学无止境

Remember a Java code audit

本文于302天之前发表,文中内容可能已经过时。如有疑问,请在评论区留言。

前言

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

第一回合

拿到代码的我一脸懵逼
OK,这是个Java项目,拿到代码之后,我们首先….看结构。
什么?难道拿到代码不是先上扫描器么?
嗯…这么想也没错,我对代码审计的扫描工具有个看法。
在我想象的代码审计境界,对于工具是这样的:
第一个境界:依赖扫描工具。这个阶段扫描工具是救命的,报告全靠扫描工具来出。
第二个境界:脱离扫描工具。一个优秀的代码审计工程师,是一定要会看得懂代码的,扫描工具是提升技术的拦路虎。
第三个境界:使用扫描工具。在高手的手里,工具是提升生产力的,因为高手知道扫描工具的误报,漏报,可以使用工具解决重复的工作,也可以对工具进行改进。
这里不用说了,我就是第一个境界中的。于是我用的是扫描工具+人工审计的方式。PS:扫描工具是使用的fortify,谁用谁知道。大家可以在网上自己寻找,这里不详说了。
这里补充一下,出去给人做代码审计呢,一般可以配一个开发来帮忙导游,哦不对,是讲解。
有什么不懂不会的都可以问,只要不是low爆的问题开发小哥都会耐心讲解。还有就是可以问一下有没有设计文档,可不可以拿出来看看。
回到正题,首先呢,看结构:
既然java代码,那么是用什么框架开发的,用了什么第三方插件,等等。
我看到这个项目,用了spring框架,然后orm用的是mybatis。
至于怎么看,如果项目里有pom.xml,那么就点开他就行,没有的话就要根据各个框架的特点来找对应文件和代码结构了。

就是上图这货。

既然是java项目,那么一个显而易见的事实就是,java代码都在.java文件里。一般来说,都在src/main/java 这个文件夹下。
最近看java,发现一个很好玩的东西,就是一个号称是安全框架的东西–shiro,apache出品,必属精品。咳咳。
其实是一个权限管理框架(总结的可能很简单,不过框架主要做的就是这方面事情),有兴趣可以自行看看shiro,我在这个项目里就有发现有用到。
以及一定要看的是web.xml,这在java web项目中属于核心文件,只要能找到就必看(没错,这个文件虽然重要但是不是必须的)。
web.xml位于WEB-INF目录下,而WEB-INF可能会位于webapp中,貌似也会在其他位置,这个大家稍微找一下就好了。(如图)

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

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

session,过期时间等。
这里有篇秘籍,大家可以自行观看web.xml详解
本项目是没有设置全局过滤的,所以,你懂得。
由于本项目使用的是mybatis,那么我们去看mybatis文件就好了,很简单,mybatis使用的是xml文件,会SQL的一看就能看懂,关键的就是${} 与#{}。

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

第二回合

好,我们继续往下进行。让我们有请我们的好朋友,XSS同学。
这里说一下人工查XSS思路,我们回顾一下XSS特点,要有输入,要有输出(反射型)。于是我们就去找,输入,一般的语句是这样的:request.getParameter()。
然后我们在这下面找到,会不会返回到前端,以及会不会过滤。前端呢,如果有jsp,去对应jsp里面找有没有${XXX}
这个就是用来输出从java里面传过来的变量的。
由于此项目不存在过滤,所以存在一些XSS。
至于储存型XSS呢,就只要看是否有调用sql语句存储到数据库,以及是否将内容输出到前端,满足这两点才会存在(当然要没有过滤才可以)。
余下的漏洞稍稍提一嘴,比如任意文件查看删除,可以根据path 变量来查(当然这属于取巧,很大可能会漏掉),
至于命令执行,可以查找相关危险函数。以及文件上传的危险函数,这里不做总结了,因为我也没找到[摊手]。

最终回合

emmm,最后我从自己审出来的+fortify的扫描报告中的一些漏洞(验证过的)拿出来写了报告。
说说我自己的理解:想要完成代码审计的工作,是要会开发的,起码要对代码有感觉,然后常见漏洞原理要掌握。
至于代码审计的进阶,那么就需要深入研究。
忘记从哪里看到的一句话:想要审别人的代码,你就要比写这个代码的人技术更好。
与君共勉。

书籍推荐

既然是Java相关,那么一定要推荐一本Java书
《Java核心技术 卷一:基础知识》
如果经济能力足够,推荐大家买正版书。
百度云(801n)

[Java Training]Week 1

  1. 1. 前言
  2. 2. 第一回合
  3. 3. 第二回合
  4. 4. 最终回合
  5. 5. 书籍推荐