🌟 ❤️
作者: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目录
再者就是讲讲spring工作原理,最核心的就是mvc,其实跟tp框架大差不差
图中对应的前端控制器就类似于webpack、webapp打包的前端
页面控制器就是类controller层,模型就是类mapper层
0x03 数据库注入实例
1.JDBC注入分析
注入分析实例
直接从请求取id参数,没有进行对参数进行任何操作就进行操作数据库的操作
修改方法:select * from user where id = ? 进行预编译操作
2.mabatis注入分析
由于我每次用springboot框架都按照标准的aop流程走,我一直都很好奇为什么javaweb也会有sql注入,直到我看见了不安全的sql写法…
$符号为不安全的写法,不会对参数值进行预编译操作
#符会默认对参数值进行预编译操作
3.hibernate注入分析
相对于jdbc和mybatis,hibernate对于更多人来说可能陌生一些
hibernate是一种ORMapping框架,可以使用原生sql和hql语句进行数据库查询
一旦在语句中没有对参数进行严格的过滤,就会造成sql注入问题,代码实例如下
这是比较老的写法了,按照框架写法(安全写法)大致如下
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
语句的模式匹配需要使用通配符,而通配符无法与预编译参数一起使用。
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
配置数据库
配置tomcat服务器
加载依赖后先clean再install
随后启动程序,访问对应路由,程序即搭建完毕
2.审计
审计之前如果拿到一套源码,还是先看看其加载了哪些配件
点开pom文件,大概知道数据库后端是mybatis+mysql
sping-mvc扫描拦截请求配置文件,可以大致看到一些路由访问的允许与否
1.xss漏洞
第一处
输入框存在xss漏洞
追本溯源一下
mapper层进行查询,返回courseDto类
dao层写接口
service层
controller层进行调用,并返回给前端
可以看到,整个过程并没有针对xss的过滤
第二处,问答处
这里留由读者朋友自行溯源了
2.前台sql注入漏洞
根据前面的学习,我们直接来找$符号
找到一处,需要看看value参数是否可控
dao层
看起来有戏,继续找service层调用
看看路由
发现参数确实可控,拼接路由看看
发现是这个接口,抓包发给sqlmap看看
成功梭哈
3.后台任意文件上传
搜索关键字upload
大致逻辑就是获取上传文件名,判断是否合规,若是则返回成功,若不是则失败,但注意,他这里只检验了filetype和文件名后缀是否一致…
看看路由
不出意外,应该没设置鉴权,我们先登录后台
后台找了半天没找到对应功能点,我们直接构造发送包吧
成功上传恶意文件
4.鉴权
越古老的系统越没有设置鉴权
比如此处的修改用户信息
进入service层看看
dao层
最后进入mapper层
userid值可控
修改该值即可完成越权
0x05 总结
对于java的代码审计其实是要比其他语言要简单的,因为市面上大部分的产品都是套用的模板框架,只要掌握各层的作用即可很快发现漏洞功能点
后期将为大家带来更多java代码审计案例
原文始发于微信公众号(剑客古月的安全屋):Java安全-案例审计&数据库注入实例&框架篇