[SUCTF 2019]EasySQL

1. 注入点测试
        a. 输入敏感字符 or、and、union、handler、from等字符串页面显示Nonono;有waf检测,不过这里没有过滤select、concat,可以使用BurpSuit测试一下。
        b. 输入字符串 a、b、c、love等页面没有任何回显
        c. 输入数字1,2,3,4,77,12312等页面显示 Array ( [0] => 1 )  只有输入数字0时页面没有回显。这里可以看出,后台将查询结果放在一个数组中,并进行输出。
        d. 堆叠注入测试,输入1;show databases;#页面会输出数据库的名字,可以进行堆叠注入。不过他这里过滤了from字段,所以查到表名,还是无法继续注入,但是我们已经知道的就是他这里可以执行多条Sql语句。
2. 测试输入输出数据
        a. 输入1             输出 Array ( [0] => 1 )
        b. 输入1,2           输出Array ( [0] => 1 [1] => 1 )
        c. 输入1,2,3        输出Array ( [0] => 1 [1] => 2 [2] => 1 )
        d. 输入1,0           输出Array ( [0] => 1 [1] => 0 )
        e. 输入0,1           输出Array ( [0] => 0 [1] => 1 )
    经过上面5次的测试,从结果中不难看出,
        ○ 他这里后台是将查询到的结果放在了数组中,并在前端页面进行显示
        ○ 数组前面部分输出的都是输入的数组,只有最后一位输出的结果为0或者是1。并且只有输入的最后一位为0是,输出才是0。

   所以我们猜测这里的sql语句中用到了运算符或(||),将从前端输入的数据和||进行了拼接,并且运算符或(||)的另一端为0或字符串。
        可以根据图中测试大胆猜测Sql语句为 select $_POST['query'] || 0(flag) from table_name
      

3.测试payload

    根据我们上述猜测也许或(||)后面拼接的就是flag,加上这里又可以执行多条Sql语句,那么这里 可以通过修改 sql_mode 模式 : PIPES_AS_CONCAT 来实现将 " || "视为 字符串连接符 而非 或 运算符
    Payload:1;set sql_mode=PIPES_AS_CONCAT;SELECT 1
    页面输出flag
    
4. 方法二:
    其实这里并没有过滤*号,所以这里可以直接构建
    Payload:*,1
    代入到Sql语句中也就是 select *,1 ||  xxx from table_name。直接查询表格的全部内容。所以使用BurpSuit通过字典测试过滤字段还是很重要的。

原文地址:https://www.cnblogs.com/ersuani/p/13875407.html