摘要本篇是Pikachu靶场系列教程的第六篇也是漏洞类型相对“轻量”但实际场景中极为常见的一篇将带领大家攻克四个重要但容易被忽视的Web安全漏洞模块不安全文件下载任意文件下载、目录遍历路径遍历、敏感信息泄露和不安全的URL重定向。与前几篇动辄可以获取服务器权限的高危漏洞不同本篇涉及的四个漏洞虽然单个来看危害等级不算最高但它们往往是攻击链中最关键的信息收集环节。不安全文件下载可以让攻击者直接下载数据库配置文件、源代码等敏感信息目录遍历让攻击者能够探索服务器文件结构敏感信息泄露直接在代码注释、报错信息、响应头中暴露密码、内网地址等关键数据不安全的URL重定向则可以被用于钓鱼攻击窃取用户凭证。本篇将从零基础出发对每个模块先讲解基础知识再按照关卡介绍→攻击思路→实操步骤→代码解析→防御方案的结构逐一通关。这些漏洞的原理相对简单非常适合初学者建立安全思维理解“什么信息不该暴露给用户”这个核心安全理念。一、不安全文件下载任意文件下载1.1 基础知识什么是不安全文件下载不安全文件下载Unsafe File Download也称为任意文件下载漏洞是指Web应用程序在提供文件下载功能时未对用户请求的文件路径或文件名进行充分验证导致攻击者能够通过构造特殊请求下载服务器上的任意文件包括敏感文件。文件下载功能的正常流程用户点击下载链接 → 前端传递文件名参数 → 后台拼接文件路径 → 服务器返回文件漏洞产生的原因原因说明未验证文件路径直接使用用户提供的参数构造文件路径未做过滤目录遍历攻击允许使用../等特殊字符进行目录跳转硬编码或可预测路径文件路径可被猜测或枚举权限控制不足未验证用户是否有权访问请求的文件常见可下载的敏感文件文件类型路径示例包含信息数据库配置文件/inc/config.inc.php数据库账号密码系统密码文件/etc/passwdLinux系统用户信息Web配置文件/web.config、.htaccess服务器配置信息源代码文件*.php、*.jsp业务逻辑和敏感算法日志文件/var/log/系统运行日志1.2 不安全文件下载实战关卡介绍Pikachu的不安全文件下载关卡模拟了一个NBA球员图片下载功能。页面展示了几位NBA球星的图片用户可以点击下载。下载链接中包含filename参数用于指定要下载的文件名。http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filenamekb.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_pathdownload/{$_GET[filename]}; // 转换字符编码 $file_pathiconv(utf-8,gb2312,$file_path); // 检查文件是否存在 if(!file_exists($file_path)){ skip(你要下载的文件不存在请重新下载, unsafe_down.php); return ; } // 以二进制模式打开文件并输出 $fpfopen($file_path,rb); $file_sizefilesize($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)); $buffer1024; while(!feof($fp)){ $datafread($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?titlearticle1.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?titlejarheads.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第二步查看页面源码在浏览器中右键点击 →查看页面源代码或按CtrlU。在源码中查找注释可能会发现类似这样的内容方法二目录列表泄露第一步尝试访问目录在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.49PHP版本文件绝对路径如/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?redirecthttps://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?urlwww.baidu.com攻击思路程序直接将url参数的值用于重定向没有做任何验证。攻击者可以构造任意URL将用户重定向到恶意网站。实操步骤第一步进入关卡访问URL重定向页面 页面显示四个链接。第二步观察URL参数URL中包含url参数http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?urli第三步测试正常跳转访问正常的跳转链接确认功能正常http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?urli第四步构造恶意跳转将url参数改为攻击者控制的恶意网站http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?urlhttps://hackcode.v4x.net/scp/第五步钓鱼攻击模拟构造一个看起来像正常链接的恶意URL通过邮件、短信等方式发送给受害者https://正常的网站.com/unsafe/redirect.php?urlhttps://钓鱼网站.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 漏洞。在学习过程中我们要明白渗透测试大部分工作都属于信息收集养成查看网页源代码的习惯开发时严格管控数据是否对外暴露默认所有用户输入都不可信同时掌握对应的防御手段完善代码与服务器配置。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。
Pikachu靶场从入门到精通(六):不安全文件下载、目录遍历、敏感信息泄露与URL重定向漏洞实战
摘要本篇是Pikachu靶场系列教程的第六篇也是漏洞类型相对“轻量”但实际场景中极为常见的一篇将带领大家攻克四个重要但容易被忽视的Web安全漏洞模块不安全文件下载任意文件下载、目录遍历路径遍历、敏感信息泄露和不安全的URL重定向。与前几篇动辄可以获取服务器权限的高危漏洞不同本篇涉及的四个漏洞虽然单个来看危害等级不算最高但它们往往是攻击链中最关键的信息收集环节。不安全文件下载可以让攻击者直接下载数据库配置文件、源代码等敏感信息目录遍历让攻击者能够探索服务器文件结构敏感信息泄露直接在代码注释、报错信息、响应头中暴露密码、内网地址等关键数据不安全的URL重定向则可以被用于钓鱼攻击窃取用户凭证。本篇将从零基础出发对每个模块先讲解基础知识再按照关卡介绍→攻击思路→实操步骤→代码解析→防御方案的结构逐一通关。这些漏洞的原理相对简单非常适合初学者建立安全思维理解“什么信息不该暴露给用户”这个核心安全理念。一、不安全文件下载任意文件下载1.1 基础知识什么是不安全文件下载不安全文件下载Unsafe File Download也称为任意文件下载漏洞是指Web应用程序在提供文件下载功能时未对用户请求的文件路径或文件名进行充分验证导致攻击者能够通过构造特殊请求下载服务器上的任意文件包括敏感文件。文件下载功能的正常流程用户点击下载链接 → 前端传递文件名参数 → 后台拼接文件路径 → 服务器返回文件漏洞产生的原因原因说明未验证文件路径直接使用用户提供的参数构造文件路径未做过滤目录遍历攻击允许使用../等特殊字符进行目录跳转硬编码或可预测路径文件路径可被猜测或枚举权限控制不足未验证用户是否有权访问请求的文件常见可下载的敏感文件文件类型路径示例包含信息数据库配置文件/inc/config.inc.php数据库账号密码系统密码文件/etc/passwdLinux系统用户信息Web配置文件/web.config、.htaccess服务器配置信息源代码文件*.php、*.jsp业务逻辑和敏感算法日志文件/var/log/系统运行日志1.2 不安全文件下载实战关卡介绍Pikachu的不安全文件下载关卡模拟了一个NBA球员图片下载功能。页面展示了几位NBA球星的图片用户可以点击下载。下载链接中包含filename参数用于指定要下载的文件名。http://127.0.0.1/pikachu/vul/unsafedownload/execdownload.php?filenamekb.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_pathdownload/{$_GET[filename]}; // 转换字符编码 $file_pathiconv(utf-8,gb2312,$file_path); // 检查文件是否存在 if(!file_exists($file_path)){ skip(你要下载的文件不存在请重新下载, unsafe_down.php); return ; } // 以二进制模式打开文件并输出 $fpfopen($file_path,rb); $file_sizefilesize($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)); $buffer1024; while(!feof($fp)){ $datafread($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?titlearticle1.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?titlejarheads.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第二步查看页面源码在浏览器中右键点击 →查看页面源代码或按CtrlU。在源码中查找注释可能会发现类似这样的内容方法二目录列表泄露第一步尝试访问目录在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.49PHP版本文件绝对路径如/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?redirecthttps://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?urlwww.baidu.com攻击思路程序直接将url参数的值用于重定向没有做任何验证。攻击者可以构造任意URL将用户重定向到恶意网站。实操步骤第一步进入关卡访问URL重定向页面 页面显示四个链接。第二步观察URL参数URL中包含url参数http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?urli第三步测试正常跳转访问正常的跳转链接确认功能正常http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?urli第四步构造恶意跳转将url参数改为攻击者控制的恶意网站http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?urlhttps://hackcode.v4x.net/scp/第五步钓鱼攻击模拟构造一个看起来像正常链接的恶意URL通过邮件、短信等方式发送给受害者https://正常的网站.com/unsafe/redirect.php?urlhttps://钓鱼网站.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 漏洞。在学习过程中我们要明白渗透测试大部分工作都属于信息收集养成查看网页源代码的习惯开发时严格管控数据是否对外暴露默认所有用户输入都不可信同时掌握对应的防御手段完善代码与服务器配置。重要声明本教程及文中所有操作仅限于合法授权的安全学习与研究。作者及发布平台不承担因不当使用本教程所引发的任何直接或间接法律责任。请务必遵守中华人民共和国网络安全相关法律法规。如果这篇文章帮你解决了实操上的困惑别忘记点击点赞、分享也可以留言告诉我你遇到的其它问题我会尽快回复。你的关注是我坚持原创和细节共享的力量来源谢谢大家。