「 典型安全漏洞系列 」02.SQL注入详解

引言:SQL注入是一个老生常谈且又非常重要的漏洞,导致许多热点的数据泄露事件。尽管学习起来相对简单,但它可能用于某些高危漏洞的利用。这使得它成为初学者的兴趣点,甚至对于更有经验的用户来说,SQL注入也是基本知识。
在这里插入图片描述

1. 简介

SQL注入是一种利用应用程序对用户输入的处理不当,使恶意用户能够执行未经授权的SQL查询的行为。当应用程序从用户那里接收输入并将其直接用作SQL查询的一部分时,就可能发生SQL注入,使得攻击者能够干扰应用程序对数据库的正常查询,甚至可访问敏感数据,引起数据泄露。
在这里插入图片描述

SQL注入根源:

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

比如,通过输入"1 and version() > 0",若应用程序正常返回,说明version()被数据库识别并执行。因version()是Mysql特有的函数,所以可以推断出后台数据库为Mysql。

Note:不同数据库的注入点可以查阅https://portswigger.net/web-security/sql-injection/cheat-sheet

2. 注入步骤

2.1. 确定目标

首先,你需要确定你想要攻击的目标。它可能是一个公开的网站,或者是一个内部网络应用。简而言之,你需要先找到一个有用户输入并且包含数据库连接信息的应用。

2.2. 寻找注入点

你需要寻找应用程序中可能存在SQL注入的点。注入点通常在用户输入字段(如用户名、密码、搜索查询等)中。当应用程序将这些输入直接插入到SQL查询中时,就可能存在注入风险。

常见注入点分类:

    1. 按参数类型区分:
    • 数字型注入:比如and 1=1,
    • 字符型注入:比如and '1'='1
    1. 按请求方式区分:
    • GET注入
    • POST注入
    • HTTP注入
    1. 按执行效果区分:
    • 报错注入
    • UNION注入
    • 布尔盲注
    • 时间盲注
    • 二次注入

2.3. 构造恶意输入

基于你找到的注入点,你需要构造一个恶意输入。这个输入可能包含一些特殊字符或字符串,这些字符或字符串会被应用程序误解为SQL代码。例如,如果你正在寻找用户名和密码字段,一个可能的恶意输入可能是“admin; SELECT * FROM users”,这个输入会触发一个查询,返回所有用户的信息。

2.4. 执行攻击

当你的恶意输入被提交到应用程序时,如果应用程序没有正确地验证和清理用户输入,那么它就会执行你构造的SQL代码。这可能导致数据库被篡改,或者敏感信息被泄露。

Note:通过构造特殊的SQL语句可猜测类似表名、字段名、用户名及密码信息。

2.5. 分析结果

一旦攻击成功,你需要分析数据库中的数据,以确认你的攻击是否成功。你可能需要查看特定的表或列,或者查看数据库的整体结构。

3. 常见攻击

在不同的情况下会发生许多SQL注入漏洞、攻击和技术。一些常见的SQL注入示例包括:

  • 检索隐藏数据:可以在其中修改SQL查询以返回其他结果,比如文章开关介绍的探索数据库版本信息;
  • 颠覆应用程序逻辑:中可以更改查询以干扰应用程序的逻辑;
  • UNION攻击:可以从不同的数据库表中检索数据;
  • SQL盲注:攻击者可以操控查询语句的参数,且查询的结果不会在应用程序的响应中返回,比如注入xxx' and '1'='1并不影响程序正常响应,但这可以确认此处存在注入点。

4. 防御

主要有以下4种防御方法:参数化查询、存储过程、输入数据校验及最小化权限配置。

4.1. 参数化查询,使用预编译语句

比如如下代码,直接通过拼接SQL方式执行查询,存储注入问题

String query = "SELECT * FROM products WHERE category = '"+ input + "'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);

可修改为下面的预编译语句形式,利用预编译将SQL编译后放入缓存池,当服务器执行入参时并不会编译SQL,而是直接传参,所以可以避免SQL注入。

PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();

4.2. 使用存储过程

使用存储过程也在可以缓解SQL注入,效果与预编译语句类似。区别在于存储过程需要先将SQL语句定义在数据库中,而非缓存池。

当然,在使用存储过程中也可能存在注入问题,需要尽量避免在存储过程内使用动态的SQL语句。如实在无法避免,可严格过滤输入或对输入编码后再处理。

4.3. 输入数据校验

对传入的数据类型做校验,比如只能是时间类型、整型,或满足指定格式(IP、邮箱格式)

4.4. 最小化权限配置

避免对普通账号赋予过高的权限,数据库账户设计时需要遵循最小化权限原则。比如,只涉及查询类的应用,数据库账户只需要赋予只读权限即可,避免因注入问题导致下个数据库被删除;

5. 参考

[1] https://portswigger.net/web-security/sql-injection#what-is-sql-injection-sqli


前期回顾:
「 典型安全漏洞系列 」01.XSS攻击详解

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

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

相关文章

SWM341系列之SWM34SRET6介绍

SWM341系列的介绍 本文介绍了华芯微特SWM341系列主要性能,和其系列之一的SWM34SRET6-50驱动4.3寸800*480 TFTLCD显示的例程应用。 SWM341系列性能 SWM341是一款基于ARM Cortex-M33的32位微控制器,片上包含精度为 1%以内的 20MHz/40MHz 时钟,最…

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 输入:l1 [], l2 [] 输出:[] 输入:l1 []…

Go后端开发 -- 条件、循环语句 defer语句

Go后端开发 – 条件、循环语句 && defer语句 文章目录 Go后端开发 -- 条件、循环语句 && defer语句一、条件语句1.if ... else 语句2.switch语句3.select语句 二、循环语句1.for循环 三、defer语句1.defer语句的作用2.defer和return的先后顺序3.recover错误拦截…

