Structured Query Language (SQL)是一种设计用于操作和管理数据库中的数据的语言。。SQL自诞生以来,作为许多商业的和开源的数据库,它得到了广泛的应用。。SQL注入(SQLi)使用专门创建的SQL语句来瞄准数据库,使系统进行意外和不合适的操作。。
你可以通过观看视频(英语)来学习SQL注入攻击。
如果攻击成功,可能会造成以下伤害:。
如果SQL注入完全成功的话,可能会给所有的企业和个人带来巨大的损失。。一旦数据被攻击,就很难完全恢复。。
数据库通常是通过应用程序(例如要求用户输入,并据此在数据库中搜索的网站)来目标的,但也有可能是直接目标。。SQL注入攻击可以是owasp的公司正在采取的十大应用安全风险之一。。
SQL注入攻击有很多方法。。攻击者在选择特定的攻击向量/方法之前,会先观察系统的行为。。
未示出差异的输入是SQLi攻击的常见类型,攻击者提供未被充分示出差异的输入作为需要转义的字符,或者未被验证为正确/预期类型的输入。。
例如,在一个在线支付账单的网站上,你可以在网页表格中要求用户的账号,然后把它发送到数据库中,去掉相关的账号信息。。如果网络应用程序在用户提供的账号中动态地创建SQL查询字符串,那么它看起来会是这样的:。
“石头* from customers where account =“userprovidedaccountnumber“+ +”;”
这对于那些正确输入账号的用户是有效的,但同时也给攻击者留下了可乘之机。。例如,如果一个人提供的账号是“或“1”=“1”,那么你的查询字符串如下。
“SELECT * FROM customers WHERE account =“”or“1”=“1”;”
因为“1”=“1”总是被评估为TRUE,所以当你把这个语句发送到数据库时,返回的是所有客户的数据,而不是一个客户的数据。。
盲SQL注入攻击,也叫引证SQL注入,它不会直接从目标数据库发布数据。。相反,攻击者会仔细调查行动的间接线索。。根据攻击者的目的,HTTP响应中的细节,特定用户输入的空白网页,以及数据库对特定用户输入的响应时间。。这些也可以指向攻击者可以尝试的另一个SQLi攻击地点。。
这种攻击有些复杂,当单一直接响应攻击无法实现目标时,攻击者可能会利用它。。攻击者通常会创建SQL语句来触发数据库系统与受攻击者控制的外部服务器建立连接。。在这种方式下,攻击者可能会采集数据,或者控制数据库中的行为。。
第二点注入是Out-of-Band注入攻击的一种。。在这种情况下,攻击者提供了SQL注入,该SQL注入是由数据库系统的另一个行为来存储和执行的。。当发生二级系统行为(例如基于时间的作业或其他典型的管理员和用户使用数据库)并且执行攻击者的SQL注入时,攻击者控制的系统就会发生“范围外”。。
在SQL注入的例子中,我们使用两个数据库表:用户和联系人。。用户表有三个简单的字段,ID,用户名和密码。。联系人表中有更多的信息,用户身份、姓氏、姓名、地址1、电子邮件地址、信用卡号、安全码等等。。
用户表中的信息被用于登录,如下所示。。
注:保存在数据库中的密码不能是透明文本,必须经常散列并添加盐。
登录时,用户需要在登录页面输入用户名和密码。。这个信息会被发送到网络服务器,在那里你会创建一个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
用户提供输入的差异图
不要在预览文本中留下机密数据
数据库权限和特权的限制
不直接向用户显示数据库错误
为访问数据库的网络应用程序设置网络应用防火墙(waf使用)
网络应用的测试解决方案使用定期测试与数据库交互的网络应用程序。
把数据库更新到最新的补丁
它是SQL注入攻击者最流行的攻击方法,但通过采取足够的措施,例如加密数据、保护和测试网络应用程序以及使用最新补丁,它可以确保数据的安全。迈出了有意义的一步。。