基础XSS攻击应对

基础XSS应对方法 - 笔记

XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
这些恶意网页程序通常是JavaScript,但实际上也可以包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

0 不要信任前端

用户可能在前端输入任何内容,不一定谁在什么时间就构造一个恶意串搞搞你。尽可能的不要信任 前端过来的数据,除非你非常知道这玩意儿不会造成伤害。

1 打开浏览器的XSS防护

能打开就打开吧,从 浏览器端 防止部分 反射型XSS 攻击。

2 配置CSP条款

内容安全策略(CSP,Content-Security-Policy),被誉为 防范XSS攻击的大杀器。通过在Meta头或其他位置配置的CSP条款,可以有效的阻止XSS脚本的运行。

如果你是小型站点或者在筹备开发的新站点,强烈建议配置CSP。一来可以防范XSS攻击,二来可以规范代码,一举两得。

如果你是已经上线的项目或者错综复杂的大项目,不太方便开启CSP,那么可以利用其中的 仅发送违规报告 的方式来查看配置好的CSP条款对你的项目运行有什么影响。在这个模式下,你一样可以配置CSP条款并应用到站点,但是条款不会被执行。仅仅是记录违规报告并发送到你指定的地址。你可以利用该方法检查配置条款对站点的影响,在不影响功能的前提下应开尽开。

如果受影响的功能可以用较小的 Effort 修好,那还是修好它然后打开 CSP 吧。

3 使用HttpUtility.HtmlEncode(str)编码字符串(C#)

HttpUtility.HtmlEncode(str)会将需要显示在页面上的文字进行转义,虽然你在页面上看到的是原样的字符串,HTML代码里也是原样的字符串。但是他们确实已经被转义过了。

我们可以认为经过转义的字符串是安全的。虽然其中可能包含攻击脚本,但已经不会被执行。

请注意:

  • 该方法不适用与 数据中必须包含HTML标签 的情况。如果你以来HTML标签来实现某些样式,请不要使用该方法。例如富文本编辑器。
  • 如果用户不会将字符串存回数据库,只是从数据库里提出来并显示,那无所谓。如果用户还需要编辑该字段并存回数据库。在存回数据库之前记得用 HTTPUtility.HtmlDecode(str) 解码。否则会出现递归编码,字符串将被破坏。

4 借助HtmlSanitizer或Jsxss来剔除或转义标签

HtmlSanitizer和Jsxss是非常棒的两个工具,你可以自定义规则,再由他们根据你定义的规则去剔除或转义标签。

HtmlSanitizer会直接干掉被你列入黑名单的标签。

Jsxss会对你认为有风险的标签进行转义。包含在其中的脚本不会被执行,而会被原样显示在页面上。这一点和HtmlEncode很像。

5 限制字符串长度

总有奇技淫巧可以绕过你的防范。比如 JsFuck。它通过六种字符就可以构造一个攻击脚本。这六种字符恰恰是比较常见常用的。或者用ASCII码转八进制,所有JS代码都可以被写成这种形式。怎么防范呢?

好在这两种方法重写的脚本都不会很短,尤其是JsFuck,alert(1)经过它的重写,长度居然达到了惊人的1227个字符。好在正儿八经的输入都不会这么长。限制一下可输入的字符串长度,截断它,就能解除一部分威胁。

6 剔除特征文本

上一节说到的JsFuck,他实在是太有特征了,你甚至可以在它的页面上找到组成它的基本串(写这玩意儿的大哥编译原理真的学的很好了)。

写个正则,匹配到这些基本串就移除。干掉了特征文本,也可以解除一部分威胁。

当然还有其他特征文本。找到,用正则一并收拾了。反正会给系统里写这玩意儿的也不是什么好鸟。

7 替换/转义特殊字符

这是第三节的补充,可能HTMLEncode的功能并不能满足你的要求,那就在它的基础上再写一点替换或转义的规则吧。

别光顾着写替换的规则,还要写怎么换回来。你肯定不希望到时候你的数据库里充斥着各种替换或转义来的乱码吧。

8 参考文档

浏览器XSS防护:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-XSS-Protection

内容安全策略:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP

HtmlDecode:https://docs.microsoft.com/zh-cn/dotnet/api/system.net.webutility.htmldecode?view=netcore-3.1

HtmlEncode:https://docs.microsoft.com/zh-cn/dotnet/api/system.net.webutility.htmlencode?view=netcore-3.1

HtmlSanitizer:https://github.com/mganss/HtmlSanitizer

JsXss:https://jsxss.com/zh/index.html

JsFuck:http://www.jsfuck.com/

写在后面

新手上路,经验不足。学习了新知识,在这里做做笔记。如果有不足的地方,还望大佬们不吝赐教。感谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值