MVC&动态调试未授权

php模型开发篇&&MVC层&&未授权

MVC

  • MVC流程

    • Controller截获用户发出的请求;
    • Controller调用Model完成状态的读写操作;
    • Controller把数据传递给View;
    • View渲染最终结果并呈献给用户。
  • MVC各层职能:

    1. 控制器Controller层–负责响应用户请求、准备数据,及决定如何展示数据。
    2. 模块Model层–管理业务逻辑和数据库逻辑。提供连接和操作数据库的抽象层。(过滤也一般写在这里)
    3. 视图View层–负责前端模版渲染数据,通过HTML方式呈现给用户。

  • MVC对审计主要影响:

    1. 文件代码定位问题,一个功能分别在三个文件里,负责不同的部分
    2. 代码过滤分析问题,一般会写道MODEL层
    3. 前端安全发现问题,模板注入,XSS等

1.文件代码定位

按原生开发的思路

url中文件和参数是对应的,但MVC中并不是对应的

由url定位到文件

  1. 定位各层的文件路径:

    从包含文件中找到控制器,模块层所在目录;

    视图层一般都是html文件

  2. 确定网站对应文件及参数

然后在刚刚确定的MVC各层中找带content的文件即为处理该页面的各层MVC,名字不一定完全相同,找不到带同名的model时,controller文件里可能有相关线索

2.审计的入口

  • 搜索法:将select封装,这种方法有局限性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    PHP常见漏洞关键字:
    SQL注入:

    select insert update mysql_query mysqli等

    文件上传:

    $_FILES,type="file",上传,move_uploaded_file()等

    XSS跨站:

    print print_r echo sprintf die var_dump var_export等

    文件包含:

    include include_once require require_once等

    代码执行:

    eval assert preg_replace call_user_func call_user_func_array等

    命令执行:

    system exec shell_exec `` passthru pcntl_exec popen proc_open

    变量覆盖:

    extract() parse_str() importrequestvariables() $$ 等

    反序列化:

    serialize() unserialize() __construct __destruct等

    其他漏洞:

    unlink() file_get_contents() show_source() file() fopen()等

    #通用关键字:

    $_GET,$_POST,$_REQUEST,$_FILES,$_SERVER等


  • 功能法:功能点抓包分析

  • 对比法:有源码的前后版本,找安全方面是否有改进点

  • 漏洞的特征:sql注入(数据库监控) 文件(文件监控)

  • 动态调试

  • 工具法

3. 案例

3.1 代码执行1

分析顺序:controller–>model–>view

它是执行写入数据库的代码

CNVD-代码执行lmxcms1.40版本

1.搜索法

  1. 发现变量可控概率高,进行分析

    查看作用函数caijiDataOne来到model层了

    数据库执行,与数据库相关的信息cj_data

    继续oneDB,没啥过滤

3.触发漏洞

触发功能函数showCjData

即构造url触发

admin.php?m=Acquisi(文件名)&a=showCjData(函数)&cid=x&id=x&lid=x(在数据库中查找符合id…值的data)

4 .注入:
后台有一处sql执行,直接写到数据库里面

直接访问就可以出发漏洞执行代码

3.2 代码执行2

模板处容易有rce,前端为了显示一些数据,会需要执行php eval,从数据库中查询到

smarty模板

3.3 文件对比

  1. 快速找到脆弱点,修复的地方上一个版本的问题就在这里
  2. 快速测试新版本有无0day
  3. UEstudio工具对比文件

3.4 命令执行

分析

baijiacms v4-4.1.4

搜索法搜关键字system(

file_save方法的第四个参数

是由全局变量file接受的

操作点

接下来就要找到能文件上传的点(操作点)

当前文件地址system/weixin/class/web/setting.php,然后就要找对应的url触发

正确的思路应该先利用已知的url正确分析出来对应的文件位置

1
http://baijiacms:8233/index.php?mod=site&act=manager&do=store&op=display&beid=1

它对应的是 system/manager/class/web/store.php

视图层

1
system/manager/template/web/store_display.php

然后依照这样构造当前文件(system/weixin/class/web/setting.php)的url

1
http://baijiacms:8233/index.php?mod=site&act=weixin&do=setting
顺利触发危险方法及漏洞

构造一些条件使得漏洞能够顺利触发

1.顺利调用方法需要满足两个if

2.在危险方法里面需要满足$settings[‘image_compress_openscale’]不为空

找到对应功能的表单名称相同

所以同理找到表单名为image_compress_openscale的

先在代码中找找前端页面和线索

文件路径:system/manager/template/web/netattach.php

对应url: /index.php?mod=site&act=manager&do=netattach

成功找到,使得它的值不为空,要确保它是开启的

抓包修改filename为命令,&&目的为截断路径来执行命令

动态调试未授权

1. 未授权安全挖掘问题

  1. 找鉴 权看引用-未引用鉴权逻辑 (没有鉴权)

  2. 找鉴权看脆弱-脆弱的鉴权逻辑(鉴权逻辑可绕过)

  3. 找鉴权看逻辑-不严谨的鉴权逻辑

    • 先功能操作后验证鉴权(逻辑错误)

    • 先验证鉴权了,但是没有及时跳出程序导致执行了后续功能操作

2. 熊海cms

静态分析

后台逻辑脆弱鉴权

先找鉴权文件

简单的源码:checkadmin,checklogin

该案例先登陆进来观察逻辑

1
http://xhcms:8332/admin/?r=newwz

参数r控制的是访问的后台文件

访客模式访问该url会跳转到登陆页面,说明该文件是有鉴权的

很显然包含的checklogin就是鉴权文件

脆弱验证,cookie不为空即可绕过

动态调试

phpstorm+phpstudy+x-debug(插件)

$user只要不为空,就不会跳转到登陆界面

未登录状态下,将coookie中添加uesr值,即可绕过鉴权

3. 创文cms

未引用

思路一:找鉴权文件

找到鉴权文件admin.php,session验证,并且我们数据包是无法干扰的,所以思路就是找遗漏的,为引用admin.php的文件

查看到一些信息

思路二 从功能点代码处入手,判断未授权

未登录状态下,在功能点代码处下断点,能执行到断点处就存在鉴权问题,没断说明鉴权了

4. BossCMS

下载仓库 · 荷兰豆/BOSSCMS-Free建站系统 - Gitee.com

任意文件删除(未授权)

它是MVC的

1.找出鉴权文件:定位首页文件分析,admin为鉴权

2.寻找未引用及鉴权漏洞

3.寻找脆弱逻辑或不严谨的逻辑

这里就是不严谨的逻辑,重定向之后并没有退出

所以在未登陆的状态下,post访问删除文件的url是可以成功执行删除的

5. 泛微-eoffice v9.0

思路:

0day:搜文件上传关键字,通过分析无需登录触发它

1day:补丁源码对比找到差异


MVC&动态调试未授权
https://bxhhf.github.io/2025/05/31/MVC/
作者
bxhhf
发布于
2025年5月31日
许可协议