本文仅作为技术讨论及分享,严禁用于任何非法用途。
前言
在某次演练中,发现了一处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=""> |