记一次对 Java 项目的代码审计

代码审计 2019-11-10

本文作者:singll(信安之路代码审计小组组长)

大家好,我是一只安全小菜鸡。老大扔给我一个项目,某项目的java审计。于是我就去进行我“第一次”审计。

第一回合

拿到代码的我一脸懵逼

OK,这是个 Java 项目,拿到代码之后,我们首先....看结构。

什么?难道拿到代码不是先上扫描器么?

嗯...这么想也没错,我对代码审计的扫描工具有个看法。

在我想象的代码审计境界,对于工具是这样的:

第一个境界:依赖扫描工具。这个阶段扫描工具是救命的,报告全靠扫描工具来出。

第二个境界:脱离扫描工具。一个优秀的代码审计工程师,是一定要会看得懂代码的,扫描工具是提升技术的拦路虎。

第三个境界:使用扫描工具。在高手的手里,工具是提升生产力的,因为高手知道扫描工具的误报,漏报,可以使用工具解决重复的工作,也可以对工具进行改进。

这里不用说了,我就是第一个境界中的。于是我用的是扫描工具+人工审计的方式。PS:扫描工具是使用的 fortify,谁用谁知道。大家可以在网上自己寻找,这里不详说了。

这里补充一下,出去给人做代码审计呢,一般可以配一个开发来帮忙导游,哦不对,是讲解。

有什么不懂不会的都可以问,只要不是 low 爆的问题开发小哥都会耐心讲解。还有就是可以问一下有没有设计文档,可不可以拿出来看看。

回到正题,首先呢,看结构:

既然 java 代码,那么是用什么框架开发的,用了什么第三方插件,等等。

我看到这个项目,用了 spring 框架,然后 orm 用的是 mybatis

至于怎么看,如果项目里有 pom.xml,那么就点开他就行,没有的话就要根据各个框架的特点来找对应文件和代码结构了。

img

就是上图这货。

img

既然是 java 项目,那么一个显而易见的事实就是,java 代码都在 .java 文件里。一般来说,都在 src/main/java 这个文件夹下。

最近看 java,发现一个很好玩的东西,就是一个号称是安全框架的东西 --shiro,apache 出品,必属精品。咳咳。

其实是一个权限管理框架(总结的可能很简单,不过框架主要做的就是这方面事情),有兴趣可以自行看看 shiro :

https://www.sojson.com/tag_shiro.html

我在这个项目里就有发现有用到。

以及一定要看的是 web.xml,这在 java web 项目中属于核心文件,只要能找到就必看(没错,这个文件虽然重要但是不是必须的)。

web.xml 位于 WEB-INF 目录下,而 WEB-INF 可能会位于 webapp 中,貌似也会在其他位置,这个大家稍微找一下就好了。(如图)

img

web.xml 里面可以看到什么呢?

img

filter,这就是大名鼎鼎的过滤器,是否有全局过滤看这里准没错。

img

session,过期时间等。

这里有篇秘籍,大家可以自行观看 web.xml 详解

https://www.jianshu.com/p/35c414c06cd9

本项目是没有设置全局过滤的,所以,你懂得。

由于本项目使用的是 mybatis,那么我们去看 mybatis 文件就好了,很简单,mybatis 使用的是 xml 文件,会 SQL 的一看就能看懂,关键的就是 ${}#{}

img

就是这种文件。原则就是,看到 #{} 就可以放心了,不存在注入的,看到 ${} 的进去跟踪下,如果是从前端传过来的,那么恭喜你,发现 SQL 注入~

此项目不存在 sql 注入。

第二回合

好,我们继续往下进行。让我们有请我们的好朋友,XSS 同学。

这里说一下人工查 XSS 思路,我们回顾一下 XSS 特点,要有输入,要有输出(反射型)。于是我们就去找,输入,一般的语句是这样的:request.getParameter()

然后我们在这下面找到,会不会返回到前端,以及会不会过滤。前端呢,如果有 jsp,去对应 jsp 里面找有没有 ${XXX}

这个就是用来输出从 java 里面传过来的变量的。

由于此项目不存在过滤,所以存在一些 XSS。

至于储存型 XSS 呢,就只要看是否有调用 sql 语句存储到数据库,以及是否将内容输出到前端,满足这两点才会存在(当然要没有过滤才可以)。

余下的漏洞稍稍提一嘴,比如任意文件查看删除,可以根据 path 变量来查(当然这属于取巧,很大可能会漏掉),至于命令执行,可以查找相关危险函数。以及文件上传的危险函数,这里不做总结了,因为我也没找到[摊手]。

最终回合

emmm,最后我从自己审出来的 + fortify 的扫描报告中的一些漏洞(验证过的)拿出来写了报告。

说说我自己的理解:想要完成代码审计的工作,是要会开发的,起码要对代码有感觉,然后常见漏洞原理要掌握。

至于代码审计的进阶,那么就需要深入研究。

忘记从哪里看到的一句话:想要审别人的代码,你就要比写这个代码的人技术更好。

与君共勉。

书籍推荐

既然是 Java 相关,那么一定要推荐一本 Java 书

《Java 核心技术 卷一:基础知识》:

https://pan.baidu.com/s/1tgUG77SSqghmJ4MKoxZnvA(801n)

如果经济能力足够,推荐大家买正版书。


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论