首先,我們來看一個國外的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權限執行命令,這樣就是所謂的遠程執行命令漏洞了。