xss防御

xss的防御

反射型xss测试的时候,可以使用扫描器,或者burp进行fuzz

存储型xss测试的时候,可以直接把字典中的payload都塞进去,根据弹窗的编号,就知道是哪个。但这个容易被发现,所以可以先试探一下特殊符号是否被过滤。

DOM型xss测试,主要以阅读js代码为主。在页面上找打输入点的相关dom节点,在开发者选项中搜索一下,根据搜索结果去看是否被相关的JS操作,如果有js的操作,就去看我们的输入操作后输出在哪个地方,就按照常规的xss思路进行构建。

防御一般来说,做实体字符编码,htmlspecialchars(), 函数功能就是把特殊符号,比如尖括号,引号转换成实体编码,这样就不会再输入的地方去干扰页面源代码。

经过实体字符编码后,用户输入的特殊符号在源代码中就变成编码,但是在页面输出的时候,还是会显示成原来的样子。

当输出位置在元素内容里面,并且被实体编码后,基本上就没有xss的可能了。

但是如果输出在事件属性中,还是有可能存在绕过的可能性。

比如在a标签中,<a href=javascript:alert(1)>,这种形式,没有尖括号也没有引号,就有可能被绕过。如果存在类似这种的情况,需要在链接属性中加上http://或https://的正则表达式来限制。

xss的绕过方式

绕过过滤

1、前端限制,直接用F12开发者选项修改js既可,或者用burpsuite绕过。

2、字符过滤,双写,大小写绕过 通过注释符绕过,也可以通过换行符绕过

绕过编码

1、明确浏览器解析的机制

2、明白机制后,选择对应的编码

(1)输出在标签间的情况:测试<>是否被过滤或转义,若无则直接<imgsrc=1onerror=alert(1)> (2)输出在script标签内:我们需要在保证内部JS语法正确的前提下,去插入我们的payload。如果我们的输出在字符串内部,测试字符串能否被闭合。如果我们无法闭合包裹字符串的引号,这个点就很难利用了。可能的解决方案:可以控制两处输入且\可用、存在宽字节 (3)输出在HTML属性内:首先查看属性是否有双引号包裹、没有则直接添加新的事件属性;有双引号包裹则测试双引号是否可用,可用则闭合属性之后添加新的事件属性;TIP:HTML的属性,如果被进行HTML实体编码(形如'&#x27),那么HTML会对其进行自动解码,从而我们可以在属性里以HTML实体编码的方式引入任意字符,从而方便我们在事件属性里以JS的方式构造payload。 (4)输出在JS中,空格被过滤:使用/**/代替空格。 (5)输出在JS注释中:设法插入换行符%0A,使其逃逸出来。 (6)输出在JS字符串内:可以利用JS的十六进制、八进制、unicode编码。 (7)输出在src/href/action等属性内:可以利用javascript:alert(1),以及data:text/html;base64;加上base64编码后的HTML。

(8)当我们的XSSpayload位于这些标签中间时,并不会解析,除非我们把它们闭合掉。

​<textarea></textarea>
<title></title>
<iframe></iframe>
<noscript></noscript>​

<noframes></noframes> <xmp></xmp> <plaintext></plaintext>



posted @ 2020-06-06 14:36  清枫、  阅读(236)  评论(0编辑  收藏  举报