PHP编码安全之四: URL跳转安全(漏洞)

这篇具有很好参考价值的文章主要介绍了PHP编码安全之四: URL跳转安全(漏洞)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

URL跳转漏洞, 也叫开放重定向漏洞(open redirect)。 如果处理不当会导致用户被重定向至钓鱼或恶意网站。我们通常用白名单机制来处理,比如qq登录等接口的回调页面就要求做白名单限制。通常我们会判断跳转url中的域名或者路径是否合法,但是问题往往就出现在这些判断中。

漏洞通常发生在以下几个地方:

  1. 用户登录、统一身份认证处,认证完后的跳转;
  2. 用户分享、收藏内容过后的跳转;
  3. 跨站点认证、授权(第三方登录)后的跳转;
  4. 站内点击其它网址链接时的跳转。

出现漏洞的原因大概有以下5个:

  1. 写代码时没有考虑过任意URL跳转漏洞,或者根本不知道/不认为这是个漏洞;
  2. 写代码时考虑不周,用取子串、取后缀等方法简单判断,代码逻辑可被绕过;
  3. 对传入参数做一些特殊的操作(如域名剪切、拼接、重组)和判断,适得其反,反而被绕过;
  4. 原始语言自带的解析URL、判断域名的函数库出现逻辑漏洞或者意外特性,可被绕过;
  5. 原始语言、服务器/容器特性、浏览器等对标准URL协议解析处理等差异性导致被绕过。

在php中, 常用如下方法进行跳转(以参数名url为例):

$redirect_url = $_GET['url'];
header("Location: " . $redirect_url);

后面假设源域名为:www.example.com,我们先设置白名单:

$arr_white_list = ['localhost', 'example.com'];

域名字符串检测

使用stripos检测url字符串中是否存在于白名单中的域名 - 不安全

如果使用stripos检测字符串是否存在于跳转url中,是不可靠的,比如下面的url:

https://www.example.com/redirect.php?url=http://www.example.com.www.evil.com/untrust.html

代码:

$redirect_url = $_GET['url'];
$is_redirect_url_valid = false; //跳转url是否验证通过
$arr_white_list = ['localhost', 'example.com'];
foreach($arr_white_list AS $white_item){
    if(stripos($redirect_url, $white_item) !== false){
        $is_redirect_url_valid = true;
        break;
    }
}

上面这种简单的判断域名是否存在url中是不安全的,不要使用。

提取并检测域名是否在白名单中

使用内置函数parse_url来判断url格式是否正确,并提取url的各个部分。

这里我们只考虑给定的url是包含protocol的完整的URL。对严重不合格的 URL,parse_url() 可能会返回 FALSE。

$redirect_url = $_GET['url'];
$arr = parse_url($redirect_url); //解析 URL,返回其组成部分
$host = ''; //要跳转的URL的域名
if($arr !== null && $arr !== false) {
    if(array_key_exists('host', $arr)){
        $host = $arr['host'];
    }
}else{
    echo 'Error: url式不正确';
}
$is_redirect_url_valid = false;
$arr_white_list = ['localhost', 'example.com'];
if($host !== ''){
    //判断域名是否在白名单中(包含二级域名)
    foreach($arr_white_list AS $white_item){
        if(
            ($host === $white_item)
            ||
            (
                //子域名: 长度 > 主域名
                strlen($host) > strlen($white_item)
                &&
                substr($host, strlen($host)-strlen($white_item)-1) === '.'.$white_item
            )
        ){
            $is_redirect_url_valid = true;
            break;
        }
    }
}

var_dump($is_redirect_url_valid); //打印跳转url检查是否通过

上面的代码简单演示了后端PHP如何判断跳转url能否通过验证。

如果白名单下的页面有重定向漏洞,这里就无法处理。我们至少要确保站内没有重定向漏洞。

防护方法

  1. 固定跳转地址,不让用户控制变量。 这种不适合登录后返回原来的页面这种场景,但是我们可以把登录功能作为页面公共部分, 所有页面都可以直接调出登录窗口,登录成功后直接reload页面。

  2. 跳转目标地址采用白名单映射机制, 不在白名单内的跳转到固定地址或不做任何动作。

  3. 合理充分的校验跳转的目标地址,非己方地址时告知用户跳转风险。

参考:

https://landgrey.me/open-redirect-bypass/

https://www.cnblogs.com/xiaozi/p/10682199.html

http://www.apgy.club/temp/url.html

https://www.anquanke.com/post/id/94377文章来源地址https://www.toymoban.com/news/detail-410044.html

