SQL注入详解

本文详细介绍了SQL注入的原理,包括平台层和代码层的注入方式,以及导致SQL注入的原因。同时,阐述了SQL注入攻击如何发生,特别是通过存储过程和动态SQL。文章还讨论了SQL注入的威胁,如信息泄露、绕过认证和权限提升。最后,提供了多种防护措施,如输入验证、参数化SQL、权限管理和错误处理策略,以及利用专业工具进行安全审查。
  • SQL注入

原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。平台层注入由不安全的数据库配置或数据库平台的漏洞所致;代码层主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:

  • 不当的类型处理;
  • 不安全的数据库配置;
  • 不合理的查询集处理;
  • 不当的错误处理;
  • 转义字符处理不合适;
  • 多个提交处理不当。

 

攻击

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。

如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。

sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

 

威胁

  • 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
  • 绕过认证,列如绕过验证登录网站后台。
  • 注入可以借助数据库的存储过程进行提权等操作

 

防护

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6. 使用专业的漏洞扫描工具

7. 安全审评

8添加新的架构(针对sqlserversqlserver默认架构师dbo,我们可以自己增加一个架构,在访问数据库表的时候表明是需要加入[.+架构名],而使用默认的是不需要的,因此可以防止表明被猜解)

 

注入技术

  1. 强制产生错误

对数据库类型、版本等信息进行识别是此类型攻击的动机所在。它的目的是收集数据库的类型、结构等信息为其他类型的攻击做准备,可谓是攻击的一个预备步骤。利用应用程序服务器返回的默认错误信息而取得漏洞信息。

  1. 使用order by猜表的列数
    1. 使用二分法快速猜解列数
  2. 使用单引号判断是否存在注入漏洞
    1. 在参数后面加入’,如果页面返回错误,则存在SQL注入
  3. 判断SQL注入漏洞的类型

             (1)数字型

              当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:

               select * from <表名> where id = x

                这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

              Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

               Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

原因如下:

              当输入 and 1=1时,后台执行 Sql 语句:

              select * from <表名> where id = x and 1=1

              没有语法错误且逻辑判断为正确,所以返回正常。

 

               当输入 and 1=2时,后台执行 Sql 语句:

               select * from <表名> where id = x and 1=2

               没有语法错误但是逻辑判断为假,所以返回错误。

               我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

               select * from <表名> where id = 'x and 1=1'

                 select * from <表名> where id = 'x and 1=2'

              查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

                (2)字符型

当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:

select * from <表名> where id = 'x'

这种类型我们同样可以使用 and '1'='1 和 and '1'='2来判断:

Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。

Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

原因如下:

当输入 and '1'='1时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='1'

语法正确,逻辑判断正确,所以返回正确。

当输入  and '1'='2时,后台执行 Sql 语句:

select * from <表名> where id = 'x' and '1'='2'

语法正确,但逻辑判断错误,所以返回正确。

### SQL 注入攻击概述 SQL注入是一种常见的网络攻击方式,通过该漏洞可以执行恶意的SQL语句从而控制数据库服务器。这种攻击利用应用程序未能正确过滤用户输入中的特殊字符或者命令字符串,在构建SQL查询时将其作为部分代码执行。 #### 原理 当Web应用或其他程序使用动态生成的SQL查询而未对来自用户的参数做适当验证或转义处理时就会存在风险。如果攻击者能够提交特制的数据来改变原有预期之外的行为,则可能造成数据泄露、破坏甚至完全控制系统[^4]。 ```sql -- 正常情况下, 用户名和密码会被安全地传递给下面这样的查询: SELECT * FROM users WHERE username='admin' AND password='correct_password'; -- 如果没有防护机制的话, 攻击者可以通过构造如下形式的用户名绕过认证: ' OR '1'='1 -- ``` 上述例子展示了如何利用逻辑错误使条件始终成立,进而获取非法访问权限。 #### 方法 为了实施一次成功的SQL注入攻击,通常会经历以下几个阶段: - **探测**: 尝试找出哪些字段允许不受限制的输入; - **分析**: 判断目标使用的DBMS类及其版本号以便更精准地编写payloads; - **测试**: 发送不同类的请求直到找到有效的组合; - **利用**: 执行任意SQL指令实现特定目的如读取敏感文件、修改表结构等操作[^5]; #### 防范措施 防止SQL注入的关键在于遵循最佳实践并采用多层次的安全策略: - 使用预编译语句(Prepared Statements)与参数化查询(Parameterized Queries),这能有效阻止大多数基于拼接字符串形成的SQL注入尝试; ```java PreparedStatement pstmt = connection.prepareStatement("INSERT INTO table_name (column1,column2,...) VALUES (?, ?, ...)"); pstmt.setString(1,"value"); // 设置其他参数... pstmt.executeUpdate(); ``` - 对所有外部输入进行全面校验,包括但不限于长度限制、格式检查以及白名单匹配等方式确保只接受合法值; - 实施最小特权原则(Minimum Privilege Principle),即授予应用程序所需的最低限度权利而非root账户那样无所不能的身份; - 定期审查日志记录寻找异常模式,并及时响应潜在威胁; - 应用最新的补丁更新以修复已知漏洞[^6]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值