前一阵和前同事交流在检测webshell方面的相关方法,其中提出了使用lex yacc做一套语法解析来解析字节码段来判断是否存在webshell。

后来在查找相关资料中,找到了github开源的一个工具:PHP-Parser。能够把php文件解析AST(抽象语法树)

Project: https://github.com/nikic/PHP-Parser

安装:

php composer.phar require nikic/php-parser

例如:

{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 = newNodeDumper;echo $dumper->dump($ast) . "\n";

转储AST为:

array(0:Stmt_Function(

byRef: falsename:Identifier(

name:test

)

params: array(0:Param(

type: nullbyRef: falsevariadic: false

var:Expr_Variable(

name:foo

)default: null)

)

returnType: nullstmts: array(0:Stmt_Expression(

expr:Expr_FuncCall(

name:Name(

parts: array(0: var_dump)

)

args: array(0:Arg(

value:Expr_Variable(

name:foo

)

byRef: false

unpack: false)

)

)

)

)

)

)

可以看到各个节点的含义,相比较查看opcode然后再去解析容易的多,opcode比较晦涩难懂。

如果做得好,再进行回归成原始的代码,例如webshell中存在很多字符串拼接、函数拼接等操作。回归最终原始代码,再去检测会变得容易的多。

关于php-parser的文档也有很多:

https://github.com/nikic/PHP-Parser/tree/master/doc

我个人的目前思路:

1、获取web目录

2、对每个php文件生成AST

3、解析AST,进行语法回归,转储原始代码 // 这个地方比较有难度

4、使用多引擎(正则、机器学习、第三方接口)进行判断文件是否异常。

php-ast 开源,PHP AST学习 - osc_ryjlu6z2的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐

  1. 文档上传下载 php开源,PHP文件的上传下载 - PHP开发学习门户的个人空间 - OSCHINA - 中文开源技术交流社区...

    (1).在标签中将enctype和method两个属性指明相应的值. Enctype="multipart/form-data"; Method="POST" ...

  2. 平面设计python教程_什么是平面设计? - Python学习教程的个人空间 - OSCHINA - 中文开源技术交流社区...

    平面设计是什么?  任何一个做平面设计的人,或多或少的会想到这一个问题,在此我不想用过多的语言去解释这个问题,.有一个同行的前辈曾经用一个比较形象的话打了个比方,所谓设计,就是纸本来是包不住火的,但是 ...

  3. java 最小众倍数_c学习 - osc_p1q9onsn的个人空间 - OSCHINA - 中文开源技术交流社区...

    ** 初学C+交流 ** 某次培新题(仅供参考) 1.一般交换机会处于哪一层?( B ) A.物理层 B.数据链路层 C.网络层 D.传输层 2.表示关系上的a>=b>=c的C语言表达式的 ...

  4. python语言是由谁设计并领导开发的_python语言概述 - osc_lt3ocv4d的个人空间 - OSCHINA - 中文开源技术交流社区...

    python语言的发展 python语言诞生于1990年,由Guide van Rossum设计并领导开发. python语言是开源项目的优秀代表,其解释器的全部代码都是开源的. 编写Hello程序 ...

  5. 每天学习java一小时_java再学感受 - 编程一小时的个人空间 - OSCHINA - 中文开源技术交流社区...

    首先的是,我买了一本新的有关于java的书,刚开始看,其实在此之前我已经学了一本java语法的书本,现在我买的这本书是我用来提升自己的java认知水平的,首先是对这本书的第一印象吧,里面的内容比较详细 ...

  6. osc mysql_MySQL学习(一) - osc_0sz5p35w的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.MySQL介绍 Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系 ...

  7. php新建数据表输入自己相信,php学习记录 - whoAmIR的个人空间 - OSCHINA - 中文开源技术交流社区...

    留言板的结构相对比较简单,主要分为以下几个文件: 我建立的mysql表 `bbs`, 里面分别有 user,用于记录 用户id `id` int(10) auto_increment, 用户名`use ...

  8. java成果_java学习成果1 - chenxiao60的个人空间 - OSCHINA - 中文开源技术交流社区

    //我的第一个java程序 /**the first thinking in java example program * display a string and today's date * @a ...

  9. java笔记冯佳微盘,JAVA学习笔记14 - osc_vsdge2u3的个人空间 - OSCHINA - 中文开源技术交流社区...

    01(Map集合概述和特点) * A:Map接口概述 * 查看API可以知道: * 将键映射到值的对象 * 一个映射不能包含重复的键 * 每个键最多只能映射到一个值 * B:Map接口和Collect ...

最新文章

  1. 【 MATLAB 】画出一个复指数序列的幅度、相位、实部和虚部的MATLAB脚本
  2. .net 文件服务器系统,File-service基于ASP.NET Core的可伸缩、通用的文件服务器
  3. Unable to load script from assets ‘index.android.bundle‘.
  4. jQuery formValidator表单验证插件4.1.0 下载 演示 文档 可换肤 代码生成器
  5. mysql 两行的差异_MySQL两行之间的日期差异
  6. 【iCore1S 双核心板_ARM】例程五:IWDG看门狗实验——复位ARM
  7. 返回表对象的方法之一--bulk collect into
  8. CSS 3 颜色属性
  9. Puzzle UVA - 227 谜题
  10. 二维码在Access中的使用
  11. 前端使用prettier格式化规范
  12. android 自定义特效,Android 自定义控件~流光特效
  13. 关于深度学习云服务器推荐
  14. 微信公众平台测试号登录入口地址
  15. 【专栏】RPC系列(实战)-负重前行的“动态代理”
  16. 【搜索】B055_LQ_梅花桩(bfs / 贪心)
  17. C语言-函数指针void(*)(void),通用函数指针void(*)()
  18. Android启动摄像机拍照存储展示
  19. ucenter php版本,PHP优秀系统UCenter的MVC架构
  20. 高效的敏捷测试第十课 BDD实践和深化

热门文章

  1. Delta Lake——数据湖的可靠性
  2. 看完你就晓得正向代理和反向代理了!
  3. no.5_得到4升的水
  4. 无招胜有招之Java进阶JVM(九)HotSpot
  5. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
  6. 微服务、容器、DevOps三者之间的演进关系,你清楚吗?
  7. 【Spring】SpringMVC 作用域传值的 4 种方式
  8. 硬盘突然提示没有初始化_测试流程_507283-001 硬盘 HP SAS
  9. kotlin学习之类(三)
  10. leetcode--5. 最长回文子串