Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计

news2024/11/15 15:48:17

文章目录

  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计
  • 1. 前言
  • 2. SQL注入代码审计【有1处】
      • 1)全局搜索`Statement`关键字,发现有几处,不过大多都是`preparStatement`预编译方式执行sql语句。
      • 2)点进第一个看看
      • 3)搜索executeSQL()方法的调用,查看sql语句怎么传递进来的
      • 4)我们搜索的`Statement`关键字,所处位置都是安装工具类`InstallUtils`,所以全部忽略。
      • 5)全局搜索`like "%`关键字,发现有1处,不过是注释,不需要管了。
      • 6)全局搜索`in (${`关键字,无
      • 7)全局搜索`select`关键字,很多,但是翻了一圈,没有和sql语句相关的
      • 8)全局搜索`update`关键字,搜索到了很多貌似和sql有关系的语句
      • 9)点进第一个看看,发现这个`ComnController`类里面的方法都和sql语句相关,那挨个看一下
      • 10)先分析下query()方法
      • 11)查看每个方法的调用,发现整个sql语句可控的情况
      • 12)寻找对应的前端功能
      • 13)验证漏洞
      • 14)继续寻找其他sql语句可控的位置

Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计

1. 前言

我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。

我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该是从0开始找到漏洞所在,包括思路!

所以这里不管有没有漏洞,我都会把审计过程写出来,因此篇幅会很长,但我认为这样对你会很有帮助。

知其然亦知所以然。

由于篇幅较长,因此我会分几篇进行,本篇是整个系列的第2篇,讲解1个内容:

  • SQL注入漏洞审计

本系列文章:

  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇1 | 环境搭建、路由机制
  • Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计

搭建好环境,确定好项目结构之后,按我思路是应该审计项目所使用框架漏洞的,这里关于框架漏洞就放最后篇章来说了,我们想了解下基础漏洞的审计~

文章中有错误点,或者思路上有什么问题的,欢迎师傅们留言指出~

2. SQL注入代码审计【有1处】

sql注入漏洞一般搜索的关键字:

Statement
createStatement
PreparStatement
like "%{
in (${
select 
update
insert
...

1)全局搜索Statement关键字,发现有几处,不过大多都是preparStatement预编译方式执行sql语句。

那要不要点击去看看?答案是需要!因为可能会有绕过方式…

2)点进第一个看看

核心代码已框出,就是预编译执行sql语句~哦,戏不大。

不过大家可以思考一下:如果整个sql语句都可控呢?是不是可以绕过预编译限制呢?

所以我们不要放弃,接下来看一下sql语句怎么来的。

3)搜索executeSQL()方法的调用,查看sql语句怎么传递进来的

在方法上右击,然后“Find Usages”或Alt+F7查看方法的调用:

发现有两个,如下

有办法注入吗?貌似没有,原因有2:

  • sql语句是写死的
  • 参数是单独传入的,但是后期是需要经过预处理的

其实这里还有一个点,就是这两个方法是在安装工具类InstallUtils下,因此即使有sql注入点,也无法利用,毕竟你不可能去重新安装该项目吧。

所以,接下来,安装工具类InstallUtils下的代码我们就不需要看了。

4)我们搜索的Statement关键字,所处位置都是安装工具类InstallUtils,所以全部忽略。

接下来换关键字搜索:

5)全局搜索like "%关键字,发现有1处,不过是注释,不需要管了。

6)全局搜索in (${关键字,无

7)全局搜索select关键字,很多,但是翻了一圈,没有和sql语句相关的

8)全局搜索update关键字,搜索到了很多貌似和sql有关系的语句

并且可以发现一个共同点,大部分都是Db.update调用的。

9)点进第一个看看,发现这个ComnController类里面的方法都和sql语句相关,那挨个看一下

10)先分析下query()方法

这里发现,Db这个是什么,点进去看一下,发现是专门用来操作数据库的类:

自己写的吗?不不不,可以看到,该文件是Db.class,可以下载源码

经过分析查看,这个Dbcom.jfinal.plugin.activerecord目录下的一个类,原来是使用的jfinal框架~ 是我孤陋寡闻了。

通过分析Db的源码,发现每个方法都使用了预编译处理~ 有漏洞的可能性不大了

但是还有一种情况,就是前面所说的,整个sql语句可控,那么可能会存在sql注入~

11)查看每个方法的调用,发现整个sql语句可控的情况

当我们找到update(String sql)方法的调用情况,SystemGenerateController类的create()方法时,发现此处的sql语句是通过getPara()方法直接获取的,并没有传递什么参数

这里大概率可以判定为sql语句可控,当然也不一定,需要看一下getPara()方法是怎么实现的:

点击进入看一下,发现是通过request.getParameter(name)直接获取的参数内容!

这个时候可以断定,这里99.9%存在sql注入,因为整个sql语句可控。

12)寻找对应的前端功能

既然得知,SystemGenerateController类的create()方法可以触发该sql执行,那么找一下前端哪个功能可以触发该方法,这里需要根据前面所说的路由机制来判断。

可以看到类名上存在一个@Action(path = "/system/generate")注解,并且方法名是create,并且该类在admin目录下

因此,可以推断出,前端请求的路径是/admin/system/generate/create.json

那么接下来去前端搜索一下:

  • 注意点1:搜索的时候不要搜全,因为路径可能是拼接出来的
  • 注意点2:这些路径大部分都是在js文件中,所以直接搜不一定搜出来,因为有些js文件可能没加载呢,所以搜索的时候,需要不断的点击不同功能来获取到不同的js文件(这里可以根据路径判断大体的功能点)。

当我们点击到“代码生成”-“新建”的时候,出现了我们搜索的路径(真费时呀)。

再通过参数名,可以再进一步验证该功能是正确的,如下图:都为sql参数名。

13)验证漏洞

接下来,根据这个功能可以验证该漏洞了。

但是这个功能是用来创建表的,通过源码,我们可以得出可以使用的sql指令是update。

既然只能使用update,那这里我的思路大概就是:报错注入

那么接下来试一下,报错注入,使用update报错注入需要知道表名和列名,那我们可以去数据库看一下~(注意:这里是代码审计,不是黑盒,所以是可以得到数据库信息的)

那就随机找个表名字段名~

构造报错注入语句:

update of_cms_field set is_disabled=updatexml(1,concat(0x5e,database(),0x5e),3) where field_id=2

点击新增,成功执行!

14)继续寻找其他sql语句可控的位置

好吧,找了其他的方法对应的调用,发现,不是sql语句固定,就是语句通过预编译,没有完全可控的sql语句了。ok,sql注入的代码审计到此结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab数据批量保存为excel,文件名,行和列的名称设置

Excel文件内数据保存结果如下: Excel文件保存结果如下: 代码如下: clear;clc; for jjjj1:10 %这个可以改 jname(jjjj-1)*10; %文件名中变数 这是EXCEL文件名字的一部分 根据自己需要改 jkkkk_num2str(jname); for …

物联网之Arduino开发环境的下载与安装、ESP32开发环境的下载与安装、常见环境配置问题的解决办法、COM端口不可用的解决方法

MENU 前言下载和安装Arduino安装ESP32开发环境常见问题JSON下载失败和下载速度慢配置解释器没有发现端口检测到端口,但是有警告图标,端口无法使用 前言 想玩开发板必须得写代码,要不然Arduino不知道怎么运行,Arduino的开发语言是C…

碳产品出口业务管理难?外贸软件ERP全流程管控降本增效

随着全球环保意识的增强和工业生产的需要,对碳产品的需求持续增长。特别是在新能源、环保、航空航天等高科技领域,碳产品的需求量更大。中国作为全球最大的碳产品生产国之一,拥有完整的产业链和丰富的生产经验,具备明显的产业优势…

【C++11 ——— 右值引用和移动语义】

C11 ——— 右值引用和移动语义 右值引用和移动语义左值引用和右值引用左值引用与右值引用比较右值引用使用场景和意义左值引用的使用场景:左值引用的短板:左值引用中编译器的优化右值引用和移动语义右值引用引用左值右值引用的其他使用场景 完美转发万能…

苹果系统安装的QT程序无法显示窗口问题的解决办法

1、问题的提出 苹果系统是可以安装QT(包含QT带来的集成开发环境QTCreator)的。但是,QT安装完毕跑运行测试程序的时候,却会发现窗口无法显示。 右下角的应用窗口程序无法打开。 2、问题的解决 其实原因就在警告之中: …

为单身人士定制的幸福计划:相亲交友系统

在忙碌的都市生活中,单身人士往往因为工作繁忙、社交圈有限等原因,难以遇到合适的伴侣。相亲交友系统,作为现代科技与人际关系结合的产物,为单身人士提供了一个全新的解决方案。本文将从客户角度出发,探讨相亲交友系统…

【计算机网络】UDP TCP介绍

UDP & TCP介绍 UDP报文格式报文内容介绍端口号报文长度校验和载荷 TCP报文格式初步了解TCP机制确认应答超时重传连接管理滑动窗口流量控制拥塞控制紧急传输数据推送延时应答捎带应答面向字节流异常处理心跳机制 UDP 和 TCP 的区别 UDP 报文格式 对于网络协议, 本质上就是…

