学习静态代码审计_第二站:简单解读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

相关文章

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

精选20个好玩又实用的的Python实战项目(有图文代码)

《精选20个好玩又实用的的Python实战项目(有图文代码)》文章介绍了20个实用Python项目,涵盖游戏开发、工具应用、图像处理、机器学习等,使用Tkinter、PIL、OpenCV、Kivy等库... 目录① 猜字游戏② 闹钟③ 骰子模拟器④ 二维码⑤ 语言检测⑥ 加密和解密⑦ URL缩短⑧ 音乐播放

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Python实现MQTT通信的示例代码

《Python实现MQTT通信的示例代码》本文主要介绍了Python实现MQTT通信的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 安装paho-mqtt库‌2. 搭建MQTT代理服务器(Broker)‌‌3. pytho

MySQL进行数据库审计的详细步骤和示例代码

《MySQL进行数据库审计的详细步骤和示例代码》数据库审计通过触发器、内置功能及第三方工具记录和监控数据库活动,确保安全、完整与合规,Java代码实现自动化日志记录,整合分析系统提升监控效率,本文给大... 目录一、数据库审计的基本概念二、使用触发器进行数据库审计1. 创建审计表2. 创建触发器三、Java