BUUCTF [SUCTF 2019]EasySQL1 writeup(详细版)

考点:堆叠注入,MySQL和mssql中||运算符的区别,运算符的意义转换(操作符重置,短路算法

打开靶机,尝试输入1查看回显:

可以看到表格回显了内容:1,用其他非0数字尝试全都回显1,那我们换个数字尝试,比如0:

什么都没有。用字母同理无回显。

使用Sql堆叠注入查看信息,先用show指令查看数据库:1;show databases;

再查看一下表:1;show tables;

 看到Flag表,猜测flag应该在Flag中。但是用1;show columns from Flag;无法回显出flag只会回显Nonono.  -->说明flag被过滤掉了(注:1;show columns from用来查询表中列名称)

接下来回顾一下最开始我们输入的非0数字和0与字母所回显的内容:非0数字回显1,0和字母不会回显任何内容

先了解一下||操作符:在MySQL中,操作符||表示“或”逻辑:

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

 这里猜测后端语句,因为只有当我们输入非零数字时才会会显出1,而0和其他全都无回显,(这里很多大佬去查看的源码看到了||的使用,但我太拉跨,,实在找不到源码orz,,)而猜测逻辑大致是这样的:大胆猜测后端(内部查询语句)语句中有||操作符,只有我们输入非零数字才会满足||的逻辑为True从而进行回显的条件。也就是满足:select 输入的内容 ||  一个列名 from 表名。(select 输入数据 || flag from Flag)

注:select语句用于从数据库中选取数据,返回的数据会储存在结果表中。

所以接下来搞清楚逻辑后,我们了解一下mssql中的||操作符意义:

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

从这里可以找到解题方法:既然我们要找到flag,后端又存在“或” 的逻辑,那么只需要把||或的逻辑改成连接符的作用就可以了。

这里需要借用到:设置 sql_mode=PIPES_AS_CONCAT来转换操作符的作用。(sql_mode设置)

 利用PIPES_AS_CONCAT令||起到连接符的作用。

构建payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1

注:这里的逻辑是先把||转换为连接操作符,注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把1换成其他非零数字也一样会回显flag

由此回显出flag

法2:

构建payload:

*,1

直接得到flag

已知后端语句是select 输入内容 || flag from Flag,输入*,1就相当于构造了select *,1 || flag from Flag,这条语句执行起来相当于select *, 1 from Flag

为啥子咧,因为1||flag是个短路算法,直接输出1了

select *和select 所有列的意义相同,那么我们构造的select *,1 || flag from Flag ==select *,1 from Flag 

拓展:

PIPES_AS_CONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似.

SELECT * 和 SELECT 所有列,两者差别几乎可忽略。所以查询所有字段(或者大多数字段)的时候,可以用select *来操作。

短路算法:

|| 逻辑或的短路:a||b

计算机发现a是真,那么输出a;如果a是假,那么输出b

0 || 12   -->12 前面假,输出后面

23 || 0   -->23 前面真,输出前面

select 1 from :建立一个临时列,这个列的所有初始值都被设为1。

  • 28
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值