网络安全系列 之 SQL注入学习总结

目录

  • 1. sql注入概述
  • 2. sql注入测试工具
  • 3. sql注入防御方法
    • 3.1 问题来源
    • 3.2 防御方法
  • 4. SQL注入防御举例
    • 4.1 使用JDBC时,SQL语句进行了拼接
        • 1. 使用statement的executeQuery、execute、executeUpdate等函数时,传入的SQL语句拼接了来自外部的不可信参数。
        • 2. 使用connection的PreparedStatement时,使用的SQL语句拼接了来自外部的不可信参数。
        • 3. 存储过程使用动态方式构建SQL语句,导致SQL注入风险。
    • 4.2 使用Hibernate时,调用API时,传入的SQL语句有拼接外部参数
        • 1. 调用createQuery时,传入的SQL语句拼接了来自外部的不可信参数。
    • 4.3 使用MyBatis时,SQL语句使用$占位符
        • 1. 配置文件使用$占位符
        • 2. mybatis接口中的函数标签的SQL语句,使用了$占位符

1. sql注入概述

程序里面如果使用了未经校验的外部输入来构造SQL语句,就很可能会引入SQL注入漏洞。

注入攻击
对于字符串输入,如果这个字符串将被解释为某种指令,那么需要特别注意防止注入攻击。sql注入、os命令注入、xml注入是典型的攻击类型。

2. sql注入测试工具

可以使用BurpSuite工具,浏览器上修改代理设置为burp工具配置的代理监听的IP端口。
对浏览器发送的请求进行拦截并修改其中参数,尝试注入攻击。

  • sleep盲注: 返回时间>=5s,存在注入.
    {"stationCodes":"AD02C7CCAB6F4BF9A85BC010AF16AC62')xor(sleep(5))and('","ptIds":"","pmYearDate":"2018","page":1,"pageSize":10}
  • 普通注入or /and : id="1' or '1'='1" id="1' or '1'='2"
  • 报错注入: updatexml /extractvalue 、floor后group by。
  1. id=1 and updatexml(1,concat(0x7e,version(),0x7e),1) 返回version(),存在注入.
  2. id=1 and extractvalue(1,concat(0x7e,version()) 返回version(),存在注入.
  3. id=1 and (select 1 from (select count(),concat(version(),floor(rand(0)2))x from information_schema.tables group by x)a)
    返回version(),存在注入.

3. sql注入防御方法

3.1 问题来源

  1. 执行外部数拼接的SQL语句。
  2. 执行外部传入的整条SQL语句
  3. 在配置文件中的SQL语句没有使用预编译方式占位符。
  4. 校验函数有缺陷或占位符使用错误。

3.2 防御方法

  1. 使用参数化语句
    sql语句预编译绑定变量,不直接拼接。

  2. 输入校验
    采用白名单或黑名单方式对入参进行检查。
    备注:ESAPI(Enterprise Security API)也提供了输入验证类 org.owasp.esapi.reference.DefaultValidator的实现。

  3. 输出编码
    在sql注入语境中,将发送给数据库的内容进行编码(或转义)是必需的操作,可以保证内容被正确的处理。
    针对Mysql的编码举例:在动态sql中提交的信息(LIKE语句中使用通配符的位置)添加引用。

    sql = sql.replace("%",“\%”);   //%匹配0个或多个任意字符sql = sql.replace("_",“\_”);    //_匹配任意一个字符

备注:在动态sql和拼接sql场景下也可以利用ESAPI进行转义处理

    // ESAPI转义,防SQL注入public static String encodeForSql(String input) {MySQLCodec mysqlCodec = new MySQLCodec(MySQLCodec.Mode.STANDARD);return ESAPI.encoder().encodeForSQL(mysqlCodec, input);}// 说明: esapi需要有两个配置文件:ESAPI.properties、validation.properties

小结:输入校验输出编码是处理注入问题(如xss)的一贯套路。

4. SQL注入防御举例

4.1 使用JDBC时,SQL语句进行了拼接

1. 使用statement的executeQuery、execute、executeUpdate等函数时,传入的SQL语句拼接了来自外部的不可信参数。
**错误示例**String userName = ctx.getAuthenticatedUserName(); //this is a constant//itemName是外部读入的参数拼接到SQL语句String sqlString = "SELECT * FROM t_item WHERE owner='" + userName + "' AND itemName='" + request.getParameter("itemName") + "'";stmt = connection.createStatement();rs = stmt.executeQuery(sqlString);

解决方法 1) 使用预编译方式(不可信数据作为字段值); 2) 对拼接到SQL语句中的外部参数进行白名单校验(不可信数据作为表名,字段名,排序方式)。

