Web靶场渗透实战:从备份文件泄露到SSRF漏洞利用链分析
Web渗透中的非常规信息收集
在Web安全测试与CTF竞赛中,面对结构复杂的靶场环境,盲目依赖自动化扫描工具往往会遗漏关键的业务逻辑漏洞。高效的渗透测试通常始于细致的信息收集,尤其是针对开发者遗留的敏感文件进行挖掘。本文将以一个典型的社交博客靶场为例,剖析如何通过基础信息收集获取源码,并进一步审计出潜在的服务器端请求伪造(SSRF)漏洞。
利用 robots.txt 挖掘敏感路径
robots.txt 文件主要用于指导搜索引擎爬虫的抓取行为,但在安全评估中,它经常成为暴露系统隐藏目录的突破口。通过请求该文件,测试者可以快速定位被开发者刻意隐藏或遗忘的备份文件。
# 探测目标站点的 robots.txt
curl -s http://target-host/robots.txt
假设目标站点返回了如下配置:
User-agent: *
Disallow: /profile.php.bak
Disallow: /manage/
Disallow: /db_dump/
需要明确的是,Disallow 仅仅是针对合规爬虫的协议约束,并不具备访问控制能力。上述配置中的 /profile.php.bak 暴露了一个典型的备份文件泄露风险。在Web开发过程中,开发者习惯使用 .bak、.old 或 ~ 后缀来备份修改前的代码。若这些文件未被清理且存放在Web根目录下,将直接导致源代码泄露。
泄露源码的审计与漏洞定位
成功下载 /profile.php.bak 后,我们对其核心业务逻辑进行代码审计。以下是重构后的关键类定义:
<?php
class UserProfile {
public $username = "";
public $userAge = 0;
public $personalSite = "";
public function __construct($username, $userAge, $personalSite) {
$this->username = $username;
$this->userAge = intval($userAge);
$this->personalSite = $personalSite;
}
// 发起外部HTTP请求的核心方法
private function fetchRemoteData($targetUrl) {
$curlHandle = curl_init();
curl_setopt_array($curlHandle, [
CURLOPT_URL => $targetUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => false
]);
$responseBody = curl_exec($curlHandle);
$statusCode = curl_getinfo($curlHandle, CURLINFO_HTTP_CODE);
curl_close($curlHandle);
return ($statusCode === 404) ? "404 Not Found" : $responseBody;
}
// 获取用户博客内容的封装方法
public function loadSiteContent() {
return $this->fetchRemoteData($this->personalSite);
}
// 验证博客URL合法性的方法
public function validateSiteUrl() {
$parsedUrl = parse_url($this->personalSite);
// 仅允许 http 和 https 协议
$allowedSchemes = ['http', 'https'];
return isset($parsedUrl['scheme']) && in_array($parsedUrl['scheme'], $allowedSchemes);
}
}
?>
在上述代码中,UserProfile 类包含了一个 fetchRemoteData 方法,该方法直接接收用户可控的 $targetUrl 参数,并使用 cURL 库发起网络请求。虽然 validateSiteUrl 方法对协议进行了限制(仅允许 HTTP/HTTPS),但在实际调用链中,如果 loadSiteContent 执行前未严格调用验证方法,或者验证逻辑存在绕过可能,攻击者便可构造恶意的 personalSite payload。这不仅可能引发服务器端请求伪造(SSRF),用于探测内网服务,还可能结合其他协议读取本地敏感文件或攻击内网其他组件。