WAF攻防实践

  • A+
所属分类:安全文章

本篇文章由ChaMd5安全团队国外挖洞小组投稿

背景

上周在做安全测试时,发现站点的xss能够插入标签,当我想用on事件来执行javascript脚本时,发现被waf拦截了。

经常怼waf的,应该会碰到过,waf针对标签on属性名的拦截策略分为两种:

  • on属性名在黑名单列表
  • 以on开头,且满足其他条件,比如字符串长度大于一定长度

举个例子,payload包含<div onXXXXX=alert(1)>时,按照第一种策略,只有onXXXXX在黑名单列表中,才会被拦截。第二种策略就直接拦截了,因为onXXXXXon开头,且还比较长。

本文碰到的waf拦截策略是第一种,所以只要找到一个on属性不在黑名单列表中,就应该可以绕过。

所以问题变成了:

  • 怎么找到所有的on属性?
  • 怎么判断哪个on属性没有被过滤?
  • 怎么利用未过滤的on事件?

分析过程

怎么找到所有的on属性?

前端遍历BOM对象document的属性即可

  1. let results = [] 

  2. for (let i in document){ 

  3.   if(i.startsWith("on")){ 

  4.     results.push(i) 

  5.   } 

  6. console.log(results) 

  7. localStorage.onAttrs=JSON.stringify(results)

因为results字符串非常长,会在chrome控制台会被截断,所以把它存到localStorage中,结果在 Chrome devtool -> Application -> Storage 中可以找到。

怎么判断哪个on属性没有被过滤?

用burpsuite的intruder爆破模块过一遍,发现有两个属性没有拦截:

  1. ontransitionstart 

  2. onbeforexrselect

这两个属性我之前也没见过,那怎么利用这两个属性执行js呢?

怎么利用ontransitionstart属性?

根据MDN-transitionstart文档[1]构造出利用方式:

  1. <div class="transition" ontransitionstart="alert(1)">Hover over me</div> 

  2.  

  3. <style> 

  4. .transition { 

  5.   width: 10000px; 

  6.   height: 10000px; 

  7.   background: rgba(255,0,0,1); 

  8.   transition-property: transform, background; 

  9.   transition-duration: 1s; 

  10.   transition-delay: 1s; 

  11.  

  12. .transition:hover { 

  13.   transform: rotate(90deg); 

  14.   background: rgba(255,0,0,0); 

  15. </style>

虽然文档写的chrome和firefox都支持transitionstart事件,但是上面的利用payload实际测试结果:

firefox可以、chrome不行

chrome用addEventListener可以监听transitionstart事件,但不能用ontransitionstart来监听事件。这个原因不知道为啥。

  • 怎么利用onbeforexrselect属性?

    根据onbeforexrselect文档[2]来看,似乎beforexrselect事件还只是一个草案。

    也因为transitionstart事件已经能利用了,所以也没有再研究。

总结

  • 从防守方来看,如果采用了on事件黑名单,就需要保证事件黑名单的全面。

  • chrome和firefox on属性有区别,或许可以作为一个区分浏览器的指纹特征(虽然感觉很不稳定)。

  • 测试过程中,我还有一个疑问:不同元素之间的on属性是否会不同,比如div元素和document元素遍历出来的on属性是否会不同。有知道答案的读者可以后台告诉我。

PS

我个人把防火墙的绕过分为两个类别:

  • 架构层面的绕过,这种绕过不太关心具体的漏洞类型是xss还是sql注入
  • 漏洞类型相关的绕过

第一种架构层面的绕过姿势比较难找,这种较为通用的绕过姿势,从攻击队视角来看我觉得比较适合扫描器来绕过防火墙。这也是你的扫描器可以绕过防火墙么系列文章名称的由来。

后面就都写到这个"waf攻防实践"系列里来。

参考资料

[1]

MDN-transitionstart文档: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/transitionstart_event

[2]

onbeforexrselect文档: https://immersive-web.github.io/dom-overlays/

end


招新小广告

ChaMd5 Venom 招收大佬入圈

新成立组IOT+工控+样本分析 长期招新

欢迎联系[email protected]



WAF攻防实践

本文始发于微信公众号(ChaMd5安全团队):WAF攻防实践

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: