前言

做36D杯的时候,遇到了一道y1ng师傅出的题,学到了一个比较好的解题思路,现在记录一下解题过程

正文

拿到题目后打开,是一个魔方

hint:不需要跑脚本

观察了很久,在最开始的源码处发现一个突破点:

image-20200513160129855

丢进扫描器里面扫描,得到一个备份文件index.php.bak,下载下来用notepad++打开,内容为:

visit all_info_u_want.php and you will get all information you want

= =Thinking that it may be difficult, i decided to show you the source code:


<?php
error_reporting(0);

//give you all information you want
if (isset($_GET['all_info_i_want'])) {
    phpinfo();
}

if (isset($_GET['file'])) {
    $file = "/var/www/html/" . $_GET['file'];
    //really baby include
    include($file);
}

?>



really really really baby challenge right? 

分析一下源代码,知道我们下一步要到all_info_u_want.php,而且可以知道考察点是文件包含,然而$file中已经拼接了/var/www/html,所以不能用php wrapper,那就从目录穿越来包含

通过https的协议头我们知道是用的nginx,然后在phpinfo中我们看到服务器所在的系统是ubuntu,尝试着用目录穿透,构造一下payload

all_info_u_want.php?file=../../../var/log/nginx/access.log

能正常回显,下面我先说下payload为何这样构造:

首先我们先来了解一下nginx的access.log

当我们访问nginx服务时,nginx会记录日志,其中access.log记录的是访问日志,每一次访问成功,都会在access.log下添加一条访问日志,其一般格式是这样的

10.1.1.1 - - [09/Feb/2019:22:41:28 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
//ip - - 时间戳 请求方式 目标 http版本号 服务器响应状态码 user-agent 

服务器安装了nginx,默认情况下,ubuntu安装的nginx默认位置是/var/log/nginx,而access.log默认就在nginx目录下,也就是说access.log的默认路径为/var/log/nginx/access.log,当然,这是可以修改的(小声祈祷不要修改)

思路是这样的:加入我们在把一句话木马写在user-agent那么以后访问access.log的时候就可以RCE了

image-20200514024416437

从phpinfo中我们可以看到$_SERVER[‘SCRIPT_FILENAME’]为/var/www/html/all_info_u_want.php,然后通过目录穿越构造三个../回到根目录,然后再一层层进入到access.log。然后进行RCE(这个还没怎么学,下次一定学[狗头])

记录就到这里

结尾

参考链接:

http://www.zsythink.net/archives/3213/

https://www.gem-love.com/ctf/2283.html#给你shell

说点什么
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...