Java 源码审计心得

0x01 前言

java现在可以说已经是web端主流的语言,大部分银行、金融、商城平台几乎都是使用java语言,php虽然使用的人也比较多但是多为个人开发使用,nodejs性能较好但是用的人少,越来越多的企业都开始使用java web,在这里做一个心得总结。

0x02 准备

java类的网站通常是比较容易获取到网站源码的,为什么这么说呢,因为java的网站有很大一部分是定制的、公司自己搭建的。相应的就会产生一些相对低级的漏洞,比如说网站的配置问题、中间件的配置问题、中间件的cve问题、任意文件读取/下载、ssrf等这些问题,出现的概率都比较高,这些都为我们获取到网站源码提供了可能,下面我就举一个我实战的例子给大家展示一下。

0x03 开始

某天,某银行的微信银行要求做渗透测试,说到这里我要吐槽一下,微信公众号测试这种东西是最难受的,里面没啥功能还好说,像这个银行放上上十个不同的网站系统,一个微信公众号 = 十个网站系统,一个星期要求测完,给我整的明明白白的。当然,整明白以后我们就发现它这个读图片的接口任意文件读取

 

有些同学可能把这就当做结尾写入报告然后收场完工,其实这只是刚刚开始。某些敏感信息我们可以先获取一下,如果有权限的话其中.bash_history是一个比较重要的东西,我们可以获取到较多路径信息和配置文件位置的信息。例如这次我们可以读取到/home/weblogic/.bash_history

这就很明了了,网站采用weblogic搭建,weblogic路径我们也获取到了,通过读取config.xml,1、我们可以获取weblogic console的账号密码 2、我们可以获取到所有war包路径

我们通过一个任意文件读取下载到了网站源码,下面开始正文,java代码审计

0x04 正文

我们下载到源码的话第一件事干什么,找敏感文件和控制器。敏感文件的内容可以让我们更好的配合其他漏洞进行利用,比如ssrf+redis密码的话就可以RCE,再比如oracle可以直接连等等,找完这些我们就要找控制器了,一般在WEB-INF的classes文件夹里可以找到。这也是源码审计的主要阶段,看代码。

和php的源码审计不同,java会把某些方法直接写出来,php可能比较侧重于找_POST或者_GET,一轮一轮下来可能都找不到参数传到哪里了,这次我们获取到的源码相当归整,一个个的控制器和方法都给我们列好了。我们需要侧重关注的点就是,找 1、文件上传 2、数据查询 3、文件下载 4、序列化,这些版块对应的漏洞我想大家都应该心知肚明

 

1、文件上传

还是这次渗透,我们发现有很多很多的文件上传接口,有需要登录的有不需要登录的,我们举两个栗子

能看出来哪个是有漏洞的上传吗?分别是什么漏洞?没错,upHt是任意文件夹上传漏洞,无waf的话upTemp是任意文件上传漏洞。

upTemp通过获取上传文件名.后面的后缀,然后直接拼接 日期 + / + 日期 + 时间 + 文件后缀 ,如果网站没有waf且没有做上传文件分离很可能这里就直接上传jsp文件getshell了,但是很明显这里是上传到指定目录tempUrl做了文件分离,所以这里可以说是没有漏洞危害较小。

upHt有什么不一样的地方吗?首先它也指定了htUrl为上传目录,拼接规则为 htUrl + 日期 + / + 时间 + /

  • 文件名,就是这个文件名拼接导致了漏洞,我们可以将文件名改为 ../../../../../etc/cron.d/root上传文件,不过这个网站有waf,我们并没有传文件成功

 

2、数据查询

数据查询的地方有很多,能看到有整句的sql,或者调用某些方法查询,但是像图片内的这些都不是我们要找的目标。我们的关注点应在未使用参数化查询,只是做sql语句简单拼接的地方(下图基本都使用了参数化查询)

 

但是像这个city的参数就属于简单拼接,而且还url解码了一下,这样我们可以更好的进行注入和绕过waf

 

像这样的地方还有很多很多,虽然java大部分都采用了参数化查询,但是一旦没有使用,极大的可能就是注入

3、文件下载

就是最开始我们利用的那个漏洞,咱们看看为什么它就可以下载任意文件

对没错,又是简单拼凑起来的路径导致了漏洞,同理我们可以在源码里发现更多的任意文件下载漏洞

 

4、序列化

像下面这个文件提交,直接将提交的请求序列化导致了序列化命令执行漏洞,比较直接

0x05 完工

通过这次渗透测试,我们通过一个简单的任意文件下载,然后源码审计找出更多漏洞,通过新的漏洞获取到了数据库、主机的权限,如果一个链接算一个漏洞的话那也得有十几个高危漏洞了吧?,算是一次比较完整的渗透测试。

 

0x06 总结

其实java由于控制器和方法的集中,其实审计起来要比php更轻松,而且一般方法中会把所有的功能都体现出来,不像php方法传参可能比较繁琐,所以只要找准位置,java的代码审计也可以是如此简单。

 

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2016-2024 | Powered by veo
  •      访问人数: | 浏览次数: