web
第三题
[SUCTF 2019]EasySQL
打开靶场
尝试单引号’
无任何回显
尝试数字1
有回显
尝试1’
说明应该是查询语句为数字型,并且没有报错显示,应该是作者控制了
尝试猜解字段数
1 order by 3 #
说明普通的数字型注入手段行不通
考虑盲注
时间盲注:
1 and if(ascii(substr(database(),1,1))=115,1,sleep(5)) #
也行不通
尝试使用burpsuite抓包进行布尔盲注:
1 and (length(database()))=8 --
无论是>8还是<8页面回显均为Nonono
那么盲注失败
考虑堆叠注入
堆叠注入详解
查看数据库
1;show databases #
查看数据表
1; show tables #
发现存在Flag表
且只存在一个Flag表
尝试使用堆叠注入直接查询表中内容
1;select * from Flag #
发现还是Nonono,只要出现这个,估计是作者在提示我们这种做法行不通了,需要想其他办法。
黔驴技穷了QAQ
百度启动
参考大佬思路
[SUCTF 2019]EasySQL
思考:既然输入数字有回显,且只存在一个Flag表
那么这个查询一定是向Flag查询
这道题目需要我们去对后端语句进行猜测
通过输入非零数字得到的回显1和输入其余字符得不到回显来判断出内部的查询语句可能存在有||,也就是select 输入的数据||内置的一个列名 from 表名,进一步进行猜测即为select post进去的数据||flag from Flag(含有数据的表名,通过堆叠注入可知),需要注意的是,此时的||起到的作用是or的作用
解法1:
构造payload:
*,1
此时拼接的语句可能为 select *,1|| flag from Flag
等于select *,1 from Flag
解法2:
当设置sql_mode为PIPES_AS_CONCAT时,将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
参考链接
set sql_mode=PIPES_AS_CONCAT;之后
||的作用就是将前后的查询结果连接在一起
拿我自己的一张数据表做演示:
所以构造payload
1;set sql_mode=pipes_as_concat;select 1
太难了┭┮﹏┭┮