记一次ctf中代码审计分析
字数 1768 2025-08-25 22:59:10

CTF代码审计分析实战教学文档

一、信呼OA漏洞分析

1. 初始入口分析

  • 入口URL参数分析:
    m=index&a=getshtml&surl=aG9tZS9pbmRleC9yb2NrX2luZGV4&num=home&menuname=6aaW6aG1
    
    • m参数:指定模块(index)
    • a参数:指定动作(getshtml)
    • surl参数:base64编码的路径(解码为"home/index/rock_index")
    • nummenuname参数:用于导航控制

2. 关键代码路径

  • 请求首先进入View.php
  • 默认会再次调用自身(自调用机制)
  • 可控参数:mad参数均可控

3. 漏洞利用链分析

  1. 文件包含点

    • 最终会包含$mpathname变量
    • 默认后缀被固定为.html
    • 但可以通过$xhrock->displayfile改变$mpathname的值
  2. 类方法调用限制

    • 可以调用任意ClassAction类和任意Action方法
    • 但被限制只能调用indexClassAction类(因为m=index写死)
  3. 关键方法分析

    • indexClassAction类中有多个以Action结尾的方法
    • 通过getshtmlAction方法可以修改displayfile属性:
      $this->displayfile = $file;
      
    • 从而将displayfile修改为任意.php后缀文件
  4. 利用pearcmd.php实现RCE

    • 结合最近爆出的pearcmd.php文件
    • 通过文件包含实现远程代码执行

4. 漏洞验证POC

http://xihu.com/?surl=Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vMQ%3D%3D&a=getshtml
  • surl参数为多层目录穿越的base64编码

二、PbootCMS漏洞分析

1. 路由分析

  • 关键路由文件:apps/common/route.php
  • 存在历史漏洞

2. 历史漏洞分析(逆向分析)

  1. 漏洞调用链

    • parserIfLabel方法 → parserAfter方法 → SearchController
    • 通过keyword参数传递攻击载荷
  2. 过滤器绕过分析

    • get函数过滤器严格,直接导致$data=null
    • content已经渲染出来,存在漏洞利用空间

3. 参考资源

  • 安su师傅的分析:https://xiaokou.top/article?key=e4Q6k0

三、代码审计实用技巧

1. IDE快捷键(基于PhpStorm/IntelliJ)

快捷键 功能描述
F7 步入(进入方法内部)
F8 步过(执行当前行,不进入方法)
F9 继续执行到下一个断点
ALT+F8 评估表达式
Ctrl+F 文件内查找字符串
双击Shift 全局搜索(类、资源、配置、方法、路径等)
Ctrl+N 按类名搜索类
Ctrl+F12 查看当前类结构
Ctrl+H 查看类的层次关系
Alt+F7 查找类或方法在哪被使用

2. 审计方法论

  1. 参数追踪

    • 从用户可控参数入手(GET/POST/COOKIE等)
    • 追踪参数传递路径,直到最终使用点
  2. 危险函数定位

    • 文件包含:includerequireinclude_oncerequire_once
    • 文件操作:file_get_contentsfile_put_contentsfopen
    • 命令执行:systemexecpassthrushell_exec
    • 反序列化:unserialize
  3. 调用链分析

    • 从入口点到漏洞触发点的完整调用路径
    • 注意中间可能存在的过滤和校验
  4. 历史漏洞参考

    • 相同CMS的历史漏洞往往有相似模式
    • 修复方式可能引入新的问题

四、实战建议

  1. 环境搭建

    • 搭建本地测试环境
    • 使用xdebug进行动态调试
  2. 工具辅助

    • 使用静态分析工具(如RIPS、SonarQube等)进行初步扫描
    • 配合动态调试工具(xdebug、phpdbg)验证漏洞
  3. 漏洞利用

    • 优先尝试已知利用方式(如pearcmd.php)
    • 注意不同PHP版本的特性差异
    • 考虑各种过滤和限制的绕过方式
  4. 防御建议

    • 对所有用户输入进行严格过滤
    • 避免动态包含用户可控路径
    • 使用白名单机制限制可包含的文件
    • 及时更新CMS和依赖库版本
