Web安全--代碼注入

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]])

這段代碼的含義是搜索subjectsubject中匹配pattern的部分,以replacementreplacement進行 替換,而當replacement處,即第一個參數存在e修飾符時,¥replacement的值會被當成PHP代碼來執行。例子如下:

if(isset($_GET['code'])){
	$code=$_GET['code'];
	preg_replace("/\[(.*)\]/e",'\\1',$code);
}else{
	echo"?code=[phpinfo()]";
}
?>

提交參數 ?code=[phpinfo()],phpinfo()會被執行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章