帮助中心
什么是SQL注入攻击?学习如何保护和识别攻击


什么是SQL注入?

SQL注入 - 或SQLI是一种网络安全攻击,它针对应用程序安全漏洞并允许攻击者控制应用程序的数据库,攻击者将恶意代码、数据输入到SQL语句中,SQL服务器无法知道是否是正常的SQL语句,并且作为正常代码进行运行。


某些SQLI攻击可以释放敏感客户数据列表,而其他SQLI攻击则删除部分(或全部)数据库,有些甚至可以远程运行软件应用程序。


SQL注入攻击实施起来相对容易和比较普遍,防止和检测SQLI攻击是安全问题的必要方面,以防止数据库数据泄露和遭受攻击。


SQL注入的定义


如何防止SQL注入

过滤验证输入:也称为验证 ; 在用户输入执行之前检查输入,这有点像在前门放一个保镖,另外对隐藏的程序检查以确保输入不包含任何SQL可执行文件,此解决方案中的最佳做法是将白名单用于批准的输入,使用白名单比将未经授权的代码列入黑名单更简单,更安全。


参数化SQL代码:这创建了一种保存用户输入的存储区域(参数或预准备语句)。如果输入与参数的类型不匹配,则忽略它,此技术可防止用户与数据库之间的直接访问,由于用户无法直接发出命令,因此无法注入恶意SQL代码。


使用对象关系映射:  ORM库是用于在编程语言之间进行转换的工具,这可能需要开发人员的帮助,但它会创建一个运行特定SQL查询的虚拟对象系统,与上一步一样,这会防止直接删除用户查询SQL Server的能力。


限制用户权限:  这是所有IT和服务器管理中的最要设置和关注的方面,它尤其适用于防止SQLI攻击,只需将用户限制为他们所需的最低权限 - 具有读、写、执行权限的帐户越少,利用的机会就越少。


第三方软件:  Web应用程序防火墙软件可以筛选SQL输入,有许多第三方安全工具可用。如果您没有编程技能(或开发人员团队),请考虑使用第三方软件来筛选、过滤、验证SQL输入。


SQL注入怎么运作


SQLI注入攻击如何工作?

要了解SQLI攻击,去理解SQL查询会对理解SQL注入如何工作很有帮助。

网页上的SQL查询有两层,第一个是用户输入,如用户名和密码字段;第二个是隐藏的编程代码针对数据库创建SQL查询。


SQL注入攻击是指攻击者将SQL代码放入正常数据输入和执行的SQL语句中,这欺骗了一个不受保护的系统,将字符串作为编程代码运行。


一个简单的例子是这样的

攻击者决定攻击SQL服务器,服务器提示输入用户名和密码:

输入用户名:用户名

输入密码:密码

服务器有一个包含用户名和密码表的数据库,当用户输入其信息时,服务器会将它们与数据库用户表中的用户名和密码字段进行比较,如果服务器找到两者的匹配项,则授予用户访问权限。

应用程序将用户的输入转换为查询,SQL查询要求数据库提供一组特定信息。

SQL查询语句可能如下所示:

SELECT UserList.Username 

FROM UserList 

WHERE UserList.Username ='username' AND 

UserList.Password ='password'

SQL Server正在数据库中的UserList表上运行查询,它正在寻找与用户输入的“用户名”输入相匹配的条目,但这还不够 - 数据库条目  还必须包含来自用户的“密码”输入,如果两者都匹配,则数据库返回TRUE结果,并且用户获得访问权限。


使用SQLI攻击时,SQL查询可能被黑客入侵。

攻击者可能会输入以下内容:

用户名:用户名

输入密码:密码 '或' 1'='1

这会将一段代码注入查询中,现在,隐藏程序创建一个这样的数据库查询:

SELECT UserList.Username 

FROM UserList 

WHERE UserList.Username ='username'AND 

UserList.Password ='password' OR '1'='1'

注意最后一行是如何改变的,“输入密码”字段的内容已添加到查询中,SQL数据库将其读作可执行代码,现在,要求检查数据库是否数字1等于数字1.用户名和密码是否正确无关紧要,公式“1 = 1”为true,因此数据库返回TRUE结果,并授予用户访问权限。


几种类型的SQL注入攻击和检测


如何检测SQL注入攻击

大多数专家都认为,最好的解决方案是在入侵发生之前防止入侵,这可以通过升级安全性以及漏洞扫描和渗透测试来完成,可以考虑使用第三方服务检查您的网站是否存在已知缺陷。


SQLI攻击通常看起来像标准数据库查询语句,如果没有特殊工具,它们很难被实时检测到,SQLI攻击通常需要反复试验和猜测,有时,蠕虫(或机器人)反复探测您的网站是否存在缺陷。有时,人类黑客会将SQL代码输入您的网站,这些攻击并不总是需要登录,使得检测更加困难。


在SQLI攻击正在进行时检测它需要额外的配置或第三方工具,第一种方法是检查sqlserver.error_reported事件是否存在特定错误,频繁失败的登录和错误的语法错误可能表示与入侵者正在重复入侵尝试。或者,可以在数据库中搜索常见的HTML标记,例如“ iframe ”或“ http-equiv =”refresh“


识别SQLI攻击的第二种方法涉及流量分析,这需要第三方监控工具,随着时间的推移,监视器将建立标准行为的基线,如果存在可疑更改(如权限更改),则监视器可以触发警报。

审计软件可以在违规后提供帮助,这些工具检查错误日志,查找已完成的损坏,此数据可用于提高安全性并防止下一次攻击。


通常,这些工具监控:

重复登录失败 - 这些可以指示试错,以绕过SQL安全性。

密码更改 - 意外的密码更改可能表示黑客获得了对用户的访问权限。

权限和所有权更改  - 以这种方式修改的文件可以证明黑客进行了更改以授予自己访问权限。

登录,注销,数据库操作 - 虽然本质上不是入侵的迹象,但不寻常或意外的帐户活动可能表示存在违规行为。


SQL注入示例

一个SQL的命令可用于从数据库中删除整个表:

输入用户名:'; DROP TABLE User; - ' 

输入密码:'或“='

将命令转换为查询后,它看起来像这样:

SELECT UserList.Username 

FROM UserList 

WHERE UserList.Username =''; DROP TABLE用户; - 'AND Pwd =''或“=”

攻击者已经注入了一段代码,该代码针对UserList表执行DROP TABLE。然后,该行的其余部分被标记为注释,因此它不会运行,这将从您的数据库中删除整个UserList表。


SQLI攻击还可用于运行多个命令,UNION命令可用于运行多个SELECT:

输入用户名:用户名

输入密码:密码UNION SELECT用户名,密码FROM UserList;

隐藏程序将按如下方式查询数据库:

SELECT UserList.Username 

FROM UserList 

WHERE UserList.Username ='username'AND 

UserList.Password ='password'UNION SELECT Username,Password FROM UserList;

这将返回表UserList中的所有用户名和密码的列表  。

这种类型的攻击可能会造成严重破坏。


如果未经授权的用户访问用户数据,则可能导致数据泄露,它可以用来销毁数据库的整个部分,它甚至可以用于在您的服务器上启动和执行恶意软件。


总结

SQL注入攻击不需要很多技能就可以造成巨大的破坏,任何拥有计算机的人都可以查找SQL漏洞并在服务器上运行它,使其成为诱人的攻击媒介,幸运的是,他们防守相对简单。

锁定SQL服务器以防止注入攻击是重要的一步,防止攻击比从数据损害去备份恢复要容易得多,请花点时间评估您的SQL代码。

购物车