文章目录
编译基础知识
0x01 编译系统的结构
编译系统的结构:以人工英汉翻译举例,理解翻译过程。
In the room, he broke a windows with hammer
第1步:判断单词的词类/词性(词法分析)–> 根据词类识别句子短语,获取句子结构(语法分析)–> 根据句子结构分析短语充当成分,获取名词短语与核心谓语动词的关系(语义分析)。
第2步,给出中间表示形式。基于AST的语法树就是代码的一种中间表现形式,通过统一中间表示形式,可以使代码自动化审计具有统一的数据源,可以使代码回归从而更好地检测Webshell。
通过举例理解,我们再看编译器工作流程的前端front end
分析部分:
0x02 词法分析
简单来说,就是对代码中的单词做标记分好类。
静态代码审计的发展-seebug1篇文章
0x01 关键字匹配
高覆盖性-宁错杀不放过:正则匹配模式\beval\(\$
,这类工具最经典的就是Seay,通过简单的关键字来匹配经可能多的目标。
高可用性-宁放过不错杀:正则匹配模式\beval\b\(\$_(GET|POST)
,这类工具最经典的是Rips免费版,用更多的正则来约束,用更多的规则来覆盖多种情况。
缺点:误报率或漏报率居高不下,依赖人工审计,工作量大。
原因:审计工具的聚焦对象是应用层的代码,而应用层的代码随着开发人员的不同而不同,难以统一格式。代码对象的不统一,使问题的复杂性成为一种必然。
0x02 AST代码分析
AST(Abstract Syntax Tree,抽象语法树)是编译原理中的概念,基于AST的静态代码分析工具,其可圈可点之处在于实现了代码对象的统一
。
开发人员是不同的,但编译器是相同的。通过把代码转换成AST抽象语法树,我们实现了代码格式的统一,即代码分析工具数据源的统一。
常见的语义分析项目:
https://github.com/nikic/PHP-Parser
https://github.com/viraptor/phply
复习一波编译原理
ExploitCat-又称
《PHP自动化白盒审计技术与实现》
https://exploitcat.blog.csdn.net/article/details/46271551
《浅谈PHP自动化代码审计技术》
https://blog.csdn.net/u011721501/article/details/44982111
《使用PHP-Parser生成AST抽象语法树》
https://exploitcat.blog.csdn.net/article/details/43031537
《PHP AST学习》-2018/07,从Webshell检测方面出发。
https://blog.csdn.net/angaoux03775/article/details/101710866?utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-8.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-8.control
《新抽象语法树(AST)给 PHP7 带来的变化》,讲到了php的编译过程。https://blog.csdn.net/weixin_43814458/article/details/106122078?utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaidudefault-5.control
《深入理解PHP原理之opcodes》,写的很详细很好,https://www.cnblogs.com/feixiablog/articles/8297163.html
不懂的地方还有很多,比如compose、PHP新特性……不要总是想着从基础去学,诚实地讲那是一种对困难的逃避方式,那样很蠢。
PHP-Parse
看到的文章更多是关于把PHP代码解析成AST。
比如《PHP-Parse 简介以及在 Hyperf 中的应用》,
PHP-Parse 的主要作用是修改原有代码(比如插入自定义的代码片段),生成新的代理类 。框架内生成代理类,处理注入有用到,比如 Hyperf 的 DI 组件利用反射和 PHP-Parse 实现了注入。
比如《PHP Parser 简介和应用 - 为你的代码自动补全单元测试》,
PHP Parser 是由 nikic 开发的一款 php 抽象语法树(AST)解析工具。PHP Parser 同时兼顾接口易用,结构简洁,工具链完善等诸多优点。在工程上,普遍使用 PHP Paser 生成模板代码,或使用其生成的抽象语法树进行静态分析。
比如用于减少语法错误的,
这里介绍一款PHP代码静态分析工具:PHPStan,不需要运行代码,也可以对代码进行严格的语法检测,尽量将代码运行错误率降到最低。
参考
《从0开始聊聊自动化静态代码审计工具》,https://paper.seebug.org/1339/