记一次项目中拿下某oa过程
字数 1183 2025-08-29 22:41:10

某OA系统渗透测试实战教学文档

1. 漏洞发现与利用概述

本教学文档详细记录了对某OA系统的渗透测试过程,涉及前台SQL注入和后台RCE漏洞的发现与利用。

2. 前台SQL注入漏洞

2.1 注入点发现

  • 通过百度搜索发现某处前台注入点
  • 注入点位于图片加载功能中

2.2 注入点分析

  • 系统继承openapiAction
  • 父类初始化函数中存在关键判断逻辑

2.2.1 访问控制绕过

  • 系统使用openkey进行验证,该值在安装时随机生成,无法预知
  • 通过伪造HTTP_HOST头绕过访问控制
    • $_SERVER['HTTP_HOST']获取的host值在不同中间件中存在差异
    • 目标系统以IP+端口方式访问,修改host头可绕过

2.3 注入原理

  • 参数经过base64解密后直接拼接SQL语句
  • 防注入措施在base64解码前执行,导致失效
  • 注入点为INSERT语句,无法直接回显

2.4 注入利用

  • 使用时间盲注技术
  • 使用sqlmap的--sql-shell功能进行查询
  • 查询管理员密码语句:
    select pass from [Q]admin where user='admin' limit 1
    
  • 表前缀处理:使用[Q]代替表前缀,系统会在执行时自动替换

3. 后台RCE漏洞

3.1 漏洞发现

  • 参考网上公开的后台RCE文章
  • 参数通过$this->post('name')方式获取

3.2 限制条件

  1. 输入过滤:
    • 过滤单引号
    • 数据转化为小写
    • 数据长度限制
  2. 双引号也被过滤
  3. 无法通过$_POST[1]方式外部传入

3.3 绕过技术

  • 利用base64_decode函数特性:
    • 字符串不需要引号包裹也可正常解码
    • 字符串结尾的=会被丢弃
    • 示例:base64_decode('MTIz') == base64_decode(MTIz)

3.4 RCE利用POC

a{};file_put_contents(base64_decode(strtoupper(mti) . strtolower(ud) . strtoupper(h) . strtolower(h0)),base64_decode(strtoupper(xs) . strtolower(k) . strtolower(7)),8);class a

POC说明:

  1. 使用file_put_contents写入一句话木马
  2. 由于长度限制,采用追加方式写入(8参数)
  3. 字母和数字需要分开处理:
    • 不能直接写strtolower(k7)
    • 需要写成strtolower(k) . strtolower(7)
  4. 通过字符串拼接构造base64编码的路径和内容

4. 关键知识点总结

  1. HTTP Host头伪造:在特定中间件配置下可绕过访问控制
  2. Base64解码绕过:参数在解码前进行过滤,解码后直接拼接导致注入
  3. 无回显注入利用:时间盲注技术结合sqlmap的sql-shell功能
  4. 表前缀处理:使用[Q]占位符处理动态表前缀
  5. 严格过滤下的RCE
    • 利用函数特性绕过引号限制
    • 字符串分片处理绕过长度和小写转换限制
    • 使用追加方式写入文件

5. 防御建议

  1. 对所有输入参数进行统一过滤,包括解码后的内容
  2. 使用预编译语句处理SQL查询
  3. 限制HTTP Host头的可信来源
  4. 对文件写入操作进行严格权限控制和内容检查
  5. 禁用危险函数或严格限制其使用场景
某OA系统渗透测试实战教学文档 1. 漏洞发现与利用概述 本教学文档详细记录了对某OA系统的渗透测试过程,涉及前台SQL注入和后台RCE漏洞的发现与利用。 2. 前台SQL注入漏洞 2.1 注入点发现 通过百度搜索发现某处前台注入点 注入点位于图片加载功能中 2.2 注入点分析 系统继承 openapiAction 类 父类初始化函数中存在关键判断逻辑 2.2.1 访问控制绕过 系统使用 openkey 进行验证,该值在安装时随机生成,无法预知 通过伪造 HTTP_HOST 头绕过访问控制 $_SERVER['HTTP_HOST'] 获取的host值在不同中间件中存在差异 目标系统以IP+端口方式访问,修改host头可绕过 2.3 注入原理 参数经过base64解密后直接拼接SQL语句 防注入措施在base64解码前执行,导致失效 注入点为INSERT语句,无法直接回显 2.4 注入利用 使用时间盲注技术 使用sqlmap的 --sql-shell 功能进行查询 查询管理员密码语句: 表前缀处理:使用 [Q] 代替表前缀,系统会在执行时自动替换 3. 后台RCE漏洞 3.1 漏洞发现 参考网上公开的后台RCE文章 参数通过 $this->post('name') 方式获取 3.2 限制条件 输入过滤: 过滤单引号 数据转化为小写 数据长度限制 双引号也被过滤 无法通过 $_POST[1] 方式外部传入 3.3 绕过技术 利用 base64_decode 函数特性: 字符串不需要引号包裹也可正常解码 字符串结尾的 = 会被丢弃 示例: base64_decode('MTIz') == base64_decode(MTIz) 3.4 RCE利用POC POC说明: 使用 file_put_contents 写入一句话木马 由于长度限制,采用追加方式写入( 8 参数) 字母和数字需要分开处理: 不能直接写 strtolower(k7) 需要写成 strtolower(k) . strtolower(7) 通过字符串拼接构造base64编码的路径和内容 4. 关键知识点总结 HTTP Host头伪造 :在特定中间件配置下可绕过访问控制 Base64解码绕过 :参数在解码前进行过滤,解码后直接拼接导致注入 无回显注入利用 :时间盲注技术结合sqlmap的sql-shell功能 表前缀处理 :使用 [Q] 占位符处理动态表前缀 严格过滤下的RCE : 利用函数特性绕过引号限制 字符串分片处理绕过长度和小写转换限制 使用追加方式写入文件 5. 防御建议 对所有输入参数进行统一过滤,包括解码后的内容 使用预编译语句处理SQL查询 限制HTTP Host头的可信来源 对文件写入操作进行严格权限控制和内容检查 禁用危险函数或严格限制其使用场景