What is SQL injection (SQLi)?

  • SQL注入是一种web安全漏洞,让攻击者干扰应用程序对其数据库的查询。
  • 它通常使得攻击者查看他们通常无法检索的数据。
  • 这可能包括属于其他用户的数据,或者应用程序本身能够访问的任何其他数据。
  • 在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为发生持续更改。
  • 在某些情况下,攻击者可以升级SQL注入攻击以危害底层服务器或其他后端基础结构,或者执行拒绝服务攻击。

What is the impact of a successful SQL injection attack?

一个成功的SQL注入攻击可能导致未经授权访问敏感的数据,比如密码、信用卡详细信息或个人用户信息。近年来,许多引人注目的数据泄露都是SQL注入攻击的结果,导致声誉受损和监管罚款。
在某些情况下,攻击者可以获得进入组织系统的持久后门,从而导致长期的危害,这种危害可能会在很长一段时间内被忽视。

SQL injection examples

目前存在着各种各样的SQL注入漏洞、攻击和技术,它们出现在不同的情况下。一些常见的SQL注入示例包括:

  • 检索隐藏数据,您可以在其中修改SQL查询以返回其他结果。

  • 颠覆应用程序逻辑,您可以更改查询以干扰应用程序逻辑。

  • 联合攻击,您可以从不同的数据库表中检索数据

  • 检查数据库,从中可以提取有关数据库版本和结构的信息。

  • 盲SQL注入,其中您控制的查询结果不会在应用程序的响应中返回。

Retrieving hidden data :检索影藏数据

考虑一个显示不同类别产品的购物应用程序。当用户单击礼品类别时,其浏览器会请求URL:

https://insecure-website.com/products?category=Gifts

这会导致应用程序进行SQL查询,以从数据库中检索相关产品的详细信息,查询的原本语句为:

SELECT * FROM products WHERE category = 'Gifts' AND released = 1

此SQL查询要求数据库返回:

  • 所有的详细信息(*)
  • 从products表中
  • 其中category为Gifts
  • released为1。

规定限制released=1时用于隐藏未发布的产品,并且规定已发布的产品的release=0。
应用程序没有针对SQL注入攻击实施任何防御措施,因此攻击者可以构建如下攻击:

https://insecure-website.com/products?category=Gifts'--

那么SQL请求的语句为:

SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1

这里的关键是双破折号--是SQL中的注释指示符,这意味着查询的其余部分被解释为注释。
这将有效地删除查询的其余部分,因此它不再包含 AND released=1这意味着将显示所有产品,包括未发布的产品。

进一步说,攻击者可以使应用程序显示任何类别中的所有产品,包括他们不知道的类别:

https://insecure-website.com/products?category=Gifts'+OR+1=1--

那么SQL请求的语句为:

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND released = 1

修改后的查询将返回类别为礼品或1等于1的所有项目。由于1=1始终为真,因此查询将返回所有项目。

所以,要想查询所有商品,尝试:'+OR+1=1--或者' or 1=1 --+++

例如:

Subverting application logic 颠覆应用程序逻辑

如果存在一个允许用户登录用户名和密码的应用程序。如果用户提交用户名wiener和密码bluecheese,应用程序将通过执行以下SQL查询来检查凭据:

SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'

如果查询返回用户的详细信息,则登录成功。否则,它将被拒绝。
在这里,攻击者只需使用SQL注释序列(从查询的WHERE子句中删除密码检查),就可以在没有密码的情况下以任何用户的身份登录。例如,提交用户名administrator'--和空白密码将导致以下查询:

SELECT * FROM users WHERE username = 'administrator'--' AND password = ''

此查询返回用户名为administrator的用户,并将攻击者作为该用户成功登录。

例如:对于POST方法,没有办法回显在URL上,所以我们可以用Burp进行修改

它这样颠覆了应用的逻辑,本来是说要输入账号密码才能进入,这样一来,只需要输入账号而不用输入密码。

Retrieving data from other database tables 从数据库里面的数据表中获取数据

如果SQL查询的结果在应用程序的响应中返回,攻击者可以利用SQL注入漏洞从数据库中的其他表检索数据。这是使用UNION关键字完成的,它允许您执行额外的SELECT查询并将结果附加到原始查询。
例如,如果应用程序执行包含用户输入“Gifts”的以下查询:

SELECT name, description FROM products WHERE category = 'Gifts'

然后,攻击者可以提交输入:

' UNION SELECT username, password FROM users--

这将导致应用程序返回所有用户名和密码以及产品的名称和说明。

Union Attacks是一个内容比较多的攻击方法,下次专门拿一个篇幅来讲Union Attacks。

Examining the database 检查数据库