**正确示例**:使用白名单校验方式校验itemNameString userName = ctx.getAuthenticatedUserName(); //this is a constantString itemName=getCleanedItemName(request.getParameter("itemName"));String sqlString = "SELECT * FROM t_item WHERE owner='" + userName + "' AND itemName='" + itemName + "'";stmt = connection.createStatement();rs = stmt.executeQuery(sqlString);
2. 使用connection的PreparedStatement时,使用的SQL语句拼接了来自外部的不可信参数。
**错误示例**String userName = ctx.getAuthenticatedUserName(); //this is a constant//itemName是外部读入的参数拼接到SQL语句String itemName = request.getParameter("itemName");// ...Ensure that the length of userName and itemName is legitimate// ...String sqlString = "SELECT * FROM t_item WHERE owner=? AND itemName='"+itemName+"'";PreparedStatement stmt = connection.prepareStatement(sqlString);stmt.setString(1, userName);rs = stmt.executeQuery();

解决方法 1) 将拼接方式改为占位符方式; 2). 对拼接到SQL语句中的外部参数进行白名单校验。

**正确示例**:所有的参数使用占位符String userName = ctx.getAuthenticatedUserName(); //this is a constantString itemName = request.getParameter("itemName");// ...Ensure that the length of userName and itemName is legitimate// ...String sqlString = "SELECT * FROM t_item WHERE owner=? AND itemName=?";PreparedStatement  stmt = connection.prepareStatement(sqlString);stmt.setString(1, userName); // jdbc编号从1开始stmt.setString(2, itemName);rs = stmt.executeQuery();
3. 存储过程使用动态方式构建SQL语句,导致SQL注入风险。
**错误示例**
REATE PROCEDURE sp_queryItem@userName varchar(50),@itemName varchar(50) 
AS 
BEGIN DECLARE @sql nvarchar(500); SET @sql = 'SELECT * FROM t_item WHERE owner = ''' + @userName + '''AND itemName = ''' + @itemName + '''';EXEC(@sql); 
END 
GO

解决方法 采用参数化查询的方式

**正确示例**:采用参数化查询的方式
CREATE PROCEDURE sp_queryItem@userName varchar(50), @itemName varchar(50) 
AS 
BEGIN SELECT * FROM t_item  WHERE userName = @userNameAND itemName = @itemName; 
END 
GO

4.2 使用Hibernate时,调用API时,传入的SQL语句有拼接外部参数

1. 调用createQuery时,传入的SQL语句拼接了来自外部的不可信参数。
**错误示例**//SQL语句拼接不可信参数String itemName = request.getParameter("itemName");Query hqlQuery = session.createQuery("from Item as item where item.itemName = '" + itemName + "'");List<Item> hrs = (List<Item>) hqlQuery.list();

解决方法 1) 对拼接到SQL语句中的外部参数进行白名单校验; 2) 使用hibernate的配置映射关系方式。

**正确示例**:对外部参数进行白名单校验String itemName = request.getParameter("itemName");itemName=getCleanedItemName(itemName);//白名单校验Query hqlQuery = session.createQuery("from Item as item where item.itemName = '" + itemName + "'");List<Item> hrs = (List<Item>) hqlQuery.list();

4.3 使用MyBatis时,SQL语句使用$占位符

1. 配置文件使用$占位符
错误示例:// 使用$,底层将使用简单拼接    <select id="getItems" resultClass="Item">SELECT * FROM t_item WHERE owner = $userName$ AND itemName = $itemName$</select>

解决方法 1) 将$占位符改为#占位符; 2) 如果外部不可信数据作为表名,字段名,排序方式,则对外部参数进行白名单校验。

**正确示例**:使用#占位符方式<select id="getItems" resultClass="Item">SELECT * FROM t_item WHERE owner = #userName# AND itemName =#itemName#</select>
2. mybatis接口中的函数标签的SQL语句,使用了$占位符
**错误示例**public interface IUserDAO { //标注中的SQL语句通过$表示占位符,内部实现是单纯的拼接@Select("select *from User where id=${id}) User getUser(@Param("id")String id);}
**正确示例**:标注中的SQL语句通过'#'表示占位符,内部实现是参数化预处理public interface IUserDAO { @Select("select *from User where id=#{id}) User getUser(@Param("id")String id);}

end.

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

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

相关文章

《平衡之策:C++应对人工智能不平衡训练数据的数据增强方法》

在人工智能的广袤领域中&#xff0c;数据是驱动模型学习与成长的核心燃料。然而&#xff0c;不平衡的训练数据却如同一颗隐藏的暗礁&#xff0c;常常使模型的训练之船偏离正确航道&#xff0c;导致性能不佳与偏差增大。当我们聚焦于 C这一强大的编程语言时&#xff0c;又有哪些…

完整指南:在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK

完整指南&#xff1a;在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK 要在Ubuntu 20.04系统中使用ROS 1环境配置和使用Orbbec SDK&#xff0c;可以遵循以下详细且系统化的步骤。这些步骤将引导您从下载必要的工具和SDK到学习如何使用这些资源&#xff0c;确保您能有效地利用…

使用 Selenium 和 Python 爬取腾讯新闻:从基础到实践

使用 Selenium 和 Python 爬取腾讯新闻&#xff1a;从基础到实践 在这篇博客中&#xff0c;我们将介绍如何利用 Selenium 和 Python 爬取腾讯新闻的内容&#xff0c;并将结果保存到 CSV 文件中。本教程包含以下内容&#xff1a; 项目简介依赖安装实现功能的代码实现中的关键技…

element ui 自定义文件上传二进字流传值问题

1.封装的post请求 import axios from ./axios.js //引入axios文件 export function post (url, data) {return axios({method: post,url,data: {...data}}) }//修改后 正常了 export function post (url, data) {return axios({method: post,url,data: data}) } 2.api文件里面…

【设计模式系列】单例模式(二十)

一、什么是单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;属于创建型模式。它的目的是确保一个类只有一个实例&#xff0c;并提供一个全局访问点来获取这个实例。 单例模式的主要特点包括&#xff1a; 唯一性&#xff1a…

在 SpringBoot 集成了 Mybatis 的基础上添加 Mybatis-Plus

SpringBoot 集成了 Mybatis 可以参考前一篇文章 《SpringBoot 项目快速集成 Mybatis》 在 SpringBoot 集成了 Mybatis 的基础上添加 Mybatis-Plus 步骤&#xff1a; 引入 mybatis-plus 依赖&#xff1a; <dependency><groupId>com.baomidou</groupId><…

BioDeepAV:一个多模态基准数据集,包含超过1600个深度伪造视频,用于评估深度伪造检测器在面对未知生成器时的性能。

2024-11-29, 由罗马尼亚布加勒斯特大学创建BioDeepAV数据集&#xff0c;它专门设计来评估最先进的深度伪造检测器在面对未见过的深度伪造生成器时的泛化能力&#xff0c;这对于提高检测器的鲁棒性和适应性具有重要意义。 数据集地址&#xff1a;biodeep 一、研究背景&#xff1…

工业—使用Flink处理Kafka中的数据_ChangeRecord1

使用 Flink 消费 Kafka 中 ChangeRecord 主题的数据,当某设备 30 秒状态连续为 “ 预警 ” ,输出预警 信息。当前预警信息输出后,最近30

Flink四大基石之State(状态) 的使用详解

目录 一、有状态计算与无状态计算 &#xff08;一&#xff09;概念差异 &#xff08;二&#xff09;应用场景 二、有状态计算中的状态分类 &#xff08;一&#xff09;托管状态&#xff08;Managed State&#xff09;与原生状态&#xff08;Raw State&#xff09; 两者的…

opencv-android编译遇到的相关问题处理

1、opencv-android sdk下载 下载地址&#xff1a;https://opencv.org/releases/ 下载安卓SDK即可 2、解压下载好的SDK 3、导入opencv的SDK到安卓项目中 导入步骤在/OpenCV-android-sdk/sdk/build.gradle文件的注释中写的非常详细&#xff0c;大家可安装官方给出的步骤导入。…

前端项目开发 如何解决 error ‘val‘ is not defined no-undef 问题?

在前端开发中&#xff0c;error val is not defined no-undef 是 ESLint 报出的错误&#xff0c;表示在代码中使用了未定义的变量 val&#xff0c;但是 ESLint 没有找到它的声明。为了解决这个问题&#xff0c;通常有以下几种方法&#xff1a; 1. 检查变量是否正确声明 最常见…

深入探索 HarmonyOS 的 Navigation 组件:灵活的页面管理与动态导航

在移动应用开发中&#xff0c;页面的跳转和导航一直是核心功能之一。对于 HarmonyOS 开发者来说&#xff0c;Navigation 组件提供了一个强大的工具来实现灵活的页面管理和导航体验。今天&#xff0c;我们将深入探讨如何使用 HarmonyOS 中的 Navigation 组件来管理页面跳转、工具…

OpenSSH-9.9p1 OpenSSL-3.4.0 升级步骤详细

前言 收到漏洞扫描通知 OpenSSH 安全漏洞(CVE-2023-38408) OpenSSH 安全漏洞(CVE-2023-51385) OpenSSH 安全漏洞(CVE-2023-51384) OpenSSH 安全漏洞(CVE-2023-51767) OpenSSH 安全漏洞(CVE-2023-48795) OpenSSH&#xff08;OpenBSD SecureShell&#xff09;是加拿大OpenBSD计划…

Python毕业设计选题:基于Flask的医疗预约与诊断系统

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 疾病信息 就诊信息 个人中心 管理员登录界面 管理员功能界面 用户界面 医生…

经济:趋势判断 课程学习笔记

文章目录 导言意愿支付和需求函数影响需求的因素市场均衡及应用均衡变动分析 导言 当代经济学研究的权威机构&#xff1a;美国经济学会&#xff08;AEA&#xff09;。 经济学研究的问题有哪些&#xff1a; 为什么有一些国家富裕&#xff0c;而另外一些国家贫穷&#xff1f;是…

Hive元数据表解析

cdh版本的hive元数据表可能和apache hive有一定区别&#xff0c;不过大同小异&#xff0c;在这里介绍 1.1.0-cdh5.12.0版本的hive元数据表。hive元数据存储在mysql的metastore库里。以_PRIVS结尾的权限信息相关表都需要在hive里使用grant授权才会产生&#xff0c;如果结合sentr…

sql删除冗余数据

工作或面试中经常能遇见一种场景题&#xff1a;删除冗余的数据&#xff0c;以下是举例介绍相应的解决办法。 举例&#xff1a; 表结构&#xff1a; 解法1&#xff1a;子查询 获取相同数据中id更小的数据项&#xff0c;再将id不属于其中的数据删除。-- 注意&#xff1a;mysql中…

数据链路层(四)---PPP协议的工作状态

1 PPP链路的初始化 通过前面几章的学习&#xff0c;我们学了了PPP协议帧的格式以及组成&#xff0c;那么对于使用PPP协议的链路是怎么初始化的呢&#xff1f; 当用户拨号上网接入到ISP后&#xff0c;就建立起了一条个人用户到ISP的物理链路。这时&#xff0c;用户向ISP发送一…

基于“微店 Park”模式下 2+1 链动模式商城小程序的创新发展与应用研究

摘要&#xff1a;本文以“微店 Park”从“开店工具”向“众创平台”的转型为背景&#xff0c;深入探讨 21 链动模式商城小程序在该平台情境下的应用潜力与创新发展路径。通过剖析“微店 Park”的运营模式&#xff0c;包括灵活承租、低成本入驻、多元流量引流等特点&#xff0c;…

4k4d 学习安装笔记

目录 这个博文讲解不错&#xff1a; 服务器上&#xff1a; https://github.com/zju3dv/4K4D?tabreadme-ov-file 安装&#xff1a; GitHub - zju3dv/EasyVolcap: [SIGGRAPH Asia 2023 (Technical Communications)] EasyVolcap: Accelerating Neural Volumetric Video Resear…