1. 代碼注入原理
PHP代碼注入是指應用程序過濾不嚴,用戶可以通過請求講代碼注入到應用中執行。代碼注入類似於SQL注入漏洞,SQL漏洞時將SQL語句注入到數據庫中執行,而代碼執行則是可以把代碼注入到應用中最終由服務器運行它。這樣的漏洞如果沒有特殊的過濾,相當於直接有一個web後門存在。
(1)程序中含有可以執行PHP代碼的函數或者語言結構
(2)傳入第一點的參數,客戶端可控,直接修改或者影響
2. 漏洞危害
Web應用如果存在代碼執行漏洞時一件非常可怕的事情,就像一個人沒有穿衣服,赤裸裸的暴露在光天化日之下。可以通過代碼執行漏洞繼承Web用戶權限,執行任意代碼。如果具有服務器沒有正確配置,web用戶權限比較高的話,我們可以讀寫目標服務器任意文件內容,甚至控制整個網站以及服務器。本課程中以PHP爲例子來說明,執行代碼漏洞。
3. 相關函數和語句
(1)eval()
eval()會將字符串當做php代碼來執行。
<?php
if(isset($GET['code'])){
$code=$_GET['code'];
eval($code);
}else{
echo "please submit code!<br />?code=phoinfo();";
}
?>
有可以在鏈接中直接輸入內容:
?code=phpinfo();
?code=${phpinfo()};
?code=1;phpinfo();
(2)assert()
assert()同樣會作爲PHP代碼執行,測試代碼如下
<?php
if(isset($GET['code'])){
$code=$_GET['code'];
assert($code);
}else{
echo "please submit code!<br />?code=phpinfo()";
}
?>
提交參數 ?code=phpinfo()
(3)preg_replace()
preg_replace()函數的作用是對字符串進行正則處理。參數和返回值如下:
mixed preg_replace(mised $pattern,mixed $replacement,mised $subject[,int limit = -1[, int &$count]])
這段代碼的含義是搜索pattern的部分,以replacement處,即第一個參數存在e修飾符時,¥replacement的值會被當成PHP代碼來執行。例子如下:
if(isset($_GET['code'])){
$code=$_GET['code'];
preg_replace("/\[(.*)\]/e",'\\1',$code);
}else{
echo"?code=[phpinfo()]";
}
?>
提交參數 ?code=[phpinfo()],phpinfo()會被執行