安全圈只要爆出一个重大漏洞,就是一次腥风血雨,学习代码审计没有多久,看着网上各位大佬分析,也忍不住想分析一下,主要是看到好像漏洞利用不太难,适合我等初学者学习。
本次复现环境是通达OAV11.3,文件上传漏洞为全版本通杀,文件包含漏洞/ispirit/interface/gateway.php只有V11.3版本存在,web文件加密为zend加密,需要下载解密软件进行解密,相关软件下载地址如下:
OA软件地址:https://www.tongda2000.com/download/2019.php
zend 5.4解密工具:https://www.cr173.com/soft/418289.html
根据网上众多复现内容,跟进到存在漏洞的文件ispirit/im/upload.php这个文件
$P = $_POST["P"]; if (isset($P) || ($P != "")) { ob_start(); include_once "inc/session.php"; session_id($P); session_start(); session_write_close(); } else { include_once "./auth.php"; }
如果直接访问该url会提示用户未登录
如果带入P参数提交的话,可以看到PHPSESSID已经设置为P参数,已经绕过了登录限制
然后接下来根据流程,开始判断DEST_UID参数,只需要传入一个不为空和0的数字即可
intval($DEST_UID)如果是空或者为0输出都是0
报错是无文件上传
接下来继续跟进函数,只要是全局变量1 <= count($_FILES)即可,也就是有文件上传就会调用upload函数
然后跟进到upload函数,位于inc/utility_file.php中,当然主要看的是上传允许的后缀问题,但是这里所用的getshell方式是文件包含,绕不绕过也就无所谓了
if (!is_uploadable($ATTACH_NAME)) { $ERROR_DESC = sprintf(_("禁止上传后缀名为[%s]的文件"), substr($ATTACH_NAME, strrpos($ATTACH_NAME, ".") + 1)); }
可以看到调用了is_uploadable函数,跟进到该函数,同样位于inc/utility_file.php,代码意思是寻找最后
一次出现 . 的位置,然后寻找后三个字符,然后变成小写字符看是否匹配字符’php’,绕过方式为在最后加 .
然后继续跟进函数UPLOAD_MODE 该函数是用来回显用的,参数值为 1 2 3,
当UPLOAD_MODE值为1时,看返回的值
然后分析下这个保存路径问题
首先可以看到UPLOAD_MODE所需要的ATTACHMENT_ID等参数来自于ATTACHMENTS,
而ATTACHMENTS则是调用upload函数的返回结果
我们所需要的ATTACHMENTS["ID"]来源于add_attach函数,add_attach函数同样位于inc/utility_file.php文件下
在add_attach函数中,看到保存路径,FILENAME
然后看这个函数的返回值,返回值中包含了文件路径以及自定义部分的文件名,在upload函数返回了原始文件名部分。
上传可以用写一个html来进行
漏洞文件位于ispirit/interface/gateway.php
http://localhost:8081/ispirit/interface/gateway.php?json={%22url%22:%22qqqispirit/../../attach/im/2003/376154918.x.php%22}