淺析PHP程序中的目錄遍歷漏洞

來源: 互聯網  發布時間: 2010-12-26 21:49  閱讀: 2329 次  推薦: 0   原文鏈接   [收藏]  
摘要:目錄遍歷漏洞在國內外有許多不同的叫法,比如也可以叫做信息泄露漏洞,非授權文件包含漏洞。下面就來通過實例來說明這類漏洞是如何產生以及該如何防范。

  目錄遍歷漏洞在國內外有許多不同的叫法,比如也可以叫做信息泄露漏洞,非授權文件包含漏洞.名稱雖然多,可他們卻有一個共同的成因,就是在程序中沒有過濾用戶輸入的../和./之類的目錄跳轉符,導致惡意用戶可以通過提交目錄跳轉來遍歷服務器上的任意文件,其危害可想而知.這類漏洞大家比較熟悉的可能就是在一些郵件列表程序以及網絡硬盤程序中,其實這類漏洞還廣泛存在與一些國外的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來截斷后綴這樣才能正常顯示文件內容。

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

  http://localhost/loudblog/loudblog/loudblog/index.php?page=/../../../../../../conf/httpd.conf%00

  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權限執行命令,這樣就是所謂的遠程執行命令漏洞了。

0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()