25、API 渗透测试:注入攻击与规避技术

API 渗透测试:注入攻击与规避技术

操作系统命令注入攻击

操作系统命令注入与本章介绍的其他注入攻击类似,但它注入的是命令分隔符和操作系统命令,而非数据库查询语句。在进行操作系统命令注入时,了解目标服务器运行的操作系统类型非常重要,可以通过 Nmap 扫描来获取相关信息。

寻找注入点

与其他注入攻击一样,首先要找到潜在的注入点。操作系统命令注入通常需要利用应用程序可以访问的系统命令,或者完全绕过应用程序。一些关键的目标位置包括 URL 查询字符串、请求参数、请求头,以及在模糊测试中抛出独特或详细错误信息(特别是包含操作系统信息的错误)的请求。

命令分隔符

以下字符可作为命令分隔符,使程序能在一行中组合多个命令。如果 Web 应用程序存在漏洞,攻击者可以在现有命令中添加命令分隔符,然后跟上额外的操作系统命令:
| 命令分隔符 |
| — |
| | |
| || |
| & |
| && |
| ' |
| " |
| ; |
| '" |

常见操作系统命令

如果不知道目标的底层操作系统,可以使用两个有效负载位置进行 API 模糊测试:一个用于命令分隔符,另一个用于操作系统命令。以下是一些常见的操作系统命令:
| 操作系统 | 命令 | 描述 |
| — | — | — |
| Windows | ipconfig | 显示网络配置 |
| Windows | dir | 打印目录内容 |
| Windows | ver | 打印操作系统和版本 |
| Windows | echo %CD% | 打印当前工作目录 |
| Windows | whoami | 打印当前用户 |
| nix (Linux 和 Unix) | ifconfig | 显示网络配置 |
|
nix (Linux 和 Unix) | ls | 打印目录内容 |
| nix (Linux 和 Unix) | uname -a | 打印操作系统和版本 |
|
nix (Linux 和 Unix) | pwd | 打印当前工作目录 |
| *nix (Linux 和 Unix) | whoami | 打印当前用户 |

使用工具进行攻击
  • Wfuzz :可以手动提供命令列表,也可以将其作为单词列表提供。例如,将命令分隔符保存到 commandsep.txt 文件中,将操作系统命令保存到 os-cmds.txt 文件中,然后使用以下命令进行攻击:
$ wfuzz -z file,wordlists/commandsep.txt -z file,wordlists/os-cmds.txt http://vulnerableAPI.com/api/users/query?=WFUZZWFUZ2Z
  • Burp Suite :可以使用 Intruder 集群炸弹攻击。将请求设置为登录 POST 请求,并针对用户参数。设置两个有效负载位置,分别对应两个文件。审查结果中的异常情况,如 200 状态码的响应和突出的响应长度。
NoSQL 注入伪造优惠券

可以利用 NoSQL 注入来伪造优惠券。以 crAPI 为例,使用其优惠券代码功能进行测试。
1. 以认证用户身份使用 Web 应用程序,点击“Shop”标签中的“Add Coupon”按钮,在优惠券代码字段中输入测试数据,然后使用 Burp Suite 拦截相应的请求。
2. 拦截的请求如下:

POST /community/api/v2/coupon/validate-coupon HTTP/1.1
Host: 192.168.195.130:8888
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0
--snip--
Content-Type: application/json
Authorization: Bearer Hapi.hacker.token
Connection: close
{"coupon_code":"TEST!"}
  1. 将请求发送到 Intruder,在 TEST! 周围添加有效负载位置,以对优惠券值进行模糊测试。添加本章涵盖的所有 SQL 和 NoSQL 有效负载,然后开始 Intruder 模糊测试攻击。
  2. 初始扫描结果显示所有状态码为 500,响应长度为 385。审查结果时,发现发送的有效负载被编码,这可能会干扰注入攻击。在 Burp Suite Intruder 的有效负载标签底部,取消选中 URL 编码某些字符的选项,然后再次发起攻击。
  3. 调整有效负载位置,使其包含引号,以避免干扰嵌套对象注入尝试。再次发起更新后的 Intruder 攻击,这次得到了更有趣的结果,包括两个 200 状态码。两个注入有效负载 {"$gt":""} {"$nin":[1]} 产生了成功的响应,通过调查 $nin (不在)NoSQL 操作符的响应,发现 API 请求返回了有效的优惠券代码。
