Java安全-案例审计&数据库注入实例&框架篇

🌟 ❤️

作者:yueji0j1anke

首发于公号:剑客古月的安全屋

字数:1703

阅读时间:    30min

声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外


目录

  • 前言

  • 前置知识

  • 数据库注入实例

  • 源码审计实战

  • 总结


0x01 前言

曾经做综设时学过一段时间的JavaWeb,有一定基础,但是对于java代码审计安全,一直属于有些浑水摸鱼,因此在最近准备深入java安全,后续将持续更新专题



0x02 前置知识

目前大部分的java项目是用maven搭建的,自然就需要讲解一下maven结构

  • src/main/java:是java的代码目录

  • src/main/resources:是资源目录,放一些配置文件,如properties、spring-mvc.xml等

  • src/main/webapp:是传统项目的WebContent目录

Java安全-案例审计&数据库注入实例&框架篇

Java安全-案例审计&数据库注入实例&框架篇


再者就是讲讲spring工作原理,最核心的就是mvc,其实跟tp框架大差不差

Java安全-案例审计&数据库注入实例&框架篇

图中对应的前端控制器就类似于webpack、webapp打包的前端

页面控制器就是类controller层,模型就是类mapper层



0x03 数据库注入实例

1.JDBC注入分析

注入分析实例

Java安全-案例审计&数据库注入实例&框架篇

直接从请求取id参数,没有进行对参数进行任何操作就进行操作数据库的操作


修改方法:select * from user where id = ? 进行预编译操作


2.mabatis注入分析

由于我每次用springboot框架都按照标准的aop流程走,我一直都很好奇为什么javaweb也会有sql注入,直到我看见了不安全的sql写法…

Java安全-案例审计&数据库注入实例&框架篇

$符号为不安全的写法,不会对参数值进行预编译操作

#符会默认对参数值进行预编译操作


3.hibernate注入分析

相对于jdbc和mybatis,hibernate对于更多人来说可能陌生一些

hibernate是一种ORMapping框架,可以使用原生sql和hql语句进行数据库查询

一旦在语句中没有对参数进行严格的过滤,就会造成sql注入问题,代码实例如下

Java安全-案例审计&数据库注入实例&框架篇

这是比较老的写法了,按照框架写法(安全写法)大致如下

Query<User> query = session.createQuery("from User where name = :name", User.class);
query.setParameter("name",name);
User user = query.getSingleResult();

采用占位符进行预编译操作


4.特殊点

order by 和 like 查询是无法对参数进行预编译操作的,一般都是+filter进行过滤


在一般的预编译语句中,LIKE语句是不能直接进行预编译操作的,因为LIKE语句的模式匹配需要使用通配符,而通配符无法与预编译参数一起使用。

Java安全-案例审计&数据库注入实例&框架篇

name参数使用了LIKE语句进行模糊匹配,而且在#{name}的周围添加了通配符 %。这种情况下,name参数无法直接进行预编译操作,而是在执行查询时,将参数值和通配符一起拼接到SQL语句中。


再看order by,order by后一般是接字段名,而字段名是不能带引号的,比如 order by username;如果带上引号成了order by ‘username’,那username就是一个字符串不是字段名了,这就产生了语法错误。


5.总结

首先找sql注入需要find out数据库查询模式,再看写法是否会存在sql注入(比如拼接,比如不安全写法,比如特殊点)



0x04 源码审计实例

这里采取的cms框架是国内首家Java版开源网校源代码建站系统->因酷网校在线教育系统


1.安装环境与配置

安装环境如下

JDK 1.8.8
Tomcat 7
Mysql 5.5
maven 3.5.3
IntelliJ IDEA 2020.3


配置数据库

Java安全-案例审计&数据库注入实例&框架篇

Java安全-案例审计&数据库注入实例&框架篇



配置tomcat服务器

Java安全-案例审计&数据库注入实例&框架篇


加载依赖后先clean再install

Java安全-案例审计&数据库注入实例&框架篇

随后启动程序,访问对应路由,程序即搭建完毕

Java安全-案例审计&数据库注入实例&框架篇


2.审计

审计之前如果拿到一套源码,还是先看看其加载了哪些配件

Java安全-案例审计&数据库注入实例&框架篇

点开pom文件,大概知道数据库后端是mybatis+mysql

Java安全-案例审计&数据库注入实例&框架篇

sping-mvc扫描拦截请求配置文件,可以大致看到一些路由访问的允许与否


1.xss漏洞

第一处

输入框存在xss漏洞

追本溯源一下

Java安全-案例审计&数据库注入实例&框架篇

mapper层进行查询,返回courseDto类

Java安全-案例审计&数据库注入实例&框架篇

dao层写接口

Java安全-案例审计&数据库注入实例&框架篇

service层

Java安全-案例审计&数据库注入实例&框架篇

controller层进行调用,并返回给前端

Java安全-案例审计&数据库注入实例&框架篇

可以看到,整个过程并没有针对xss的过滤


第二处,问答处

Java安全-案例审计&数据库注入实例&框架篇

Java安全-案例审计&数据库注入实例&框架篇



这里留由读者朋友自行溯源了


2.前台sql注入漏洞

根据前面的学习,我们直接来找$符号

Java安全-案例审计&数据库注入实例&框架篇

找到一处,需要看看value参数是否可控

dao层

Java安全-案例审计&数据库注入实例&框架篇

看起来有戏,继续找service层调用

Java安全-案例审计&数据库注入实例&框架篇

看看路由

Java安全-案例审计&数据库注入实例&框架篇

发现参数确实可控,拼接路由看看

Java安全-案例审计&数据库注入实例&框架篇

发现是这个接口,抓包发给sqlmap看看

Java安全-案例审计&数据库注入实例&框架篇

成功梭哈


3.后台任意文件上传

搜索关键字upload

Java安全-案例审计&数据库注入实例&框架篇

大致逻辑就是获取上传文件名,判断是否合规,若是则返回成功,若不是则失败,但注意,他这里只检验了filetype和文件名后缀是否一致…

看看路由

Java安全-案例审计&数据库注入实例&框架篇

不出意外,应该没设置鉴权,我们先登录后台

后台找了半天没找到对应功能点,我们直接构造发送包吧

Java安全-案例审计&数据库注入实例&框架篇

成功上传恶意文件


4.鉴权

越古老的系统越没有设置鉴权

比如此处的修改用户信息

Java安全-案例审计&数据库注入实例&框架篇

进入service层看看

Java安全-案例审计&数据库注入实例&框架篇

dao层

Java安全-案例审计&数据库注入实例&框架篇

最后进入mapper层

Java安全-案例审计&数据库注入实例&框架篇

userid值可控

Java安全-案例审计&数据库注入实例&框架篇

修改该值即可完成越权




0x05 总结

对于java的代码审计其实是要比其他语言要简单的,因为市面上大部分的产品都是套用的模板框架,只要掌握各层的作用即可很快发现漏洞功能点


后期将为大家带来更多java代码审计案例


原文始发于微信公众号(剑客古月的安全屋):Java安全-案例审计&数据库注入实例&框架篇

版权声明:admin 发表于 2024年7月11日 下午7:29。
转载请注明:Java安全-案例审计&数据库注入实例&框架篇 | CTF导航

相关文章