首頁 > 軟體

PHP網路安全之命令執行漏洞及防禦

2022-07-26 14:00:26

命令執行漏洞的原理

程式應用有時需要呼叫一些執行系統命令的函數,如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漏洞及防禦內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com