规避 API 安全控制

在测试 API 时,会遇到各种安全控制,如 Web 应用程序防火墙(WAF)、输入验证和速率限制等。REST API 是无状态的,API 提供者需要通过一些信息来确定请求的来源,并利用这些信息阻止攻击。

安全控制的工作原理

安全控制的阈值因 API 提供者而异,但通常会对恶意活动有一定的阈值,当达到该阈值时会触发响应。WAF 可能会被以下情况触发:
- 对不存在的资源进行过多请求。
- 在短时间内发送过多请求。
- 常见的攻击尝试,如 SQL 注入和 XSS 攻击。
- 异常行为,如对授权漏洞的测试。

API 提供者通过一些信息来唯一标识攻击者及其请求,这些信息通常包括 IP 地址、源请求头、授权令牌和元数据。元数据是 API 防御者推断出的信息,如请求模式、请求速率和请求中包含的请求头组合。

检测 API 安全控制
  • 直接攻击 :直接对 API 进行扫描、模糊测试和发送恶意请求,能快速了解安全控制是否会阻碍测试,但可能会被阻止进一步访问。
  • 正常使用 API :先按预期使用 API,了解应用程序的功能。可以查看文档、构建有效请求集合,以合法用户的身份映射 API。同时,审查 API 响应中是否有 WAF 的迹象,WAF 通常会在响应中包含特定的请求头。
  • 注意请求头 :注意请求或响应中的 X-CDN 等请求头,这意味着 API 正在使用内容分发网络(CDN),CDN 通常会提供 WAF 服务。
  • 使用工具检测 :可以使用 W3af、Wafw00f 或 Bypass WAF 等工具主动检测 WAF,Nmap 也有相应的脚本:
$ nmap -p 80 –script http-waf-detect http://hapihacker.com
使用临时账户

检测到 WAF 后,需要了解其对攻击的响应。建议使用临时账户进行测试,临时账户是在 API 防御机制封禁时可以丢弃的账户或令牌,使测试更安全。创建多个额外的账户,并获取用于测试的授权令牌列表。注册账户时,使用与其他账户无关的信息,必要时可以使用 VPN 或代理来隐藏 IP 地址。

API 渗透测试:注入攻击与规避技术

规避 API 安全控制(续)
规避技术

规避安全控制是一个反复尝试的过程,有些安全控制可能不会通过响应头显示其存在,而是暗中等待攻击者犯错。临时账户有助于识别会触发响应的操作,然后可以尝试避免这些操作或使用下一个账户绕过检测。以下是一些有效的规避措施:

  • 字符串终止符
    空字节和其他符号组合常作为字符串终止符,即用于结束字符串的元字符。如果这些符号未被过滤,可能会绕过 API 安全控制过滤器。许多后端编程语言将空字节解释为停止处理的标志,如果处理用户输入验证的后端程序处理到空字节,验证程序可能会被绕过。以下是一些可能的字符串终止符:
    | 字符串终止符 |
    | — |
    | %00 |
    | 0x00 |
    | // |
    | ; |
    | % |
    | ! |
    | ? |
    | [] |
    | %5B%5D |
    | %09 |
    | %0a |
    | %0b |
    | %0c |
    | %0e |

可以将字符串终止符放在请求的不同部分,尝试绕过现有的限制。例如,在用户个人资料页面的 XSS 攻击中,在有效负载中输入空字节可能会绕过禁止脚本标签的过滤规则:
http POST /api/v1/user/profile/update --snip-- { "uname": "<s%00cript>alert(1);</s%00cript>", "email": "hapi@hacker.com" }

