学习静态代码审计_第二站:简单解读php-parser项目

2024-01-19 08:32

本文主要是介绍学习静态代码审计_第二站:简单解读php-parser项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 前言
    • 项目官方说明
        • 0x01 PHP解析器
        • 0x02 功能
        • 0x03 快速开始
        • 0x04 文档
    • 参考


前言

  第一次接触这个项目,是2021强网杯的pop-master题目,也是这道题目给我打开了静态代码审计的大门。后来了解静态代码审计的发展历程,又接触到了昆仑镜项目。php-parse项目都下载三遍了,这次要搞定她!

  PHP Parser 是由 nikic 开发的一款 php 抽象语法树(AST)解析工具。项目地址:https://github.com/nikic/PHP-Parser。

  项目作者:nikic是PHP的主要contributor,目前在Jetbrains旗下的PhpStorm项目工作,并且开发过许多PHP的开源库。他也是LLVM项目的开发者。


项目官方说明

0x01 PHP解析器

  使用PHP编写的适合 php5.2 - php8.0 的解析器,用于简化静态代码分析和操作。

  Documentation for version 4.x (stable; for running on PHP >= 7.0; for parsing PHP 5.2 to PHP 8.0),文档地址:https://github.com/nikic/PHP-Parser/tree/master/doc.

  Documentation for version 3.x (unsupported; for running on PHP >= 5.5; for parsing PHP 5.2 to PHP 7.2),文档地址:https://github.com/nikic/PHP-Parser/tree/3.x/doc.

0x02 功能

  主要功能如下,其中前4项功能相比之下更具可用性。

  • 把PHP5、PHP7、PHP8的代码转换成抽象语法树AST
    • 无效代码会被解析成一个部分抽象语法树
    • 生成的AST包含准确的位置信息
  • 使用可读性高的表格转储生成的AST
  • 把AST转回PHP代码
    • 试验的:修改后的AST可以被格式化保存
  • 遍历和修改AST
  • 命名空间名称的解析
  • 常数表达式的求值
  • 简化AST结构的构造器 for 代码生成
  • 来回转换抽象语法树和Json数据
0x03 快速开始

  (1)使用PHP依赖管理工具Composer安装,由于本地Composer是全局配置,所以命令有所不同。

	composer require nikic/php-parsercd ./vendor/nikic/php-parser/

在这里插入图片描述

  (2)运行测试代码:nikic给出的代码示例如下,使用该软件,只需要把需要审计的代码放到$code变量中即可。

<?php
use PhpParser\Error;
use PhpParser\NodeDumper;
use PhpParser\ParserFactory;$code = <<<'CODE'
<?phpfunction test($foo)
{var_dump($foo);
}
CODE;$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
try {$ast = $parser->parse($code);
} catch (Error $error) {echo "Parse error: {$error->getMessage()}\n";return;
}$dumper = new NodeDumper;
echo $dumper->dump($ast) . "\n";

  测试:在nikic/php-parser/lib/目录下新建MyASTest.php,复制粘贴示例代码,使用测试代码替换7-12行的代码。

<?php
var_dump(token_get_all('<?php echo "hello"; $a=1;echo $a+$a;?>'));
?>

  报错信息:使用PHPStorm打开MyASTest.php文件,使用PHP7.3.24命令解释器,发生报错。(完全使用示例代码也有相同报错)
在这里插入图片描述

PHP Fatal error:  Uncaught Error: Class 'PhpParser\ParserFactory' not found in /Users/didi/Downloads/vendor/nikic/php-parser/lib/MyASTest.php:15
Stack trace:
#0 {main}thrown in xxx.php on line 15

  网上并没有找到明确的解决方式,但通过查阅use相关资料得知,use只是使用了命名空间,但是要想调用类,必须要加载类文件,或者自动加载。根据报错信息可以知道,use起作用了,但class类没有引用成功。

  尝试1-可行:使用自动加载。autoload.php文件在vendor目录下,通过目录遍历去包含该文件。比如本地在MyASTest.php文件第5行添加的代码如下,运行结果如图。

	require_once __DIR__ . '/../../../autoload.php';

在这里插入图片描述

  (3)遍历AST并执行某种操作,比如丢掉抽象语法树AST中某个函数的所有函数体。
  使用Class NodeTraverser,运行相关代码之后可以发现,只保留了Stmt_Function数组,stmts数组的内容被清空了。这意味着,我们可以对得到的AST语法树进行比较灵活的操作。(我愿称之为二次操作)

  (4)把得到的AST语法树转回PHP代码。
这个步骤很适合Webshell检测。使用PrettyPrinter文件中的Class PrettyPrinter\Standard,但是作者给出的例子中,却没有还原函数体,具体点就是 减去了函数中var_dump()的调用。该软件还原代码的可用性有多大,还需要进一步探究。

  (5)For a more comprehensive introduction, see the documentation。

0x04 文档

  基础组件的使用这部分,其实相当重要。但持恒之初忌深远,贪多嚼不烂,后续更文再深入分析,一定记得多读文档方能熟能生巧。

  1. Introduction
  2. Usage of basic components

  下一篇学习研究PHP-Parse的使用,通过聚焦某些应用场景,比如基于该软件寻找强网杯pop-master题目的RCE pop链、探索该软件在代码审计领域的应用场景等。希望可以做到对这个PHP编写的PHP解析器项目烂熟于心,成为迈向代码安全领域坚实的一步。


参考

  《PHP Parser 简介和应用 - 为你的代码自动补全单元测试》,文章地址:https://learnku.com/articles/21846。

  《PHP中的use、命名空间、引入类文件、自动加载类的理解》,文章地址:https://blog.csdn.net/github_37767025/article/details/68064974

这篇关于学习静态代码审计_第二站:简单解读php-parser项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621848

相关文章

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪

Java Spring ApplicationEvent 代码示例解析

《JavaSpringApplicationEvent代码示例解析》本文解析了Spring事件机制,涵盖核心概念(发布-订阅/观察者模式)、代码实现(事件定义、发布、监听)及高级应用(异步处理、... 目录一、Spring 事件机制核心概念1. 事件驱动架构模型2. 核心组件二、代码示例解析1. 事件定义

springboot项目中整合高德地图的实践

《springboot项目中整合高德地图的实践》:本文主要介绍springboot项目中整合高德地图的实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一:高德开放平台的使用二:创建数据库(我是用的是mysql)三:Springboot所需的依赖(根据你的需求再

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java中Map.Entry()含义及方法使用代码

《Java中Map.Entry()含义及方法使用代码》:本文主要介绍Java中Map.Entry()含义及方法使用的相关资料,Map.Entry是Java中Map的静态内部接口,用于表示键值对,其... 目录前言 Map.Entry作用核心方法常见使用场景1. 遍历 Map 的所有键值对2. 直接修改 Ma

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地