本文最后更新于:2020 , 八月 23日 星期日, 11:37 晚上
OA - 任意文件删除
实测影响版本:通达OA V11.6(其他版本未测)
根据网上的exp直接定位到漏洞文件MYOA\webroot\module\appbuilder\assets\print.php
通达OA的文件需要进行解密才可以进行查看源码,否则是乱码
解密后,内容如下:
可以看到该页面并没有何的需要登录验证的文件包含
并且$s_tmp
的并没进行任何的过滤直接带入了unlink()
删除文件函数中
导致了任意文件的删除!
起始目录:/../../../../logs/appbuilder/logs/
漏洞验证:删除一个txt文件
至于文件上传,看的有点糊涂就不写了
深信服任意文件登录
- 漏洞文件:
ui/login.php
看构造进行Session前的if语句
if((isset($_SERVER["REMOTE_ADDR"]) && ("127.0.0.2" == $_SERVER["REMOTE_ADDR"] || "127.0.0.1" == $_SERVER["REMOTE_ADDR"]))
|| $docker)
{
//构造session
if(isset($_GET["user"]))
{
$auth_value["auth_user"] = $_GET["user"];
}
elseif($docker)
{
$auth_value["auth_user"] = $username;
}
else
{
//$auth_value["auth_user"] = "SCLOUDE";
//免密登录后,人为loginout,还是需要密码登录,url不一样
return;
}
session_start();
先判断了$_SERVER["REMOTE_ADDR"]
是否存在,接着判断了$_SERVER["REMOTE_ADDR"]
是否等于127.0.0.2
或127.0.0.1
以及$docker
不知道哪里出了问题,导致了
$_SERVER["REMOTE_ADDR"] == 127.0.0.1
为真所以等于这个判断为永真,直接就进入到了构造session的环节
//构造session
if(isset($_GET["user"]))
{
$auth_value["auth_user"] = $_GET["user"];
}
elseif($docker)
{
$auth_value["auth_user"] = $username;
}
else
{
//$auth_value["auth_user"] = "SCLOUDE";
//免密登录后,人为loginout,还是需要密码登录,url不一样
return;
}
session_start();
如果存在$_GET["user"]
则直接写入到$auth_value["auth_user"]
中,没有进行任何的过滤
$_SESSION["auth_user_info"] = $auth_value;
也就是说用户名是直接带入到$_SESSION["auth_user_info"]
中的,并且是可以控制的
调用了一些函数,但是该php中并没有定义,跟进文件开始时包含的platform
查看相应函数的代码
ui/platform.php
user_logined_get()
:
有问题的if判断:条件为真,则$login_user
获取登录到后台管理员的用户名
if (isset($_SESSION["auth_user_info"]["authed"]) and $_SESSION["auth_user_info"]["authed"] === true )
{
$login_user = $_SESSION["auth_user_info"]["auth_user"];
}
先判断了isset($_SESSION["auth_user_info"]["authed"])
是否存在
接着判断$_SESSION["auth_user_info"]["authed"] === true
是否全等于true
这两个判断条件是有问题的
因为在login.php
中$_SESSION["auth_user_info"]["authed"]
已经默认设置为true
所以该判断条件是为永真的,像当于直接就执行了$login_user = $_SESSION["auth_user_info"]["auth_user"];
Ps:
$_SESSION["auth_user_info"]["auth_user"]
是在login.php
中由$_GET["user"]
可控参数获取的
接着查看判断是否为超级管理员的函数
admin_login_check()
:
和前面函数判断一样,都是if判断出现了逻辑问题,并且用户名是可控的
即:$_GET["user"]= admin
即为超级管理员权限
// login.php
header('Location: index.php');
login.php
的check_free_loginbyscl()
执行到最后,跳转到了index.php
页面
ui/index.php
查看获取用户权限的函数:ui/platform.php
文件中
发现该函数过度信任admin用户,只要是admin用户则一直为管理员
接着查看index.php
获取用户权限函数后的两个if语句
$_SESSION["is_bbs_login"]
在login.php
中已经默认设置为true
所以这个判断也是为永真状态
也就是说无论什么用户,$dev0ption['isAdmin']
一定是为true的
并且user_permission
设置为true,并带入到其他变量中
不再往下分析,简单的说就是判断逻辑不严谨并且用户名参数可控导致了漏洞存在!
该文章仅为自己的看法,如有错误,请告知
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!