SUCTF 2019 EasySQL1解法

2024-08-03

SUCTF 2019 EasySQL1解法

前言

记录一次SUCTF 2019 EasySQL1刷题记录

解法

关键点是判断出SQL后端语句为select $_GET['query'] || flag from flag

可以借助我之前的一篇博客的方法来判断出:猜测SQL注入的后端语句

判断出SQL语句是非经典式select $_GET['query'] from flag ,并且是数字型的。

后面加入的|| flag 一定程度上提高了题目的难度,但是知道是非经典式SQL语句。这种情况如果回显的数据只有 1 或是 0,就可以知道SQL语句拼接了一个逻辑运算符。可以多测试几个参数,通过判断逻辑运算结果,也可以猜出是进行了一次或运算 ||

此外,题目还过滤了select、flag等关键词。进一步提高了难度

所以堆叠注入,联合注入等一系列方法就无法进行。只能通过判断SQL后端语句来进行

法1

知道后端语句是select $_GET['query'] || flag from flag

尝试传入参数 *,1

SQL语句变成:select *,1 || flag from flag

这里的1 || flag是进行了一个或运算,结果为1。原理是把flag看成字符串,先转换为整型类型0(因为flag开头没有数字),再转换为布尔值False,而前面的1直接转换为布尔值TRUE, 最后TRUE || FALSE = TRUE。因为SQL中不使用布尔值,所以TRUE被转换为1.

更加具体的SQL字符串逻辑运算方法可以看我的另一篇博客:Mysql中字符串的逻辑运算和比较运算

所以SQL语句又变成:select *,1 from flag

该的意思是:先select * from flag 再进行 select 1 from flag

所以结果如下:

2019EasySQL_1

法2

利用SQL的一个配置,可以将SQL中的管道符||或运算的含义,转换为拼接的作用

配置如下 set sql_mode=pipes_as_concat;

所以我们构造payload:0;set sql_mode=pipes_as_concat;select 0

传入后,原SQL语句变成 select 0;set sql_mode=pipes_as_concat;select 0 || flag from flag

分为三段:

1、select 0; :直接输出数据 0

2、sql_mode=pipes_as_concat; : 修改管道符的作用

3、select 0 || flag from flag :先select 0 from flagselect flag from flag。最后通过管道符的拼接作用,将两者的数据拼接起来

结果如下:

2019EasySQL_2

结语

加油!多刷题0.0