当前位置: 首页 > news >正文

DVWA靶场Open HTTP Redirect (重定向) 漏洞所有级别通关教程及源码审计

目录标题

  • Open HTTP Redirect
    • low
      • 源码审计
    • medium
      • 源码审计
    • high
      • 源码审计
    • impossible
      • 源码审计

Open HTTP Redirect

HTTP 重定向(HTTP Redirect Attack)是一种网络,利用 HTTP 协议中的重定向机制,将用户引导至恶意网站或非法页面,进而进行钓鱼、恶意软件传播等恶意行为。攻击者通常通过操控重定向响应头或 URL 参数实现这种

HTTP 重定向基本原理

HTTP 重定向是一种用于通知客户端(如浏览器)请求的资源已被移动到另一个位置的机制,通常由服务器发送 3xx 系列状态码响应。常见的重定向状态码包括:

  • 301 Moved Permanently:永久重定向,表示请求的资源已被永久移动到新的 URL。

  • 302 Found:临时重定向,表示请求的资源临时在另一个 URL 上。

  • 303 See Other:建议客户端使用 GET 方法获取资源。

  • 307 Temporary Redirect:临时重定向,保持请求方法不变。

  • 308 Permanent Redirect:永久重定向,保持请求方法不变。

HTTP 重定向方式

HTTP 重定向主要利用了合法的重定向机制,通过各种方式将用户重定向到恶意网站。常见的方式包括:

  1. 开放重定向(Open Redirect)
  • 通过操控网站的 URL 参数,实现对重定向目标的控制。例如,合法网站的 URL 参数 redirect=http://example.com 被替换为 redirect=http://malicious.com,导致用户被重定向到恶意网站。
  1. 钓鱼(Phishing)
  • 利用重定向将用户引导到伪装成合法网站的恶意网站,诱骗用户输入敏感信息(如登录凭证、银行账号)。
  1. 恶意软件传播(Malware Distribution)
  • 通过重定向将用户引导到托管恶意软件的网站,诱骗用户下载和安装恶意软件。

low

随便点击一个链接,发现url栏有传参点

定位源码查看,发现重定向点

修改为source/low.php?redirect=http://www.baidu.com

成功跳转

源码审计

没有存在过滤,不安全

<?php
// 检查URL中是否存在'redirect'参数,并且该参数不为空。
if (array_key_exists("redirect", $_GET) && $_GET['redirect'] != "") {// 如果存在'redirect'参数且不为空,则进行重定向到指定的路径。header("location: " . $_GET['redirect']);exit; // 终止脚本执行
}
// 如果'redirect'参数不存在或为空,则返回HTTP 500状态码并显示缺少重定向目标的错误信息。
http_response_code(500);
?>
<p>Missing redirect target.</p>
<?php
exit; // 终止脚本执行
?>

medium

low级别的方法没什么区别,查看源码可以发现不同的地方在于禁用了http://,https:// 字段

构造url绕过 source/low.php?redirect=www.baidu.com,如果没有明确指定协议,直接以 // 开头,则表示使用和当前页面相同的协议,便可以绕过了

源码审计

利用正则表达式检查是否含有http:// https:// 字段。如果有则过滤

<?php
// 检查URL中是否存在'redirect'参数,并且该参数不为空。
if (array_key_exists("redirect", $_GET) && $_GET['redirect'] != "") {// 使用正则表达式检查'redirect'参数是否包含不安全的绝对URL。if (preg_match("/http:\/\/|https:\/\//i", $_GET['redirect'])) {// 如果是绝对URL,则返回HTTP 500状态码,并显示错误信息。http_response_code(500);?><p>Absolute URLs not allowed.</p><?phpexit; // 终止脚本执行} else {// 如果是相对路径,则进行重定向到指定的路径。header("location: " . $_GET['redirect']);exit; // 终止脚本执行}
}
// 如果'redirect'参数不存在,则返回HTTP 500状态码并显示缺少重定向目标的错误信息。
http_response_code(500);
?>
<p>Missing redirect target.</p>
<?php
exit; // 终止脚本执行
?>

