悟空云课堂 | 代码安全第一期:什么是SQL注入漏洞?

中科天齐软件源代码安全检测中心

共 2065字,需浏览 5分钟

 ·

2021-03-22 14:38

tVfe6gfUE0.jpg

中科天齐倾情打造《悟空云课堂》旨在科普软件安全相关知识,助力企业有效防范软件安全漏洞,提升网络安全防护能力。本期主题为SQL注入漏洞的相关介绍。

一、什么是SQL注入:

SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。

SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。如Web应用程序的开发人员对用户所输入的数据或cookie等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的SQL被执行,获取对数据库的信息以及提权,发生SQL注入攻击。

二、SQL注入的特点:

1、广泛性

任何一个基于SQL语言的数据库都可能被攻击,很多开发人员在编写Web应用程序时未对从输入参数、Web表单、cookie等接受到的值进行规范性验证和检测,通常会出现SQL注入漏洞。

2、隐蔽性

SQL注入语句一般都嵌入在普通的HTTP请求中,很难与正常语句区分开,所以当前许多防火墙都无法识别予以警告,而且SQL注入变种极多,攻击者可以调整攻击的参数,所以使用传统的方法防御SQL注入效果非常不理想。

3、危害大

攻击者通过SQL注入获取到服务器的库名、表名、字段名,从而获取到整个服务器中的数据,对网站用户的数据安全有极大的威胁。攻击者也可以通过获取到的数据,得到后台管理员的密码,然后对网页页面进行恶意篡改。这样不仅对数据库信息安全造成严重威胁,对整个数据库系统安全也影响重大。

4、操作方便

互联网上有很多SQL注入工具,简单易学,攻击过程简单,不需要专业知识也能自如运用。

三、SQL注入的检测描述:

满足以下条件,就构成了一个该类型的安全漏洞:

1.数据从不可靠来源(包括但不局限于不可靠用户的输入信息或是不可靠用户可能更改的文件)进入应用程序;

2.外部输入数据未经验证直接用于构造SQL语句并执行。

SQL注入的常见后果:

关键词:敏感信息泄露;绕过保护;修改应用数据。

由于SQL数据库通常包含敏感数据,SQL注入漏洞可能导致丢失机密性信息,或者进行更改甚至删除此信息。

如果使用恶意的SQL命令来检查用户名和密码,则可以作为另一个没有密码的用户连接到系统。

如果授权信息保存在SQL数据库中,则可以通过利用SQL注入漏洞来更改此信息。

四、SQL注入的案例:

但凡使用数据库开发的应用系统,就可能存在SQL注入攻击的媒介。自1999年起,SQL注入漏洞就成了常见安全漏洞之一。至今SQL注入漏洞仍然在CWE列表中排前10。

2011年美国国土安全局,Mitre和SANA研究所将SQL注入作为第一危险的安全漏洞。至今,SQL注入仍然是首要的难以修复的安全威胁漏洞(数据库生产厂商难以通过维护数据库自身功能或提高数据库安全策略来防范SQL注入)。

2012年,Barclaycard的一个代表声称97%的数据泄露都是由SQL注入引起的。

2014年一个叫“TeamDigi7al”的黑客组织攻击了美国海军的一个名为“Smart Web Move”的web应用。此次事件直接造成美国海军数据库超过22万服役人员的个人信息被泄露。而事后,美国海军动用了超过50万美元来弥补此次的数据泄密事故。

在日本电话电报公司集团(NTT)发布的2014全球威胁情报的报告中提出了一个惊人的数字——“企业对一次小规模SQL注入攻击的平均善后开支,通常超过19.6万美元。”

随着Web安全事件的不断频发,我们不得不思考SQL注入攻击的代价。显然,SQL注入不是一个过期的安全问题,恰恰相反,它是一种非常容易被使用的攻击方式,SQL注入并不需要高深的攻击手段便可以轻易使敏感的数据库信息被非法浏览或删除。事实上,由于SQL注入攻击简单而又非常高效,高级黑客们已开始采用某些软件自动搜索web应用程序的SQL漏洞,并利用SQL注入自动化工具来制造僵尸,并建立可自动攻击的僵尸网络。

SQL注入攻击并不会在短时间内消失,而其所造成影响更是一个刻不容缓、代价不菲的重大威胁,处理一次web应用安全事故几乎要花掉20万美元。网络安全工程师们务必要意识到,研究与防范SQL注入攻击是必要的,也是首要的安全任务。

五、防范和修补SQL注入的一些建议:

1.输入:使用严格符合规范的可接受输入的白名单。拒绝任何不严格符合规范的输入,或将其转换为具有相应规格的输入;

2.输出:最保守的方法是转义或过滤所有未通过极其严格的白名单的字符(例如不是字母数字或空格的所有内容);

3.如果可以,请使用自动强制执行数据和代码分离的结构化机制。这些机制可能能够自动提供相关的引用,编码和验证,而不是依赖开发人员在生成输出的每个点提供此功能;

4.使用预准备语句,参数化查询或存储过程处理SQL查询。

样例:

4qZ2t5WJlG.jpg


浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报