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

蓝字关注,回复“1”加入前端进阶群 与大家一起成长

昨日在公众号中挖掘到了一个 XSS 安全漏洞,目前该漏洞已经上报给腾讯,具体复现流程如下:

  1. 发一篇公众号文章,标题中包含<input onfocus="alert('1')">

  2. 用户打开文章后,在写留言页面中会发现标题没有被转义,正常被渲染成了 HTML

  3. 用户点击被渲染出来的输入框后执行代码

以下是复现漏洞的视频

素材来自公众号「遇见前端」

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

首先标题中存在 HTML<input onfocus="alert('1')">,在网页中如果不对这部分文本做转义的话,就会正常渲染为 HTML。

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

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

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

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

  • 反射型

  • 存储型

  • DOM 型

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

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

function escape(str) {
  str = str.replace(/&/g, '&amp;')
  str = str.replace(/</g, '&lt;')
  str = str.replace(/>/g, '&gt;')
  str = str.replace(/"/g, '&quto;')
  str = str.replace(/'/g, '&#39;')
  str = str.replace(/`/g, '&#96;')
  str = str.replace(/\//g, '&#x2F;')
  return str
}
// "&lt;script&gt;alert(1)&lt;&#x2F;script&gt;"
escape('<script>alert(1)</script>')

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

// 使用 js-xss 开源项目
const xss = require('xss')
let html = xss('<h1 id="title">XSS</h1><script>alert("xss");</script>')
// -> <h1>XSS</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
console.log(html)

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

最后

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

欢迎大家来聊聊自己在项目中遇到的安全问题。

- END -

长按二维码关注,漫漫前端路,结伴同行

来自恺哥的推荐阅读

我就知道你在看!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值