所需知识
要解决这个实验室问题,您需要了解以下内容:
- 如何确定用户输入是否包含在服务器端的 URL 路径或查询字符串中。
- 如何使用路径遍历序列尝试更改服务器端请求。
- 如何查找 API 文档。
这些内容在我们的 API 测试学院主题中有涵盖。
进入实验室
研究行为
1、 在 Burp Suite 的浏览器中,触发管理员(administrator)用户的密码重置。
2、 在 Proxy > HTTP history 中,注意到 POST /forgot-password 请求和相关的 /static/js/forgotPassword.js JavaScript 文件。
3、 右键点击 POST /forgot-password 请求,并选择发送到 Repeater。
4、 在 Repeater 标签页中,重新发送请求以确认响应是一致的。
5、 发送各种修改过的 username 参数值的请求,以确定输入是否被放置在服务器端请求的 URL 路径中而没有进行转义:
- 将 URL 编码的 administrator# 作为 username 参数的值提交。注意到返回一个 Invalid route 错误消息。这表明服务器可能将输入放置在了服务器端请求的路径中,并且片段截断了一些尾随数据。观察到消息还提到了一个 API 定义。
2. 将 username 参数的值从 administrator%23 改为 URL 编码的 administrator?,然后发送请求。注意到这同样返回一个 Invalid route 错误消息。这表明输入可能被放置在了 URL 路径中,因为 ? 字符指示查询字符串的开始,因此截断了 URL 路径。
3. 将 username 参数的值从 administrator%3F 改为 ./administrator,然后发送请求。注意到这返回了原始响应。这表明请求可能访问了与原始请求相同的 URL 路径。这进一步表明输入可能被放置在了 URL 路径中。
4. 将 username 参数的值从 ./administrator 改为 ../administrator,然后发送请求。注意到这返回一个 Invalid route 错误消息。这表明请求可能访问了一个无效的 URL 路径。
导航到 API 定义
1、 将 username 参数的值从 ../administrator 改为 ../%23。注意到返回一个 Invalid route 响应。
2、 逐步增加更多的 ../ 序列,直到达到 ../../../../%23。注意到返回一个 Not found 响应。这表明您已经导航到 API 根目录之外。
3、 在这个级别上,向 URL 路径添加一些常见的 API 定义文件名。例如,提交以下内容:
username=../../../../openapi.json%23 |
注意到返回一个错误消息,其中包含如下用于查找用户的 API 端点:
/api/internal/v1/users/{username}/field/{field} |
利用这个漏洞
1、 更新 username 参数的值,使用已识别的端点结构。为 field 参数添加一个无效值(例如:usernmae,password,id,uid,sid,eamil,token):
username=administrator/field/foo%23 |
发送请求。注意到返回一个错误消息,因为 API 只支持 email 字段。
2、 将 email 作为 field 参数的值:
username=administrator/field/email%23 |
发送请求。注意到返回了原始响应(响应包中可以获得添加的参数值,且返回值 200)。这可能表明服务器端应用程序识别了注入的 field 参数,并且 email 是一个有效的字段类型。
3、 在 Proxy > HTTP history 中,查看 /static/js/forgotPassword.js JavaScript 文件。识别密码重置端点,它引用了 passwordResetToken 参数:
###访问路径### |
4、 在 Repeater 标签页中,将 field 参数的值从 email 改为 passwordResetToken:
username=administrator/field/passwordResetToken%23 |
发送请求。注意到返回一个错误消息,因为密码重置端点不支持 passwordResetToken 参数。
5、 使用之前识别的 /api/ 端点,将 API 版本改为 username 参数的值:
该实验默认一直 API v1 的目录结构
如果不能遍历路径,不能文件读取,该方法不适用
username=../../v1/users/administrator/field/passwordResetToken%23 |
发送请求。注意到返回一个密码重置令牌,请记下这个令牌。
6、 在 Burp Suite 的浏览器中,输入密码重置端点地址栏。将您的密码重置令牌添加为 reset_token 参数的值。例如:
/forgot-password?passwordResetToken=aa3eqz8ug2igm3zq4quplq13g0jmwae3 |
7、 设置一个新密码。
8、 使用您的新密码以管理员身份登录。
9、 转到管理员面板,并删除 carlos 以解决实验室问题。