一些词表可用于一般的模糊测试,如 SecLists 的元字符列表(在 Fuzzing 目录下)和 Wfuzz 的坏字符列表(在 Injections 目录下)。在防护良好的环境中使用此类词表存在被封禁的风险,在敏感环境中,最好通过不同的临时账户逐步测试元字符。可以将元字符插入不同的攻击请求中,并审查结果中的独特错误或其他异常情况。

  • 大小写转换
    有时,API 安全控制可能不够智能,改变攻击有效负载中字符的大小写就可能绕过它们。可以尝试将一些字母大写,另一些字母小写。例如,跨站脚本攻击可以变为:
    ```html

SQL 注入请求可以变为: sql
SeLeCT * RoM all_tables
sELecT @@vErSion
```
如果防御机制使用规则来阻止某些攻击,改变大小写可能会绕过这些规则。

  • 编码有效负载
    为了进一步绕过 WAF,可以尝试对有效负载进行编码。编码后的有效负载通常可以欺骗 WAF,同时仍能被目标应用程序或数据库处理。即使 WAF 或输入验证规则阻止了某些字符或字符串,也可能会遗漏这些字符的编码版本。安全控制依赖于分配给它们的资源,API 提供者难以预测所有的攻击。

Burp Suite 的解码器模块非常适合快速编码和解码有效负载。只需输入要编码的有效负载,然后选择所需的编码类型。通常,URL 编码最有可能被目标应用程序解释,但 HTML 或 base64 编码也经常有效。编码时,重点关注可能被阻止的字符,如 < > ( ) [ ] { } ; ' / \ | 。可以对部分有效负载或整个有效负载进行编码,以下是编码后的 XSS 有效负载示例:
%3cscript%3ealert %28%27supervuln%27%29%3c%2fscript %3e %3c%73%63%72%69%70%74%3ealert('supervuln')%3c%2f%73%63%72%69%70%74%3e
甚至可以对有效负载进行双重编码。如果检查用户输入的安全控制进行一次解码过程,而应用程序的后端服务进行第二次解码,双重编码的有效负载可能会绕过检测。

速率限制测试

在 API 测试中,速率限制是常见的安全控制之一,它限制了在一定时间内可以发送的请求数量。可以结合前面介绍的规避技术来测试和绕过速率限制。

测试思路

可以利用临时账户和各种规避技术,以不同的速率发送请求,观察 API 的响应。例如,使用多个临时账户同时发送请求,或者使用编码、大小写转换等方法改变请求的形式,尝试突破速率限制。

自动化规避

一旦发现了绕过 WAF 或其他安全控制的方法,可以利用 Burp Suite 和 Wfuzz 内置的功能来自动化规避方法,发送更大的有效负载集。例如,在 Burp Suite 中可以设置规则,自动对请求进行编码或添加字符串终止符;在 Wfuzz 中可以使用脚本和参数来实现类似的自动化操作。

以下是一个简单的 mermaid 流程图,展示了整个 API 渗透测试的大致流程:

graph LR
    A[开始] --> B[注入攻击测试]
    B --> B1[操作系统命令注入]
    B --> B2[NoSQL 注入伪造优惠券]
    B --> C[检测 API 安全控制]
    C --> C1[直接攻击]
    C --> C2[正常使用 API 检测]
    C --> C3[注意请求头]
    C --> C4[使用工具检测]
    C --> D[使用临时账户测试]
    D --> E[规避技术应用]
    E --> E1[字符串终止符]
    E --> E2[大小写转换]
    E --> E3[编码有效负载]
    E --> F[速率限制测试]
    F --> F1[多账户测试]
    F --> F2[自动化规避]
    F --> G[结束]

通过以上步骤和技术,可以更全面地对 API 进行渗透测试,发现潜在的安全漏洞,并尝试绕过各种安全控制。在实际测试中,需要根据具体情况灵活运用这些方法,并遵守相关法律法规和道德准则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值