• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評(píng)論 - 101, 引用 - 0
            數(shù)據(jù)加載中……

            js偽造Referer來(lái)路

            js偽造Referer來(lái)路  

            2014-06-30 21:33:23|  分類: 默認(rèn)分類|舉報(bào)|字號(hào) 訂閱

            首先說(shuō)明,偽造訪問(wèn)來(lái)路不是什么光明正大的事情,目的就是為了欺騙服務(wù)器。原本以為給 XMLHTTP 對(duì)象增加一個(gè) Referer header 就可以,結(jié)果卻沒(méi)有任何作用,改用 ServerXMLHTTP 也如此。

            無(wú)意間發(fā)現(xiàn)公司內(nèi)部項(xiàng)目使用的 paypal 扣款程序里面有 WinHttp.WinHttpRequest.5.1 對(duì)象,它負(fù)責(zé)把客戶的信用卡信息提交到 paypal 的服務(wù)器,看來(lái)是一個(gè)核心的遠(yuǎn)程訪問(wèn)方法,google一下發(fā)現(xiàn)它居然用可以成功偽造所有 http 請(qǐng)求的 header 信息!下面的代碼通過(guò)偽造 referer 的值,假裝從百度首頁(yè)提交一個(gè)表單到指定的 url 去:

            1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            var url = "http://www.yourtarget.com";  

            var param = "name=david&age=30";  

            var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");  

            obj.Open("POST", url, false);  

            obj.Option(4) = 13056;  

            obj.Option(6) = false; //false可以不自動(dòng)跳轉(zhuǎn),截取服務(wù)端返回的302狀態(tài)。  

            obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  

            obj.setRequestHeader("Referer", "http://www.baidu.com");  

            obj.Send(param);  

            WScript.Echo(obj.responseText);

            保存為 xxx.js 文件,在命令行中運(yùn)行 cscript.exe xxx.js

            msdn得知,WinHttp.WinHttpRequest.5.1  msxml 4.0 的底層對(duì)象,也就是說(shuō) XMLHTTP/ServerXMLHTTP 也是在它的基礎(chǔ)上封裝而來(lái)。用 WinHttpRequest 發(fā)的請(qǐng)求,連 Fiddler 也監(jiān)測(cè)不到,看來(lái)確實(shí)是比較底層的東西。

            ---------------------------邪惡的分割線------------------------

            既然可以用它來(lái)偽造所有 http 請(qǐng)求的 header,那 CookiesSessionid 自然也就可以得到并傳遞了。下面是實(shí)戰(zhàn)代碼,用命令行登錄博客園,共三次請(qǐng)求,第一次請(qǐng)求獲取表單的 VIEWSTATE  EVENTVALIDATION,第二次帶賬戶登錄,第三次帶Cookie訪問(wèn)其首頁(yè):

            //封裝成遠(yuǎn)程訪問(wèn)的函數(shù)  

            function RemoteCall(method, url, param, header){  

                var obj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");  

                obj.Open(method||"GET", url, false);  

                obj.Option(4) = 13056;  

                obj.Option(6) = false;  

                if(method=="POST"){  

                    obj.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  

                }  

                if(header){  

                    for(var key in header){  

                        if(key=="Cookie"){//根據(jù) MSDN 的建議,設(shè)置Cookie前,先設(shè)置一個(gè)無(wú)用的值  

                            obj.setRequestHeader("Cookie", "string");  

                        }  

                        obj.setRequestHeader(key, header[key]);  

                    }  

                }  

                obj.Send(param);  

                return obj;  

            }  

            //第一次遠(yuǎn)程訪問(wèn)博客園的登錄入口  

            var url = "http://passport.cnblogs.com/login.aspx";  

            var objFirst = RemoteCall("GET", url, null);  

                   

            //取得 viewstate 與 eventvalidation  

            var viewstate = objFirst.responseText.match(/id="__VIEWSTATE" value="(.*?)" \/>/)[1];  

            var eventvalidation = objFirst.responseText.match(/id="__EVENTVALIDATION" value="(.*?)" \/>/)[1];  

                   

            //輸入自己的賬戶與密碼  

            var username = "";  

            var password = "";  

            var param = "" 

            + "__VIEWSTATE="+encodeURIComponent(viewstate)   

            + "&__EVENTVALIDATION="+encodeURIComponent(eventvalidation)   

            + "&tbUserName="+username  

            + "&tbPassword="+password  

            + "&btnLogin="+encodeURIComponent("登  錄");  

                   

            var objSecond = RemoteCall("POST", url, param);  

                   

            //登錄成功后服務(wù)器執(zhí)行 Response.Redirect 跳轉(zhuǎn),即向客戶端發(fā)送了 302 狀態(tài)代碼  

            WScript.Echo(objSecond.status); //302即登錄成功, 如果是200,則登錄失敗,頁(yè)面沒(méi)有跳轉(zhuǎn)  

                   

            //帶上登錄成功后的cookie,再次訪問(wèn)其首頁(yè)  

            var json = {"Cookie": objSecond.getResponseHeader("Set-Cookie")};  

            var objThird = RemoteCall("GET", "http://www.cnblogs.com", null, json);  

            WScript.Echo(objThird.responseText);

            上面的代碼其實(shí)已經(jīng)有一定惡意,我只為證明使用 WinHttpRequest  確實(shí)可以模擬瀏覽器發(fā)送請(qǐng)求,服務(wù)端也無(wú)法區(qū)別是從瀏覽器來(lái)的,還是從命令行來(lái)的。這證明到一點(diǎn),從客戶端提交來(lái)的任何數(shù)據(jù)都不可信,因?yàn)榘l(fā)送的 http 數(shù)據(jù)包不但表單值可以修改,連數(shù)據(jù)包的header都可以隨意修改。同時(shí)也說(shuō)明,使用 VIEWSTATE 對(duì)表單的安全性無(wú)任何用處。

            posted on 2015-02-20 17:23 tqsheng 閱讀(2956) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            怡红院日本一道日本久久 | 久久天天躁夜夜躁狠狠| 麻豆一区二区99久久久久| 久久精品国产亚洲77777| 91久久精品91久久性色| 夜夜亚洲天天久久| 亚洲欧洲精品成人久久曰影片| 亚洲色婷婷综合久久| 亚洲色欲久久久综合网东京热| 潮喷大喷水系列无码久久精品| 久久精品国产72国产精福利| 久久精品国产乱子伦| 亚洲国产天堂久久综合网站| 久久亚洲国产最新网站| 久久免费精品视频| 久久综合精品国产二区无码| 久久国产福利免费| 99久久人妻无码精品系列蜜桃| 久久99精品国产麻豆婷婷| 色综合久久久久综合体桃花网| 国产成人精品久久亚洲高清不卡| 国产成人综合久久精品红| 国产精品激情综合久久| 久久久av波多野一区二区| 久久久高清免费视频| 日韩一区二区久久久久久| 久久久婷婷五月亚洲97号色| 亚洲欧美成人久久综合中文网 | 国内精品久久久久久99| 亚洲美日韩Av中文字幕无码久久久妻妇 | 国产精品久久婷婷六月丁香| 久久人人超碰精品CAOPOREN | 99久久99久久精品免费看蜜桃| 精品伊人久久久| 狠狠精品久久久无码中文字幕| 日本精品久久久久影院日本| 久久精品国产亚洲Aⅴ蜜臀色欲 | 久久亚洲熟女cc98cm| 无码8090精品久久一区| 久久久久亚洲av成人无码电影| 久久久这里有精品中文字幕|