📜  SQL injection

📅  最后修改于: 2020-11-12 00:33:39             🧑  作者: Mango

SQL注入

SQL注入是一种代码渗透技术,可能会导致数据库丢失。通过网页输入,将恶意代码放置在SQL语句中是最常用的网络黑客技术之一。 SQL注入可被恶意用户用来操纵应用程序的Web服务器。

当我们要求用户输入用户名/用户ID时,通常会发生SQL注入。用户提供了一条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注入攻击

  • 我们应该使用用户身份验证通过预定义长度,输入类型和输入字段来验证来自用户的输入。
  • 限制用户的访问特权,并定义任何局外人都可以从数据库访问的数据量。通常,不能授予用户访问数据库中所有内容的权限。
  • 我们不应使用系统管理员帐户。