openEuler22.0.3安装oracle11.2.0.4报错总结

openEuler是CentOS8系列魔改来的 1.xstart无法打开报错x11拒绝转义 yum install *x11* vi /etc/ssh/sshd_config X11Forwarding yes systemctl restart sshd 2.执行runinstaller报错,无论是直接无法打开界面报错: when installed in the jdk 1.2 Linux 还是打开界面报错: no o…

网络服务DHCP与DNS

一 DHCP的工作原理(租约过程) 分类 1)自动分配:分配到一个IP地址后永久使用 (2)手动分配:由DHCP服务器管理员指定IP(打印机、报销系统)把mac地址和ip地址做一个一一对…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin 手指在上面的图上移动,“剪切”出上面图中以手指触点为中心的图(半径图),然后在下面的ImageView显示。 impor…

C++实现简单贪吃蛇游戏

文章目录 1 开发历程2 开发思路3 使用介绍4 源文件代码5 游戏截图6 小结 1 开发历程 游戏使用C语言开发,是博主某个下午心血来潮的结果,后面又花了点时间加了计分,记录历史得分的功能。 2 开发思路 其实贪吃蛇主要难在蛇身的移动上&#x…

(C#源码)LIMS实验室信息系统,管理实验室的样本、数据、实验和设备等信息

LIMS系统,LIMS实验室信息系统源码,C# LIMS系统源码, 什么是LIMS? LIMS即实验室信息管理系统(Laboratory Information Management System),是一种专门为实验室设计的信息管理系统,用…

小程序基础学习(组件化)

(一)创建 找到components文件夹下面创建新的文件夹 然后再文件夹内创建component格式的文件 创建后这样 我创建的是my-info的文件夹以及my-info的components文件,跟着普通的页面一样 (二) 注册组件 找到你需要使用组…

leetcode:滑动窗口

目录 1.定长滑动窗口 1.1 几乎唯一子数组的最大和(使用map来计数) 1.2 长度为k子数组中的最大和 2.不定长滑动窗口 2.1 最多k个重复元素的最长子数组 2.2 绝对差不超过限制的最长连续子数组(multiset) 2.3 将x减到0的最小操作数(正难则反 逆向思维) 2.4 统计…

Developer Tools for Game Creator 1

插件包含: 持久世界时间管理系统 单击以生成对象或预设 游戏内调试控制台 游戏内事件控制台 控制台管理控制 命令模板脚本 游戏内屏幕截图 低分辨率和高分辨率图像 缩略图生成 移动支持 使用Game Creator Action或拖放来激活和控制组件,无需编码。 通过此资产,您可以获得: …

Android 15即将到来,或将推出5大新功能特性

Android15 OneUI电池优化 三星最近完成了对其所有设备的稳定版 One UI 6.0 更新的推出,引起了用户的极大兴奋。据新出现的互联网统计数据显示,即将发布的基于 Android 15 的 One UI 7 将通过优化电池和功耗来重新定义用户体验,这是一项具有突…

React之自定义路由组件

开篇 react router功能很强大,可以根据路径配置对应容器组件。做到组件的局部刷新,接下来我会基于react实现一个简单的路由组件。 代码 自定义路由组件 import {useEffect, useState} from "react"; import React from react // 路由配置 e…

【C++】C++11中的常见语法(上)

C11 一、C11简介二、统一的列表初始化1.{}初始化2. std::initializer_list 三、声明1. auto2. decltype3. nullptr 四、右值引用和移动语义1. 左值引用和右值引用2. 左值引用与右值引用比较3. 右值引用使用场景和意义4. 右值引用引用左值及其一些更深入的…

Python知识点(史上最全)

Python期末考试知识点(史上最全) python简介 Python是一种解释型语言 Python使用缩进对齐组织代码执行,所以没有缩进的代码,都会在载入时自动执行 数据类型:整形 int 无限大 浮点型 float…

概率论与数理统计-第6章 参数估计

6.1 点估计问题概述 一、点估计的概念 二、评价估计量的标准 无偏性 定义1:设^ θ(X1,…,Xn)是未知参数θ的估计量,若E(^ θ)θ,则称^θ为θ的无偏估计量定理1:设X1,…,Xn,为取自总体X的样本,总体X的均值为μ,方差为…

快速打通 Vue 3(四):标签的 ref 属性与 Vue3 生命周期

很激动进入了 Vue 3 的学习,作为一个已经上线了三年多的框架,很多项目都开始使用 Vue 3 来编写了 这一组文章主要聚焦于 Vue 3 的新技术和新特性 如果想要学习基础的 Vue 语法可以看我专栏中的其他博客 Vue(一):Vue 入…

centos 8.0 安装sysbench 1.0.17

序号步骤说明执行命令执行结果备注1 下载并解压sysbench-1.0.17.zip sysbench-1.0.17.zip2安装依赖文件 yum install automake libtool -y yum install /usr/include/libpq-fe.h 3安装sysbench cd sysbench-1.0.17 ./autogen.sh ./configure \ --prefix/sysbench \ --with-pgsq…

【Docker】Linux中Docker技术入门与实战及实用的常规命令

目录 一、引言 1. 说明: 2. Linux介绍 3. Docker简介 二、Docker三要素 1. 镜像(Image) 2. 容器(Container) 3. 仓库(Repository) 三、实现案例 1. 创建 2. 设置镜像 3. 开启设置 …

MidTool的AIGC与NFT的结合-艺术创作和版权保护的革新

在数字艺术和区块链技术的交汇点上,NFT(非同质化代币)正以其独特的方式重塑艺术品的收藏与交易。将MidTool(https://www.aimidtool.com/)的AIGC(人工智能生成内容)创作的图片转为NFT&#xff0c…