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

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

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

第一回合

拿到代码的我一脸懵逼

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

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

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

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

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

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

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

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

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

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

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

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

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

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

就是上图这货。

既然是 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 中,貌似也会在其他位置,这个大家稍微找一下就好了。(如图)

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

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

session,过期时间等。

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

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

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

由于本项目使用的是 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 核心技术 卷一:基础知识》:

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

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

原文发布于微信公众号 - 信安之路(xazlsec)

原文发表时间:2018-10-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JavaEdge

Java并发编程实战系列11之性能与可伸缩性Performance and Scalability

线程可以充分发挥系统的处理能力,提高资源利用率。同时现有的线程可以提升系统响应性。 但是在安全性与极限性能上,我们首先需要保证的是安全性。 11.1 对性能的...

37450
来自专栏野路子程序员

徒手解剖composer,简单了解其实现过程

30760
来自专栏小狼的世界

基于Mapabc API的周边查询应用

现在,越来越多的 Location Based 应用,或者Geolocation的应用出现在网络、手机等各种各样的终端上,为人们的日常生活、出行和工作都提供了不...

10920
来自专栏Golang语言社区

Redis在游戏服务器中的应用

排行榜 游戏服务器中涉及到很多排行信息,比如玩家等级排名、金钱排名、战斗力排名等。 一般情况下仅需要取排名的前N名就可以了,这时可以利用数据库的排序功能,或者自...

523120
来自专栏wOw的Android小站

[iOS] 技术文章收藏

现在关注了一些微博,订阅号,博客。每天都能看到不少好文章。现在收藏夹里放了不少文章,我觉得是时候整理一下,把文章分各类,做个目录出来,方便以后查阅。

8710
来自专栏黑白安全

ASLRay:一个可以绕过ASLR的工具

ASLR(Address Space Layout Randomization,即地址空间格局随机化)是指利用随机方式配置数据地址,一般现代系统中都加设这一机制...

7810
来自专栏嵌入式程序猿

Bootloader需要你的精心设计

嵌入式产品,我们一般都需要一个bootloader来更新固件和修复bug,一般常用的接口有,UART, CAN, USB, Ethernet,有的还有无线接口,...

15230
来自专栏小石不识月

微服务编排

在 Jexia 中,我们相信微服务架构是组织我们的后端云的最佳方式 —— 它可以很好地进行关注分离(Separation of concerns),并为特定任务...

81890
来自专栏FreeBuf

ASLRay:一个可以绕过ASLR的工具

ASLR(Address Space Layout Randomization,即地址空间格局随机化)是指利用随机方式配置数据地址,一般现代系统中都加设这一机制...

23980
来自专栏進无尽的文章

聊聊程序设计思想之面向接口编程IOP

我们在一般实现一个系统的时候,通常是将定义与实现合为一体,不加分离的,但是有时候最为理想的系统设计规范应是所有的定义与实现分离,尽管这可能对系统中的某些情况有点...

17020

扫码关注云+社区

领取腾讯云代金券