SQL 注入
SQL注入是一种可能导致我们数据库损失的代码渗透技术。它是最常见的网络黑客技术之一,通过网页输入在SQL语句中插入恶意代码。SQL注入可以被恶意用户用来操纵应用程序的web服务器。
当我们要求用户输入其用户名/用户ID时,SQL注入通常发生。用户不输入姓名或ID,而是给我们提供一个我们无意中在数据库上运行的SQL语句。例如——我们通过添加一个变量”demoUserID”来创建一个SELECT语句来选择一个字符串。该变量将从用户输入(getRequestString)中获取。
demoUserI = getrequestString("UserId");
demoSQL = "SELECT * FROM users WHERE UserId =" +demoUserId;
SQL注入攻击的类型
SQL注入不仅可以通过登录算法实施伤害。一些SQL注入攻击包括:
- 更新、删除和插入数据:攻击者可以通过修改cookie来破坏Web应用程序的数据库查询。
- 执行在服务器上下载和安装恶意程序(如木马)的命令。
- 将有价值的数据(如信用卡详细信息、电子邮件和密码)导出到攻击者的远程服务器。
- 获取用户登录详细信息:这是最简单的SQL注入形式。Web应用程序通常通过表单接受用户输入,前端将用户输入传递给后端数据库进行处理。
SQL注入的示例
我们有一个基于员工记录的应用程序。任何员工只能通过输入唯一和私有的员工ID查看自己的记录。我们有一个类似于员工ID的字段。员工在输入字段中输入以下内容:
236893238或1=1
它将转换为:
SELECT * from EMPLOYEE where EMPLOYEE_ID == 236893238 or 1=1
上面的SQL代码是有效的,并且将从EMPLOYEE表中返回EMPLOYEE_ID行。1=1将返回所有满足此条件的记录。所有的员工数据都被泄露了,现在,恶意用户也可以类似地删除员工记录。
例子:
SELECT * from Employee where (Username == "" or 1=1) AND (Password="" or 1=1).
现在恶意用户可以合理地使用“=”运算符来检索私有和安全的用户信息。因此,除了上述查询之外,下面的查询在被使用后会检索到受保护的数据,而这些数据不应该被展示给用户。
SELECT * from EMPLOYEE where (Employee_name =" " or 1=1) AND (Password=" " or 1=1)
基于批处理SQL语句的SQL注入攻击
几个数据库支持批处理SQL语句。它是由分号分隔的两个或更多SQL语句组成的组。
下面给出的SQL语句将返回Employee表中的所有行,然后删除Employee_Add表。
SELECT * From Employee; DROP Table Employee_Add
如何检测SQL注入攻击
创建SQL注入攻击并不困难,但即使是最出色和良好意图的开发人员也会犯错误。检测SQL注入因此是创建SQL注入攻击风险的重要组成部分。Web应用防火墙可以检测和阻止基本的SQL注入攻击,但我们不应该仅依赖它作为唯一的预防措施。
入侵检测系统(IDS)既可以是基于网络的,也可以是主机基础的。它可以被调整来检测SQL注入攻击。基于网络的IDSec可以监控到我们的数据库服务器的所有连接,并标记可疑活动。基于主机的IDS可以监控Web服务器日志,并在发生异常时发出警报。
SQL注入的影响
入侵者可以检索到数据库中存在的所有用户数据,如用户详细信息、信用卡信息和社会保障号码,并且还可以访问受保护的区域,如管理员门户。还有可能从表中删除用户数据。如今的所有在线购物应用程序、银行交易都使用后端数据库服务器。如果入侵者能够利用SQL注入,整个服务器都会受到损害。
如何防止SQL注入攻击
- 我们应该使用用户认证来验证用户输入,通过预定义长度、输入类型和输入字段。
- 限制用户的访问权限,并定义外部人员可以从数据库中访问的数据量。通常情况下,用户不能被授予访问数据库中的全部内容的权限。
- 我们不应该使用系统管理员帐户。