PortSwigger靶场之Exploiting server-side parameter pollution in a query string通关秘籍
一、靶场分析
好这个靶场的目标是利用服务器端参数污染(Server-Side Parameter Pollution, SSPP)漏洞。
二、解决靶场
我们需要利用参数污染来注入并控制后端服务器的查询。
1. 发现漏洞:后端 API 的“回声” 👂
注入有效参数整个攻击的突破口。我们先通过注入无效参数来试探后端是否反应
首先题目只给了账户名所以我们利用忘记密码的请求包来尝试
username=administrator%26x=y
%26
是&
的 URL 编码。你发送的username
值其实是administrator&x=y
。前端服务器的操作:它构建了一个类似
https://api.internal/reset?username=administrator&x=y
的后端请求。后端的反应:后端 API 收到了两个参数,
username
和x
。但它的程序里并不认识x
是什么,于是报错“Parameter is not supported”(不支持的参数)。关键信息:这个报错证明了我们可以成功注入一个完整的参数!我们输入的值没有被当成一个整体的用户名,而是被后端拆分解析了。
username=administrator%23
%23
是#
的 URL 编码。在 URL 中,#
后面的内容是片段标识符,服务器在处理时会忽略它。前端服务器的操作:它构建了后端请求,比如原本应该是
...&username=administrator&field=email
。但因为你注入了#
,后端请求变成了...&username=administrator#&field=email
。后端的反应:后端 API 只看到了
#
前面的部分,即...&username=administrator
。它发现后面缺少了一个它必需的参数field
,于是报错“Field not specified”(未指定字段)。关键信息:这个报错不仅再次确认了注入有效,还泄露了一个隐藏的、必需的参数名:
field
。
2. 刺探情报:寻找隐藏参数的值 🕵️
现在我们知道了可以注入参数,并且有一个隐藏参数叫 field
。那么 field
的有效值是什么呢?
username=administrator%26field=x%23
我们主动构造一个
field
参数,并给它一个无效的值x
,然后用#
截断,防止前端服务器自己附加的field
参数干扰我们。后端收到了我们伪造的
field=x
,发现x
不是它能接受的值,于是报错“Invalid field”(无效字段)。关键信息:这证明了后端确实在校验
field
参数的值。使用 Burp Intruder 进行暴力破解
通过将
field
的值设为变量,并使用内置的“服务器端变量名”字典进行爆破,我们发现当值为username
和email
时,服务器返回了200 OK
,说明这两个是有效的field
值。这符合一个密码重置功能的正常逻辑(通过用户名或邮箱来重置)。
3. 终极利用:偷取重置令牌 🔑
这是最精彩的一步。通过阅读前端的 JavaScript 文件 (forgotPassword.js
) 发现,重置密码的下一步需要一个名为 reset_token
的参数。
攻击者的猜想:既然后端 API 可以根据
field
参数返回 username
或 email
相关的信息,那它是否也能返回其他敏感信息,比如 reset_token
?
最终的攻击载荷 (Payload):
username=administrator%26field=reset_token%23
前端服务器的操作:它将这个值拼接到后端请求中,最终后端收到的请求被我们劫持为:
...lookup?username=administrator&field=reset_token
后端的反应:后端 API 的逻辑可能是“根据用户名查找用户,然后返回该用户指定的字段信息”。它接收到指令,查找
administrator
用户的reset_token
字段,并直接将令牌返回给了你!漏洞根源:后端 API 过度相信了前端传来的
field
参数,没有设置一个白名单来限制哪些字段是允许被查询的,导致了敏感信息的泄露。
4. 收尾工作:接管账户 👑
拿到了管理员的密码重置令牌后,剩下的就非常简单了:
访问密码重置链接
/forgot-password?reset_token=d1cre6vbql3s34hp1u7zaw8w2w79i2mo
设置一个新密码。
用
administrator
和新密码登录。进入后台删除
carlos
,完成任务。
总而言之,这个靶场完美地展示了当一个系统存在分层架构(前端应用 -> 后端 API)时,如果层与层之间的信任和数据传递没有得到妥善处理,攻击者就可以如何利用这些缝隙,通过巧妙的注入和试探,一步步地获取信息并最终完全控制系统。