介绍
笔者是大四学生,初涉安全的萌新,如果文章有错误之处还请大佬指出!
最初考虑采用纯正则等方式匹配,但这种方式过于严格,程序员编写的代码有各种可能的组合
于是尝试自行实现Java词法分析和语法分析,稍作尝试后发现这不现实,一方面涉及到编译原理的一些算法,另外相比C语言等,Java语言本身较复杂,不是短时间能搞定的,深入研究编译原理背离了做审计工具的目的
后来找到了几种解决方案:Antlr,JavaCC,JDT,javaparser
经过对比,最终选择javaparser项目,该项目似乎是基于JavaCC,核心开发者是effective java的作者。使用起来比较方便,可以简单地以依赖的方式导入
<dependency>
<groupId>com.github.javaparser</groupId>
<artifactId>javaparser-symbol-solver-core</artifactId>
<version>3.23.0</version>
</dependency>
笔者本想采用Golang编写该工具,查找相关资料后发现,Golang本身提供AST库,可以对Golang本身做语法分析,但找不到实现Java语法分析的库(考虑后续复习下编译原理自己尝试)
实例
javaparser最根本的类是CompilationUnit,如果我们想对代码做分析,首先需要实例化该对象
// code是读入的java代码字符串
// 也有其他重载,但这个比较方便
CompilationUnit compilationUnit = StaticJavaParser.parse(code);
给出一段最简单的XSS代码
package testcode.xss.servlets;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Demo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String param = req.getParameter("xss");
resp.getWriter().write(param);
}
}
针对于该案例,我们写审计工具的原理
- 从import来看,比如有request和response,以证明这是HttpServlet
- 从类来看,必须继承自HttpServlet才能证明这是Servlet
- 如果req.getParameter得到的值被write了,认为这是XSS