• SQL注入


    SQL 注入攻击是如何产生的?

    每次用户登录时,都会执行一个相应的 SQL 语句。这时,黑客会通过构造一些恶意的输入参数,在应用拼接 SQL 语句的时候,去篡改正常的 SQL 语意,从而执行黑客所控制的 SQL 查询功能。这个过程,就相当于黑客“注入”了一段 SQL 代码到应用中

    举例:

    1. 修改 WHERE 语句

    现在有一个简单的登录页面,需要用户输入 Username 和 Password 这两个变量来完成登录。具体的 Web 后台代码如下所示

    uName = getRequestString("username");
    uPass = getRequestString("password");
    
    sql = 'SELECT * FROM Users WHERE Username ="' + uName + '" AND Password ="' + uPass + '"'

    当用户提交一个表单(假设 Username 为 admin,Password 为 123456)时,Web 将执行下面这行代码:

    SELECT * FROM Users WHERE Username ="admin" AND Password ="123456"

    黑客想要在不知道密码的情况下登录应用,他又会输入什么呢?他会输入 " or ""="。这时,应用的数据库就会执行下面这行代码:

    SELECT * FROM Users WHERE Username ="" AND Password ="" or ""=""

    WHERE 语句后面的判断是通过 or 进行拼接的,其中""=""的结果是 true。那么,当有一个 or 是 true 的时候,最终结果就一定是 true 了。因此,这个 WHERE 语句是恒为真的,所以,数据库将返回全部的数据

    2. 执行任意语句

    在 MySQL 中,实现任意语句执行最简单的方法,就是利用分号将原本的 SQL 语句进行分割。这样,我们就可以一次执行多个语句了。比如,下面这个语句在执行的时候会先插入一个行,然后再返回 Users 表中全部的数据。

    INSERT INTO Users (Username, Password) VALUES("test","000000"); SELECT * FROM Users;

    在这种情况下,黑客只要在传入的 userId 参数中加入一个分号,就可以执行任意的 SQL 语句了。比如,黑客想“删库跑路”的话,就令 userId 为 1;DROP TABLE Users

    SELECT * FROM Users WHERE UserId = 1;DROP TABLE Users

    通过 SQL 注入攻击,黑客能做什么?

    绕过验证

    在上面的内容中,我们已经介绍过," or ""=" 作为万能密码,可以让黑客在不知道密码的情况下,通过登录认证。因此,SQL 注入最直接的利用方式,就是绕过验证

    任意篡改数据

    在各类安全事件中,我们经常听到“拖库”这个词。所谓“拖库”,就是指黑客通过类似 SQL 注入的手段,获取到数据库中的全部数据(如用户名、密码、手机号等隐私数据)。最简单的,黑客利用 UNION 关键词,将 SQL 语句拼接成下面这行代码之后,就可以直接获取全部的用户信息了

    SELECT * FROM Users WHERE UserId = 1 UNION SELECT * FROM Users

    消耗资源

    QL 注入破坏可用性十分简单,可以通过完全消耗服务器的资源来实现。比如,在 Web 后台中,黑客可以利用 WHILE 打造死循环操作,或者定义存储过程,触发一个无限迭代等等。在这些情况下,数据库服务器因为 CPU 被迅速打满,持续 100%,而无法及时响应其他请求

    如何进行 SQL 注入防护 ?

    使用 PreparedStatement

    原理:SQL 注入是在解析的过程中生效的,用户的输入会影响 SQL 解析的结果。因此,我们可以通过使用 PreparedStatement,将 SQL 语句的解析和实际执行过程分开,只在执行的过程中代入用户的操作。这样一来,无论黑客提交的参数怎么变化,数据库都不会去执行额外的逻辑,也就避免了 SQL 注入的发生。

    使用存储过程

    原理:实际上,它的原理和使用 PreparedStatement 类似,都是通过将 SQL 语句的解析和执行过程分开,来实现防护。区别在于,存储过程防注入是将解析 SQL 的过程,由数据库驱动转移到了数据库本身。

    验证输入

    原理:防护的核心原则是,一切用户输入皆不可信。因此,SQL 注入的防护手段和 XSS 其实也是相通的,主要的不同在于:

    • SQL 注入的攻击发生在输入的时候,因此,我们只能在输入的时候去进行防护和验证;
    • 大部分数据库不提供针对 SQL 的编码,因为那会改变原有的语意,所以 SQL 注入没有编码的保护方案

     

    盲注

  • 相关阅读:
    python限定方法参数类型、返回值类型、变量类型等
    双拼自然码
    关于将汉语拼音字母“ü”改成“v”的设想和建议
    数据库转模型图
    python中的捕获异常、异常跟踪
    内部教师爆料:某些民办学校真正的内幕
    炸薯条
    IntelliJ IDEA添加JavaDOC注释 方法 快捷键
    java获取当前路径的方法
    java获取全部子类或接口的全部实现
  • 原文地址:https://www.cnblogs.com/mysky007/p/12494098.html
Copyright © 2020-2023  润新知