什麼是WebShell
滲透測試工作的一個階段性目標就是獲取目標伺服器的操作控制權限,於是WebShell便應運而生。Webshell中的WEB就是web服務,shell就是管理攻擊者與作業系統之間的交互。Webshell被稱為攻擊者通過Web伺服器埠對Web伺服器有一定的操作權限,而webshell常以網頁腳本的形式出現。常見的WebShell使用asp、jsp和php來編寫,提供了如執行系統命令、文件上傳下載、資料庫管理等功能。
獲取WebShell的方式
獲取WebShell的動作又叫做GetShell,是滲透測試各項能力的綜合體現,也是滲透測試一個重要的階段性目標。GetShell方式眾多,常見如文件上傳、SQL注入、命令執行、文件包含、解析漏洞等等。有時候一個漏洞即可GetShell,有時候則需要各種漏洞打一套組合拳方可。So,多交流,才能掌握更多GetShell騷姿勢。
通過利用任意文件上傳漏洞可以最快獲取WebShell,一般常見有三種情況:(1)直接上傳木馬文件到目標伺服器;(2)繞過防護(以下不包括繞過WAF防護,以後有時間再介紹繞過WAF的姿勢)限制上傳木馬文件;(3)CMS等的通用任意文件上傳漏洞。在對目標進行滲透測試時,可從前後臺頭像修改、文件導入、圖片上傳等處尋找文件上傳接口。此外,還需要根據識別的站點指紋尋找是否存在文件上傳漏洞。以下是針對不同情況下上傳WebShell的方式。
a) 前端校驗文件後綴時,可先傳允許的文件類型,然後抓包修改文件後綴。b) MIME校驗時,抓包修改Conten-Type為允許MIME類型。
a) 利用特殊文件後綴。如.php3、.php5、.php7、.phtml;asa、cer、cdx、aspx;jspx、 jsw、jsv、jspf等,但不一定都能被解析。b) 配合Windows/Linux特性使用特殊字符,如上傳.php::$DATA、「.php空格」等後綴的文件到Windows伺服器,由於Windows的文件後綴中不能包含一些特殊符號,使得這些文件在保存在Windows伺服器上時後綴只剩下.php。c) Apache 1.x、2.2.x版本文件解析漏洞,.php.xx。d) 後綴大小寫,如pHp。e) 在數據包中使用雙filename,如filename=「1.jsp」; filename=「1.php」。
a) 00截斷,要求PHP<5.3.4且magic_quotes_gpc為OFF狀態。b) 配合解析漏洞(見解析漏洞getshell)。c) 文件包含圖片馬(見文件包含getshell)。
a) 使用文件頭繞過,如圖片中使用GIF89a。b) 使用圖片馬,接著配合解析漏洞或者文件包含漏洞getshell。c) 使用元數據編輯器在圖片的EXIF信息中插入一句話木馬。
如禪道<=12.4.2後臺任意文件上傳漏洞;編輯器漏洞、中間件的也不容忽視,如CVE-2017-12615可直接使用put寫入木馬文件。當然,「老洞」IIS 6 開啟WebDAV可直接put寫入文件。以下兩張圖是禪道<=12.4.2後臺任意文件上傳漏洞的利用截圖:
利用命令(代碼)執行漏洞寫入WebShell文件從而GetShell。在此列舉了以下四種常見情況作為說明。(1) 利用CMS、框架通用漏洞,如thinkPHP命令執行漏洞,影響範圍較廣,如鯰魚CMS、ThinkCMF、yunCMS等。Struts2遠程命令(代碼)執行漏洞,如S2-059、S2-057……(2) 中間件、架構通用漏洞,如:Jboss遠程命令執行、weblogic未授權命令執行CVE-2020-14882……(3) 應用程式命令執行漏洞,如Redis 4.x/5.x命令執行漏洞、Zabbix遠程命令執行CVE-2020-11800……(4) 命令注入漏洞寫入WebShell,根據Linux和Windows的不同採用不同的注入方式。如:
利用解析漏洞將圖片馬等文件解析為惡意腳本文件從而GetShell,本文主要介紹在IIS、Nginx、Apache的解析漏洞。一般,該漏洞會配合文件上傳漏洞等來獲取WebShell。
a) IIS 5.x/6.0解析漏洞,其中文件名解析漏洞利用形式為*.asp;.jpg;目錄解析漏洞利用形式為/asp/1.jpg。b) IIS 7.0/7.5解析漏洞。其實該漏洞為cgi.fix_pathinfo的配置不當引起的解析漏洞,利用形式為x.jpg%20\0.php。
a) Nginx漏洞版本0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7默認配置導致解析漏洞,利用形式為x.jpg/.php。b) Nginx漏洞版本0.5.、0.6.、0.7 <= 0.7.65、0.8 <= 0.8.37,利用形式為x.jpg%00.php。c) CVE-2013-4547,利用形式為x.jpg[非空編碼]\0.phpd) PHPStudy v8.1.0.7默認Nginx配置解析漏洞,利用形式為x.jpg/.php。
a) 文件後綴x.php.ss.ss2會被解析為php文件b) 利用配置文件。上傳.htaccess配置文件,就會將.jpg解析為PHP文件,內容如下:
或者
在MySQL注入中,可以利用SQL注入獲取WebShell,要寫入WebShell文件到伺服器中,需要滿足以下條件:
網站物理路徑;
文件寫入的權限;
secure_file_priv條件沒有設置為NULL;
要求mysql資料庫的配置中,沒有將secure_file_priv條件沒有設置為NULL,即secure_file_priv=NULL時,無法導入導出文件;而當設置為空時,即secure_file_priv=時,則導入導出文件不受限制;如果設置為某個文件路徑,如secure_file_priv=/mysql/時,則導入導出必須要在跟文件目錄下完成。利用形式如下。(1) 直接使用into outfile
(2) 直接使用into downfile
(3) 意為將數據導出到文件shell.php時,每個數據以一句話木馬作為分割符
而在寫入時,也可以將分隔符,即一句話木馬做hex編碼如:
(4) 設置每行數據開頭為一句話木馬
(5) 在欄位之間的以一句話木馬作為分隔符。
舉例如下圖所示:
利用文件包含漏洞GetShell,由於面比較大,主要介紹PHP文件包含,其分為本地文件包含和遠程文件包含。本地文件包含中,需要PHP的配置文件項allow_url_include和allow_url_fopen均設置為On。一般配合文件上傳等漏洞GetShell,最常見的如先傳圖片馬,再包含之。遠程文件包含中,需要PHP的配置文件項allow_url_fopen設置為On,利用方式是在遠程伺服器上存在shell.txt,內容為webshell,然後遠程包含這個文件即可。
0day自己挖,如一些cms黑白盒滲透、代碼審計等;Nday靠收集。
創建、修改模板時寫入webshell文件。
在網站設置如「網站名稱」中插入一句話,但需要注意閉合,稍有不慎會將網站插壞的。
資料庫備份時修改備份文件後綴,在數據中插入一句話。
a) 開啟日誌文件,將日誌文件的路徑設置為網站的物理路徑,如:
最後在執行的SQL語句中帶有一句話木馬,這樣,日誌文件內容中就包含了webshell。b) 導出數據時,將webshell導出到文件中,詳見前文SQL注入GetShell。
如DedeCMS CSRF + 任意文件寫入。
添加上傳文件類型,如白名單中添加PHP。
本次就先總結到這裡,望大佬們不吝賜教。