CTF代码审计分析实战教学文档 一、信呼OA漏洞分析 1. 初始入口分析 入口URL参数分析: m 参数:指定模块(index) a 参数:指定动作(getshtml) surl 参数:base64编码的路径(解码为"home/index/rock_ index") num 和 menuname 参数:用于导航控制 2. 关键代码路径 请求首先进入 View.php 默认会再次调用自身(自调用机制) 可控参数: m 、 a 、 d 参数均可控 3. 漏洞利用链分析 文件包含点 : 最终会包含 $mpathname 变量 默认后缀被固定为 .html 但可以通过 $xhrock->displayfile 改变 $mpathname 的值 类方法调用限制 : 可以调用任意 ClassAction 类和任意 Action 方法 但被限制只能调用 indexClassAction 类(因为 m=index 写死) 关键方法分析 : indexClassAction 类中有多个以 Action 结尾的方法 通过 getshtmlAction 方法可以修改 displayfile 属性: 从而将 displayfile 修改为任意 .php 后缀文件 利用pearcmd.php实现RCE : 结合最近爆出的 pearcmd.php 文件 通过文件包含实现远程代码执行 4. 漏洞验证POC surl 参数为多层目录穿越的base64编码 二、PbootCMS漏洞分析 1. 路由分析 关键路由文件: apps/common/route.php 存在历史漏洞 2. 历史漏洞分析(逆向分析) 漏洞调用链 : parserIfLabel 方法 → parserAfter 方法 → SearchController 类 通过 keyword 参数传递攻击载荷 过滤器绕过分析 : get 函数过滤器严格,直接导致 $data=null 但 content 已经渲染出来,存在漏洞利用空间 3. 参考资源 安su师傅的分析:https://xiaokou.top/article?key=e4Q6k0 三、代码审计实用技巧 1. IDE快捷键(基于PhpStorm/IntelliJ) | 快捷键 | 功能描述 | |--------|----------| | F7 | 步入(进入方法内部) | | F8 | 步过(执行当前行,不进入方法) | | F9 | 继续执行到下一个断点 | | ALT+F8 | 评估表达式 | | Ctrl+F | 文件内查找字符串 | | 双击Shift | 全局搜索(类、资源、配置、方法、路径等) | | Ctrl+N | 按类名搜索类 | | Ctrl+F12 | 查看当前类结构 | | Ctrl+H | 查看类的层次关系 | | Alt+F7 | 查找类或方法在哪被使用 | 2. 审计方法论 参数追踪 : 从用户可控参数入手(GET/POST/COOKIE等) 追踪参数传递路径,直到最终使用点 危险函数定位 : 文件包含: include 、 require 、 include_once 、 require_once 文件操作: file_get_contents 、 file_put_contents 、 fopen 等 命令执行: system 、 exec 、 passthru 、 shell_exec 等 反序列化: unserialize 调用链分析 : 从入口点到漏洞触发点的完整调用路径 注意中间可能存在的过滤和校验 历史漏洞参考 : 相同CMS的历史漏洞往往有相似模式 修复方式可能引入新的问题 四、实战建议 环境搭建 : 搭建本地测试环境 使用xdebug进行动态调试 工具辅助 : 使用静态分析工具(如RIPS、SonarQube等)进行初步扫描 配合动态调试工具(xdebug、phpdbg)验证漏洞 漏洞利用 : 优先尝试已知利用方式(如pearcmd.php) 注意不同PHP版本的特性差异 考虑各种过滤和限制的绕过方式 防御建议 : 对所有用户输入进行严格过滤 避免动态包含用户可控路径 使用白名单机制限制可包含的文件 及时更新CMS和依赖库版本