high

查看源码可以发现与上面两个级别不同的是检查是否有info.php字段,如果没有,则不能进行重定向

构造代码绕过:source/low.php?redirect=http://www.baidu.com?id=info.php

成功绕过

源码审计

检查了url种是否含有info.php字段,如果没有则会过滤

<?php
// 检查URL中是否存在'redirect'参数,并且该参数不为空。
if (array_key_exists("redirect", $_GET) && $_GET['redirect'] != "") {// 检查'redirect'参数中是否包含"info.php"。if (strpos($_GET['redirect'], "info.php") !== false) {// 如果包含"info.php",则进行重定向。header("location: " . $_GET['redirect']);exit; // 终止脚本执行} else {// 如果不包含"info.php",返回HTTP 500状态码和错误信息。http_response_code(500);?><p>You can only redirect to the info page.</p><?phpexit; // 终止脚本执行}
}
// 如果'redirect'参数不存在或为空,则返回HTTP 500状态码并显示缺少重定向目标的错误信息。
http_response_code(500);
?>
<p>Missing redirect target.</p>
<?php
exit; // 终止脚本执行
?>

impossible

源码审计

采用了更加符合现实情况的方法,较为安全

<?php
// 初始化目标URL为空字符串
$target = "";
// 检查URL中是否存在'redirect'参数,并且该参数是一个数字。
if (array_key_exists("redirect", $_GET) && is_numeric($_GET['redirect'])) {// 根据'redirect'参数的整数值选择不同的重定向目标。switch (intval($_GET['redirect'])) {case 1:// 如果参数值为1,设置目标为"info.php?id=1"$target = "info.php?id=1";break;case 2:// 如果参数值为2,设置目标为"info.php?id=2"$target = "info.php?id=2";break;case 99:// 如果参数值为99,设置目标为"https://digi.ninja"$target = "https://digi.ninja";break;}// 如果目标URL已被设置,执行重定向。if ($target != "") {header("location: " . $target);exit; // 结束脚本执行} else {?>Unknown redirect target. <!-- 输出未知重定向目标的错误信息 --><?phpexit; // 结束脚本执行}
}
?>
Missing redirect target. <!-- 输出缺少重定向目标的信息 -->
http://www.lryc.cn/news/514633.html

相关文章:

  • 探索 JMeter While Controller:循环测试的奇妙世界
  • Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace
  • ubuntu支持ssh
  • 浏览器书签智能分类
  • 通俗易懂的讲一下Vue的双向绑定和React的单向绑定
  • Redis 深度解析:从入门到精通
  • 基于物联网的冻保鲜运输智能控制系统
  • 【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)
  • 论文解读之learning to summarize with human feedback
  • STM32学习(六 )
  • 基于 GitHub API 的 Issue 和 PR 自动化解决方案
  • 56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息
  • 文件本地和OSS上传
  • elementui table 表格 分页多选,保持选中状态
  • MSE+Range案例
  • C# 设计模式(结构型模式):代理模式
  • YOLO——pytorch与paddle实现YOLO
  • 持续大额亏损,销量增幅有限,北汽蓝谷依旧黯然神伤
  • C# OpenCV机器视觉:背景减除与前景分离
  • C语言return与 ? :
  • 【论文阅读】SCGC : Self-supervised contrastive graph clustering
  • python pyqt5+designer的信号槽和动态显示
  • 版本控制系统Helix Core 2024.2增强功能:与OpenTelemetry协议集成、Delta同步和传输等
  • certificate verify failed: unable to get local issuer certificate (_ssl.c:10
  • 关于大一上的总结
  • JavaScript的基础知识
  • 数据结构之单链表(超详解)
  • 告别编程困惑:GDB、冯诺依曼、操作系统速通指南
  • 网络分析工具-tcpdump
  • 基于AI边缘计算盒子的智慧零售场景智能监控解决方案