java代码审计之路
一、前言
首先,本文不是技术文章,主要给出大家java代码审计学习方向的资料、资源推荐,如何从小白一点一点成长。因为最近好多人私信我,怎么去学java代码审计,这里尽量把小白刚入门存在的问题给解答出来,没有考虑到的,可以评论区讨论。这也算是我的成长之路吧。
二、初级
首先,对于没有代码审计经验的,可以先从php代码审计入手,了解php语言特性,既然都在t00ls混了,大家肯定都会利用web常见漏洞:参考链接1,有了这个基础之后,可以尝试挖掘一些CMS或者框架的漏洞,php了解全面了,就可以从java入手,作为一个合格的安全工程师,代码审计应该是每个人都需要掌握的。
1、java环境搭建,很多人即使有了java基础,在java 调试环境上还是不了解,这里极力推荐用IDEA作为IDE,了解一下IDEA快捷键有哪些,总结一下我用的最多快捷键:
F7步入|F8步过|F9到下一个断点|ALT+F8评估表达式|Ctrl+F 文件内查找字符串|双击Shift 查找任何内容,可搜索类、资源、配置项、方法等,还能搜索路径|Ctrl + N 按类名搜索类|Ctrl + F12 查看当前类结构|Ctrl + H 查看类的层次关系|Alt + F7 查找类或方法在哪被使用
查看一下继承关系,这也常用。剩下的参考这里
知道IDEA怎么使用时候,就要学debug本地调试和远程调试,目前审一些cms、框架需要本地调试漏洞,本地调试有些CMS是maven开发的导入到IDEA就能运行,一般CMS怎么本地调试都有文档。一些web服务器、中间件需要远程调试,比如weblogic、tomcat、conconfluence和jboss,远程调试参考这篇文章。
2、java基础学习,推荐去慕课网上学习,这里比较重要的把java反射机制、JAVA动态代理机制 、java设计模式多花点功夫,下面给出我之前学的视频:
3、java框架学习 因为只有有正向开发的基础,才能审计基于java的CMS,我这里主要看了Struts2和SpringMVC的资料,知道了java web是怎么开发的,后面又学习了mybatis和Hibernate ORM框架,紧接着就是学习SSH和SSM是如何整合的。
4、java CMS代码审计,有了正向开发基础后,有php审计的经验,在学习点java安全的trick,审计这些CMS就不是难事了,在渗透过程中,遇到源码泄露,自己也有能力去挖掘,下面给出我之前看过的案例分享。
CMS审计文章1
CMS审计文章2
CMS审计文章3
CMS审计文章4
javasec项目
极力推荐园长写的文章
orich1师傅的文章
大家也可看看看jkgh006写的文章,还有凌天实验室最近一直更java审计的文章。
三、进阶
上面讲的大部分都是初级的知识,漏洞类型跟常见的web漏洞一样了。下面可能涉及weblogic、spring、fastjson、jackson、solr、jboss、tomcat、struts2....这些web服务器、中间件、框架、类库的安全,这些大型的框架首先要确定漏洞类型有哪些,我简单总结一下:1、反序列化漏洞。2、表达式注入。3、JNDI注入。4、XXE、SSRF。5、协议漏洞(tomcat ajp、jmx协议等。6、逻辑漏洞(框架的一些目录变量、文件上传、任意文件删除、SSTI等)。了解完漏洞类型,要知道这些大的服务器代码量是很大的,前面基础中的设计模式的知识就体现出来了,所以要把前面基础打好。
这里进阶的重头戏来了,java反序列化。java反序列化,推荐学习路线,首先我是从ysoserial简单的gadget看起的,新手可以看看下面我圈出来的gadget是这么构造出来的,自己debug一下,目前网上都有很多文章都有POC,这里就不给出了。新手尤其不建议直接研究JDK7u21,底层jdk的gadget,里面涉及到的知识量太大了,以后一点点逐步的把ysoserial中的gadget都搞懂,还有marshalse的gadget,还有提醒一下反序列化不只是有RCE。向反序列化后的Fileupload(FileUpload1 gadgets)、xxe都是有可能的。
进阶我简单分为下面三个阶段,最简单的就是复现漏洞,有已知的POC,去理解漏洞成因,去debug一下。
1、复现漏洞
2、根据漏洞描述、patch能构造出poc
3、自动化工具或者审计,独立的挖掘漏洞
有了反序列化知识以后,可以先从fastjson入手复现漏洞,涉及到文章2时,又涉及到rmi的知识(内容自行查找),资料如下:
1、fastjson反序列化TemplatesImpl
2、fastjson反序列化JdbcRowSetImpl
3、fastjson反序列化之Jackson-databind(CVE-2017-17485)
4、廖师傅写的文章
当把fastjson所有漏洞都调试一遍,这时候在看jackson、XStream、yaml的漏洞就不难了。接下来,可以入手复现一下web服务器的反序列化漏洞,这里推荐先从weblogic开始学习,我是基本把所有weblogic的漏洞都复现一遍,还有说一下调试服务器就需要远程debug了,学习资料如下:
1、weblogic之CVE-2016-0638反序列化分析
2、weblogic之CVE-2016-3510反序列化分析
3、weblogic之XMLDecoder RCE CVE-2017-10271
4、weblogic之CVE-2017-3248,CVE-2018-2628,CVE-2018-2893,CVE-2018-3245反序列绕过分析
5、weblogic之CVE-2018-3191漏洞分析
6、 webLogic CVE-2019-2647 反序列化XXE POC构造
7、welogic之CVE-2019-2725分析
8、CVE-2019-2725反序列化漏洞补丁绕过分析
9、教你一步一步构造CVE-2020-2555 POC
提醒一点,上面一个漏洞的POC可能不只有一种(比如2019-2725)尽量把所有POC都调试或者构造出来,上面都是当时学习时,做的一点笔记,有很多疏漏,还请师傅们多担待。
有了以上基础,也就是第一个步骤:复现漏洞能力。接着入手一些框架的Stucts2 OGNL表达式注入复现,Spring Boot Actuator via jolokia 等案例,后面就是有java漏洞就跟。当复现漏洞越多时,可以开始尝试根据漏洞描述、patch能构造出poc的能力。
四、高级
到这个阶段基本把所有国内java安全的文章能搞懂过一遍,去推特上关注一些国外大佬的文章,blackhat议题等,再进一步了解JDK底层的安全机制(JEP 290等),RASP技术等。再次进阶就可以自动化工具或者审计,独立的挖掘漏洞。
比如读一下gadgetinspector工具实现的源码:threedr3am师傅的文章、
使用codeql挖掘fastjson利用链、抽象语法树分析寻找FastJSON的Gadgets等文章。接下来就是教大家如何从事安全研究工作,这也是我在湛卢实验室实习跟小伙伴学到的。
选择研究对象,比如我擅长web服务、框架漏洞挖掘,首先需要总结TOP 10服务器有哪些,第二步去漏洞公告中,总结近10年所有CVE漏洞,如下格式整理,漏洞描述、漏洞模块、漏洞成因、漏洞影响范围和参考链接
总结完成后,向IIS比较老的服务器。看漏洞成因能看出安全研究员研究方向的转变,这时候,可以选择擅长的领域,向一些比较新的产品往往很可能出现问题。我这里就以weblogic为例,说一下我的研究思路。还是总结weblogic历史漏洞,从漏洞类型上看,T3反序列化漏洞最多,但是要挖掘新的gadget,研究时间就可能比较长。第二个是从协议层面上挖掘,这就需要看weblogic的手册内容,我选择了审计基于RMI的JMX服务,weblogic默认会注册一些MBean,如果这些MBean中存在危险代码,外部还可以访问,第一个思路就是审计weblogic中默认注册的MBean中的代码,是否存在危险代码,然而,实际问题来了想操纵MBean,前提需要知道管理员的用户名和密码,即使RCE危害也不大,这条路就放弃了,第二个思路就是rmi-iiop协议,当时看blackhat议题,提到了这个,当时,只是在weblogic实现了rmi-iiop的demo,没深入研究下去,后来就有人在这里爆洞了(菜是原罪)。当时爆出反序列化XXE的CVE:CVE-2019-2647、CVE-2019-2648、CVE-2019-2649、CVE-2019-2650 比较多,直觉感觉应该还有遗漏的XXE。后来就写了个正则的扫描的工具,搞到EJBTaglibDescriptor这个类和一处比较鸡肋的XXE,后来我又去审计weblogic http协议的内容,找到一个XXE和一处SSRF。当时因为没打最新补丁,打了补丁后发现XXE已经被修补了。那处SSRF在debug版本存在。
下面是XXE的位置,貌似没看到过有这个漏洞的分析文章,但是查cnvd,2018年有人就提交了。
后来准备毕业的一些事情,上面也就是我当时研究的整个思路,挺感谢ADlab的哥和姐的,在那里学到不少渗透、审计的知识。
五、总结
最后,嘱咐大家纸上得来终觉浅,所有案例都要调试一遍,整就牛,OVER!