对于一个Javaweb项目怎么进行代码审计找出漏洞呢.

无框架的javaweb项目

如果是简单的jsp+severlet项目,边运行边看代码,根据页面关键功能跳转查看功能逻辑找到servelt进行查看就行,过滤器Filter和拦截器Interceptor也是很方便根据关键词可以找到。

使用框架

pom.xml文件

如果是使用了常见java框架的javaweb项目比如使用了struct2 spring家族,一般这种情况下项目都会是maven构建,直接查看pom.xml文件,pom.xml文件是一个配置第三方组件的文件,根据这个文件你可以清楚知道这个项目使用了哪些第三方组件,这些第三方组件可能包含一些漏洞同时你也知道这个项目可能会有哪些功能。比如下面这个pom.xml文件

  1. <junit.version>4.12</junit.version> 测试
  2. <spring.version>4.3.27.RELEASE</spring.version>
  3. <cglib.version>3.3.0</cglib.version>
  4. <!-- Spring与Mybatis整合版本对应:http://mybatis.org/spring/ -->
  5. <mybatis.version>3.4.6</mybatis.version> 数据库
  6. <mybatis-spring.version>1.3.3</mybatis-spring.version>
  7. <mysql.version>5.1.47</mysql.version>
  8. <druid.version>1.1.22</druid.version> 数据库连接池
  9. <pagehelper.version>5.1.11</pagehelper.version>
  10. <slf4j.version>1.7.30</slf4j.version> 日志
  11. <logback.version>1.2.3</logback.version>
  12. <fastjson.version>1.2.68</fastjson.version> json解析工具
  13. <jackson.version>2.10.2</jackson.version>

通过pom.xml查看漏洞

看到这些组件名应该马上想到相关漏洞,比如mybatis 数据库$$传参带来的sql注入风险,druid是数据库连接池组件,常见漏洞是druid监控未授权访问漏洞,fastjson就不用说了反序列化。

总而言之看到这些组件就应该想到对应组件的功能使用场景是什么以及对应漏洞有哪些,以及哪些漏洞的关键词是什么,有什么危害。比如druid是一个数据库连接池用来处理数据库连接同时可以监控数据库,一般都会开启监控功能,漏洞未授权访问,漏洞原因是配置不当导致的未授权访问,危害是Druid数据监控界面,里面存在数据源,sql监控,sql防火墙,web应用,url监控,session监控,spring监控等信息,可以详细监控该网站的情况,获取敏感信息,在web监控中,可以获取整个网站的目录,在session监控中,可以获取网站用户的session,从而伪造用户session进行登录,那么你就需要去找druid的配置文件,你就要知道在javaweb框架里druid配置是怎么样配置的一般放在什么位置,文件后缀名是什么,它们都是固定……

即熟悉开发相关配置(相关组合搭配使用 相关组件配置 相关漏洞位置)思考业务性质。比如spring 常见数据库方面有mybatis redis如果是像天猫商城这种对响应性要求更高的可能还有消息队列组件。
Java语言之所以能流行这么多年是因为它成熟的生态圈,什么是生态圈就是所有功能对应组件它全都有而且根据不同业务场景进行使用的都是固定搭配。

配置文件

看完pom.xml文件检查完第三方组件安全性以后看配置文件,不同框架配置文件略有不同比如SpringBoot使用一个全局的配置文件,配置文件名是固定的application.properties,application.yml。Spring配置文件web.xml,简单springmvc框架一般配置(拦截器,过滤器,路由配置)都会写到web.xml。数据库mybatis,sql语句配置文件一般写到sqlmap.xml里搜sqlmap.xml就行了。

过滤器拦截器