在初步识别SQL注入漏洞之后,通常可以获得有关数据库本身的一些信息。这些信息通常可以为进一步开发铺平道路。
您可以查询数据库的版本详细信息。完成此操作的方式取决于数据库类型,因此您可以根据任何一种技术推断数据库类型。例如,在Oracle上,您可以执行:

SELECT * FROM v$version

您还可以确定存在哪些数据库表,以及它们包含哪些列。例如,在大多数数据库上,可以执行以下查询以列出表:

SELECT * FROM information_schema.tables

Blind SQL injection vulnerabilities 盲注

SQL注入的许多实例都是盲目漏洞。这意味着应用程序不会返回SQL查询的结果或其响应中任何数据库错误的详细信息。仍然可以利用盲漏洞访问未经授权的数据,但所涉及的技术通常更复杂,也更难执行。

根据漏洞的性质和涉及的数据库,可以使用以下技术来利用盲SQL注入漏洞:

  • 根据单个条件的真实性,您可以更改查询逻辑以触发应用程序响应中的可检测差异。这可能涉及将一个新条件注入到一些布尔逻辑中,或者有条件地触发一个错误,例如被零除。

  • 您可以有条件地触发查询处理中的时间延迟,从而允许您根据应用程序响应所需的时间推断条件的真实性。

  • 您可以使用OAST技术触发带外网络交互。这项技术非常强大,在其他技术不起作用的情况下也能起作用。通常,您可以通过带外通道直接过滤数据,例如,将数据放入您控制的域的DNS查找中。

How to detect SQL injection vulnerabilities

使用Burp Suite的web漏洞扫描程序可以快速可靠地发现大多数SQL注入漏洞。

通过对应用程序中的每个入口点使用一组系统的测试,可以手动检测SQL注入。这通常涉及:

  • 提交单引号字符并查找错误或其他异常。

  • 提交一些特定于SQL的语法,这些语法的计算结果为入口点的基(原始)值和不同的值,并在生成的应用程序响应中查找系统差异。

  • 提交布尔条件,如OR 1=1OR 1=2,并查找应用程序响应中的差异。

  • 提交设计用于在SQL查询中执行时触发时间延迟的有效负载,并查找响应时间的差异。

  • 提交设计用于在SQL查询中执行时触发带外网络交互的OAST有效负载,并监控任何产生的交互。

SQL injection in different parts of the query

大多数SQL注入漏洞出现在SELECT查询的WHERE子句中。

但是SQL注入漏洞原则上可以发生在查询中的任何位置,也可以发生在不同的查询类型中。SQL注入出现的最常见的其他位置有:

  • 在UPDATE语句中,在更新的值或WHERE子句中。

  • 在INSERT语句中,在插入的值内。

  • 在SELECT语句中,在表或列名中。

  • 在SELECT语句中的ORDER BY子句中。

Second-order SQL injection

当应用程序从HTTP请求获取用户输入,并在处理该请求的过程中以不安全的方式将输入合并到SQL查询中时,会出现一阶SQL注入。

在二阶SQL注入(也称为存储SQL注入)中,应用程序从HTTP请求获取用户输入,并将其存储以备将来使用。这通常是通过将输入放入数据库来实现的,但在存储数据的位置不会出现漏洞。稍后,当处理不同的HTTP请求时,应用程序检索存储的数据并以不安全的方式将其合并到SQL查询中。

二阶SQL注入通常出现在开发人员意识到SQL注入漏洞的情况下,因此可以安全地处理输入到数据库中的初始位置。当数据随后被处理时,它被认为是安全的,因为它以前是安全地放入数据库的。此时,数据是以不安全的方式处理的,因为开发人员错误地认为数据是可信的。

Database-specific factors 数据库的特定因素

SQL语言的一些核心功能在流行的数据库平台上以相同的方式实现,因此许多检测和利用SQL注入漏洞的方法在不同类型的数据库上工作相同。

然而,公共数据库之间也存在许多差异。这意味着检测和利用SQL注入的一些技术在不同平台上的工作方式不同。例如:

  • 字符串连接的语法。

  • 解释。

  • 批处理(或堆叠)查询。

  • 特定于平台的API。

  • 错误消息。

How to prevent SQL injection 如何阻止SQL注入

大多数SQL注入实例都可以通过使用参数化查询(也称为准备语句)而不是查询中的字符串连接来防止。

以下代码易受SQL注入攻击,因为用户输入直接连接到查询中:

 String query = "SELECT * FROM products WHERE category = '"+ input + "'";

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery(query);

此代码可以以防止用户输入干扰查询结构的方式轻松重写:

 PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");

statement.setString(1, input); //将input代表的值赋值给第一个问号代表的参数

ResultSet resultSet = statement.executeQuery();

参数化查询可用于不受信任的输入在查询中显示为数据的任何情况,包括INSERT或UPDATE语句中的where子句和值。它们不能用于处理查询的其他部分中不受信任的输入,例如表或列名,或ORDERBY子句。将不受信任的数据放入查询的这些部分的应用程序功能需要采用不同的方法,例如白名单允许的输入值,或者使用不同的逻辑来交付所需的行为。

