MVC&动态调试未授权
php模型开发篇&&MVC层&&未授权
MVC
MVC流程
- Controller截获用户发出的请求;
- Controller调用Model完成状态的读写操作;
- Controller把数据传递给View;
- View渲染最终结果并呈献给用户。
MVC各层职能:
- 控制器Controller层–负责响应用户请求、准备数据,及决定如何展示数据。
- 模块Model层–管理业务逻辑和数据库逻辑。提供连接和操作数据库的抽象层。(过滤也一般写在这里)
- 视图View层–负责前端模版渲染数据,通过HTML方式呈现给用户。

MVC对审计主要影响:
- 文件代码定位问题,一个功能分别在三个文件里,负责不同的部分
- 代码过滤分析问题,一般会写道MODEL层
- 前端安全发现问题,模板注入,XSS等
1.文件代码定位
按原生开发的思路
url中文件和参数是对应的,但MVC中并不是对应的
由url定位到文件
定位各层的文件路径:
从包含文件中找到控制器,模块层所在目录;

视图层一般都是html文件

确定网站对应文件及参数

然后在刚刚确定的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
42PHP常见漏洞关键字:
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.搜索法

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

查看作用函数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 文件对比
- 快速找到脆弱点,修复的地方上一个版本的问题就在这里
- 快速测试新版本有无0day
- UEstudio工具对比文件
3.4 命令执行
分析
baijiacms v4-4.1.4
搜索法搜关键字system(

file_save方法的第四个参数
是由全局变量file接受的

操作点
接下来就要找到能文件上传的点(操作点)
当前文件地址system/weixin/class/web/setting.php,然后就要找对应的url触发
正确的思路应该先利用已知的url正确分析出来对应的文件位置
1 | |
它对应的是 system/manager/class/web/store.php
视图层
1 | |
然后依照这样构造当前文件(system/weixin/class/web/setting.php)的url
1 | |
顺利触发危险方法及漏洞
构造一些条件使得漏洞能够顺利触发
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. 未授权安全挖掘问题
找鉴 权看引用-未引用鉴权逻辑 (没有鉴权)
找鉴权看脆弱-脆弱的鉴权逻辑(鉴权逻辑可绕过)
找鉴权看逻辑-不严谨的鉴权逻辑
先功能操作后验证鉴权(逻辑错误)
先验证鉴权了,但是没有及时跳出程序导致执行了后续功能操作
2. 熊海cms
静态分析
后台逻辑脆弱鉴权
先找鉴权文件
简单的源码:checkadmin,checklogin
该案例先登陆进来观察逻辑
1 | |
参数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:补丁源码对比找到差异