×

如何保护网页按钮不被XSS自动点击
  

新手264571 5520

{{ttag.title}}
如何保护网页按钮不被XSS自动点击

在社交网络里,很多操作都是通过点击按钮发起的,例如发表留言。假如留言系统有 XSS 漏洞,那么,XSS 自动点按钮有什么危害?有没有一种机制,让「发表留言」必须通过用户的「真实点击」按钮才能完成呢?




前言

XSS 自动点按钮有什么危害?

在社交网络里,很多操作都是通过点击按钮发起的,例如发表留言。假如留言系统有 XSS 漏洞,用户中招后 XSS 除了攻击之外,还能进行传播 —— 它能自动填入留言内容,并点击发表按钮,即可发出带有恶意代码的留言。好友看了中招后,又传播给他们的好友。。。从而形成蠕虫扩散。

那么,有没有一种机制,让「发表留言」必须通过用户的「真实点击」按钮才能完成,而无法通过脚本自动实现?这样就能减缓蠕虫传播速度了。

实现

这个想法听起来好像不可行。如果发表留言需要带上用户行为信息,那么 XSS 完全可以伪造一份行为数据,后端根本无法识别。

除非,用户在点击按钮时会产生一个「特殊数据」,让后端校验它。

但是,XSS 也可以直接调用按钮元素的 click 方法,这样效果和用户点击仍然一样。后端仍无法识别,是脚本点的,还是用户点的。

这么看来,我们只能保护好这个「按钮元素」,让它没法被 XSS 访问到。例如,放在一个不同源的 iframe 里,这样就和 XSS 所在的环境隔离了!

不过,这样还不够。假如 XSS 破解了这个「特殊数据」的生成规则,那么即可自己伪造一个,然后直接调用 HTTP 接口发表留言。所以,我们得找一个不可伪造的硬标识。

事实上,有个很简单的办法:我们干脆让 HTTP 请求也通过 iframe 发送。这样,后端通过 referer 即可检测请求是否为 iframe 发起的。毕竟,XSS 是无法伪造 referer 的!


另外,通过第三方服务器发表是不算的。这里为简单,省略了登录态;真实场合下,会话 Cookie 是 HttpOnly 的,无法被 JS 获取到,也就无法让第三方服务器代替发表。

细节:

1. 使用者加载 safebutton.js,引入 SafeButton 类

2. 使用者实例化 SafeButton 对象 A,创建出一个不同源的 iframe 作为按钮界面

3. 用户点击 iframe 按钮后,内部变量 S 置为 true,同时将点击消息告知主页面(postMessage)

4. 主页面收到消息后,让 A 产生 onclick 事件

5. 使用者将 HTTP 请求数据,通过 A 的 send 方法扔给 iframe

6. iframe 校验内部变量 S:若为 true,则将数据通过 AJAX 发送;否则放弃

7. 服务器校验 referer:若为 iframe 的地址,则继续业务逻辑;否则放弃

8. iframe 收到 AJAX 返回后,将结果扔给主页面

9. A 产生 onreceive 事件,其中包含 HTTP 返回结果

其中 No.6 的步骤最为关键。正是这一步,使得未经用户点击,XSS 强制扔给 iframe 的消息变得无效!

缺陷

当然,这个方案阻挡不了点击劫持 —— XSS 可以把 iframe 元素放大至整个页面,并设置全透明。

这样用户只要在页面的任何位置点一下,iframe 的 S 状态就变成 true 了,于是就能绕过 No.6。

结尾

当然,安全防御有胜于无。并且该方案的改造成本也不是很大,后端只是增加一个 referer 判断而已;前端也只需改造个别按钮,例如发帖按钮,像点赞这种按钮就没必要保护了。

feeling 发表于 2017-8-30 18:27
  
这个没操作过
小钢炮 发表于 2018-10-31 22:26
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
雨娃梦娃 发表于 2018-10-31 22:32
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
煮雨听茶 发表于 2018-10-31 22:38
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
五月虎 发表于 2018-10-31 22:41
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
七月人 发表于 2018-10-31 22:44
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
新手959695 发表于 2018-10-31 22:47
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
新手805957 发表于 2018-10-31 22:49
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
新手412848 发表于 2018-10-31 22:50
  
我正在参加社区万圣节活动,楼主不给我豆豆,我就在你这儿捣蛋
发表新帖
热门标签
全部标签>
西北区每日一问
技术盲盒
安全效果
【 社区to talk】
技术笔记
干货满满
每日一问
新版本体验
GIF动图学习
信服课堂视频
技术咨询
2023技术争霸赛专题
产品连连看
功能体验
安装部署配置
通用技术
秒懂零信任
技术晨报
自助服务平台操作指引
原创分享
标准化排查
排障笔记本
玩转零信任
排障那些事
SDP百科
深信服技术支持平台
POC测试案例
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
高手请过招
升级&主动服务
高频问题集锦
社区新周刊
全能先锋系列
云化安全能力

本版达人

新手68983...

本周分享达人

零和一网络

本周提问达人