随着技术的进步,Web应用技术在得以快速发展的同时,其自身的漏洞和伴随的风险也在不断迭代与增加着。自2003年以来,SQL注入攻击已持续位列OWASP应用安全风险Top 10之中,并值得各类公司持续予以严防死守。在本文中,我们根据如下的议题,来深入探讨SQL注入攻击的特点,及其防御方法。具体议题如下:
您可以访问网络安全视频讲座-- https://youtu.be/gfFKuiZ9Y7s,以观看培训专家对每个技术细节的讨论。
一、什么是SQL注入攻击?
SQL注入(SQL injection,SQLi)攻击是指:攻击者通过执行恶意SQL语句,来控制某个Web应用的数据库服务器,进而未经授权地访问、修改或删除各种数据。
在互联网发展的早期,构建网站曾是一个非常简单的过程:既没有JavaScript,又没有CSS,且少有图像。但是,随着各类网站的普及,人们对于先进技术和动态网站的需求也在不断增长。这就导致了JSP和PHP等服务器端脚本语言的不断发展。
同时,各类网站也开始在数据库中存储丰富的用户输入内容。如今,MySQL已经成为了访问和操作数据库的最流行、且标准化的应用。不过,黑客当然也找到了利用SQL技术漏洞的新方法,SQL注入攻击就是最常用的数据库入侵方式之一。黑客使用定制化的SQL语句来入侵数据库,以欺骗系统执行各种异常的、且不应该的操作。
二、SQL注入攻击有何危害?
在易受攻击的网站上,攻击者可以利用SQL注入实现许多操作与目的。可以说,只要客观条件满足,攻击者就能够执行如下各项操作:
虽然上述一切都取决于攻击者的技巧与能力,但不可否认的是,有时候SQL注入在整个攻击过程中,对他们能够成功并完全地接管数据库和Web应用起到了关键性的作用。下面我们来深入了解此类攻击是如何实现的。
三、SQL注入攻击如何运作的?
开发人员通过定义某种SQL查询,在对应的应用程序运行过程中,让数据库执行一系列操作。此类查询通常带有一到两个参数,以便根据用户所提供的合适参数值,返回预期的查询记录。
不过,SQL注入攻击会在如下两个阶段发生:
让我们来观察一下如下示例。在登录表单的过程中,网站用户可以更改下面语句中的$user和$password参数值:
$statement = "SELECT * FROM users WHERE username ='$user' AND password '$password'";
在服务器端,这一特定的SQL语句会被传递给相应的函数,而那个函数又将该字符串发送给已连接的数据库。接着,该数据库对其进行解析、执行并返回相应的结果。
#Define POST variables uname = request.POST['username'] passwd = request.POST['password'] #SQL query vulnerable to SQLi sql = "SELECT id FROM users WHERE username='" + uname + "' AND password='" + passwd + "'" #Execute the SQL statement database.execute(sql)
那么,如果用户的输入没有得到应用程序的适当“消毒”,攻击者则可以轻松地植入精心设计的参数值。例如下面这条输入语句:
$statement = "SELECT * FROM users WHERE username ='Dean' OR '1'='1'-- ' AND password = 'WinchesterS'";
深入分析上述语句,我们可以注意到它包含的两个特殊部分:
因此,一旦该查询被执行之后,SQL注入就能够有效地跳过密码验证,进而导致身份验证环节的缺失。而且,凭借着此类查询的记录,攻击者能够很容易地使用获取到的第一手数据库帐户,即管理员用户的信息,进而成功地登录到对应的应用程序之中。
值得注意的是,上面只是通过SQL的查询,以非正式的方式获取必要的信息。而实际上,SQL注入攻击还有许多种类型。
四、SQL注入攻击有哪些不同类型?
正所谓“条条道路通罗马”。下面我们来看看攻击者可以使用哪些类型的SQL注入漏洞,从服务器上提取数据。一般而言,SQL注入可分为如下种类:
1. 带内(In-Band)SQL注入
此类是最常见的SQL注入攻击。它通常发生在攻击者能够使用相同的通信信道,来发起攻击和收集各种结果。因此,最为常见的带内SQL注入类型分别是:
在上述两种注入类型中,各种数据实际上并未通过Web应用程序进行传输。因此,攻击者也就无法直观地看到攻击的结果。下面,攻击者可以通过发送有效的负载,并观察Web应用的响应,以及数据库服务器的结果行为,来对数据库结构进行重建。因此,我们称如下两种SQL注入为推理类型:
2. 带外(Out-of-Band)SQL注入
此类SQL注入攻击的特点是:不但最不常见,而且通常也是最难以被执行。它们通常涉及到,将各种数据直接从数据库服务器发送到由攻击者所控制的计算机上。从某种程度上说,带外技术为攻击者提供了SQL带内或盲注式攻击的替代方法,其主要针对的是服务器响应并不十分稳定的情况。
可见,服务端脚本(server-scripting)语言并不能够确定SQL查询字符串是否存在着格式错误。他们所能做的只是将某个字符串发送到数据库服务器上,并等待解析的完成与响应。不过话说回来,我们总能找到各种办法来对用户的输入进行“消毒”,并确保SQL注入攻击无法得逞。
五、如何防御SQL注入攻击?
现如今,我们有许多种简单的方法,以避免网站陷入SQL注入攻击,并抑制它们可能造成的危害。下面,我们仅列举其中的一小部分:
纵然SQL注入攻击是网络犯罪分子非常流行的攻击方法,但是如果我们能够通过采取诸如:数据加密,执行安全测试,以及及时更新补丁等适当的预防措施,就能够在某种程度上实现对数据的安全保护。
我们可以毫不夸张的说:遍布世界各地的黑客无时无刻在通过各种各样的渗透方式,不断地探测着目标Web应用中的潜在漏洞,并伺机采取各种攻击手段。因此,我们要时刻保持高度警惕。
function$initHighlight(block, cls) { try { if (cls.search(/\bno\-highlight\b/) != -1) return process(block, true, 0x0F) + ` class="${cls}"`; } catch (e) { /* handle exception */ } for (var i = 0 / 2; i < classes.length; i++) { if (checkCondition(classes[i]) === undefined) } } export $initHighlight;
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。