[SUCTF 2019]EasySQL
[SUCTF 2019]EasySQL
这道题的话先尝试一下常用的payload:
发现是nonono,应该是过滤了一些东西,所以我们尝试着去用fuzz字典跑一下
抓包发送到intruder
然后到那个intruder界面选择变量,选择字典
通过这个load去加载字典文件,这个界面在payloads那个界面,然后开始攻击(start attack),如果请求过多,可以改一下这个
跑完结果:507的这些都被过滤了,发现这个数据库以及其他的一些报错注入函数都被过滤了
搜索之后发现这道题是要用到堆叠注入
查数据库名
再查表名
尝试一下是否能够直接访问这个Flag表,发现并不行
网上搜索发现有两种解法:
解法1:
猜测这里的源码为select $_POST[‘query’] || flag from Flag
|| 这个符号在linux里是管道符,前面命令为假,才执行后面语句
这里的||的作用是or的作用,所以我们这里可以用*,1,原语句就变成了select *,1 || flag from Flag
也就是select *,1 from Flag
,这样就直接查询了这整个表的内容
解释一下就是因为*,1为真,所以||后面的flag就不会被执行了
查询结果:
解法2:直接让这个||变成连接符号,我们可以通过这样的语句实现set sql_mode=PIPES_AS_CONCAT;
最终的payload就是:1;set sql_mode=pipes_as_concat;select 1
这一整句语句就相当于是select 1 from Flag和select flag from Flag
最终提交这个payload
本地测试一下这个set sql_mode=pipes_as_concat
语句
可以看到刚开始a列中的数据是1,1,2,3,2,1,null
未设置该语句前的查询结果
设置语句后的查询结果
可以发现,在设置这个set sql_mode=pipes_as_concat
语句之前,只查询到1,设置后既查询了1又查询了a列的数据