本文仅作为技术讨论及分享,严禁用于任何非法用途。
前言
在某次演练中,发现了一处XSS注入点,位于input
标签内,但是它拦截了大部分事件且拦截尖括号,并且标签内有disable
,导致无法利用,本文记录一下绕过过程。
正文
首先简单看一下参数输出点,可以看到是在input标签内
简单测试,双引号不拦截,尖括号拦截
不能用尖括号的话,看来只能通过js事件触发了,fuzz了一下js事件,看到还是有几个事件还能用
事件用法可以参考HTML 事件属性
onshow
、ontoggle
事件因为要<menu>
元素或者<details>
元素等才能触发,而本例是有拦截尖括号的,所以无法使用,而oninvalid
事件需要在<form>
内,而本例中的注入点恰好是在在<form>
内,那么就选用oninvalid
作为触发事件测试
先看一下oninvalid
事件的触发样例
1 | <html> |
oninvalid
事件会以正则表达式判断pattern
属性的值,这里是a
,那么当在input框输入的值不是全等于a
的时候,并且被submit
提交,就会触发oninvalid
事件
本地保存以上代码为HTML文件,再使用浏览器打开。经过测试,随意输入字符串,点击提交后可以触发xss
绕过事件拦截
那么现在可以开始构造绕过payload了,因为需要submit
提交,所以添加type="submit"
1 | xss" oninvalid=console.log(1) pattern="a" type="submit" |
绕过disable属性
因为标签内有disabled="disabled"
,导致标签被禁用,所以需要屏蔽该元素,但是双斜杠//
以及<!--
因为存在<
也被拦截,这里使用a=
绕过,拼接后变成a=" disabled="disabled"
,浏览器就会把" disabled="
当做属性a
的值,从而绕过标签禁用,所以payload修改为:
1 | xss" oninvalid=console.log(1) pattern="a" type="submit" a= |
绕过js函数拦截
因为直接oninvalid=alert(1)
会被拦截,使用变量绕过函数拦截,把alert(1)
拆分为a=alert;a(1)
进行绕过,最终payload为:
1 | xss" oninvalid=a=alert;a(1) pattern="a" type="submit" a= |
小结
本文通过实际案例介绍了3个xss绕过小技巧,如有更好的方法,请各位师傅不吝赐教。
后记
文章在t00ls发布后有师傅问道”input中 先是text然后submit 最后的input应该显示的还是text,图中的form中没有submit 最后是咋触发的…”,想了下这点确实没特地提出来,实际上xss插入的type即是text又是submit,保存以下代码为HTML可自行测试,在文本框中按回车即可触发。
1 | <form action=""> |