「 典型安全漏洞系列 」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.mzph.cn/news/614153.shtml

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

相关文章

自动化测试框架详解

自动化测试框架是一套工具、库和规范的集合,用于支持和简化自动化测试的开发、执行和管理。 提供一种结构化的方法来编写、组织和执行自动化测试用例,并提供一些常用的功能和工具,例如测试用例管理、结果报告生成、测试数据管理、日志记录等…

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

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

Win10下python3和python2同时安装并解决pip共存问题

特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似。 使用python开发,环境有Python2和 python3 两种,有时候需要两种环境切换使用,下面提供详细教程一份。 1、下载…

基于WebRTC技术的EasyRTC视频云服务系统在线视频客服解决方案

一、需求分析 随着互联网技术的发展,视频客服也成为服务行业的标配体验,基于WebRTC实时通信技术,客服人员与用户可以建立实时双向的视频交互与沟通。借助视频客服功能可以更加直观地了解用户的需求,提高沟通效率,并帮…

Unity获取系统语言

大家好,我是阿赵。   在使用Unity引擎做多语言的游戏时,很有可能需要根据用户的手机或者电脑的当前语言来设置游戏的默认语言。   Unity的API里面默认就有可以获取系统语言的方法: Application.systemLanguageUnity的API例子&#xff1a…

小家电应用解决方案以及选型指南

电磁炉是现代厨房中常见的一种小家电产品,它利用电磁感应加热原理,可以快速、高效地进行烹饪。在电磁炉的设计和制造过程中,功率开关芯片的选择对于产品的性能和成本有着重要的影响。 针对电磁炉的应用需求,推荐采用LED驱动芯片S…

.NET开源、强大的Web报表统计系统

前言 今天分享一个.NET开源、强大的Web报表统计系统:CellReport。 项目官方介绍 CellReport 诞生的初衷是为了解决日常快速制作统计报表的需要。 CellReport 是一个为复杂统计报表为核心目标的制作、运行工具。你可以使用数据库、excel文件、api服务、已有报表等为…

vue3 指令详解

系列文章目录 TypeScript 从入门到进阶专栏 文章目录 系列文章目录前言一、v-model (双向绑定功能)二、v-bind(用于将一个或多个属性绑定到元素的属性或组件的 prop)三、v-if、v-else、v-else-if(用于根据条件选择性地渲染元素)四、v-show(根…

【算法系列 | 12】深入解析查找算法之—斐波那契查找

序言 心若有阳光,你便会看见这个世界有那么多美好值得期待和向往。 决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。 我们一起努力,成为更好的自己! 今天第12讲,讲…

用MATLAB求最短路径(graphshortestpath)和求最小生成树(minspantree),代码演示

求最短路径(graphshortestpath),求最小生成树(minspantree) 文章目录 求最短路径(graphshortestpath),求最小生成树(minspantree)1、最短路径问题2、最小生成…

如何快速取消开始右下角的更新并关机

关机时,隔几天老是会跳出来有更新并关机,想要直接关机又没有办法。怎么办?往下看 找到设置,进去 找到更新和安全 找到Windows更新 找到高级选项,把这些都关闭,然后在下面可以许安则暂停截止日期&#…

芯片设计中的ECO

如标题所写,我们今天聊一聊IC设计种的ECO。在展开关于ECO的概念之前,我们先大致捋下数字IC设计的流程,有助于我们后面的讨论。 数字IC设计流程简述 1、确定项目需求 根据市场或者芯片功能要求,设计芯片的spec,得到可…

模型评估:A/B测试的陷阱

互联网公司中,A/B测试是验证新模块、新功能、新产品是否有效;新算法、新模型的效果是否有提升;新设计是否受到用户欢迎;新更改是否影响用户体验的主要测试方法。在机器学习领域中,A/B测试是验证模型最终效果的主要手段…

StarRocks Awards 2023 年度贡献人物

2023 年行将结束。这一年,StarRocks 继续全方位大步向前迈进,在 300 贡献者的辛勤建设下,社区先后发布了 50 版本,并完成了从全场景 OLAP 到云原生湖仓的进化。 贡献者们的每一行代码、每一场布道,推动着 StarRocks 社…

【AIGC-文本/图片生成视频系列-8】Align your Latents: 基于潜在扩散模型的高分辨率视频合成

目录 一. 项目概述与贡献 二. 方法详解 三. 应用总览 四. 个性化视频生成 五. 实时卷积合成 六. 更多结果 七. 论文 八. 个人思考 AI生成高分辨率视频一直是一个挑战。 今天讲解一篇潜在扩散模型(LDM)用于高分辨率、时间一致且多样化的视频生成…

【清华社机器之心】视频生成前沿研究与应用特别活动

在视频生成即将迎来技术和应用大爆发之际,为了帮助企业和广大从业者掌握技术前沿,把握时代机遇,机器之心AI论坛就将国内的视频生成技术力量齐聚一堂,共同分享国内顶尖力量的技术突破和应用实践。 论坛将于2024.01.20在北京举办&am…

RT-Thread 线程间通信

线程间通信 在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执行相应的动作,达到通信协作的目的。 邮箱 …

Unity中向量的点乘、叉乘区别和作用以及经典案例

文章目录 点乘(Dot Product)叉乘(Cross Product)向量归一化(Normalize)其他作用 unity开发中我们要计算角度,判断位置,常用点乘、叉乘、归一化等等,我们看看他们的使用案…

Flashduty 案例分享 - 途游游戏

Flashduty 作为功能完备的事件OnCall中心,可以接入云上、云下不同监控系统,统一做告警降噪分派、认领升级、排班协同,已经得到众多先进企业的认可。我们采访了一些典型客户代表,了解他们的痛点、选型考虑和未来展望,集…

JavaScript复习小案例

JavaScript实现简易留言板 效果图 完整代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>留言板</title><style>body {background-color: #f4f4f4;}/* 外部容器样式设置 */.wrapper {width: 400px;heigh…