0x00 前言
复现这个漏洞的过程中觉得很有分析的必要,而作者源码结合 log 调试分析的这篇文章已经写得比较详尽了,就想自己纯从审计的角度写一下分析巩固一下。
总之,如有不当,烦请评论捉虫,我会在第一时间响应并评论提示,谢谢。
0x01 简介
漏洞成因
可构造 uri 使 mod_proxy 请求转发给内部服务器造成 SSRF 。
影响版本
实验环境
代审环节个人建议是亲手编译调试 Apache 跟进,可以参照 P 神的教程:
编译调试 Apache
调试补充事项
不一定要 Ubantu,Kali 上笔者也调试成功了,最好用 VS,另外如果你想尝试用 CLion,可以参照下面的链接进行 SSH 远程调试,其余步骤都同上一样:
Stay local, let your IDE do remote work for you! | The CLion Blog (jetbrains.com)
CLion 调试需要注意有 cmake 和 gdb 版本限制,最好不要下载最新版本避免还要用软链接重新下载某一指定版本,或者更新 CLion 也是可以的。
【一>所有资源获取<一】
1、200份很多已经买不到的绝版电子书
2、30G安全大厂内部的视频资料
3、100份src文档
4、常见安全面试题
5、ctf大赛经典题目解析
6、全套工具包
7、应急响应笔记
8、网络安全学习路线
0x02 前置学习
为了理解漏洞原理,笔者个人认为是需要 Apache 和 PHP 一些前置知识学习的,就简单概括了并使之递进加深理解,很多点都会在分析过程中用到,行文结合了许多官方文档和自身理解整理以确保准确,如有缺漏不当之处,还请指出。
Apache 部署 php
众所周知,php 有五种运行模式,其中最常见的三种 CGI、FastCGI、Module 加载或者说 apache2handler 更为恰当(linux 下)。
Module 加载这种模式一般对于 Apache 而言,简单来说,就是把 PHP 作为 Apache 的一个子模块来运行,用 LoadModule 加载模块,最主要的模块就是 mod_php,漏洞实验环境配置调试也是以 LoadModule 加载 mod_proxy 的。
而 FastCGI 这个模式下会用到 PHP-FPM 这个进程管理器进行 FastCGI 管理,而非 CGI 的用 Web 服务器管理,其中的子进程叫做 PHP-CGI ,这次漏洞的突破点 mod_proxy 就与 PHP-FPM 有关,它从 PHP 5.3.3 就成为了 PHP 的内置管理器,所以配合这个从 Apache httpd 2.4.x 推出了使用 mod_proxy 的子模块 mod_proxy_fcgi 和 PHP-FPM 部署更高性能的 PHP 运行环境。
虽然现在明显用 Nginx+PHP-FPM 是更好的选择
mod_proxy 反向代理
顾名思义,这个模块与其相关模块为 Apache HTTP Server 实现代理 / 网关。
前面有说到 High-performance PHP on apache httpd 2.4.x using mod_proxy_fcgi and php-fpm 这种方式,本质就是 Apache 作为反代服务器用 mod_proxy_fcgi 这个子模块请求转发给 PHP-FPM ,而 PHP-FPM 监听的方式,也就是接收 Apache 转过去时处理 PHP 的请求的方式,有两种:
-
TCP Socket(ip and port)
ProxyPass / http://www.example.com:port -
UDS (Unix Domain Socket)**只在Apache 2.4.7 及更高版本中支持。**可以通过使用位于
unix:/path/app.sock|前面的目标来支持使用 UDS 。例如,要代理 HTTP 并将 UDS 定位于/home/www.socket,应使用unix:/home/www.socket|http://localhost/whatever/。ProxyPass / unix:/path/to/app.sock|http://example.com/app/name
对于反向代理而言, Apache 转发代理,也就是 Apache 发送请求给 PHP-FPM 的方式有三种,其中一种叫 ProxyPass ,这是指令,允许将远程服务器 Map 到本地服务器(反向代理 / 网关)的空间,对于不同监听方式的指令例子如上所示。
Apache hook 机制
说起 Apache Module 不能不提起 Apache hook,想要处理请求,要做的第一件事就是在请求处理过程中创建一个 hook,所有处理程序,就比如我们上面说到的 mod_proxy ,都会被挂接到请求过程的特定部分。服务器本身是不知道哪个模块负责处理特定请求的,所以会询问每个模块是否对给定请求感兴趣。然后,由每个模块决定是否像身份验证 / 授权模块那样拒绝服务请求,接


402



被折叠的 条评论
为什么被折叠?



