微信公众号爆出前端xss安全漏洞

2023年 7月 10日 59.3k 0

公众号中挖掘到了一个 XSS 安全漏洞,具体复现流程如下:

  • 发一篇公众号文章,标题中包含
  • 用户打开文章后,在写留言页面中会发现标题没有被转义,正常被渲染成了 HTML
  • 用户点击被渲染出来的输入框后执行代码
  • 以下是复现漏洞的视频

    视频链接

    现在我们来分析下这个漏洞的产生过程。

    首先标题中存在 HTML ,在网页中如果不对这部分文本做转义的话,就会正常渲染为 HTML。

    在文章详情中其实我们并没有发现这个问题,也就说明了在该页面中开发者是做了文本转义的。

    但是在留言页面中却出现了该问题,也就是说开发者并没有做标题的转义,因此导致了这个问题的发生。

    虽然这个问题触发条件不是那么容易,但是对于微信这样亿级日活的产品出现这样低级的安全问题实属没想到。

    我们把这样的安全问题称之为 XSS 攻击。根据攻击的来源,我们可以将此类攻击分为三种,分别为:

    • 反射型
    • 存储型
    • DOM 型

    在这个案例中我们遇到的是存储型 XSS 攻击。此类攻击是攻击者将恶意代码提交至服务器并保存在数据库中,用户访问该页面触发攻击行为。这种类型的攻击常见于保存用户编辑数据的场景下,比如案例中的发表文章,亦或者评论场景等等。

    防范存储型 XSS 攻击的策略就是不相信一切用户提交的信息,比如说用户的评论、发表的文章等等。对于这些信息一律进行字符串转义,主要是引号、尖括号、斜杠

    function escape(str) {
      str = str.replace(/&/g, '&')
      str = str.replace(//g, '>')
      str = str.replace(/"/g, '&quto;')
      str = str.replace(/'/g, ''')
      str = str.replace(/`/g, '`')
      str = str.replace(/\//g, '/')
      return str
    }
    // "<script>alert(1)</script>"
    escape('alert(1)')
    复制代码

    但是在显示富文本的场景下其实不能把所有的内容都转义了,因为这样会把需要的格式也过滤掉。对于这种情况,通常考虑采用白名单过滤的办法。

    // 使用 js-xss 开源项目
    const xss = require('xss')
    let html = xss('XSSalert("xss");')
    // -> XSS<script>alert("xss");</script>
    console.log(html)
    复制代码

    在白名单的情况下,h1 标签不会被转义,但是 script 能被正常转义。

    最后

    安全无小事,大家在做项目的时候应该时刻关注在类似场景下的可能出现的安全问题。

    相关文章

    Mallox勒索软件新Linux变种现世
    伪装成破解程序和商业工具的新型恶意软件正在传播
    Orcinius后门新样本分析
    Poseidon窃取程序通过Google广告感染Mac用户
    大选开始之际,欧盟各政党遭受 DDoS 攻击
    微软2024

    发布评论