打开靶机,发现是一个查询框
输入1,提交,有回显
输入1',提交,没有回显,应该是没有显示报错信息,那么报错注入就行不通了
然后就是联合查询,时间盲注,布尔盲注,堆叠注入等一顿输出,发现除了堆叠之外,其他基本上都是有过滤的,如下
那我们就用堆叠呗,输入1';show databases;,发现没回显,难道是数字型注入?输入1;show databases;,果然成功爆出数据库
接下来看看当前数据库下有哪些表,1;show tables;
flag应该就在这里了,但是过滤了from等一堆关键字,测试了一下,连handler语句都过滤了,怎么才能拿到里面的内容呢? 到这里又不会了,小伙子,还得练啊。看了一下别人的wp,才知道知道题的关键是猜测后端的sql语句,如下
1.非零数字有回显,0没有回显,说明里面应该有'||'这样的字符
2.题目一定有方法让我们查到flag,所以内置语句应该是这样:select (输入的数据)||flag from Flag;
(其实笔者很疑惑为什么这都能猜出来,应该不是我菜吧(滑稽))
当我们输入*,1时,查询语句应该是select *,1||flag from Flag,也就是select *,1 from Flag,成功爆出表里的内容
猜出了语句后,大佬们还有另一个骚操作,利用sql_mode(它定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的 PIPES_AS_CONCAT 将 || 视为字符串的连接操作符而非 "或" 运算符)来改变'||'的作用,从运算符变成连接符,之后输入1就查询语句就是这样的:select 1,flag from Flag,就能够同时查出1和flag的数据
payload:1;set sql_mode=PIPES_AS_CONCAT;select 1
查询语句就变成select 1;set sql_mode=PIPES_AS_CONCAT;select 1,flag from Flag
牛!