偶然发现的bug————越权访问漏洞追溯

栏目: PHP · 发布时间: 5年前

内容简介:因为经常需要做一些小的demo,所以掌握一个快速开发框架是十分重要的,我比较习惯使用yii2,而就在写demo的过程中,最后使用脚本自动化测试的时候,偶然间发现了不登陆竟然也可以执行逻辑代码,这也就是这篇文章的起源。大家都知道,框架基本都是基于

偶然发现的bug————越权访问漏洞追溯

因为经常需要做一些小的demo,所以掌握一个快速开发框架是十分重要的,我比较习惯使用yii2,而就在写demo的过程中,最后使用脚本自动化测试的时候,偶然间发现了不登陆竟然也可以执行逻辑代码,这也就是这篇文章的起源。

简单介绍

大家都知道,框架基本都是基于 mvc 框架的, yii2 也不例外,每个框架都有自己封装好的访问控制代码组件,很多人(也包括我自己)在使用的时候,是不会去具体查看究竟是怎么实现的,这也就可能会导致版本更替,或者版本更新了以后,还按照默认写法来做访问控制,最终导致了越权漏洞的产生。

在yii中,所有的逻辑代码都写在控制器中,而每一个操作又叫动作,所以在yii中,一个控制器的大概结构就是:

class SiteController extends Controller
{
    public function actionIndex()
    {
        return $this->render('index');
    }

    public function actionLogin()
    {
        .........
        return $this->render('index');
    }
}

csrf的防御

为什么要先讲讲csrf的防御呢?因为我了解访问控制,就是从这里开始的。前面的几篇文章分析的cms,也有很多都没有实现csrf校验,也算是提供一个比较好的实现方法。

在所有使用yii开发的系统,默认都是开启了 csrf token 防御验证的,而具体实现这个校验的途径,就是使用了一个叫做 beforeacton 的特殊动作,这个动作会在该控制器的任意动作执行之前执行。

我们具体跟进看一下所有控制器的父类里面的实现:

偶然发现的bug————越权访问漏洞追溯

可以看到,这里 csrf 有两个关键的点:

$this->enableCsrfValidation
!Yii::$app->getRequest()->validateCsrfToken()

上面的是配置,开发者是可以在控制器当中关闭配置来关闭 csrf 验证的,下面则是验证 csrf token 的函数,我们继续跟进一下:

偶然发现的bug————越权访问漏洞追溯

通过简单的查看,可以看到具体的实现代码,这样就可以实现对开发者和访问者都透明化的处理,既不会干扰开发者写正常的逻辑代码,也不会影响访问者的操作,可以说是比较经典的实现 csrf 校验的方法。

访问控制的实现

yii2.0.3 版本之前,如果控制器的所有动作都是需要登陆的,那就可以在 beforeaction 中直接写上控制代码,例如:

偶然发现的bug————越权访问漏洞追溯

但是就是这样的默认写法,在前几天测试的时候却出现了问题。

简单测试

我们简单写一个 demo 测试一下,其中的 actionbeforeaction 如下图:

偶然发现的bug————越权访问漏洞追溯

然后尝试访问一下site/test这个动作,按理说这个时候是不会显示123的,应该渲染index所对应的模板文件

偶然发现的bug————越权访问漏洞追溯

但是实际情况确实仍旧会打印出来123,这就说明test这个动作还是执行了,越权漏洞也就产生了,如果控制器内部有一些危险的动作,加上这个越权漏洞危害还是比较巨大的。

资料查找

经过在github上的搜索,发现这个问题在 issue 中是有人提到过的,并且官方给出了解决方案。

偶然发现的bug————越权访问漏洞追溯

对比分析

可以看到,解决方案是在 redirect 后面紧接上执行 send 函数,那我们就来看一下现在这两个函数:

偶然发现的bug————越权访问漏洞追溯 偶然发现的bug————越权访问漏洞追溯

根据大概的函数名,可以看出来 redirect 函数只是向浏览器发送了一个302的响应码,这其实在安全中就和只做了前端验证是一样的操作,所以是非常危险的,那我们继续追踪一下 send 函数,他又是怎么弥补这个问题的呢?

偶然发现的bug————越权访问漏洞追溯

send函数实现了强制发送302跳转的功能,并且在最后关闭了当前的连接,这样就能确保越权不在产生,其实总结一下:

redirect => echo "<script>window.location.href=xxx;</script>";
redirect+send => echo "<script>window.location.href=xxx;</script>";die();

就大概相当于这样,所以道理是非常浅显易懂的,但是由于封装了很多层,所以可能不是很好看出来。

后记

所以不论是在开发或者是在做安全的过程中,重视开发文档都是非常重要的,严格的实现协议,严格的按照开发文档实现逻辑,会减少很多漏洞的产生。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

一个APP的诞生

一个APP的诞生

Carol 炒炒、刘焯琛 / 电子工业出版社 / 2016-7-1 / 79

在移动互联网高度发达的今天,一个个APP,成为我们通向网络世界的窗口。它的诞生流程,令不少对互联网世界产生幻想甚至试图投身其中的年轻人充满了好奇。 《一个APP 的诞生》就是这样一步一步拆分一个APP 的诞生过程。从前期市场调研,竞品分析开始,一直到设计规范,界面图标,设计基础,流程管理,开发实现,市场推广,服务设计,甚至跨界融合,都有陈述。 《一个APP 的诞生》被定义是一本教科书,......一起来看看 《一个APP的诞生》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换