微博投票XSS漏洞

0、案例描述

收到了公司安全组发来的一个反射型XSS漏洞提醒,修复建议:请在参数值输出点做过滤或者编码转换,
链接如下:

http://vote.weibo.com/widget?vid=2977008&skin=&isCustom=1&height=448zdxxn"><img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3Ealert(1)%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<script>" title="<script>" />yptrj

点开后确实呈现了一个弹窗,查看了接收参数和展示参数的地方, 直接展示了接收到的参数。

// controller
$r = $this->getRequest();
$wiget_width = $r->getQuery('width', 600);
$wiget_height = $r->getQuery('height', 600);

// view

<div style="height: <?=$wiget_height?>px" >;

快速做了一个类型转换,上线修复了问题

$wiget_width  = intval($r->getQuery('width', 600));
$wiget_height = intval($r->getQuery('height', 600));

1、漏洞分析(XSS攻击)

修复漏洞还是相对容易的事情,但究竟啥是XSS攻击?

之前听说过XSS攻击,没有深入了解过,也没有遇到过。查了下,网上总结这个的文章还是相当多的。XSS是Cross-site scripting(跨站脚本)的简称,在别人的站点嵌入脚本,而这个脚本原来不是属于这个站点的,所以叫跨站脚本。嵌入的脚本通常是JS(也可以是Java/HTML等),通过编写不同功能的程序,可以实现获取Cookie、私密网页内容、更高的权限……带着这种恶意的目的的脚本可以达成对站点的攻击,史称XSS攻击。

Cross-site scripting的英文首字母缩写本应为CSS,但因为CSS在网页设计领域已经被广泛指层叠样式表(Cascading Style Sheets),所以将Cross(意为“交叉”)改以交叉形的X做为缩写。

那么,啥是反射型XSS呢,还有哪些其他类型呢?
严格来说XSS并没有标准的分类,根据表现形式和存储形态主要分为二大类:非持久型(Non-persistent)和持久性(Persistent)。非持久型通常叫反射性(Reflected), 而持久性通常叫存储型(Stored)。

第一类:反射型XSS。
用户通过Web客户端提交给服务端的数据,立刻用于解析和显示该用户的结果页面(数据没有在服务端存储)。如果提交的数据中含有恶意的脚本代码,而服务端没有经过编码转换或者过滤,就会形成XSS攻击,这种形式的XSS称为反射型XSS。

常见的通过浏览器地址栏输入的HTTP GET请求参数和页面搜索框输入的POST查询内容。恶意用户通过构造含恶意脚本的URL, 发送到各种群、朋友圈、邮箱,诱导用户点击,获取点击用户的信息,达到攻击目的。

例如上面微博投票的案例就是典型的XSS漏洞。另一个经典的反射性XSS攻击案例是2011年6月28日新浪微博的部分用户自动发微博,发私信的例子,详细过程可见,新浪微博的XSS攻击

第二类:存储型XSS。
用户通过Web客户端提交给服务端的数据,由服务端保存,然后永久显示在其他用户的页面上。如果提交的数据中含有恶意的脚本代码,而服务端在存储前或展示前没有经过编码转换或者过滤,就会形成XSS攻击,这种形式的XSS称为存储型XSS。

这种场景通常是用户的留言、评论中含有恶意脚本,存储在了服务器中,普通用户访问到就会受到攻击,理论上该Web应用的任何用户都是攻击对象。

2、风险分析

如果这个漏洞被恶意用户发现和利用,势必会造成部分用户在微博上的一些行为比如发博、转发、评论等被操控。

3、总结(XSS攻击防范)

很多RD没有经历过Web攻击,对Web安全往往没有什么概念。通过这次事件,深刻理解了,平常在写代码的时候,参数检查的重要性。

简单说下针对XSS这种Web攻击的防范总结:

  • 有安全意识,熟悉常见的漏洞和攻击方式。
  • 接收用户的参数要严格校验类型和长度, 只允许用户输入我们期望的数据。
  • 存储的数据存储前务必通过HTML Encoding(PHP中可以使用htmlspecialchars、htmlentities)。

这也是在大公网工作额外的收益,带给你的是眼界和见识。所以我一直赞同经历就是财富。

参考:
维基百科:跨站脚本
Cross-site scripting
美团:如何防止XSS攻击

发表评论

电子邮件地址不会被公开。 必填项已用*标注