Pikachu靶场从入门到精通(六):不安全文件下载、目录遍历、敏感信息泄露与URL重定向漏洞实战
摘要:本篇是Pikachu靶场系列教程的第六篇,也是漏洞类型相对“轻量”但实际场景中极为常见的一篇,将带领大家攻克四个重要但容易被忽视的Web安全漏洞模块:不安全文件下载(任意文件下载)、目录遍历(路径遍历)、敏感信息泄露和不安全的URL重定向。
与前几篇动辄可以获取服务器权限的高危漏洞不同,本篇涉及的四个漏洞虽然单个来看危害等级不算最高,但它们往往是攻击链中最关键的信息收集环节。不安全文件下载可以让攻击者直接下载数据库配置文件、源代码等敏感信息;目录遍历让攻击者能够探索服务器文件结构;敏感信息泄露直接在代码注释、报错信息、响应头中暴露密码、内网地址等关键数据;不安全的URL重定向则可以被用于钓鱼攻击,窃取用户凭证。
本篇将从零基础出发,对每个模块先讲解基础知识,再按照关卡介绍→攻击思路→实操步骤→代码解析→防御方案的结构逐一通关。这些漏洞的原理相对简单,非常适合初学者建立安全思维,理解“什么信息不该暴露给用户”这个核心安全理念。
一、不安全文件下载(任意文件下载)
1.1 基础知识
什么是不安全文件下载?
不安全文件下载(Unsafe File Download),也称为任意文件下载漏洞,是指Web应用程序在提供文件下载功能时,未对用户请求的文件路径或文件名进行充分验证,导致攻击者能够通过构造特殊请求下载服务器上的任意文件(包括敏感文件)。
文件下载功能的正常流程:
用户点击下载链接 → 前端传递文件名参数 → 后台拼接文件路径 → 服务器返回文件
漏洞产生的原因:
| 原因 | 说明 |
|---|---|
| 未验证文件路径 | 直接使用用户提供的参数构造文件路径,未做过滤 |
| 目录遍历攻击 | 允许使用../等特殊字符进行目录跳转 |
| 硬编码或可预测路径 | 文件路径可被猜测或枚举 |
| 权限控制不足 | 未验证用户是否有权访问请求的文件 |
常见可下载的敏感文件:
| 文件类型 | 路径示例 | 包含信息 |
|---|---|---|
| 数据库配置文件 | /inc/config.inc.php | 数据库账号密码 |
| 系统密码文件 | /etc/passwd | Linux系统用户信息 |
| Web配置文件 | /web.config、.htaccess | 服务器配置信息 |
| 源代码文件 | *.php、*.jsp | 业务逻辑和敏感算法 |
| 日志文件 | /var/log/ | 系统运行日志 |
1.2 不安全文件下载实战
关卡介绍
Pikachu的不安全文件下载关卡模拟了一个NBA球员图片下载功能。页面展示了几位NBA球星的图片,用户可以点击下载。下载链接中包含filename参数,用于指定要下载的文件名。
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=kb.png攻击思路
程序直接将filename参数的值拼接到文件路径中,没有做任何过滤。攻击者可以利用../进行目录遍历,读取服务器上的任意文件。
实操步骤
第一步:进入关卡
访问不安全文件下载页面:页面显示了几个NBA球员头像(科比、詹姆斯、库里等)。
第二步:抓包分析
点击任意一个球员的图片下载链接,用Burp Suite拦截请求或直接在浏览器中观察URL:可以看到filename参数指定了要下载的文件名。
第三步:尝试下载敏感文件——配置文件
Pikachu的数据库配置文件位于/inc/config.inc.php,尝试构造路径读取它:
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php如果成功,浏览器会下载config.inc.php文件,打开后可以看到数据库配置信息:
第四步:读取系统敏感文件
在Linux系统中尝试读取密码文件:
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../etc/passwd在Windows系统中尝试读取系统文件:
// 如果没有在c盘那就不好意思了 http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../Windows/System32/drivers/etc/hosts第五步:读取网站源码
尝试读取当前页面的源码:
http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filename=../../unsafedownload/execdownload.php代码解析
// execdownload.php <?php // 设置根目录路径 $PIKA_ROOT_DIR = "../../"; include_once $PIKA_ROOT_DIR."inc/function.php"; // 从GET参数获取文件名(直接使用用户输入,未过滤) $file_path="download/{$_GET['filename']}"; // 转换字符编码 $file_path=iconv("utf-8","gb2312",$file_path); // 检查文件是否存在 if(!file_exists($file_path)){ skip("你要下载的文件不存在,请重新下载", 'unsafe_down.php'); return ; } // 以二进制模式打开文件并输出 $fp=fopen($file_path,"rb"); $file_size=filesize($file_path); ob_clean(); Header("Content-type: application/octet-stream"); Header("Accept-Ranges: bytes"); Header("Content-Length:".$file_size); Header("Content-Disposition: attachment; filename=".basename($file_path)); $buffer=1024; while(!feof($fp)){ $data=fread($fp,$buffer); echo $data; } fclose($fp); ?>漏洞原因分析:
用户输入未过滤:
$_GET['filename']直接拼接到文件路径中路径遍历漏洞:可以使用
../跳出download/目录无权限验证:没有检查当前用户是否有权下载该文件
直接暴露文件内容:使用
application/octet-stream强制下载任何文件
防御方案
白名单验证:只允许下载预设的文件列表
$allow_files = ['kb.png', 'james.png', 'curry.png']; if (!in_array($_GET['filename'], $allow_files)) { die("非法文件!"); }过滤路径穿越字符:过滤
../、./、..\等危险字符$filename = str_replace(['../', '..\\', './', '.\\'], '', $_GET['filename']);限制目录范围:使用
realpath()和dirname()验证文件是否在允许的目录内$base_dir = realpath('./download/'); $file_path = realpath($base_dir . '/' . $_GET['filename']); if (strpos($file_path, $base_dir) !== 0) { die("非法路径!"); }文件重命名存储:数据库中存储文件原名和随机生成的实际文件名
权限控制:验证用户是否有权下载该文件
记录日志:记录所有下载请求以便审计
二、目录遍历(路径遍历)
2.1 基础知识
什么是目录遍历?
目录遍历(Directory Traversal),也称为路径遍历(Path Traversal)漏洞,是指攻击者通过构造特殊的路径(如../),访问Web应用程序根目录之外的文件和目录。
目录遍历与不安全文件下载的区别:
这两个漏洞经常被混淆:
| 漏洞类型 | 表现形式 | 典型场景 |
|---|---|---|
| 目录遍历 | 通过URL参数遍历目录结构,读取文件内容并显示在页面上 | ?title=../../etc/passwd页面直接显示文件内容 |
| 不安全文件下载 | 通过下载功能下载任意文件到本地 | ?filename=../../config.php浏览器弹出下载 |
简单来说:目录遍历是在页面上显示文件内容,不安全文件下载是把文件下载到本地。
目录遍历的危害:
读取应用程序源代码
读取系统配置文件
读取数据库凭据
获取系统用户信息
为后续攻击提供信息支撑
2.2 目录遍历实战
关卡介绍
Pikachu的目录遍历关卡提供了一个类似“文章阅读”的功能。页面显示了几篇文章的标题,点击后URL中带有title参数:
http://127.0.0.1/pikachu/vul/dir/dir.php?title=article1.txt后台根据title参数读取对应的文件内容并显示在页面上。
攻击思路
程序直接将title参数拼接到文件路径中读取并显示。攻击者可以利用../进行目录遍历,让页面显示服务器上的任意文件内容。
实操步骤
第一步:进入关卡
访问目录遍历页面:
http://127.0.0.1/pikachu/vul/dir/dir_list.php页面显示了两篇文章的标题,点击任意一篇,URL变为:
http://10.0.0.176/pikachu/vul/dir/dir_list.php?title=jarheads.php第二步:尝试目录遍历
修改title参数,尝试读取系统敏感文件。
在Linux系统中:
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../../etc/passwd在Windows系统中:
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../../Windows/System32/drivers/etc/hosts如果漏洞存在,页面会直接显示文件内容。
第三步:读取配置文件
尝试读取Pikachu的数据库配置文件:
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../inc/config.inc.php因为代码强制拼接soup/前缀,php://filter 伪协议无法使用;利用普通目录遍历只能执行 config.inc.php,无法读取源码。单靠该页面不能获取配置文件源码。
第四步:读取测试文件
http://127.0.0.1/pikachu/vul/dir/dir_list.php?title=../../../test/phpinfo.txt代码解析
if(isset($_GET['title'])){ $filename=$_GET['title']; //这里直接把传进来的内容进行了require(),造成问题 require "soup/$filename"; // echo $html; }漏洞原因分析:
用户输入未过滤:
$_GET['title']直接用于文件操作路径穿越:可以使用
../跳出sources/目录无权限验证:没有检查用户是否有权查看该文件
防御方案
白名单验证:只允许访问预设的文件列表
$allow_titles = ['article1.txt', 'article2.txt']; if (!in_array($_GET['title'], $allow_titles)) { die("非法请求!"); }过滤危险字符:过滤
../、..\、./等路径穿越字符使用basename():只取文件名部分,忽略路径
$title = basename($_GET['title']);限制目录范围:使用
realpath()验证文件是否在允许的目录内使用数据库存储内容:不直接通过文件路径读取,而是将文章内容存储在数据库中
三、敏感信息泄露
3.1 基础知识
什么是敏感信息泄露?
敏感信息泄露(Sensitive Information Disclosure)是指由于后台人员的疏忽或者不当的设计,导致不应该被前端用户看到的数据被轻易地访问到。
敏感信息泄露的常见形式:
| 类型 | 示例 | 危害 |
|---|---|---|
| 目录列表泄露 | 访问/uploads/直接显示所有文件列表 | 暴露文件结构、可下载敏感文件 |
| 源码注释泄露 | HTML/JS中的注释包含账号密码 | 直接获取登录凭证 |
| 报错信息泄露 | 输入错误参数后显示完整错误堆栈 | 暴露系统版本、文件路径、数据库结构 |
| 响应头泄露 | Server头显示Apache/2.4.49 | 暴露中间件版本,便于针对性攻击 |
| Cookie泄露 | Cookie中包含明文密码或可解密的密文 | 凭证泄露 |
| 前端源码泄露 | JS中包含内网接口、后台地址 | 暴露攻击面 |
为什么敏感信息泄露很重要?
敏感信息泄露虽然常被评为危害较低的漏洞,但这些敏感信息往往给攻击者实施进一步的攻击提供巨大的帮助,甚至“离谱”的敏感信息泄露也会直接造成严重的损失。在真实的渗透测试中,信息收集往往是第一步也是最重要的一步。
3.2 敏感信息泄露实战
关卡介绍
Pikachu的敏感信息泄露关卡名为“I can see you ABC”,模拟了多种常见的敏感信息泄露场景。
攻击思路
通过查看页面源码、分析响应头、触发错误页面等方式,发现开发者遗留的敏感信息。
实操步骤
方法一:查看页面源码中的注释
第一步:进入关卡
访问敏感信息泄露页面:
http://127.0.0.1/pikachu/vul/infoleak/findabc.php第二步:查看页面源码
在浏览器中右键点击 →查看页面源代码(或按Ctrl+U)。
在源码中查找注释,可能会发现类似这样的内容:
方法二:目录列表泄露
第一步:尝试访问目录
在URL后面添加目录路径,尝试访问没有index文件的目录:
http://127.0.0.1/pikachu/vul/csrf/如果Web服务器开启了目录列表功能,会直接显示该目录下的所有文件列表。如果没开启就是403。
方法三:报错信息泄露
第一步:构造错误请求
在URL中输入一个不存在的页面或错误的参数:
http://127.0.0.1/pikachu/vul/csrf/notexist.php第二步:观察报错信息
如果开启了错误显示,页面可能会显示:
操作系统类型和版本
Web服务器版本(如Apache/2.4.49)
PHP版本
文件绝对路径(如
/var/www/html/pikachu/inc/function.php)数据库错误信息
没开启就是404错误
方法四:Cookie信息泄露
第一步:打开浏览器开发者工具
按F12打开开发者工具,切换到Application(应用程序)标签 →Cookies。(前提是需要先登录)
第二步:查看Cookie内容
观察Cookie中是否包含敏感信息,例如:
第三步:解密密码
如果密码是MD5加密的,可以到MD5解密网站尝试解密。
方法五:响应头信息泄露
第一步:拦截或查看响应头
使用Burp Suite拦截响应,或使用浏览器开发者工具的Network(网络)标签查看响应头。
第二步:观察Server头
这个信息直接暴露了Web服务器和PHP的版本,攻击者可以据此查找对应的已知漏洞。
代码解析
敏感信息泄露通常不是由某一行特定的漏洞代码造成的,而是由多种不当的开发习惯导致:
注释泄露(源码层面)
<!-- 测试账号:lili/ 123456 -->错误报告开启(配置层面)
// php.ini 或代码中 error_reporting(E_ALL); ini_set('display_errors', 'On');目录列表开启(配置层面)
# httpd.conf 或 .htaccess Options IndexesCookie明文存储(代码层面)
setcookie('username', $username); setcookie('password', $password); // 明文存储密码防御方案
清理源码注释:生产环境移除所有包含敏感信息的注释
关闭错误显示:生产环境设置
display_errors = Off,使用自定义错误页面关闭目录列表:设置
Options -Indexes不将敏感信息存于Cookie:密码、Token等敏感信息不应存储在Cookie中
使用HTTPS:加密传输,防止中间人窃听
隐藏版本信息:
ServerTokens Prod ServerSignature Off定期安全审计:检查代码中是否存在敏感信息泄露风险
四、不安全的URL重定向
4.1 基础知识
什么是URL重定向?
URL重定向(URL Redirection)是Web应用中常见的功能,用于将用户从一个页面自动跳转到另一个页面。例如:登录成功后跳转到首页、点击广告链接跳转到外部网站等。
什么是不安全的URL重定向?
不安全的URL重定向(Unsafe URL Redirection)是指应用程序在实现重定向功能时,直接使用用户可控的参数作为跳转目标,而没有进行有效的验证和过滤。
攻击原理:
攻击者构造一个包含恶意URL的链接,诱使用户点击。由于跳转目标由用户参数控制,用户会被重定向到攻击者指定的恶意网站。这个恶意网站可以伪装成目标网站的登录页面,窃取用户的账号密码。
典型攻击场景——钓鱼攻击:
正常链接:https://bank.com/login.php?redirect=/dashboard.php 恶意链接:https://bank.com/login.php?redirect=https://fake-bank.com/login.php用户点击恶意链接后,被重定向到伪造的银行登录页面,输入账号密码后信息被攻击者窃取。
URL重定向的其他风险:
配合XSS攻击:跳转URL中可以包含
javascript:协议执行恶意代码配合CRLF注入:在URL参数中注入
%0d%0a进行HTTP响应拆分攻击
4.2 不安全的URL重定向实战
关卡介绍
Pikachu的不安全URL重定向关卡模拟了一个简单的页面跳转功能。URL中包含一个url参数,用于指定跳转目标:
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=www.baidu.com攻击思路
程序直接将url参数的值用于重定向,没有做任何验证。攻击者可以构造任意URL,将用户重定向到恶意网站。
实操步骤
第一步:进入关卡
访问URL重定向页面: 页面显示四个链接。
第二步:观察URL参数
URL中包含url参数:
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=i第三步:测试正常跳转
访问正常的跳转链接,确认功能正常:
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=i第四步:构造恶意跳转
将url参数改为攻击者控制的恶意网站:
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=https://hackcode.v4x.net/scp/第五步:钓鱼攻击模拟
构造一个看起来像正常链接的恶意URL,通过邮件、短信等方式发送给受害者:
https://正常的网站.com/unsafe/redirect.php?url=https://钓鱼网站.com/login.php?redirect=正常的网站.com受害者点击后,会先跳转到正常的网站,然后被重定向到钓鱼网站,在钓鱼网站上输入账号密码后信息被窃取。
代码解析
if(isset($_GET['url']) && $_GET['url'] != null){ $url = $_GET['url']; if($url == 'i'){ $html.="<p>好的,希望你能坚持做你自己!</p>"; }else { header("location:{$url}"); } }漏洞原因分析:
用户输入未验证:
$_GET['url']直接用于header()重定向无白名单限制:可以跳转到任意外部域名
无协议限制:支持
http://、https://、javascript:等多种协议
防御方案
白名单验证:只允许跳转到预设的可信域名列表
$allow_domains = ['www.baidu.com', 'www.google.com']; $url = parse_url($_GET['url']); if (!in_array($url['host'], $allow_domains)) { die("非法跳转目标!"); }相对路径跳转:只允许跳转到本站内部的相对路径
if (strpos($_GET['url'], '/') !== 0) { die("只允许跳转到本站内部页面!"); }过滤危险协议:禁止
javascript:、data:等协议$url = $_GET['url']; if (strpos($url, 'javascript:') === 0 || strpos($url, 'data:') === 0) { die("非法协议!"); }使用映射表:前端传递索引值,后台映射到真实URL
$redirect_map = [ 'home' => '/index.php', 'dashboard' => '/dashboard.php', 'profile' => '/profile.php' ]; $target = $redirect_map[$_GET['redirect_id']] ?? '/index.php';添加确认页面:跳转到外部网站时显示提示确认页面
总结
本篇主要学习不安全文件下载、目录遍历、敏感信息泄露、不安全 URL 重定向四类容易被忽略的 Web 漏洞,单独漏洞的危害弱于 RCE、SQL 注入,但在渗透攻击链里承担着信息收集的关键作用。不安全文件下载的成因是下载功能直接将用户传入的文件名拼接至文件路径,攻击者利用../ 实现路径遍历,下载数据库配置文件、系统账号文件,防护手段为设置文件名白名单、过滤路径穿越字符、限定访问目录;目录遍历和不安全文件下载原理一致,区别是直接在页面读取展示文件内容,防御方式和文件下载漏洞一致;敏感信息泄露由开发疏漏、服务器配置不当造成,通过前端源码注释、目录浏览、报错回显、Cookie、响应头泄露数据,通过清除代码注释、关闭错误回显、禁用目录列表、隐藏服务版本进行防护;不安全 URL 重定向漏洞是跳转地址受用户可控参数支配,攻击者构造恶意链接实施钓鱼攻击,可通过配置域名白名单、只允许相对路径跳转、拦截危险协议进行防御。四类漏洞存在紧密联系,不安全文件下载和文件包含都由可控文件路径引发,前者下载源码,后者执行代码;目录遍历与不安全文件下载底层原理一致,仅分为页面回显、文件下载两种表现形式;敏感信息泄露属于渗透的信息收集环节,获取的账号、绝对路径、服务版本能够为 SQL 注入、暴力破解等后续攻击提供支撑;不安全 URL 重定向和 XSS 均可实现钓鱼,重定向还能借助 javascript 协议触发 XSS 漏洞。在学习过程中我们要明白渗透测试大部分工作都属于信息收集,养成查看网页源代码的习惯,开发时严格管控数据是否对外暴露,默认所有用户输入都不可信,同时掌握对应的防御手段,完善代码与服务器配置。
重要声明:本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。
如果这篇文章帮你解决了实操上的困惑,别忘记点击点赞、分享,也可以留言告诉我你遇到的其它问题,我会尽快回复。你的关注是我坚持原创和细节共享的力量来源,谢谢大家。
