![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
很多白帽子在挖掘XSS漏洞的时候,往往会遇到一个问题,就是明明发现这里的过滤有缺陷,但是就是没法成功的进行构造利用。可能会由于自身对XSS绕过的局限性思维,往往只会反复的去尝试各种不同 payload代码,寄希望于其中某一个可以绕过过滤。但是在遇到强有力的XSS防御措施下,往往只能是竹篮打水一场空。
鉴于这种情况,这里主要分3个章节来简单的分享一些XSS绕过思路。
所谓的黑名单,就是不允许某些指定的字符输入,其他非限制的内容都可以通过,相对白名单策略,虽然白名单更加安全些,但是往往白名单会误杀正常业务,所以只能针对性的部署,而不能进行多个业务统一的部署。黑名单的策略,显然这一方面更具有优势,缺点就是防御规则常常会被绕过。一般的XSS-WAF规则用的都是黑名单策略。
所谓的富文本环境,就是指可以直接写入各种标签符号的一个环境。比如邮件、空间、编辑器等,这些位置采用的基本都是黑名单策略。
比如直接过滤<script> 、 <iframe> 、 <object>等危险标签,以及onload、onerror、onclick等危险事件,有的也会直接粗暴的过滤掉script之类的关键字。
比如标签写成 <sCript> <SCRIPT>这样,关键字script写成sCRIPT之类。事件也和关键字的方法差不多,尝试用Onload ONLOAD之类的大小写去绕过,不过事件类的过滤,这种方法一般都没啥用。一般情况过滤了onxxx的话99%都会注意大小写问题。
写成<script 或者 <script src=xxx? 这样子,由于语义解析问题和浏览器html代码补全机制,这种方法在以前是可以干掉很多富文本的规则的,现在随着安全的发展,相对也不是太好用了。
尝试一些不在黑名单中的标签,比如<a><img>之类,事件一般是先尝试下onxxx这样,如果发现没有被过滤,那么这种情况一般都是过滤了常见的onload、onerror、onclick之类的事件,我们可以找一些不常见的事件去尝试绕过,比如ontouchstart就是触摸触发,这种在手机、平板设备上面的触发率还是比较高的。<a>标签可以尝试<a href=javascript:alert(1)>xx</a>这样去测试,如果对script关键字有过滤的话,再用大小写混淆或者html编码进行绕过尝试。
比如发现某处会将<script>或者onload过滤为空,那么就可以直接尝试用 <scri<script>pt>、o<script>nload、oonloadnload的方式去绕过。以前这个方法用的还是比较多的,现在很多程序已经考虑到这点,基本都会进行循环过滤和语义分析,所以这个姿势已经不太能过一些大厂的规则了。
在js环境中,方法相对灵活很多,比如单引号过滤,很多时候可以用反单引号。
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
其实单引号,等号这些有一个比较常用的处理方法,就是用String.fromCharCode
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
但是要注意,这里String.fromCharCode输出的结果是字符串,需要执行的话,还需要给最外层加一个eval
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
或者不用String.fromCharCode用atob函数也可以,或者用其他的这种可逆的编码、加密函数都是可以的。
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
2 不仅过滤了单引号、等号,还过滤了圆括号、eval的情况
上面的方法在进行js环境中,的黑名单过滤绕过特别实用,但是有人就会问了,你这方法需要用eval和括号,如果把这些也都过滤掉了呢。其实括号的问题,前面已经提到过了,是可以用反单引号去替换的,eval的话,这种可以尝试其他的函数去绕过,比如用Function或者constructor配合js模板字符串的写法。
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
具体细节这是js的模板字符串的特性,以前发过的XSS相关文章中也提到过很多次了,这里就不再具体展开细讲了,有兴趣的可以自行百度去了解下。
可能看到上面的演示会有人说你这里的payload里面还是有等号啊,其实这种base64加密后面的等号是可以控制的,比如用alert(1)加密发现有等号,就写成或者alert(1);var aaa=1;之类的改变字符其长度,直到没有了等号就行了,这里主要是提供一个思路和方法。
某网站储存型XSS(过滤了尖括号/圆括号/单引号)
经过测试后发现,该漏洞点过滤了常见的script关键字,还有尖括号 >< ,单引号 ' ,圆括号 ) ( 不过经过一番测试,绕过了这些过滤,成功弹窗。
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
这里做下简单的说明,为什么payload要这么写呢?
1 由于过滤了尖括号><,所以只能在input标签内部构造,input标签最好用的xss事件就是onfocus了;
2 由于过滤了圆括号(),所以用 location=url编码 的这种模式可以将括号写为%28 %29;
3 由于过滤了单引号',所以location='alert%271%28'这样就不能用了,所以利用this.name进行传值;
4 script关键字有过滤,所以用sCript大小写混淆绕过;
基本就这样了吧,综上就可以得出上面的payload了~
不管是白名单还是黑名单,还是以后会讲到的长度限制的XSS绕过,其实万变不离其宗,都是利用代码特性和代码逻辑进行的一些构造而已。
文章其实主要是探讨的绕过思路,作者认为对于XSS绕过这个问题上,思路还是比较重要的。相比很多人喜欢收集一堆payload,然后一个个的去反复尝试,其实了解了这些payload的构造思路的话,往往只需要测试一些特殊字符,就大概心里有数了。
北京威努特技术有限公司(以下简称“威努特”), 是国内工控网络安全领军企业、全球六家荣获国际自动化协会安全合规学会ISASecure CRT Tool认证企业之一和亚太地区唯一国际自动化学会(ISA)全球网络安全联盟(GCA)创始成员。
威努特作为国家高新技术企业,以创新的“白环境”整体解决方案为核心,自主研发了全系列工控网络安全专用产品,拥有52项发明专利、50项软件著作权、52项原创漏洞证明等核心知识产权。积极牵头和参与工控网络安全领域国家、行业标准制定,受邀出色完成新中国70周年庆典、中共十九大、全国两会等重大活动的网络安保任务,被授予“国家重大活动网络安保技术支持单位”,得到了中央网信办、公安部、工信部等国家政府部门的高度认可。迄今已成功为电力、轨道交通、石油石化、军工、烟草、市政、智能制造、冶金等国家重要行业1000多家工业企业提供了全面有效的安全保障。
威努特始终以“专注工控,捍卫安全”为使命,致力于为我国关键信息基础设施网络空间安全保驾护航!
![强防御下的XSS绕过思路(二) 黑名单篇 强防御下的XSS绕过思路(二) 黑名单篇]()
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/144671.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论