拦截器过滤器。一般的项目都会进行过滤拦截。主要是过滤一些有害参数比如拦截sql注入拦截xss。
spring与springboot关于拦截器过滤器略有不同,spring最后是要写到配置文件里。大致实现拦截过滤主要有两种是通过注解或者继承相应类然后通过bean注册,以springboot拦截器为例:
实现自定义拦截器只需要3步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。如public class MyInterceptor1 implements HandlerInterceptor
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
3、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中(在addInterceptors方法中添加)。

  1. @Configuration
  2. public class MyWebAppConfigurer
  3. extends WebMvcConfigurerAdapter { // 这里注意,在spring 5.0之后 WebMvcConfigurerAdapter 过时了,可以直接实现接口 implements WebMvcConfigurer(下面实现的方法是一样的)
  4. @Override
  5. public void addInterceptors(InterceptorRegistry registry) {
  6. // 多个拦截器组成一个拦截器链
  7. // addPathPatterns 用于添加拦截规则
  8. // excludePathPatterns 用户排除拦截
  9. registry.addInterceptor(new MyInterceptor1()).addPathPatterns("/**");
  10. registry.addInterceptor(new MyInterceptor2()).addPathPatterns("/**");
  11. super.addInterceptors(registry);
  12. }
  13. }

这是实现拦截器的一种方式其他实现方式自己搜索。

业务逻辑漏洞

看完配置文件开始看业务逻辑漏洞。最常见的业务逻辑漏洞就是越权,越权有水平越权,垂直越权,这个时候你就要想一下你审计的这个项目,项目背景是什么,有的环境是没有垂直越权的,比如整个项目背景里没有管理员,大家都是一样的身份级别。
然后越权漏洞主要发生在信息交互的增删改查部分,对前端传来个人信息参数有没有进行身份鉴定就会发生未授权访问,比如查询银行卡卡号,学生学号,消费者id等。审计代码的时候找到相应功能比如学生个人信息查询检查参数传递有没有进行身份认证,如果多个业务逻辑流程比如需要认证成功以后才能进行下一个逻辑,响应代码也很重要,查看服务端怎么样进行响应,响应码也是容易被篡改的。即除了看检查对应参数也要注意响应代码。

然后很多项目开发人员一点安全意识都没有,前端代码里你很轻松就会发现正确的响应码,如果刚好后端不进行校验那么就很容易绕过。一般一个系统正确的响应码都是一样的。业务逻辑还有很多,可以部署好项目找到功能点黑盒白盒结合起来进行审计。

常见其他漏洞关键词:

Xml实体注入: DocumentBuilder、sax、Unmarshaller 、XPath、XMLInputFactory
Json: ObjectInputStream.readObject

其他

然后开发时间较早(老版)的可能存在更多问题。相关的组件配置也会是更老版本的。写法也会略有区别。
然后一般除了常见ssm框架以外很多大公司会对框架进行再次封装,封装以后代码会稍微复杂一点,但是基本审计原理思路还是一样的。

代码审计工具idea

常见功能键就搜索:
1.全局搜搜 Edit-find->find in files->可使用正则表达式…… 按esc结束
2.查找某个类 接口调用的位置点右键,有个find usages选项,意思是”找到使用它的地方”
3.搜索某个文件 或者某种文件后缀 如.jsp .xml ctrl+shift+n
4.maven 类包想查看源码 光标放在对应类上面然后就会显示包组织架构,右键edit resouce就可以看见了。

最后因为spring版本问题,可能有遗漏,因为不同版本可以有不同写法。然后spring家族不同搭配也是使用场景不一样的,比如springbootspringcloud组合微服务一般主要是微服务的场景。ssm就比较传统的web网页项目。Spring家族可以搭配混合使用。强调使用场景是因为不同场景很多细节不一样。

如果想学会基础的javaweb代码审计,只需要看懂基础的Java代码就行,知道基础的Java语法,然后了解aop,了解注解反射。只需要了解看得懂代码就行。不需要一定非要多么精通。
javaweb审计例子可以从最简单的无框架只jsp+servelt开始,然后审计单纯使用ssm框架的项目,再审计一个综合性强业务比较多的javaweb项目即可,github,gitee很多。

总结一下:代码审计要了解项目业务场景,熟悉使用组件的基本功能常见漏洞,了解不同javaweb框架细微区别。熟悉常见漏洞的关键词,安全写法和不安全写法。再根据关键词数据流和配置文件进行审计即可。

拦截器过滤器参考原文链接:
https://blog.csdn.net/catoop/article/details/50501696
https://www.cnblogs.com/paddix/p/8365558.html