SQL注入攻击

Structured Query Language (SQL)是一种设计用于操作和管理数据库中的数据的语言。。SQL自诞生以来,作为许多商业的和开源的数据库,它得到了广泛的应用。。SQL注入(SQLi)使用专门创建的SQL语句来瞄准数据库,使系统进行意外和不合适的操作。。

你可以通过观看视频(英语)来学习SQL注入攻击。

如果攻击成功,可能会造成以下伤害:。

  • 认证的旁路
  • 数据泄漏/被盗
  • 数据的变更和破坏
  • 删除数据
  • 任意代码执行
  • 获取对系统本身的路由访问

SQL注入的危险性

如果SQL注入完全成功的话,可能会给所有的企业和个人带来巨大的损失。。一旦数据被攻击,就很难完全恢复。。

数据库通常是通过应用程序(例如要求用户输入,并据此在数据库中搜索的网站)来目标的,但也有可能是直接目标。。SQL注入攻击可以是owasp的公司正在采取的十大应用安全风险之一。。

SQL注入攻击的类型

SQL注入攻击有很多方法。。攻击者在选择特定的攻击向量/方法之前,会先观察系统的行为。。

未示差的输入

未示出差异的输入是SQLi攻击的常见类型,攻击者提供未被充分示出差异的输入作为需要转义的字符,或者未被验证为正确/预期类型的输入。。

例如,在一个在线支付账单的网站上,你可以在网页表格中要求用户的账号,然后把它发送到数据库中,去掉相关的账号信息。。如果网络应用程序在用户提供的账号中动态地创建SQL查询字符串,那么它看起来会是这样的:。

“石头* from customers where account =“userprovidedaccountnumber“+ +”;”

这对于那些正确输入账号的用户是有效的,但同时也给攻击者留下了可乘之机。。例如,如果一个人提供的账号是“或“1”=“1”,那么你的查询字符串如下。

“SELECT * FROM customers WHERE account =“”or“1”=“1”;”

因为“1”=“1”总是被评估为TRUE,所以当你把这个语句发送到数据库时,返回的是所有客户的数据,而不是一个客户的数据。。

盲SQL注入

盲SQL注入攻击,也叫引证SQL注入,它不会直接从目标数据库发布数据。。相反,攻击者会仔细调查行动的间接线索。。根据攻击者的目的,HTTP响应中的细节,特定用户输入的空白网页,以及数据库对特定用户输入的响应时间。。这些也可以指向攻击者可以尝试的另一个SQLi攻击地点。。

Out-of-Band注入

这种攻击有些复杂,当单一直接响应攻击无法实现目标时,攻击者可能会利用它。。攻击者通常会创建SQL语句来触发数据库系统与受攻击者控制的外部服务器建立连接。。在这种方式下,攻击者可能会采集数据,或者控制数据库中的行为。。

第二点注入是Out-of-Band注入攻击的一种。。在这种情况下,攻击者提供了SQL注入,该SQL注入是由数据库系统的另一个行为来存储和执行的。。当发生二级系统行为(例如基于时间的作业或其他典型的管理员和用户使用数据库)并且执行攻击者的SQL注入时,攻击者控制的系统就会发生“范围外”。。

SQL注入的例子

在SQL注入的例子中,我们使用两个数据库表:用户和联系人。。用户表有三个简单的字段,ID,用户名和密码。。联系人表中有更多的信息,用户身份、姓氏、姓名、地址1、电子邮件地址、信用卡号、安全码等等。。

用户表中的信息被用于登录,如下所示。。

  • jsmith, P@$$w0rd
  • sbrown, WinterIsComing!
  • kcharles, Sup3rSecur3Password$

注:保存在数据库中的密码不能是透明文本,必须经常散列并添加盐。

登录时,用户需要在登录页面输入用户名和密码。。这个信息会被发送到网络服务器,在那里你会创建一个SQL查询,然后这个查询会被发送到数据库服务器。。这样的查询显示如下:。

Select ID from Users where username=’jsmith’and password=’p@$ $w0rd’

SQL的机制是,然后在查询要求的每一行中执行比较算子。。在这个例子中,查询检查用户表并请求返回所有行的ID值,其中用户名是jsmith,密码是p@ $$w0rd。。在很多情况下,网络服务器会确认数据库服务器返回的东西,以及它是否为数字。。在这里,网络服务器收到“1”,让用户通过登录页面。。

但是如果你在这里恶意呢?。数据库服务器会进行true-or-false检查,让你相信你的验证是成功的。。在密码中添加OR。。如果你登录的密码是“x’”或“1=1”,你会得到以下的新查询。。

Select ID from Users where username=’jsmith’and password=’x’or 1=1

x不是jsmith的密码,但是数据库会用它来确认第二个条件。。如果x不是jsmith的密码,那么1=1。。你的身份会被发送到你的应用程序,你就完成了用户身份验证。。

这不是1=1的条件。。如果它是平等的,那么它可以在2= 2,4726 =或a=a的情况下运行。。

如果你的网页可以显示数据,那么你也可以在屏幕上打印额外的数据。。你也可以聚合两个SQL请求来访问数据。。“或者除了1=1之外,你还可以添加第二种状态,例如来自联系人的UNION选择,姓氏,信用卡号和安全码。。这样的附加条款需要额外的操作,但是SQL注入攻击的最终目标是获得数据的访问权限。。

另一个可以用于盲SQL注入的技巧是,如果数据不能返回到屏幕上,就注入其他提示。。“或者和1=1的条件一样,你可以让服务器进入睡眠状态。。“or sleep(10)”,然后就会有相应的动作。。让数据库休眠10秒钟,减缓所有的响应。。

SQL注入攻击的预防方法

防止SQL注入攻击成功的方法如下:。

不使用动态SQL

  • 避免直接输入用户提供的输入到SQL语句中。。
  • 优先使用更安全的预授权和参数化查询。。
  • 存储过程通常比动态SQL更安全。。

用户提供输入的差异图

  • 适当的转义处理应该转义的字符。。
  • 确保发送的数据类型与预期类型一致。。

不要在预览文本中留下机密数据

  • 加密数据库中的私人和机密数据。。
  • 在加密散列中加入盐。。
  • 如果攻击者成功提取机密数据,这是另一层保护。。

数据库权限和特权的限制

  • 我们将数据库用户的权限设置在最低限度。。
  • 这限制了攻击者在获得访问时能做的事情。。

不直接向用户显示数据库错误

  • 攻击者可以利用这些错误信息来获取数据库的信息。。

为访问数据库的网络应用程序设置网络应用防火墙(waf使用)

  • 这保护了网络应用程序。。
  • 来识别SQL注入的尝试。。
  • 根据设置,它阻止SQL注入的尝试到达应用程序(和数据库)。。

网络应用的测试解决方案使用定期测试与数据库交互的网络应用程序。

  • 这使得我们可以检测到新的漏洞和退化,允许SQL注入。。

把数据库更新到最新的补丁

  • 这使得攻击者无法利用旧版本中基地的漏洞/漏洞。。

它是SQL注入攻击者最流行的攻击方法,但通过采取足够的措施,例如加密数据、保护和测试网络应用程序以及使用最新补丁,它可以确保数据的安全。迈出了有意义的一步。。