程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP中的目錄遍歷漏洞分析

PHP中的目錄遍歷漏洞分析

編輯:PHP綜合
 目錄遍歷漏洞在國內外有許多不同的叫法,比如也可以叫做信息洩露漏洞,非授權文件包含漏洞.名稱雖然多,可他們卻有一個共同的成因,就是在程序中沒有過濾用戶輸入的../和./之類的目錄跳轉符,導致惡意用戶可以通過提交目錄跳轉來遍歷服務器上的任意文件,其危害可想而知.這類漏洞大家比較熟悉的可能就是在一些郵件列表程序以及網絡硬盤程序中,其實這類漏洞還廣泛存在與一些國外的BLOG程序中,這類漏洞大概分兩種下面就來通過實例來說明這類漏洞是如何產生以及該如何防范.

  首先,我們來看一個國外的BLOG,前幾天從網上下了一個名為LoudBlog的BLOG程序,

  在它的index.php頁面中看到如下代碼:

  

  //build an include-path from the url-request

  else {

  $loadme = "inc/backend_" . $_GET['page'] . ".php";

  }

  //yee-hah! finally we do show real content on our page!

  include ($loadme);

  ?>

  這段程序很簡單卻包含了一個可怕的漏洞,變量$page是我們GET上去的,如果沒有設置page參數,程序就自動包含inc/backend_postings.PHP這個文件,如果有page參數就把$page的值放到inc目錄下以backend_前綴開頭的文件形成一個新的文件.這裡並沒有對$page的值做任何的過濾,導致我們可以遍歷所有文件了.

  這裡要注意的是,我們提交的$page的值會自動的加上php後綴,所以我們閱讀PHP文件是不會有效果的.當然我們可以讀一些配置文件也是很有用的.下面就來測試一下,我們在inc目錄外建立一個 TXT文件,內容為Wh0 !s H4K_BaN?我們提交如下URL看看結果:

  http://localhost/loudblog/loudblog/loudblog/index.php?page=/../../hello.txt%00這裡要說的是由於變量會加上PHP後綴,所以我們要用%00來截斷後綴這樣才能正常顯示文件內容,結果如圖1

  測試成功說明漏洞存在了,那我們接著讀一些敏感文件吧,提交如下URL:

  http://localhost/loudblog/loudblog/loudblog/index.PHP?page=/../../../../../../conf/httpd.conf%00結果如圖2

  apache的配置文件也順利讀出來了,接下來就來看另外一種情況.

  這類漏洞主要是存在與基於PHP+TXT結構的程序中,漏洞代碼也是來自於一個國外的BLOG,代碼如下:

  

  $act = $_GET['act'];

  if ($act == '')

  {

  include("blog.txt");

  }

  else

  {

  include("act/$act.txt");

  }

  ?>

  

  $blog_id = $_GET['blogid'];

  if ($blog_id == '')

  {

  include("blog.txt");

  }

  else

  {

  include("./blog_entrIEs/$blog_id.txt");

  }

  ?>

  從上面的代碼可以清晰的看出問題所在,第一段程序獲得$_GET[]提交的數據並賦值給$act,這裡沒有對act做任何的過濾,而在後面判斷如果變量為空就把blog.txt包含進來,如果不為空就包含act目錄下的$act.txt文件,不過只能讀以.txt結尾的文件,讀別的文件加上 txt後綴後會提示找不到文件,可以配合某些上傳漏洞把文件包含進去,比如提交如下URL:

  index.php?act=blog&blogid=../../filename這樣帶到程序裡就成了include("./filename.txt");包含近來的文件只要裡面含有PHP代碼就算後綴是TXT文件也會被執行,原理給上面的一樣,我就不截圖了.

  上面分別介紹了現在最主要的兩種目錄遍歷漏洞,從表面上看基於TXT的PHP程序如果有這類漏洞似乎利用更方便一些,其實兩者的危害性都是等價的.其實避免這類漏洞也是很簡單的事情,象$blog-id這類數字形的參數只需用intval()函數強制整形化就可以了,對於字符形的參數我們可以自己寫一個過濾函數把危險字符過濾掉,類似代碼如下:

  function fuckchar($var){

  $var = str_replace("..","",$var);

  $var = str_replace(".","",$var);

  $var = str_replace("/","",$var);

  $var = str_replace("\","",$var);

  $var = str_replace(" ","",$var);

  }

  大家可以自己測試一下這類漏洞,不管什麼語言過濾的思路都是一樣的,用GOOGLE搜索: powered by Loudblog可以找到一些這類程序,不過官方現在已經推出新版本了,更多的漏洞等待大家自己去發掘吧.

  當PHP配置文件中的allow_url_open打開的話,我們可以在自己的WEB服務器上建立一個同名文件裡面包含shell命令,然後提交我們自己建立的shell文件讓被攻擊的服務器遠程包含,可以以WEB權限執行命令,這樣就是所謂的遠程執行命令漏洞了。

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