CTFer成长记录——CTF之Web专题·19强网杯—随便注

发布时间 2023-07-30 18:28:47作者: MiracleWolf

一、题目链接

https://buuoj.cn/challenges#[%E5%BC%BA%E7%BD%91%E6%9D%AF%202019]%E9%9A%8F%E4%BE%BF%E6%B3%A8

二、解法步骤

  本题考察的是堆叠注入:堆叠注入原理就是通过结束符同时执行多条sql语句;例如php中的mysqli_multi_query函数与之相对应的mysqli_query()只能执行一条SQL所以要想目标存在堆叠注入,在目标主机存在类似于mysqli_multi_query()这样的函数,根据数据库类型决定是否支持多条语句执行。总之,堆叠注入的触发条件很严格

  输入:1进行常规查询。

同时用order by  2,可以得出共有两列;但是本题过滤了select ,delete等关键字,要想获取数据库可以用show databases,

  结合堆叠注入的特性,构造payload:1';show databases;# 这里第一个分号表示正常查询结束,第二个分号是我们注入的sql语句结束,同时结尾仍然用#注释。

  

  可以发现爆出了许多数据库;接下来试试能不能爆表:同样用show tables

  

  114514(警觉!)说不定flag就在这表里,现在用show columns  from `1919810931114514`,查询表里的列。PS:这里查数字类型的表时,需要用反引号括起来。

查询该表:

  最后就差查数据了,查数据只能用select,但是如果直接用:1';select * from`1919810931114514`;#会发现提示select被过滤。绕过方式可以选择设置一个变量,让它的值变成该语句的16进制,最后用prepare ···· from ·····   ,execute 语句执行。

  设置变量:SeT@a=

  sql语句的十六进制:0x73656c656374202a2066726f6d20603139313938313039333131313435313460 (把select flag from ` 数字 `转换成16进制)

  语句执行:prepare execsql from @a;execute execsql;#

  完整payload:1';Set@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

  得到flag:

  最后得到flag。

三、总结

  本题能想到堆叠注入就挺难的,对select过滤处理方法也要知道;总体难度较大,目前就当增长见识了。