【BUUCTF】SUCTF 2019EasySQL1 write up

本文详细探讨了一种SQL注入攻击的场景,通过测试发现输入数字有回显,而字母符号无响应。作者尝试了联合注入和堆叠注入,并通过布尔盲注技术来解析数据。在确认存在逻辑运算符||的情况下,利用sql_mode=PIPES_AS_CONCAT进行 payload 构造,最终成功获取信息。此外,还介绍了在||未被设置为连接符时的非预期解,通过将数据提交为*,1来规避逻辑运算,直接查询出Flag表的内容。
摘要由CSDN通过智能技术生成

做一些简单的测试,输入数字发现有回显,输入字母符号却没有。

尝试执行注入语句,出现Nonono.猜测有注入点,查询列,无回显,联合注入也无需尝试

不用没关系,咱了解了解

联合注入:(给我戳它)

 MySQL数据库联合查询与连接查询 - Prinlily - 博客园 (cnblogs.com)https://www.cnblogs.com/Prinlily/p/10030157.html

尝试堆叠注入,查询数据没有回显,查询表名,回显

直接访问flag,没用,尝试布尔盲注

 布尔盲注:(挺有意思的)
https://cloud.tencent.com/developer/article/1632161(想详细了解的,去看看这位大佬的博客吧)

回显漏漏漏,说明Flag被过滤了

输入1有回显,但0没有,说明只有非零数字才可

查看源码猜测后端语句 有||操作符,当我们输入非零数字,才可满足||的逻辑为真进而回显。

但要查找flag,后端又有“或”逻辑存在,我们需要将||视作字符串连接符,相当于CONCAT() 函数。因此需要借用sql_mode=PIPES_AS_CONCAT转换操作符,起到连接符的作用。

构造payload:select 输入数据|| flag from Flag(select语句用于从数据库中选取数据,返回的数据会储存在结果表中。)

select $post['query']||flag from Flag(猜测后端语句)
1;set sql_mode=PIPES_AS_CONCAT;select 1(payload)
select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag(拼接后)
select 1 from Flag和select flag from Flag(同上)

 

 

非预期解:
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数,就按默认没有配置来进行,此时||就是逻辑或。
command1;command2顺序执行
command1 || command2
如果command1执行失败,则执行command2
command1 && command2
如果command1执行成功,则执行command2

在MySQL中,操作符||表示“或”逻辑:

command1 || command2
c1和c2其中一侧为1则取1,否则取0

mssql中||表示连接操作符,不表示或的逻辑。

因此需要将$_POST[‘query’]提交的数据换成*,1
解释:
sql=select.post[‘query’]."||flag from Flag";(拼接语句),如果$post[‘query’]的数据为*,1,sql语句就变成了select *,1||flag from Flag,相当于select *,1 from Flag(select *和select 所有列的意义相同),这样就直接查询出了Flag表中的所有内容。(1||flag是个短路算法,直接输出1)此处的1是临时增加一列,列名为1且这一列的所有值都为1

执行payload:*,1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值