开启 Java 审计之路,从最基础的项目开始
文章目录
- OFCMS
- 搭建环境
- 漏洞分析
- 模板注入
- 文件上传
- XSS
- XXE
- 参考:
OFCMS
搭建环境
下载链接
import project 与 open 的区别: import project:如果项目不是用 idea 开发的,用 import 打开。因为这个情况下,这个项目不是 idea 模型,使用 import 可以避免许多不必要的麻烦。 open:如果项目之前就是 idea 开发的,直接用 open 即可
选择 maven
在 ofcms-admin/src/main/resources/dev/conf/ 文件夹下 db.properties 文件,修改数据库的账号和密码
修改为合适版本,点击 import changes
添加 tomcat server local
设置 tomcat 目录
点击 deployment
点击确定修改成功后下边的 appliaction context 就是文件目录,可以自定义修改
配置成功后在 idea 右上角可以看到程序启动按钮为绿色
站点地址:http://localhost:8080/ofcms-admin/
后台地址: http://localhost:8080/ofcms-admin/admin/login.html
账密:admin/123456
这是手动部署的方式,也可以选择下载 war 包以安装方式部署
为了方便调试代码,可以使用 SQL 监控工具查看数据库具体执行语句
推荐两个工具:
- Java版
- PHP版
漏洞分析
拿到一个 Java 系统后首先分辨是 普通 servlet 还是 ssh/ssm 框架是否使用 maven 工程,如果使用的 maven 工程首先看 pom.xml 配置文件去对系统有一个整体的了解
漏洞位置为:ofcms- admin/src/main/java/com/ofsoft/cms/admin/controller/system/SystemGenerateController.java
查看函数 getPara
可以发现这里使用自定义函数 getPara 来接收用户输入的参数,然后使用 updata 方法,进入 updata 方法
updata 方法是重载的,只需要看红框里的即可
再继续往下跟 MAIN.updata
可以发现输入的数据作为语句进行编译并且在 executeUpdate 处进行了执行
并且进行回显
有同学可能会感到疑问,这里不是用了预编译,不是预编译可以防止 SQL 注入么?
这里确实是用了预编译,但是这里没有正确使用,正确的方法如下
public void select() { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet rs = null; String sql = "select * from user limit 0,1"; try { //获取数据连接 connection = basicUse.getConnection(); //获取发送sql指令执行sql对象 preparedStatement = connection.prepareStatement(sql); //返回查询结果集用于保存数据库查询内容 rs = preparedStatement.executeQuery();发现漏洞点这里是将用户输入的语句直接编译执行,而不是作为编译的参数,所以语句可以正常执行
模板注入
模板注入可以说是 Java 中最常出现的漏洞,像 Struts2 的 OGNL 表达式注入,Spring SPEL 表达式注入,甚至 Log4j 的注入都可以认为是模板注入的范畴
浏览 pom.xml 的时候发现存在模版引擎 freemarker,该模版是存在模版注入的
freemarker 模板注入
通过前台首页找到对应的模版
回到系统中找到该模版,然后直接使用 payload 执行系统命令,这里执行的命令是 whoami
<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("calc") }成功执行命令
文件上传
前台位置
代码位置
在 com.ofsoft.cms.admin.controller.cms.TemplateController 类的 save 方法中
和模板注入一样,没有对文件名和内容进行过滤,可以通过 …/ 向服务器写任意文件
尝试写一个 jsp 文件
直接 F12 改这里的 value 就可以修改文件名了,不行的话再用 burp
在 tomcat 目录下可以发现已经写入成功
直接用冰蝎连接
XSS
在 1.1.3 版本中新增文章评论功能,该功能存在 xss
在 save 方法中调用了 getParamsMap 方法,这个方法是用来获取用户提交的所有参数的,获取到所有参数后就调用Db.update()方法将数据更新到数据库中,这里是没有进行过滤
抓取用户评论的请求数据包,修改 comment_content 内容为 xss payload:<script>alert(1)</script>,提交数据包
XXE
在 com.ofsoft.cms.admin.controller.ReprotAction 类的 expReport 方法中,通过 get 参数接收 j,并且没有过滤,底下还进行了拼接,可以通过传入 …/ 来控制路径,后边调用了 compileReport 函数
在 compileReport 方法中又调用了JRXmlLoader.load()方法,继续跟踪
在 loadXML 方法中调用了 Digester 类的 parse 解析我们的 XML 文档内容,默认是没有禁用外部实体解析的,所以这里是存在XXE漏洞的
因为在一开始路径拼接了 jrxml,所以说要利用的话也用这个文件,可以先生成一个文件,文件内容如下
<!DOCTYPE foo <!ENTITY % xxe SYSTEM "http://127.0.0.1:7777"> %xxe; ]>http://localhost:8080/ofcms_admin/admin/reprot/expReport.html?j=../../static/payload使用 python 启动一个简单的服务器,访问 url 即可收到请求
参考:
P神代码审计记又一次Java代码审计