Hello,各位小伙伴大家好~
这里是一名白帽的成长史~
上期讲完了SSH框架的搭建:
今天一起来看看Hibernate的注入挖掘吧~
Part.1
SSH路由分析
框架判断
在代码审计之前,我们需要先判断一下该cms使用什么框架进行运作。
翻看src目录,可以找到Spring核心配置文件applicationContext.xml:
可以看到applicationContext.xml加载了hibernate配置文件:
可以找到struts路由配置文件:
由此可以判断这是一个SSH框架,即Struts2 + Spring + Hibernate。
路由分析
判断为SSH框架后,来分析一下路由,参考下图:
假如用户请求以下url:
https://127.0.0.1:8080/lcmsnewfujian/repair/showReportRepairSearch.action?repairNumber=123&page=1
其中/lcmsnewfujian 为网站根目录,后面/repair/为命令空间,用于标记struts路由配置。
我们可以根据url中的命名空间(/repair/),找到对应的路由配置文件struts-repair.xml:
根据url中的/repair/showReportRepairSearch.action锁定struts-repair.xml中的控制器配置:
//上图可以看出该控制器对应的方法为ckupFixAction.java中的showReportRapairSearch()方法
//因此url中的showReportRepairSearch.action?repairNumber=123,
即向ckupFixAction.java中的showReportRapairSearch()方法,传递参数repairNumber=123
全局搜索,找到ckupFixAction.java类,以及showReportRapairSearch()方法:
//根据路由,该请求将repairNumber=123发送给了chupFixService类的showReportRapairSearch()处理。
showReportRapairSearch()执行到最后,会return SUCCESS到控制器struts-repair.xml:
控制器收到SUCCESS后,根据result配置,将结果跳转至showReportEquipment.jsp页面,本次访问就结束了。
以上就是ssh框架的基本路由流程。
总结一下:
1、当我们输入url访问SSH框架服务时,服务端先根据url中的/命名空间/控制器名称.action找到对应的struts.xml中的控制器配置。
2、由此确定下一步访问的控制器及该控制器对应的方法,再往下一步步追溯到dao层即可。
3、最后再根据result的值(return SUCCESS),将结果跳转至对应的页面即可。
梳理完路由之后,来看看漏洞挖掘。
Part.2
漏洞挖掘
漏洞挖掘
Hibernate大多采用HQL来进行数据库操作,HQL是hibernate框架提供的一种查询机制,可以完成查询、修改、删除等操作。
全局搜素String hql等关键字,找到以下直接拼接参数的sql语句,位于Dao层CkupFixDaoImp.java中的showReportRepairSearch()方法:
//可以看到这里直接拼接repairNumber参数,且为string类型,如果没有过滤,则可能存在sql注入。
往service层追溯,或者全局搜素showReportRepairSearch方法:
定位到CkupFixServiceImp.java 的 showReportRepairSearch()方法:
再往上追溯,定位到控制器CkupFixAction的showReportRepairSearch()方法:
//可以看到该代码的功能点为:
维修管理 -> 设备维修 -> 查询
根据前面分析的路由,可知class=ckupFixAction,method=showReportRepairSearch,可以在路由文件struts-repair.xml中找到该配置,且该配置的name=showReportRepairSearch:
由struts-repair.xml可知,命名空间为/repair/
全局搜索/repair/showReportRepairSearch,可以定位到漏洞前端页面showReportEquipment.jsp,及漏洞触发url:
/lcmsnewfujian/repair/showReportRepairSearch.action?repairNumber=123&page=1
找到漏洞页面测试,或者根据前面的url直接构造报文测试均可:
拼接sql注入语句 11’ or ‘1’=‘1 :
通过sql注入,查出全部保修订单:
漏洞修复
和mybitis一样,需要对用户输入的内容进行检查。
或者通过占位符的方式进行规避,hql有两种常用占位方式:
(1)通过?号作为占位符:
(2)通过参数名称进行占位:
将本文中的代码通过占位符或者命名参数的方式进行修复:
再次测试,漏洞已修复:
Part.3
以上就是今天的全部内容了~
欢迎关注我的公众号~
Peace!
你“在看”我吗?
原文始发于微信公众号(一名白帽的成长史):【JAVA代码审计】从零开始的Hibernate框架SQL注入审计(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论