利用phply分析函数调用链
字数 1805 2025-09-01 11:26:03

利用phply分析PHP函数调用链教学文档

1. 工具概述

本工具基于phply解析PHP代码生成AST(抽象语法树),分析函数调用关系,并将结果导入Neo4j图数据库,通过Cypher查询语句查找函数调用链,特别适合用于安全分析中的漏洞挖掘。

2. 环境准备

2.1 软件安装

  1. Neo4j数据库

    • 下载社区版5.20.0:https://neo4j.com/deployment-center/
    • 安装后默认凭证:neo4j/neo4j
  2. APOC插件

    • 下载地址:https://github.com/neo4j/apoc/
    • 必须与Neo4j版本匹配
    • 安装方式:
      • 将插件jar包放入Neo4j的plugins目录
      • 配置neo4j.conf和apoc.conf
  3. Python依赖

    • phply (PHP解析器)
    • neo4j驱动
    • openpyxl (用于Excel输出)

2.2 配置APOC

  1. 在neo4j.conf中添加:

    dbms.security.procedures.unrestricted=apoc.*
    apoc.import.file.enabled=true
    apoc.export.file.enabled=true
    
  2. 验证安装:

    CALL apoc.help('all')
    

3. 工具使用流程

3.1 代码解析阶段

  1. PHP版本转换

    • 使用convert_php7_to_php5函数将高版本PHP代码转换为PHP5语法
    • 原因:phply对高版本PHP支持不完善
  2. 解析PHP文件

    • parse_php_file函数:利用phply解析单个PHP文件生成AST
    • parse_multiple_files函数:批量解析指定目录下的PHP文件
  3. 修改扫描路径

    • 需要手动修改parse_multiple_files函数中的扫描路径参数

3.2 数据导入Neo4j

  1. 离线导入模式

    • 运行phpast_creat_1_18.py进行数据导入
    • 注意:导入时必须关闭Neo4j服务
    • 导入完成后才能启动Neo4j
  2. 数据结构

    • 节点(Node)表示函数
    • 关系(Relationship)表示调用关系

3.3 查询分析阶段

  1. 启动Neo4j

    neo4j.bat console
    
  2. 执行查询

    • 运行search_neo4j_19.py查询函数调用链
    • 结果自动保存到xlsx文件
  3. 配置查询

    • 修改config.yaml配置文件
    • 自定义search_vul函数中的queue_2变量(查询语句)

4. 核心功能实现

4.1 函数调用关系分析

  1. AST遍历

    • 识别函数定义节点(Function)
    • 识别函数调用节点(FunctionCall)
    • 建立调用者与被调用者的关系
  2. 调用链构建

    • 从入口函数开始追踪所有可能的调用路径
    • 支持跨文件调用关系分析

4.2 安全分析应用

  1. 定义敏感点

    • Source点:用户可控输入点(如\(_GET、\)_POST)
    • Sink点:危险函数(如eval、system)
  2. 查询示例

    MATCH path=(start)-[*]->(end) 
    WHERE start.name='input_function' AND end.name='dangerous_function'
    RETURN path
    
  3. 漏洞模式

    • 检测从Source到Sink的无过滤调用链
    • 识别潜在的代码注入、文件包含等漏洞

5. 高级配置

5.1 自定义查询

  1. 修改config.yaml

    • 定义常用的Source和Sink点
    • 配置扫描路径和输出格式
  2. Cypher查询模板

    • 路径查询:MATCH path=()-[*]->() RETURN path
    • 深度限制:MATCH path=()-[*..5]->() RETURN path

5.2 结果处理

  1. Excel输出

    • 自动生成包含调用链详细信息的xlsx文件
    • 包含调用路径、相关代码位置等信息
  2. 可视化分析

    • 使用Neo4j浏览器查看图形化结果
    • 支持路径高亮和子图导出

6. 常见问题解决

  1. phply解析错误

    • 确保PHP代码已转换为PHP5语法
    • 处理语法糖和特殊语法结构
  2. Neo4j导入失败

    • 检查APOC插件版本匹配
    • 验证配置文件中APOC相关设置
  3. 性能优化

    • 对大项目分批处理
    • 增加内存限制配置

7. 项目资源

  • 项目地址:https://github.com/tj00000000/phpast_creat
  • 参考项目:https://github.com/wh1t3p1g/tabby

