PHP網絡安全之命令執行漏洞及防禦
命令執行漏洞的原理
程序應用有時需要調用一些執行系統命令的函數,如php中的system,exec,shell exec,passthru,popen,proc popen等,當用戶可以控制這些函數的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令註入攻擊
兩個條件
(1)用戶可以控制函數輸入
(2)存在可以執行代碼的危險函數
命令執行漏洞產生原因
1.開發人員編寫源碼時,未針對代碼中可執行的特殊函數入口作過濾,導致客戶端可以惡意構造語句,並提交服務端執行
2.命令註入攻擊中,web服務器沒有過濾類似system,eval,exec等函數,是該漏洞攻擊成功的主要原因。
命令執行漏洞的危害
1.繼承web服務程序的權限去執行系統命令或讀寫文件
2.反彈shell
3.控制整個網站甚至服務器
4.進一步內網滲透
實例
<?php echo shell_exec($_GET['a']); ?>
將url中的參數a作為cmd命令行指令執行
危險函數導致代碼執行
<?php $arr = $_GET['arr']; $array = $_GET['array']; $new_array = arraymap($arr,$array); ?>
arraymap是一個危險函數,它會默認將參數作為php代碼執行
PHP一些可調用外部程序的危險函數
eval攻擊
eval函數將輸入的參數當成php代碼來執行
mixed eval(string code str)
<?php $var = "var"; if(isset($_GET["arg"])) { $arg = $_GET["arg"]; eval("\$var = $arg;"); echo "\$var = ".$var; } ?>
preg_replace()函數
preg_replace()函數執行一個正則表達式的搜索和替換
在php版本為5.5.0以下時有一個漏洞,當該函數使用瞭一個不安全的修飾符"\e"時,preg_replace()會對替換字符串的反向引用進行正常替換,將其作為php代碼進行計算,並使用 結果替換搜索字符串。
此處/e的用處是引用括號裡的字符 也就是以參數a去替代括號裡的字符
ps:不要忘記代碼兩側的中括號
call_user_func
函數用法:
call_user_func($_GET["a"] , $_GET["b"])
將a作為函數執行,b作為函數參數傳遞進去
在命令註入時,常有需要多命令執行的情況
在linux下,可以使用|或||代替
|是管道符,顯示後面的執行結果
||當前面命令執行出錯時再執行後面的
在Window下,可以使用&、&&、|、||代替
&前面的語句為假則執行後面的
&&前面的語句為假則直接出錯,後面的也不執行
|直接執行後面的語句
||前面出錯執行後面的語句
命令執行的防禦手段
1.盡量不要執行外部命令
2.使用自定義函數或函數庫替代外部函數功能
3.使用escapeshellarg函數來處理命令參數
4.使用safe_mode_exec_dir:指定可執行文件路徑 ,這樣可以將會使用的命令提前放入此路徑內
safe_mode_exec_dir = /usr/local/php/bin
DVWA介紹
DVWA平臺:
用來進行安全脆弱性鑒定的PHP/Mysql Web應用
為安全專業人員測試總結的專業技能和工具提供合法環境
幫助web開發者更好的理解web應用安全防范的過程
DVWA的搭建
DVWA是基於php/mysql環境開發的
下載地址:
Buy Steroids Online UK – Anabolic Steroids For Sale UK
GitHub
DVWA練習命令註入
使用靶場自行練習
到此這篇關於PHP網絡安全之命令執行漏洞及防禦的文章就介紹到這瞭,更多相關PHP漏洞及防禦內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- PHP反序列化字符串逃逸實例詳解
- php中str_replace替換實例講解
- python os.system執行cmd指令代碼詳解
- PHP如何初始化PDO及原始SQL語句操作
- PHP危險函數禁用深入詳解