MVC模式下的未授权漏洞代码审计-PHP
0x00 前置知识
未授权的情况有很多种:
- 未引用鉴权文件--->访问未引用鉴权文件的后台文件就可以实现未授权操作
- 脆弱的鉴权--->能绕过
- 不严谨的鉴权--->虽然进行了鉴权操作,但是在检查到没有相应权限时,没有立即结束程序,程序还可以继续执行下面的功能操作。
在这次代码审计中,我们使用了xdebug进行动态调试,方便我们理解鉴权前后的流程。
phpstorm配置xdebug的教程:
参考链接:https://mp.weixin.qq.com/s/7K8edea8imalZ8_jJp3ODw
0x01 CwCMS 未引用鉴权文件
部署好网站后,登陆一下后台,发现来到了/admin/cw_main.php页面。

则进行动态调试的时候,我们可以在/admin/cw_main.php中下个断点。

在未登陆的情况下访问/admin/cw_main.php,并开始动态调试。



从上面的动态调试中,我们可以知道若是在未登录的情况下直接访问后台/admin/cw_main.php界面的话,会先来到Admin.php进行鉴权操作,判断到session中的user的值为空,会提示登陆超时或为登陆,重定向到/admin/index.php界面。
在已登陆的情况下访问/admin/cw_main.php文件,并两端都开启动态调试。






从上面的动态调试的过程中,我们可以知道在已登陆的状态下访问后台/admin/cw_main.php界面的话,会先来到/Admin/Admin.php界面进行鉴权操作,鉴权结果为admin,返回到/admin/cw_main.php代码中,执行下面的代码require_once("../inc/config.php");,执行完/inc/config.php配置代码后,会继续执行/admin/cw_admin中的功能代码。
对比未登录和已登录的动态调试情况,可得知:
-
/Admin/Admin.php是后台的鉴权文件。鉴权逻辑是判断session中存储的username变量有无值。如果变量username为空,会重定向到index.php登录界面。
-
未登录的情况下会被重定向到/admin/login.php界面,已登录的情况下会继续执行 cw_mian.php中的内容。
使用session对username值进行存储,这个我们是无法进行绕过的,只能看有没有一部分的后台文件并引用鉴权文件,然后访问未引用鉴权文件的后台文件,这样子就能实现未授权登录后台了。


0x02 XhCMS 脆弱鉴权
在phpstorm ide中,开启debug监听模式,在newwz.php中下个断点。

在浏览器中,Xdebug Helper开启Debug。

在未登录的请况下访问http://192.168.11.1:84/admin/?r=newwz,然后来到phpstorm,进行动态调试。



从上面的动态调试我们可以知道,在未登录的状态下访问http://192.168.11.1:84/admin/?r=newwz界面的话,先会来到/inc/checklogin.php代码中进行鉴权操作,接收cookie中的user,因为是未登录状态,user的值为空,会重定向到http://192.168.11.1:84/admin/?r=login界面。
在已登录的情况下访问http://192.168.11.1:84/admin/?r=newwz,看看动态调试的走向是怎么样的?





从上面的动态调试我们可以知道,在已登录的状态下访问http://192.168.11.1:84/admin/?r=newwz界面的话,先会来到/inc/checklogin.php代码中进行鉴权操作,接收cookie中的user,因为是已登录状态,user的值为admin。然后来到require '../inc/conn.php';代码执行中,执行/inc/conn.php中的代码,执行完后会进行执行接下来/admin/newwz.php中的功能操作。
对比未登录和已登录的动态调试情况,可得知
-
鉴权文件是/inc/checklogin.php。鉴权逻辑是判断cookie中接收的user变量有无值。如果变量user为空,会重定向到login登录界面。
-
在未登录的情况下,如果直接访问/admin?r=newwz界面,会被重定向到login界面,提示要登陆。
-
在已登陆的情况下,如果直接访问/admin?r=newwz界面,可以直接来到newwz界面。
鉴权文件checklogin.php的内容如下:
<?php
$user=$_COOKIE['user'];
if ($user==""){
header("Location: ?r=login");
exit;
}
?>
这个是个脆弱的鉴权,在未登陆的情况下,在cookie中添加一个user变量,user值为admin,就能绕过鉴权,访问后台文件了。
0x03 BossCMS 不严谨鉴权
https://www.cnvd.org.cn/flaw/show/CNVD-2022-19247
先登录一下后台,然后随便找一个后台的界面,http://192.168.11.1:86/admin/#items,找一下对应的源码文件,对应的源码文件是/system/admin/items/items.class.php和system/admin/items/content.class.php这两个php文件。
在items.class.php和content.class.php这两个文件中都下断点,访问http://192.168.11.1:86/admin/#items没有断下来,访问http://192.168.11.1:86/admin/#content发现在connetn.class.php这里断下来了。
然后根据 动态调试,我们可知鉴权文件是/system/basic/class/admin.class.php,其实整个鉴权逻辑十分严谨并且坚固,但是致命点在于在鉴权为没有相应权限的用户后,并没有马上结束程序,而是还继续执行该文件接下来的功能操作代码,这造成了未授权执行功能代码。

于是在后台备份列表中,导致了未授权任意文件删除。

删除备份数据库的数据包是这样子的:

POST /admin/?mold=safe&part=backup&func=delete&id=20231029203802u8m8c2.sql
url=http://192.168.11.1:86/admin/?mold=safe&part=backup&func=table&lang=1
试着在未登录的状态下,将备份数据库删除。

发现确实是只有一个sql文件了,说明未授权删除文件成功.

修复意见:当鉴权为未授权用户,进行重定向后,立马结束程序(die/exit)。
0x04 泛微OA 未授权任意文件上传
参考链接:https://xz.aliyun.com/t/10646
https://www.cnvd.org.cn/flaw/show/CNVD-2021-49104
修复的地方是在uploadFile.php中有一个SecurityFilter()过滤函数,对上传的文件进行了个过滤。


浙公网安备 33010602011771号