文章目录
- 代码审计------第一百零八天
-
- PHP模型开发篇&MVC层&动态调试未授权&脆弱鉴权&未引用&错误逻辑
-
- PHP动态调试
-
- 为什么需要动调?
- 如何配置
-
- 配置php.ini文件
- 配置PhpStorm
- 配置调试器
- [配置Xdebug helper插件](#配置Xdebug helper插件)
- [PHP审计 - 动态调试-脆弱的鉴权逻辑](#PHP审计 - 动态调试-脆弱的鉴权逻辑)
- [PHP审计 - 动态调试-未引用的鉴权逻辑](#PHP审计 - 动态调试-未引用的鉴权逻辑)
- [PHP审计 - 动态调试-不严谨的鉴权逻辑](#PHP审计 - 动态调试-不严谨的鉴权逻辑)
- 总结
代码审计------第一百零八天
PHP模型开发篇&MVC层&动态调试未授权&脆弱鉴权&未引用&错误逻辑
PHP动态调试
为什么需要动调?
- 我们上节课的最后一个案例,虽然是比较小的CMS,但我们分析的时候需要跳来跳去地看他的逻辑很麻烦
- 而之后我们可能需要审计更大的系统,他的代码逻辑会比这个复杂很多很多,因此我们纯静态分析代码会很麻烦,由此引入动态调试
- 动态调试对认证缺陷、访问控制、反序列化链等等漏洞都有比较好的效果
如何配置
配置php.ini文件
-
首先我们需要安装Xdebug helper插件,直接Edge搜索安装即可,然后在phpstudy中选择指定的php版本打开调试功能:

-
之后点开对应的php版本配置文件,在末尾写入如下内容:
php
# 添加:
xdebug.idekey=PHPSTORM
xdebug.mode=debug
# 修改:
xdebug.remote_enable=Off => xdebug.remote_enable=On
配置PhpStorm
-
设置完成之后打开PHPSTORM设置php语言级别与解释器和phpstudy一致:

-
之后设置网站监听域名端口与phpstudy中的一致,这里路径映射是针对远程php调试的时候使用:

-
然后设置Xdebug的调试端口:

-
我们之前不是在php.ini中添加了两行配置吗,这里就需要设置相应的DBGp代理:

配置调试器
- 接下来选择应用后,我们还需要开启调试:


配置Xdebug helper插件
-
最后设置浏览器上的Xdebug helper插件的IDE key即可:

-
设置完成之后,我们就可以下断点然后开始调试了
PHP审计 - 动态调试-脆弱的鉴权逻辑
-
第一个案例是CNVD-2017-04238,熊海CMS v1.0后台存在登录绕过漏洞,用户可伪造COOKIE绕过鉴权:

-
安装好之后通过PS打开源码,这里我们先静态能不能分析出来,直接搜索关键词
COOKIE以及鉴权猜测文件名就可以定位到checklogin.php:

-
可以看到这里他的鉴权逻辑很简单就是看
COOKIE['user']是否为空,于是我们就可以直接将COOKIE随便设一个值就可以绕过这个鉴权逻辑执行管理员操作 -
比如我们到后台登录页面,然后随便设置一个
COOKIE['user']就可以看到直接进入后台了:


-
那这里当文件很多的时候,我们就可以直接用动态调试的方法下断点然后直接尝试访问后台路径,他必定会走这个鉴权逻辑,所以我们就可以直接看到了
-
首先我们看到这个URL就可以知道他是MVC架构,所以可以先看看他的路由结构:

-
于是我们能够知道他接收一个r参数,然后包含这个
files/$r.php文件,所以我们直接随便找一个后台文件,然后尝试下断点访问即可:

-
在这途中他就会经过这个
checklogin.php文件,然后步入看这个逻辑即可找到对应的鉴权文件,然后他调试的时候还会动态显示当前的参数以及值:

-
在审计的时候其实也还是蛮有用的
PHP审计 - 动态调试-未引用的鉴权逻辑
-
第二个案例是CwCMS,他存在一个后台文件未授权访问漏洞,当然危害并不大,主要是看他这个漏洞挖掘思路
-
这里我们不管是通过动调还是静态分析,都可以找到他的鉴权文件为
admin.php,这里我们主要关注的漏洞是未授权,所以这里我们可以看看哪些Admin目录下的文件没有引用这个鉴权文件:

-
所以这里没有引用鉴权文件的有
Cw_right.php和cw_imglist.php,我们可以直接未授权访问:


-
当然这个可能没什么用,但是这里结合后面的代码,我们很容易看到他存在SQL注入,那这里的危害就大了:

-
但是这里我们主要是看这个未授权的挖掘思路------就是找找看有没有引用鉴权逻辑的文件
PHP审计 - 动态调试-不严谨的鉴权逻辑
-
第三个案例是CNVD-2022-03687,BossCMS V1.0存在任意文件删除漏洞:

-
首先我们看到这个URL就知道是MVC架构,所以先搞清楚他的路由逻辑,那这里就不展示怎么找的了:

php
bosscms:7899/admin/?mold=login&part=login&func=init
即:
mold -> 文件名
part -> 类名
func -> 方法名
-
然后我们可以通过删除文件的关键函数
unlink定位到system/basic/class/dir.class.php文件的delete()函数,然后转到他的声明或用例,搜索dir::delete,我们可以找到这个文件system/admin/safe/backup.class.php:

-
于是我们这里尝试访问,构造URL:
php
bosscms:7899/admin/?mold=safe&part=backup&func=delete&id=xxx
post: url=xxx
-
但是这里需要先登录,于是我们在这里下一个断点,尝试登录访问该URL找找看鉴权文件,这里为
system/admin/login/login.class.php:

-
我们可以看到这里他的逻辑是如果登录失败就直接弹窗提示失败,但是这里会出现的逻辑问题就是他本身的代码还是会往下执行
-
因此,这里就可以挖掘一些文件类漏洞,比如这里的文件删除,我们先创建一个备份文件:

-
然后退出登录,通过我们上面构造的URL进行访问,看看能否未授权删除即可验证漏洞是否存在:


-
那这里他也没有过滤
../这种路径穿越符,所以导致可以未授权删除任意文件,这里我也验证过了 -
因此这里我们需要注意的就是看鉴权逻辑是否在退出之前做结束处理,比如
die()、exit()等等
总结
- 所以今天主要就是关于鉴权的漏洞成因,主要就是这三类:
- 脆弱的鉴权逻辑,导致可以绕过鉴权
- 未引用鉴权逻辑,导致未授权访问
- 不严谨的鉴权逻辑,导致未授权操作