到了这里,关于PHP编码安全之四: URL跳转安全(漏洞)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 织梦dedecms安全漏洞include/common.inc.php漏洞解决方法

    1.受影响版本织梦dedecms 5.7、5.6、5.5。 2.漏洞文件/include/common.inc.php 3.DEDECMS的全局变量初始化存在漏洞,可以任意覆盖任意全局变量。 描述: 目标存在全局变量覆盖漏洞。 1.受影响版本DEDECMS 5.7、5.6、5.5。 2.漏洞文件/include/common.inc.php 3.DEDECMS的全局变量初始化存在漏洞,可以

    2024年02月04日
    浏览(90)
  • 网络安全全栈培训笔记(53-WEB攻防-通用漏洞&CRLF注入&URL重定向&资源处理拒绝服务)

    知识点: 1、CRLF注入-原理检测利用 2、URL重定向-原理检测利用 3、Web拒绝服务-原理检测利用 #下节预告: 1、JSONPCORS跨域 2、域名安全接管劫持 #详细点: 1.CRLF注入漏洞,是因为Wb应用没有对用户输入做严格验证,导致攻击者可以输入一些 恶意字符。攻击者一旦向清求行或首部

    2024年01月15日
    浏览(53)
  • 不安全的反序列化(php&java)及漏洞复现

    A8:2017-不安全的反序列化 A08:2021-Software and Data Integrity Failures 为什么要序列化? 序列化, 将对象的状态信息转换为可以存储或传输的形式的过程 ,这种形式大多为字节流、字符串、json 串。在序列化期间内,将对象当前状态写入到临时或永久性的存储区。以后,就可以通过从

    2024年02月09日
    浏览(52)
  • 6.php开发-个人博客项目&Tp框架&路由访问&安全写法&历史漏洞

    目录 知识点 php框架——TP URL访问 Index.php-放在控制器目录下 ​编辑 Test.php--要继承一下 带参数的—————— 加入数据库代码 --不过滤 --自己写过滤 --手册(官方)的过滤 用TP框架找漏洞: 如何判断网站是thinkphp? 黑盒: 白盒: php总结 ​ 1-基于TP框架入门安装搭建使用

    2024年01月25日
    浏览(54)
  • 第27天:安全开发-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞

    1.TP框架-开发-配置架构路由MVC模型 参考:https://www.kancloud.cn/manual/thinkphp5_1 配置架构-导入使用 路由访问-URL访问 数据库操作-应用对象 文件上传操作-应用对象 前端页面渲染-MVC模型 1.TP框架-安全-不安全写法版本过滤绕过 1.内置代码写法 不合要求的代码写法-ThinkPHP5-自写 2.框架

    2024年04月25日
    浏览(61)
  • web安全-文件上传漏洞-图片马制作-相关php函数讲解-upload靶场通关详细教学(3)

    制作图片马有两种方法,一种是文本方式打开,末尾粘贴一句话木马,令一种是使用命令进行合成。 方法1 首先准备好一个图片(这里是1.png)。 将一个图片以文本格式打开(这里用的Notepad++,以记事本方式打开修改也能连接成功,不过修改后图片无法正常显示了)。 后面粘

    2024年02月06日
    浏览(55)
  • URL编码揭秘:为什么要进行URL编码?

    URL(Uniform Resource Locator,统一资源定位符)是互联网上资源地址的唯一标识符。在网络请求和数据传输过程中,URL编码起着至关重要的作用。 URL编码解码 | 一个覆盖广泛主题工具的高效在线平台(amd794.com) https://amd794.com/urlencordec 一、URL编码的起源与发展 URL编码起源于1960年代

    2024年02月03日
    浏览(41)
  • URL编码和Base64编码

    数据操作过程中,经常涉及到编码与解码等相关操作,如web请求时会对 url进行编码 ,其中的中文等字符会转义为其他内容;中文字符串数据传输时,会将其使用 base64编码 并在接收后解码,以避免乱码的出现。 URLDecoder 和 URLEncoder 用于普通字符串 和 application/x-www-form-urlenco

    2024年02月02日
    浏览(57)
  • 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞复现 [附POC]

    免责声明:请勿利用文章内的相关

    2024年02月03日
    浏览(58)
  • [网络安全] Windows Server 设置文件屏蔽防止黑客利用漏洞上传特定类型的非法文件(.asp .aspx .jsp .php)

    [网络安全] Windows Server 设置文件屏蔽防止黑客利用文件上传漏洞上传特定类型的非法文件(.asp .aspx .jsp .php) 我在负责网站运维期间,遇到过一次黑客利用公司网站内使用的开源文件上传工具漏洞上传非法文件(可执行脚本) 我是通过设置文件屏蔽来防止此类事件的再次发生。

    2024年02月12日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包