在 Python2 中,input 函式相當於
eval(raw_input(prompt))
如果輸入的資料是一個惡意的表示式,存在任意程式碼執行的風險
例項演示
- 字串拼接
- 命令執行
__import__('os').system('cat /etc/passwd')
靶場利用
在 vulnhub bottleneck 靶機中,遇到 input 漏洞利用的情況
# 核心程式碼
foreach($blacklist as $elem){
if(strstr($imagefile, $elem) !== FALSE)
$isblocked = TRUE;
}
// report the intrusion to the soc and save information locally for further investigation
if($isblocked){
$logfile = 'intrusion_'.$timestamp;
$fp = fopen('/var/log/soc/'.$logfile, 'w');
fwrite($fp, "'".$imagefile."'");
fclose($fp);
exec('python /opt/ids_strong_bvb.py </var/log/soc/'.$logfile.' >/tmp/output 2>&1');
print_troll();
exit();
}
程式碼的意思是引數輸入要是包含黑名單的字串中,則將輸入輸出到日誌檔案中
我們不知道 ids_strong_bvb.py 的內容是什麼,但靶機中存在檔案包含漏洞可讀取 /tmp/output 的內容
由於靶機中還存在定時清空 /tmp/output 的程式, 所以還需要先 讀一個包含黑名單字串的路徑,在立刻讀取 output 檔案,方可讀取
如圖所示,先讀取這兩個路徑
輸出為:
/etc 後加單引號使 程式報錯
知道程式中包含 input 引數,經由上面輸出推測得,使用者輸入由input函式處理
由報錯可以知道閉合規則,將payload放到 /etc' and payload and '
中即可
輸出:
更改system裡面的命令,可造成任意命令執行,直接getshell,進行下一步提權。