0%

记一次XSS绕过

本文仅作为技术讨论及分享,严禁用于任何非法用途。

前言

在某次演练中,发现了一处XSS注入点,位于input标签内,但是它拦截了大部分事件且拦截尖括号,并且标签内有disable,导致无法利用,本文记录一下绕过过程。

正文

首先简单看一下参数输出点,可以看到是在input标签内

简单测试,双引号不拦截,尖括号拦截


不能用尖括号的话,看来只能通过js事件触发了,fuzz了一下js事件,看到还是有几个事件还能用

事件用法可以参考HTML 事件属性

onshowontoggle事件因为要<menu> 元素或者<details>元素等才能触发,而本例是有拦截尖括号的,所以无法使用,而oninvalid事件需要在<form>内,而本例中的注入点恰好是在在<form>内,那么就选用oninvalid作为触发事件测试

先看一下oninvalid事件的触发样例

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<form id="wapFrom" action="/" method="post">
查询号码:
<input type="text" pattern="a" oninvalid="alert(1)" />

<input type="submit" value="Submit">

</form>
</body>
</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
2
3
<form action="">
<input type="text" value="xss" oninvalid=a=alert;a(1) pattern="a" type="submit" a=" disabled="disabled" style="margin-top: 1px;">
</form>