为了使参数化查询能够有效防止SQL注入,查询中使用的字符串必须始终是硬编码常量,并且不得包含来自任何来源的任何变量数据。不要试图逐个决定数据项是否受信任,继续在查询中使用字符串连接以查找被认为安全的情况。在数据的可能来源方面很容易出错,或者其他代码中的更改会违反关于哪些数据受到污染的假设。

这些只是SQL注入的基本概述与分类,具体的还需慢慢研究

SQL injection:Summary ,Overview and Classification的更多相关文章

  1. Blind SQL injection:盲注详解

    什么是盲注? 当应用程序易受SQL注入攻击,但其HTTP响应不包含相关SQL查询的结果或任何数据库错误的详细信息时,就会出现盲SQL注入. 对于盲目SQL注入漏洞,许多技术(如联合攻击)都是无效的,因 ...

  2. 网络攻击技术:SQL Injection(sql注入)

    网络攻击技术开篇——SQL Injection   1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...

  3. 网络攻击技术开篇——SQL Injection

    本文转自: http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库 ...

  4. SQL注入(SQL Injection)案例和防御方案

    sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...

  5. mybatis 一次执行多条SQL MySql+Mybatis+Druid之SqlException:sql injection violation, multi-statement not allow

    如果用JDBC jdbc.jdbcUrl=jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8 ...

  6. mysql报错:Cause: java.sql.SQLException: sql injection violation, syntax error: ERROR. pos 39, line 2, column 24, token CLOSE

    因为close是mysql关键字 -- ::, DEBUG (BaseJdbcLogger.java:)- ==> Preparing: , -- ::, INFO (XmlBeanDefini ...

  7. 新手指南:DVWA-1.9全级别教程之SQL Injection

    *本文原创作者:lonehand,转载须注明来自FreeBuf.COM 目前,最新的DVWA已经更新到1.9版本(http://www.dvwa.co.uk/),而网上的教程大多停留在旧版本,且没有针 ...

  8. Portswigger web security academy:SQL injection

    Portswigger web security academy:SQL injection 目录 Portswigger web security academy:SQL injection SQL ...

  9. DVWA(三):SQL injection 全等级SQL注入

    (本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进 ...

随机推荐

  1. mysql 深度解析auto-increment自增列"Duliplicate key"问题

    转载自:https://cloud.tencent.com/developer/article/1367681 问题描述 近期,线上有个重要Mysql客户的表在从5.6升级到5.7后master上插入 ...

  2. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

  3. ctf常见编码形式(罗师傅)

    https://zhuanlan.zhihu.com/p/30323085 这是原链接 ASCII编码 •ASCII编码大致可以分作三部分组成: •第一部分是:ASCII非打印控制字符(参详ASCII ...

  4. 使用oss来存取及优化图片资源

    目录 1. 开通阿里云OSS,并创建存储空间 2. 图片上传及处理 2.1 图片上传 2.2 图片处理 前言: 在日常开发中,不免会遇到需要实现图片上传与展示的需求.比如一个文章发布系统,我们通常会开 ...

  5. tr 字符转换命令

    tr:可以用来删除一段信息当中的文字,或者是进行文字信息的替换 语法:tr [parameter] set1 ...参数: -d:删除信息当中的set1这个字符 -s:替换掉重复的字符 举例: 将la ...

  6. AspNetCore&MassTransit Courier实现分布式事务

    在之前的一篇博文中,CAP框架可以方便我们实现非实时.异步场景下的最终一致性,而有些用例总是无法避免的需要在实时.同步场景下进行,可以借助Saga事务来解决这一困扰.在一些博文和仓库中也搜寻到了.Ne ...

  7. Python使用笔记005-文件操作(二)

    1.1 打开文件模式 # r r+ r+读是没问题的,写的话,会覆盖原来的内容,文件不存在时会报错# w w+ w+用来新的文件没问题,旧的文件会覆盖原来的内容# a a+ a+写是追加,读不到是因为 ...

  8. C语言:char总结

    char字符型数据1.用单引号限制的1字节的字符称为字符型数据,字符型常量2.字符型常量实质保存的是对应字符的ASCII码值,是一个整数3.字符型常量表示范围:0-2554.声明字符型变量 char ...

  9. CentOS更换网易yum源

    最新内容和地址参见http://mirrors.163.com/.help/centos.html 1 首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yu ...

  10. mpvue开发小程序项目遇到的问题

    mpvue项目 最近用mpvue开发了一个家庭私人医生签约的小程序项目.记录总结一下,开发过程中遇到的一些问题. 关于页面进栈出栈的状态值问题 页面进出栈,会触发onLoad/unLoad事件.出栈不 ...