软件工程技术专业软件开发综合实训室解决方案

一、行业背景与前景分析 1.1 软件工程技术专业就业前景 近年来,中国的软件行业取得了显著的成就,即便在全球经济受到新冠疫情冲击的情况下,仍保持了强劲的增长势头。据工业和信息化部发布的数据,2021年我国软件和信息技术服务业…

mysqldump 迁移至MySQL到Oceanbase-CE V4 和旁路导入语法的学习

闲着没事干,测试着玩。 一.数据库环境 mysql: oceanbase: mysql下的表: 二、mysqldump迁移数据到OceanBase # 通过mysqldump导出数据 mysqldump -h 192.168.80.16 -uroot -P3306 -p --databases test > toob.sql #传输脚本到o…

DDR3 SDRAM操作流程

天空灰暗到一定程度,星晨就会熠熠生辉。 ----一起加油 DDR3 SDRAM的相关操作主要包括上电(Power on)、复位(Reset procedure)、初始化(Initialization)、ZQ对齐(ZQ calibration)、模式寄存器配置(MRS)、自刷新(Selfrefresh)、刷新(Refreshing)、激活(Activating)、读…

线上VR虚拟展厅里可以展示3D模型么?

虚拟展厅里可以展示3D模型。 虚拟展厅利用数字技术和三维建模技术创建一个虚拟的展览环境,使得参观者可以通过计算机、智能手机、平板电脑等设备远程参观展览。在这个过程中,3D模型作为虚拟展厅的重要组成部分,扮演着至关重要的角色。 在虚…

Google AI 概述——喜欢的三点和不喜欢的两点

如果你在谷歌上搜索某些内容,你可能注意到谷歌AI概览已经回归。不过,对此功能的实用性我仍持观望态度。 对于那些还没有使用过的人来说,谷歌AI概览基本上是从各个网站收集信息并将其整合在搜索结果页面的顶部。理论上,这应该使用…

opencv将灰度图转为彩色图片

文章目录 背景灰度图优势opencv读取灰度图彩色转灰度算法需求 方法测试代码 背景 在图像处理中通常需要将图片转为灰度图 灰度图,也称为灰度图像或黑白图像,是一种只包含亮度信息而不包含颜色信息的图像。在灰度图中,每个像素的亮度级别通常…

【STL中容器汇总】map、list、vector等详解

容器学习分享 1、STL简介1.1、STL六大组件 2、vector容器2.1、vector 基本操作2.2、vector容器示例2.3、vector容器存放自定义数据类型示例2.3、vector嵌套vector示例 3、list 容器3.1使用示例3.2、list容器基本函数 4、map容器4.1、map函数原型4.2、map函数示例 1、STL简介 ST…

pdf文件怎么编辑?7大常用的pdf在线编辑技巧,免费好用!

编辑pdf文件通常涉及对文本、图片及其他内容的添加、删除或修改。无论您希望清除过时的信息,还是想为pdf文件增添一些补充材料,掌握几种简单有效的编辑方法都是非常重要的。因此,本文将为大家介绍7大常用的pdf在线编辑技巧,详细解…

Java学习Day40:大战亢金龙!(spring框架之AOP)

AOP(面向切面变成):不改变原有代码的情况下,对代码进行功能添加 1.一些概念 抽取出的方法:通知 原始方法:成为连接点(可以是程序执行中的任意位置),对应原始的一个个方…

Qt篇——Qt在msvc编译下提示“C2001:常量中有换行符“的错误

在pro文件中添加以下配置即可: msvc{QMAKE_CFLAGS /utf-8QMAKE_CXXFLAGS /utf-8 }

哈希表、算法

哈希表 hash: 在编程和数据结构中,"hash" 通常指的是哈希函数,它是一种算法,用于将数据(通常是字符 串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要…

什么是浏览器指纹及其在线跟踪的用途?

互联网常常给人一种广阔的蓝色天空的感觉,在那里你可以自由航行,只有匿名才能提供这种自由。然而,事实并非如此。有一套工具被希望识别谁在访问其网站的企业广泛使用。这套工具被称为浏览器指纹识别,了解它的使用方式很重要。 一…

剑指offer JZ23 链表中环的入口结点

问题描述: 给定一个长度为n的链表,首先判断其是否有环,然后找到环的入口。 要求:空间复杂度 O(1),时间复杂度 O(n)。 思路: 1. 投机一点的做法 从头遍历链表,如果有环,那么有些节…