pikachu靶场通关笔记42 不安全的URL重定向
目录
一、URL重定向
二、不安全的重定向
三、源码分析
四、渗透实战
1、进入靶场
2、依次点击4个链接
(1)链接1无变化
(2)链接2无变化
(3)链接3重定向成功
(4)链接4的URL出现重定向
3、原理分析
4、渗透实战
(1)访问DVWA靶场
(2)访问百度
本系列为通过《pikachu靶场通关笔记》的URL重定向关卡的渗透实战,通过对URL重定向关卡源码的代码审计找到安全风险的真实原因,讲解URL重定向安全风险的原理并进行渗透实践。
一、URL重定向
URL 重定向是指当客户端向服务器请求某个 URL 时,服务器返回一个新的 URL,让客户端重新发起对新 URL 的请求 。它通过 HTTP 协议中的状态码(如 301 永久重定向、302 临时重定向)来实现。在实际应用中,URL 重定向常用于网站改版迁移、错误页面引导、流量分发等场景。
然而,若对 URL 重定向处理不当,会存在安全风险。恶意攻击者可构造恶意的重定向链接,诱导用户访问钓鱼网站,窃取用户信息。比如,将重定向链接伪装成正常网站,欺骗用户点击,当用户点击后就会被引导至恶意页面,从而遭受损失。因此,需要对重定向目标进行严格校验,防止被恶意利用。
类别 | 详情 |
---|---|
定义 | 客户端向服务器请求某 URL 时,服务器返回一个新的 URL,指示客户端重新发起对新 URL 的请求 |
常见类型 | 301 永久重定向:表示原资源已永久转移到新的 URL,搜索引擎会更新索引; 302 临时重定向:原资源临时转移到新 URL,搜索引擎不会更新索引; 307 临时重定向:和 302 类似,不允许改变请求方法; 308 永久重定向:和 301 类似,不允许改变请求方法 |
应用场景 | 网站改版迁移:将旧网址的流量导向新网址; 错误页面引导:如用户访问不存在页面时重定向到首页或错误提示页; 流量分发:根据不同条件将用户重定向到不同服务器或页面; 用户认证后跳转:登录成功后重定向到用户主页 |
存在风险 | 网络钓鱼:攻击者构造恶意重定向链接,诱使用户访问钓鱼网站,窃取用户账号密码等信息; 绕过安全限制:通过重定向绕过一些安全防护机制,访问受限制资源; 影响用户体验:错误或恶意的重定向导致用户无法访问预期内容 |
防范措施 | 严格校验重定向目标 URL:对重定向目标进行合法性检查,避免使用用户可控参数直接作为目标; 采用白名单机制:只允许重定向到预先定义好的合法域名或 URL; 对用户提示:在进行重定向操作前,给予用户提示,告知即将跳转到的地址 |
二、不安全的重定向
不安全的重定向(URL 重定向安全风险)是指 Web 应用程序在实现 URL 重定向功能时,未对目标 URL 进行有效验证和过滤,导致攻击者可利用该功能将用户重定向到恶意网站。攻击者通过构造包含恶意 URL 的链接,诱使用户点击。当用户访问存在URL重定向安全风险的页面时,会被自动跳转至钓鱼网站、恶意下载页面等,进而可能遭受账号密码窃取、恶意软件感染等风险。此外,该安全风险还可用于实施网络钓鱼攻击、绕过安全防护机制等。为防范此类安全风险,开发人员应严格校验重定向目标 URL,采用白名单机制限制合法重定向地址,避免直接使用用户可控参数作为重定向目标。
三、源码分析
进入到pikachu靶场的命令执行URL重定向关卡,找到源码urlredirect.php文件进行分析。
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php
这段 PHP 代码的主要功能是处理通过 GET 方式传递的 url 参数。如果 url 参数的值为 i,则会在页面上显示一段提示信息;如果 url 参数的值不为 i,则会将用户重定向到该参数所指定的 URL经过详细注释的源码如下所示。
// 初始化一个空字符串变量 $html,用于存储后续要输出的 HTML 内容
$html = "";// 检查是否通过 GET 方式传递了名为 'url' 的参数,并且该参数不为空
if (isset($_GET['url']) && $_GET['url'] != null) {// 从 GET 请求中获取 'url' 参数的值,并将其赋值给变量 $url$url = $_GET['url'];// 检查 $url 的值是否等于 'i'if ($url == 'i') {// 如果 $url 的值为 'i',则将一段提示信息追加到 $html 变量中$html .= "<p>好的,希望你能坚持做你自己!</p>";} else {// 如果 $url 的值不为 'i',则使用 header 函数将用户重定向到 $url 所指定的 URL// header 函数用于发送原始的 HTTP 头信息,这里的 "location" 头用于指示浏览器重定向到指定的 URLheader("location:{$url}");}
}
此代码存在 URL 重定向安全风险的原因在于,它直接使用了用户通过 GET 请求传递的 url 参数作为重定向的目标,而没有对该参数进行任何有效的验证和过滤。这意味着攻击者可以构造任意的 URL 作为 url 参数的值,从而将用户重定向到恶意网站。
四、渗透实战
1、进入靶场
打开pikachu靶场的命令执行URL重定向关卡,同时bp开启inception off抓包功能,如下图所示页面有四个链接,具体参考下图红框。
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php
2、依次点击4个链接
按照顺序点击页面中的四个链接,同时关注URL地址的变化,具体如下所示。
(1)链接1无变化
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php
(2)链接2无变化
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php
(3)链接3重定向成功
http://127.0.0.1/pikachu/vul/urlredirect/unsafere.php
通过burpsuite抓包可以看到跳转过程,HTTP状态码302表示重定向(下图序号3374),重定向后转向的是/pikachu/vul/urlredirect/unsafere.php(下图序号3375)。
(4)链接4的URL出现重定向
点击第四个则页面显示一段文件同时 URL 中多了一个 url=i 参数。
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=i
3、原理分析
打开源码根目录,找到urlredirect.php的位置,查看urlredirect.php源码,如下所示。
找到上图四个链接的位置,可以发现url重定向是通过 urlredirect.php?url= 来实现的。为什么会有这个安全风险呢?这是因为用户可控的参数url的输入没有被好好过滤。
4、渗透实战
(1)访问DVWA靶场
尝试修改最后一条连接的网址,使访问DVWA靶场,url= http://127.0.0.1/DVWA,具体如下所示。
127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=http://127.0.0.1/DVWA
通过burpsuite抓包可以看到跳转过程,HTTP状态码302表示重定向(下图序号3382),重定向后转向的是?url=http://127.0.0.1/DVWA(下图序号3383)
(2)访问百度
更改参数为url=http://www.baidu.com,具体如下所示。
http://127.0.0.1/pikachu/vul/urlredirect/urlredirect.php?url=http://www.baidu.com
通过burpsuite抓包可以看到跳转过程,HTTP状态码302表示重定向(下图序号3406),重定向后转向的是?url=http://www.baidu.com(下图序号3407)。