跨站脚本攻击(XSS)

什么是XSS

英文全称:Cross‑Site Script,为了和CSS(层叠样式表)区分,缩写命名为 XSS

攻击常发生在允许输入HTML内容的位置:评论区、CMS投稿、用户留言等。
黑客以普通用户身份,提交包含恶意JS脚本的HTML代码。其他用户访问页面时,恶意脚本会在浏览者浏览器中执行。

典型危害:
脚本可以读取当前用户的Cookie,并把Cookie发送给黑客。黑客拿到Cookie即可冒充账号登录;如果窃取到管理员Cookie,就可以获取网站管理员权限。

早期XSS案例大多是跨域场景,因此叫“跨站脚本”;现在即使不跨域,也可以实施攻击,但XSS名称保留沿用。

XSS两种常见类型

  1. 反射型XSS
    恶意代码放在URL参数里,请求触发后直接在页面输出,不会存入数据库,需要诱导用户点击恶意链接才会触发。
  2. 存储型XSS
    恶意脚本提交后保存到数据库(评论、投稿),所有访问该页面的用户都会触发脚本,危害更大。

ASP.NET WebForm 反射型XSS演示示例

页面 WebForm1.aspx

<body>
    <form id="form1" runat="server">
        <div>
            <asp:Literal ID="Literal1" runat="server"></asp:Literal>
        </div>
        <div>
            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        </div>
    </form>
</body>Code language: HTML, XML (xml)

后端按钮事件,直接把用户输入原样输出到页面,就会产生XSS漏洞:

protected void Button1_Click(object sender, EventArgs e)
{
    //漏洞:直接把用户输入渲染为HTML
    Literal1.Text = TextBox1.Text;
}Code language: JavaScript (javascript)

用户输入:<script>alert('XSS攻击')</script>,提交后脚本直接执行。

XSS 解决方案

  1. 输入过滤(保存数据库之前处理)
    过滤危险标签与事件:
  • JS事件:onclickonloadonmouseover
  • 危险属性:styleexpressionbackground:url(javascript:...) 等,清除可执行JS的代码。
  1. 使用UBB编辑器
    不直接保存HTML,转成UBB标记语法。只保留安全排版功能,自动禁用JS事件、危险脚本。
  2. 业务上尽量不要开放HTML输入权限
    如CMS投稿、评论模块,非必要不要支持完整HTML。
  3. 输出编码(重要)
    把用户输出内容做HTML编码,< > " '转义成实体字符,浏览器只会当成普通文本展示,不会解析执行脚本。

配合Cookie设置HttpOnly=true,就算XSS漏洞出现,JS脚本也无法读取Cookie,降低损失。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注