最近學習了PHP命令執行,內容比較多,把本身學到的總結下來,加深理解,水平有限,歡迎大佬斧正。php
Command Injection,即命令注入攻擊,是指因爲Web應用程序對用戶提交的數據過濾不嚴格,致使黑客能夠經過構造特殊命令字符串的方式,將數據提交至Web應用程序中,並利用該方式執行外部程序或系統命令實施攻擊,非法獲取數據或者網絡資源等。PHP命令注入攻擊存在的主要緣由是Web應用程序員在應用PHP語言中一些具備命令執行功能的函數時,對用戶提交的數據內容沒有進行嚴格的過濾就帶入函數中執行而形成的。下面結合PHP語言的特性,對PHP命令注入作了一些簡單的分析。程序員
與PHP命令注入攻擊相關的函數有system函數、exec函數、passthru函數,shell_exec函數,接下來依次分析他們。shell
1、system函數網絡
先來看一下php學習手冊對這個函數的解釋,如圖函數
接下來若是咱們構造以下代碼,目的是獲取本地用戶信息並輸出學習
<? $dir = $_GET["dir"]; if(isset($dir)) { echo "<pre>"; system("net user".$dir); echo "</pre>"; } ?>
若是攻擊者結尾再加上其餘其餘內容呢,好比想要查看開放了哪些端口,咱們能夠構造以下URL測試
?dir=||netstat -ano
結果以下圖,咱們獲取了本地服務的全部開放端口spa
2、exec函數.net
也是先看一下php學習手冊對exec這個函數的介紹3d
接下來仍是構造以下一段代碼
<? $cmd = $_GET["cmd"]; $output = array(); echo "<pre>"; exec($cmd,$output); echo "</pre>"; foreach($output as $key=>$value) { echo $value."<br>"; } ?>
若是攻擊者想要查看目錄只須要在參數cmd 後面接上=dir就能夠,以下圖
想要查看開放的端口,只須要在參數cmd後接=netstat -ano,結果以下圖
3、passthru函數
仍是先看一下php學習手冊的介紹
能夠構造以下代碼
<? $cmd = $_GET["cmd"]; echo "<pre>"; passthru($cmd); echo "</pre>"; ?>
和上面一下,攻擊者能夠直接在參數cmd後面輸入命令查看本身想要看到的數據,如查看目錄,查看端口等
4、shell_exec函數
下面是php學習手冊的介紹
構造以下測試代碼
<? $cmd = $_GET["cmd"]; echo "<pre>"; shell_exec($cmd); echo "</pre>"; ?>
除了上面的一些函數,還有eval函數,eval函數的做用是將字符串看成php代碼執行,這個函數至關的危險,由於它容許執行任意 PHP 代碼,看到eval的第一眼是否是很熟悉?我們使用的php一句話木馬就是使用的eval。
接下來構造以下代碼
<? $cmd = $_GET["cmd"]; eval($cmd); ?>
接着在參數cmd後面接=phpinfo();,結果以下圖
咱們發現咱們提交的字符串「phpinfo();」通過eval函數的處理後,能夠按照PHP函數進行執行,並將結果反饋給咱們,那麼執行相應的其餘PHP函數,如寫入文件,查詢文件信息等功能的代碼字符串時,一樣能夠執行。
可使用黑名單的形式,打開php.ini文件,找到disable_functions=,而後將上面那些函數添加進來就能夠了。