PHP-代码审计-命令执行
當你的才華
還撐不起你的野心時
那你就應該靜下心來學習
? ? ? 代碼審計學習線上實驗,都是CE一邊實操,一邊整理的筆記,方便以后翻看時,可快速查閱。
目錄
命令注入漏洞產生的原因
簡介
相關函數
命令注入漏洞防范
命令注入漏洞產生的原因
? ? ? 命令注入攻擊可被攻擊者用來導入代碼到某特定的計算機程序,以改變程序的運行進程或目的。 PHP命令注入則是由于Web應用程序對用戶提交的數據過濾不嚴格,導致黑客可以通過構造特殊命令字符串的方式,將數據提交至Web應用程序中,并利用該方式執行外部程序或系統命令實施攻擊,非法獲取數據或者網絡資源等
簡介
PHP命令注入攻擊漏洞是PHP應用程序常見漏洞之一
國內著名的PHP應用程序,如discuz!、dedecms等大型程序在網絡中均被公布過存在命令注入攻擊漏洞,黑客可以通過命令注入攻擊漏洞快速獲取網站權限,進而實施掛馬、釣魚等惡意攻擊,造成的影響和危害十分巨大。
同時,目前PHP語言應用于Web應用程序開發所占比例較大,Web應用程序員應該了解命令注入攻擊漏洞的危害。
需要注意PHP命令注入和Sql注入、PHP代碼執行漏洞的區別:
-
Sql注入漏洞是將Sql語句注入到后臺數據庫中進行解析并執行
-
PHP代碼執行漏洞是將PHP代碼注入到Web應用中通過Web容器執行
-
命令注入漏洞是指注入可以執行的系統命令(如windows中的CMD命令、linux中的Bash命令)并執行
相關函數:
? ?system()、exec()、passthru()、shell_exec()、popen()、proc_open()、pcntl_exec()一共7個函數。
?
命令注入函數,分為三類
第一類函數
? ? ? ?包括system()、exec()、shell_exec()、passthru()可以直接傳入命令執行并返回結果,其中system()最簡單,不需要輸出函數,會自動打印命令執行結果,所以這里我們先講解system()函數
代碼如下,變量 $id 獲取 get 方式傳遞的變量名為 bash 的變量值(值為一個字符串),然后傳入system()函數被當作命令執行:
?通過代碼分析,構造我們的payload為:?bash=pwd時,頁面就能成功返回當前當前.php文件所在目錄的地址
?其他幾個函數類似相同的道理,比如exec()、shell_exec()、passthru()函數,大家自己手動試試吧。
exec() 函數
sehll_exec 函數
passthru 函數
?
第二類函數
說明:
? ? ? ?resource popen ( string $command , string $mode )
? ? ? 打開一個指向進程的管道,該進程由派生給定的 command 命令執行而產生
- 第一個參數?$command 會被當作命令執行
- 第二個參數?$mode 決定執行模式,有兩個取值r?或者?w?,來指明是讀還是寫
?
? ? ? ?包括popen()、proc_open(),當使用這類函數傳入命令時,命令會執行,但不會返回執行結果。
代碼如下,
?通過代碼分析,構造我們的payload為:?bash=ifconfig >> /tmp/popen.txt時,頁面沒有返回信息,但我們這行命令的意思是將ifconfig 輸出的信息寫道路徑為/temp 下的popen.txt里。
?
第三類函數
說明:
? ? ? ? void pcntl_exec ( string $path [, array $args [, array $envs ]] )
$path 為可執行程序的路徑,如果是perl或者Bash腳本,則需要在文件頭加上?#!/bin/bash來標識可執行程序路徑,args 表示傳遞給args表示傳遞給path程序的參數,$envs 則是執行這個程序的環境變量。?
參考鏈接:https://www.shiyanlou.com/courses/895
?
命令注入漏洞防范
通常我們可以使用白名單對用戶輸入進行過濾,這是一種通用的手段。
除此之外這里有幾項具體的建議:
使用自定義函數或函數庫來替代外部命令的功能
使用 escapeshellarg()函數來處理命令參數
使用 safe_mode_exec_dir 指定可執行文件的路徑
我不需要自由,只想背著她的夢
一步步向前走,她給的永遠不重
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的PHP-代码审计-命令执行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP-代码审计-代码执行
- 下一篇: PHP-代码审计-变量覆盖