跟bWAPP學WEB安全(PHP程式碼)--OS命令注入
背景
這是溫故知新的一個系列,也是重新拾起WEB安全的一個系列,同時希望能稍微有點對初學者的幫助。第一篇先來講講OS命令注入
bWAPP裡面有兩個頁面也就是兩個漏洞,來驗證OS命令注入。一個是有回顯的,一個是沒有的,其實本質都是一樣,沒有回顯的,可以利用類似ceye平臺來驗證dns請求或者http請求,自己搭建一個也不難,flask或者Django起一個,除錯模式,看日誌也是OK的。
難度區分
一般來講,bWAPP有三個難度,高中低,一般高的也不是不可以繞過,但是很複雜,不在這個系列裡面去溫故知新或者去記錄了,但是有些會給出連結,供參考。
正文
前兩個作為開篇前言,後面的系列就不會再寫了,下面開始正文。
程式碼分析
先上程式碼:
<?php if(isset($_POST["target"])) { $target = $_POST["target"]; if($target == "") { echo "<font color=\"red\">Enter a domain name...</font>"; } else { echo "<p align=\"left\">" . shell_exec("nslookup " . commandi($target)) . "</p>"; } } ?>
可以看出問題的關鍵就在這裡shell_exec,高危函式,類似的還有很多,可以參考我的部落格WEB安全第一篇--對伺服器的致命一擊:程式碼與命令注入
追蹤程式碼,再來看看
function commandi($data) { switch($_COOKIE["security_level"]) { case "0" : $data = no_check($data); break; case "1" : $data = commandi_check_1($data); break; case "2" : $data = commandi_check_2($data); break; default : $data = no_check($data); break; } return $data; }
可以看出難度不同,檢查不同,難度低沒有檢查,難度中等,使用commandi_check_1函式進行檢查,難度高等使用commandi_check_2函式進行檢查。具體來看看這兩個檢查函式
function commandi_check_1($data)
{
$input = str_replace("&", "", $data);
$input = str_replace(";", "", $input);
return $input;
}
function commandi_check_2($data)
{
return escapeshellcmd($data);
}
function commandi_check_3($data)
{
$input = str_replace("&", "", $data);
$input = str_replace(";", "", $input);
$input = str_replace("|", "", $input);
return $input;
}
不檢查的好說,直接 | 拼接在執行的命令就行了,難度高的用來escapeshellcmd函式,標準PHP防禦OS命令執行的函式,繞過方式可以參考Exploit/bypass PHP escapeshellarg/escapeshellcmd functions
我們來說說中等
中等難度
在中等難度中過濾了&和;其實這沒啥用一個|拼接一樣執行,我們按照commandi_check_3的標準過濾掉|,再來嘗試注入。
可以嘗試``我們來試試
Payload:%26%26%60id%20>1.txt%60
參考文獻
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Remote%20commands%20execution/Intruder/command_exec.txt
https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Remote%20commands%20execution/Intruder/command-execution-unix.txt