用Joern进行PHP漏洞复现与挖掘
Joern是源码级的静态分析工具,支持多种语言(二进制有ghidra支持),接下来将从Joern的基本概念,Joern的基本使用,到使用Joern来进行PHP漏洞复现,在到实际使用过程中遇到的问题和解决方案(降低误报率) 来进行介绍。 一、Joern的基本概念 在使用Joern对代码进行分析时,其主要步骤是将项目代码转换为代码属性图(CPG),再提供查询接口来供用户基于CPG进行漏洞挖掘。 Robust parsing ; Code Property Graphs ; Taint Analysis ; Search Queries ; Extendable via CPG passes Joern的官方文档中介绍其核心特点有: 强大的解析能力,指的是Joern内含多种解析器,支持将多种语言转换为代码属性图(CPG) Joern中的代码属性图是其进行静态分析的根基,该数据结构包含程序语法、控制流和数据流的相关信息 污点分析,Joern提供污点分析引擎,用户可以通过定制化的方式来对攻击者可控数据进行分析此外灵活搜索查询和CPG可扩展也是Joern的优点。对于图CPG节点和CPG图本身,Joern支持用户对其灵活的访问和修改 上图展示了用户使用Joern来进行漏洞挖掘的完整逻辑: 首先项目导入,Joern会根据用户提供的项目路径和路径下的文件名后缀来对项目进行解析生成代码属性图,比如项目中如果主要是cpp文件,Joern就会将项目识别为c++项目 生成的代码属性图将加载到Joern的shell中,shell会提供访问代码属性图的接口 用户依据自己积累的漏洞模式,通过查询的方式,对目标项目进行漏洞挖掘。比如通过设置source点和sink点,来进行污点传播分析(在第二节中介绍) Joern输出具有漏洞模式的代码传播路径,快速的帮助用户定位可能存在漏洞的地方,此时需要用户通过审计以及编写poc的方式确认漏洞是否存在 二、Joern的基本使用 使用静态分析工具常见的要求是分析程序从source点到sink点的传播路径,也就是污点传播分析。 这里的source点从宏观上讲,指的是程序中攻击者的可控输入点,具体来说如在php中的$_GET $_POST $_SERVER, 设备固件中HttpGetEnv中的返回值,main函数中的argv等。 sink点指的是程序中的污点,当攻击者输入可以进入到污点将发生安全风险,如危险函数system popen mysql_queryi的输入参数,不局限于危险函数,有特征的字符串拼接也可以设置为sink点,如"SELECT UPDATE INSERT",当程序中有sql query语句拼接特征的代表有注入风险可能。 接着将从Joern官网的例子来演示用Joern进行污点传播分析的基本使用 https://docs.Joern.io/cpgql/data-flow-steps/ //目录 :c/X42.c #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char buffer[10]; if (argc > 1 && strcpy(buffer, argv[1]) == 0) { fprintf(stderr, "It depends!...