8. 扩展应用

  1. 结合静态分析

    • 集成污点分析
    • 添加数据流追踪
  2. CI/CD集成

    • 作为代码审计的自动化环节
    • 设置危险调用链的阻断规则
  3. 自定义规则

    • 扩展Sink点定义
    • 添加框架特定漏洞模式

通过本工具,安全研究人员可以高效地分析PHP应用中的函数调用关系,快速定位潜在的安全风险点,提高代码审计的效率和质量。

利用phply分析PHP函数调用链教学文档 1. 工具概述 本工具基于phply解析PHP代码生成AST(抽象语法树),分析函数调用关系,并将结果导入Neo4j图数据库,通过Cypher查询语句查找函数调用链,特别适合用于安全分析中的漏洞挖掘。 2. 环境准备 2.1 软件安装 Neo4j数据库 : 下载社区版5.20.0:https://neo4j.com/deployment-center/ 安装后默认凭证:neo4j/neo4j APOC插件 : 下载地址:https://github.com/neo4j/apoc/ 必须与Neo4j版本匹配 安装方式: 将插件jar包放入Neo4j的plugins目录 配置neo4j.conf和apoc.conf Python依赖 : phply (PHP解析器) neo4j驱动 openpyxl (用于Excel输出) 2.2 配置APOC 在neo4j.conf中添加: 验证安装: 3. 工具使用流程 3.1 代码解析阶段 PHP版本转换 : 使用 convert_php7_to_php5 函数将高版本PHP代码转换为PHP5语法 原因:phply对高版本PHP支持不完善 解析PHP文件 : parse_php_file 函数:利用phply解析单个PHP文件生成AST parse_multiple_files 函数:批量解析指定目录下的PHP文件 修改扫描路径 : 需要手动修改 parse_multiple_files 函数中的扫描路径参数 3.2 数据导入Neo4j 离线导入模式 : 运行 phpast_creat_1_18.py 进行数据导入 注意:导入时必须关闭Neo4j服务 导入完成后才能启动Neo4j 数据结构 : 节点(Node)表示函数 关系(Relationship)表示调用关系 3.3 查询分析阶段 启动Neo4j : 执行查询 : 运行 search_neo4j_19.py 查询函数调用链 结果自动保存到xlsx文件 配置查询 : 修改 config.yaml 配置文件 自定义 search_vul 函数中的 queue_2 变量(查询语句) 4. 核心功能实现 4.1 函数调用关系分析 AST遍历 : 识别函数定义节点(Function) 识别函数调用节点(FunctionCall) 建立调用者与被调用者的关系 调用链构建 : 从入口函数开始追踪所有可能的调用路径 支持跨文件调用关系分析 4.2 安全分析应用 定义敏感点 : Source点:用户可控输入点(如$_ GET、$_ POST) Sink点:危险函数(如eval、system) 查询示例 : 漏洞模式 : 检测从Source到Sink的无过滤调用链 识别潜在的代码注入、文件包含等漏洞 5. 高级配置 5.1 自定义查询 修改config.yaml : 定义常用的Source和Sink点 配置扫描路径和输出格式 Cypher查询模板 : 路径查询: MATCH path=()-[*]->() RETURN path 深度限制: MATCH path=()-[*..5]->() RETURN path 5.2 结果处理 Excel输出 : 自动生成包含调用链详细信息的xlsx文件 包含调用路径、相关代码位置等信息 可视化分析 : 使用Neo4j浏览器查看图形化结果 支持路径高亮和子图导出 6. 常见问题解决 phply解析错误 : 确保PHP代码已转换为PHP5语法 处理语法糖和特殊语法结构 Neo4j导入失败 : 检查APOC插件版本匹配 验证配置文件中APOC相关设置 性能优化 : 对大项目分批处理 增加内存限制配置 7. 项目资源 项目地址:https://github.com/tj00000000/phpast_ creat 参考项目:https://github.com/wh1t3p1g/tabby 8. 扩展应用 结合静态分析 : 集成污点分析 添加数据流追踪 CI/CD集成 : 作为代码审计的自动化环节 设置危险调用链的阻断规则 自定义规则 : 扩展Sink点定义 添加框架特定漏洞模式 通过本工具,安全研究人员可以高效地分析PHP应用中的函数调用关系,快速定位潜在的安全风险点,提高代码审计的效率和质量。