[SUCTF 2019]EasySQL

打开靶机,又是熟悉的查询框

先随便输入点东西,发现只有输入数字有回显

题目是SQL,先验证是否存在sql注入

构造payload

1' or 1=1 #

显示为nonono,可能是设置了过滤,想着用联合注入试试,可是我们判断列数的时候,也是nonono,所以我们换思路,用堆叠注入试试。

先看看数据库都有哪些,构造payload:

1;show database();

有反应,我们在看看表

1;show tables;

发现表名是Flag,有戏,再看列:

1;show columns from Flag;

显示nonono,又被过滤了。

这里参考了大佬wp,这里后端语句,只有当我们输入非零数字时才会会显出1,而0和其他全都无回显,即输入数字有回显而字符没有回显,说明了语句中存在||结构。

方法一:

需要把payload中的||或逻辑改成连接符的作用,这里需要用到SQL模式。

构造payload:

1;set sql_mode=PIPES_AS_CONCAT;select 1
  •    set sql_mode=PIPES_AS_CONCAT这个是设置了 MySQL 的 sql_mode,即修改当前会话中的 SQL 模式。它会将 | 符号(管道符)视为字符串连接符,而不是按位或运算符。启用 PIPES_AS_CONCAT 后,| 就会变成一个字符串连接符,类似于 CONCAT() 函数的作用,用于将两个字符串连接起来。默认情况下,| 符号在 MySQL 中是按位运算符,表示按位“或”操作。

注意:在你给出的 SQL 语句中,虽然设置了这个模式,但实际上并没有直接用到 | 符号,因此这一部分语句的作用是为后续的操作做准备,或者可能在一些其他查询中会被使用。

  • select 1;这是一个简单的查询,返回数字 1。它的作用是从数据库中选择数字 1,并且返回给用户。这个语句不会受到 PIPES_AS_CONCAT 模式的影响,因为该模式是针对字符串连接的符号 | 的,而不是数字或普通的查询操作。

注意分号隔断了前面的命令,所以要再次添加select来进行查询,这里把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

构造payload:

*,1

总结

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

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

||运算符原本的作用相当于or,即 :

    0 || 1 = 1
    3 || 4 = 1
    0 || 0 = 0

我们可以修改sql_mode的值,将||视为字符串的连接操作符而非或运算符,即set sql_mode=PIPES_AS_CONCAT;

以上是个人做题的方法和经验,如果觉得有用可以帮忙点个赞或者收藏吗,感谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值