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

news/2024/12/4 15:27:29/

目录

  • 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语句,使用了$占位符

sql注入概述">1. sql注入概述

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

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

sql注入测试工具">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(),存在注入.

sql注入防御方法">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)的一贯套路。

sql注入防御举例">4. SQL注入防御举例

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

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);
sql语句拼接了来自外部的不可信参数">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();
sql语句导致sql注入风险">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

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

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();

sql语句使用占位符">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>
sql语句使用了占位符">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.ppmy.cn/news/1552311.html

相关文章

联想YOGA Pro 14s至尊版电脑找不到独立显卡(N卡)问题,也无法安装驱动的问题

问题描述 电脑是联想YOGA Pro 14s至尊版&#xff0c;电脑上装的独立显卡是4060&#xff0c;一直是能够使用独立显卡的。然而有两次突然就找不到显卡了&#xff0c;NVIDIA CONTROL PANEL也消失了&#xff0c;而且也无法安装驱动。具体表现如下&#xff1a; 无法连接外接显示器…

【音视频】HLS和DASH 流媒体协议的详细介绍和实现方式

深入探讨 HLS 和 DASH 流媒体协议 1. HLS&#xff08;HTTP Live Streaming&#xff09; 核心技术细节 HLS&#xff08;HTTP Live Streaming&#xff09;是由苹果公司提出的一种基于 HTTP 协议的流媒体协议。它将视频分割成多个小片段&#xff0c;通过 .m3u8 文件作为索引进行…

解决 el-input 红色波浪线问题

解决 el-input 红色波浪线问题 添加 spellcheck"false" <el-input class"inputStyle" v-model"codeNum" spellcheck"false" change"orderFn" ref"inputSelectBound" label""></el-input>…

代码随想录-算法训练营day29(回溯算法05:非递减子序列,全排列,全排列2)

第七章 回溯算法part05* 491.递增子序列 * 46.全排列 * 47.全排列 II详细布置 491.递增子序列 本题和大家刚做过的 90.子集II 非常像&#xff0c;但又很不一样&#xff0c;很容易掉坑里。 https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.htm…

Python 入门教程(2)搭建环境 | 2.4、VSCode配置Node.js运行环境

文章目录 一、VSCode配置Node.js运行环境1、软件安装2、安装Node.js插件3、配置VSCode4、创建并运行Node.js文件5、调试Node.js代码 一、VSCode配置Node.js运行环境 1、软件安装 安装下面的软件&#xff1a; 安装Node.js&#xff1a;Node.js官网 下载Node.js安装包。建议选择L…

【Go底层】select原理

目录 1、背景2、go版本3、 selectgo函数解释【1】函数参数解释【2】函数具体解释第一步&#xff1a;遍历pollorder&#xff0c;选出准备好的case第二步&#xff1a;将当前goroutine放到所有case通道中对应的收发队列上第三步&#xff1a;唤醒groutine 4、总结 1、背景 select多…

SpringBoot 框架下基于 MVC 的高校办公室行政事务管理系统:设计开发全解析

2系统开发环境 2.1vue技术 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第…

2024.12.2工作复盘

1.今天学了什么&#xff1f; 简单的写了一篇博客&#xff0c;是关于参数校验的问题&#xff0c;参数校验&#xff0c;一个是前后端校验到底一不一致&#xff0c;一个是绕过前端校验&#xff0c;看后台的逻辑到底能不能校验住。 2.今天解决了什么问题&#xff1f; 3.今天完成…