「 典型安全漏洞系列 」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.mfbz.cn/a/311704.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

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

【数据结构】--二叉树递归题记

最近写了几道关于二叉树的剑指offer题,和小伙伴们分享一下心得。 🌈对称的二叉树 请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。 思路分析: 对于二叉树的问题来说肯…

谷达冠楠:抖音开网店创业怎么做

随着互联网的发展,越来越多的人选择在网上创业。而抖音作为目前最火的短视频平台之一,也成为了许多人开网店的首选。那么,如何在抖音上开网店创业呢?下面就来详细介绍一下。 第一步:注册账号 首先,你需要在抖音上注册…

登录模块的实现

一.前期的准备工作 1.页面的布局 (1)表单的校验: 利用element-ui提供的文档绑定rules规则后实现校验 (2)跨域的配置 : 利用proxy代理来解决跨域的问题 (3)axios拦截器的配置 两个点:1. 在请求拦截的成功回调中,如果token,因为调用其它的接口需要token才能调取。 在请…

【排序】对各种排序的总结

文章目录 前言1. 排序算法的复杂度及稳定性分析2. 排序算法的性能测试2.1 重复率较低的随机值排序测试2.2 重复率较高的随机值排序测试 前言 本篇是基于我这几篇博客做的一个总结: 《简单排序》(含:冒泡排序,直接插入排序&#x…

【Docker】概述与安装

🥳🥳Welcome Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome Huihuis Code World ! !🥳🥳 一. Docker的概述 1.Docker为什么出现 2…

【AI视野·今日CV 计算机视觉论文速览 第285期】Mon, 8 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 8 Jan 2024 Totally 66 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Denoising Vision Transformers Authors Jiawei Yang, Katie Z Luo, Jiefeng Li, Kilian Q Weinberger, Yonglong Tian, Yue…

YOLOv8-Seg改进:轻量化改进 | 超越RepVGG!浙大阿里提出OREPA:在线卷积重参数化

🚀🚀🚀本文改进:OREPA在线卷积重参数化巧妙的和YOLOV8结合,并实现轻量化 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何训练YOLOv8-seg; 2)模型创新,提升分割性能; 3)独家…

(css样式)权限控制el-button是否显示 + 鼠标悬浮停留才会显示el-button

前提: (1)当前物理席位是主任席(seatType‘1’) (2)管制席位TWR_ONE账号发布了内容:管制席——zhouzebiao——。。。。 (3)主任席tatai账号发布了内容&…

C++|47.动态数组 48.C++的std:vector使用优化

动态数组 动态数组叫vector,也是一种定义好的类/数据结构。“定义好”意味着 vector处在std命名空间之中。 vector的存在代表着一种可以调用的数据结构,不用 动态的意思是可以将该数组的大小进行动态调整。 也就意味着起初vector是没有固定大小的。 它是…

Git 基础指令

Git 基础指令 本章涵盖了我们在使用 Git 完成各种操作时将会用到的各种基本命令。 在学习完本章之后,我们应该能够配置并初始化一个仓库(repository)、开始或停止跟踪(track)文件、暂存(stage)…

QT第四天

头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTime>//时间类 #include<QTimerEvent>//定时器事件类 #include<QtTextToSpeech> //语言播报类 #include<QPushButton> namespace Ui { class Widget; }clas…

【Scala】——变量数据类型运算符

1. 概述 1.1 Scala 和 Java 关系 1.2 scala特点 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的静态类型编程语言&#xff08;静态语言需要提前编译的如&#xff1a;Java、c、c等&#xff0c;动态语言如&#…

js 数据回调 异步 Promise

回调顺序 JavaScript 函数按照它们被调用的顺序执行。而不是以它们被定义的顺序。 js数据顺序问题 <!DOCTYPE html> <html> <body><h2>JavaScript 函数序列</h2><p>JavaScript 函数按照它们被调用的顺序执行。</p><p id"de…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-3Phase Portrait相图,相轨迹

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-3Phase Portrait相图&#xff0c;相轨迹 1. 1-D2. 2-D3. General Form4. Summary5. 爱情中的数学-Phase Portrait 相图动态系统分析 1. 1-D 2. 2-D 3. General Form 4. Su…

你为什么还在用Promise.all?

请停止在JavaScript中使用Promise.all() 什么是JavaScript中的Promise 如果您偶然发现这篇文章,那么您可能已经熟悉了promise。 但是,对于那些JavaScript新手来说,让我们来详细说明一下。 从本质上讲,Promise对象表示异步操作的最终完成或失败。 有趣的是,当创建promise时,其值…

【昕宝爸爸小模块】ConcurrentHashMap为什么不允许null值

ConcurrentHashMap为什么不允许null值 一、✅典型解析二、✅要实现一个HashMap怎么做2.1 ✅需要考虑以下几个方面2.2 ✅基于数组和链表的HashMap实现Demo2.3 ✅扩容后如何解决链表长度过长的问题 三、✅拓展知识仓3.1 ✅在多线程环境下如何保证数据的正确性和性能3.2 ✅那如何在…

git 的安装

git 的安装 在我们开始使用 Git 前&#xff0c;需要将它安装在我们的电脑上。即便已经安装&#xff0c;最好将它升级到最新的版本。 我们可以通过软件包或者其它安装程序来安装&#xff0c;或者下载源码编译安装。 本文只介绍通过在 windows 上安装软件包的方式&#xff0c;其…

vue Element Plus Cascader级联选择器点击标签选中复选框

element-plus原功能 element-plus的Cascader级联选择器点击标签时是不会选中复选框的&#xff0c;我们想要实现点击标签时也能选中复选框这个效果&#xff0c;那么就要用到一些原生的方法 实现效果 mounted() {// Cascader 级联选择器: 点击文本就让它自动点击前面的input就可…

Vue 自定义仿word表单录入之日期输入组件

因项目需要&#xff0c;要实现仿word方式录入数据&#xff0c;要实现鼠标经过时才显示编辑组件&#xff0c;预览及离开后则显示具体的文字。 鼠标经过时显示 正常显示及离开时显示 组件代码 <template ><div class"paper-input flex flex-col border-box "…