SQL注入

一、定义

SQL 注入 (SQLi) 是一个 Web 安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序的内容或行为发生持续更改。

在某些情况下,攻击者可以升级 SQL 注入攻击以危害底层服务器或其他后端基础结构,或执行拒绝服务攻击。

二、SQL注入示例

SQL注入漏洞、攻击和技术种类繁多,出现在不同的情况下。一些常见的 SQL 注入示例包括:

  • 检索隐藏数据,您可以在其中修改 SQL 查询以返回其他结果。
  • 颠覆应用程序逻辑,您可以在其中更改查询以干扰应用程序的逻辑。
  • UNION 攻击,您可以在其中从不同的数据库表中检索数据。
  • 检查数据库,您可以在其中提取有关数据库版本和结构的信息。
  • 盲 SQL 注入,其中您控制的查询结果不会在应用程序的响应中返回。

1.检索隐藏数据

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

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

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

select * from products where category = 'Gifts' and released = 1

该应用程序不会针对 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始终为 true,因此查询将返回所有项。

2.颠覆程序应用逻辑

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

select * from users where username = 'wiener' and password = 'bluecheese'

如果查询返回用户的详细信息,则登录成功。否则,将被拒绝。

在这里,攻击者只需使用 SQL 注释序列从查询子句中删除密码检查,即可在没有密码的情况下以任何用户身份登录。

例如,提交用户名和空白密码会导致以下查询:--WHERE administrator'--

select * from users where username = 'administrator'--' and password = ''

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

3.从其他数据库表中检索数据

如果 SQL 查询的结果在应用程序的响应中返回,攻击者可以利用 SQL 注入漏洞从数据库中的其他表中检索数据。这是使用关键字UNION SELECT完成的,该关键字允许您执行其他查询并将结果追加到原始查询。

例如,如果应用程序执行以下包含用户输入“礼物”的查询:

select name,description from products where category = 'Gifts'

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

' union select username,password from users--

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

4.检查数据库

在初步识别 SQL 注入漏洞后,获取有关数据库本身的一些信息通常很有用。这些信息通常可以为进一步利用铺平道路。

您可以查询数据库的版本详细信息。执行此操作的方式取决于数据库类型,因此您可以从任何有效的技术推断数据库类型。例如,在 Oracle 上,您可以执行:

select * from v$version

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

select * from information_schema.tables

5.SQL盲注漏洞

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

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

  • 您可以更改查询的逻辑,以根据单个条件的真实情况触发应用程序响应中的可检测到的差异。这可能涉及将新条件注入到某些布尔逻辑中,或有条件地触发错误,例如除以零。
  • 您可以在查询处理过程中有条件地触发时间延迟,从而允许您根据应用程序响应所需的时间推断条件的真实性。
  • 您可以使用 OAST 技术触发带外网络交互。这种技术非常强大,在其他技术不起作用的情况下有效。通常,您可以通过带外通道直接泄露数据,例如,将数据放入您控制的域的 DNS 查找中。

6.如何检测SQL注入漏洞

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

  • 提交单引号字符'并查找错误或其他异常情况。
  • 提交一些特定于 SQL 的语法,这些语法评估为入口点的基本(原始)值和不同的值,并在生成的应用程序响应中寻找系统差异。
  • 提交诸如OR 1=1 and之类的布尔条件OR 1=2,并查找应用程序响应中的差异。
  • 提交旨在在 SQL 查询中执行时触发时间延迟的有效负载,并寻找响应时间的差异。
  • 提交旨在在 SQL 查询中执行时触发带外网络交互的 OAST 有效负载,并监控任何由此产生的交互。

7.不同上下文中的SQL注入

一些网站接受 JSON 或 XML 格式的输入并使用它来查询数据库。这些不同的格式甚至可以为您提供替代方法来混淆由于 WAF 和其他防御机制而被阻止的攻击。弱实施通常只是在请求中寻找常见的 SQL 注入关键字,因此您可以通过简单地编码或转义禁止关键字中的字符来绕过这些过滤器。例如,以下基于 XML 的 SQL 注入使用 XML 转义序列对SELECT中的字符S进行编码

<stockCheck>
    <productId>
        123
    </productId>
    <storeId>
        999 &#x53;ELECT * FROM information_schema.tables
    </storeId>
</stockCheck>

这将在传递给 SQL 解释器之前在服务器端进行解码。

 

posted @ 2023-05-05 22:13  北蒙岛的cozyDay  阅读(73)  评论(0编辑  收藏  举报