利用phply分析函数调用链
字数 1805 2025-09-01 11:26:03
利用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中添加:
dbms.security.procedures.unrestricted=apoc.* apoc.import.file.enabled=true apoc.export.file.enabled=true -
验证安装:
CALL apoc.help('all')
3. 工具使用流程
3.1 代码解析阶段
-
PHP版本转换:
- 使用
convert_php7_to_php5函数将高版本PHP代码转换为PHP5语法 - 原因:phply对高版本PHP支持不完善
- 使用
-
解析PHP文件:
parse_php_file函数:利用phply解析单个PHP文件生成ASTparse_multiple_files函数:批量解析指定目录下的PHP文件
-
修改扫描路径:
- 需要手动修改
parse_multiple_files函数中的扫描路径参数
- 需要手动修改
3.2 数据导入Neo4j
-
离线导入模式:
- 运行
phpast_creat_1_18.py进行数据导入 - 注意:导入时必须关闭Neo4j服务
- 导入完成后才能启动Neo4j
- 运行
-
数据结构:
- 节点(Node)表示函数
- 关系(Relationship)表示调用关系
3.3 查询分析阶段
-
启动Neo4j:
neo4j.bat console -
执行查询:
- 运行
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)
-
查询示例:
MATCH path=(start)-[*]->(end) WHERE start.name='input_function' AND end.name='dangerous_function' RETURN path -
漏洞模式:
- 检测从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应用中的函数调用关系,快速定位潜在的安全风险点,提高代码审计的效率和质量。