PortSwigger靶场之Exploiting server-side parameter pollution in a query string通关秘籍

一、靶场分析

好这个靶场的目标是利用服务器端参数污染(Server-Side Parameter Pollution, SSPP)漏洞。


二、解决靶场

我们需要利用参数污染来注入并控制后端服务器的查询

1. 发现漏洞:后端 API 的"回声" 👂

注入有效参数整个攻击的突破口。我们先通过注入无效参数来试探后端是否反应

首先题目只给了账户名所以我们利用忘记密码的请求包来尝试

bash 复制代码
username=administrator%26x=y
  • %26& 的 URL 编码。你发送的 username 值其实是 administrator&x=y

  • 前端服务器的操作 :它构建了一个类似 https://api.internal/reset?username=administrator&x=y 的后端请求。

  • 后端的反应 :后端 API 收到了两个参数,usernamex。但它的程序里并不认识 x 是什么,于是报错"Parameter is not supported "(不支持的参数)。

  • 关键信息 :这个报错证明了我们可以成功注入一个完整的参数!我们输入的值没有被当成一个整体的用户名,而是被后端拆分解析了。

bash 复制代码
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 的有效值是什么呢?

bash 复制代码
username=administrator%26field=x%23
  • 我们主动构造一个 field 参数,并给它一个无效的值 x,然后用 # 截断,防止前端服务器自己附加的 field 参数干扰我们。

  • 后端收到了我们伪造的 field=x,发现 x 不是它能接受的值,于是报错"Invalid field "(无效字段)。

  • 关键信息 :这证明了后端确实在校验 field 参数的值。

  • 使用 Burp Intruder 进行暴力破解

    • 通过将 field 的值设为变量,并使用内置的"服务器端变量名"字典进行爆破,我们发现当值为 usernameemail 时,服务器返回了 200 OK,说明这两个是有效的 field 值。这符合一个密码重置功能的正常逻辑(通过用户名或邮箱来重置)。

3. 终极利用:偷取重置令牌 🔑

这是最精彩的一步。通过阅读前端的 JavaScript 文件 (forgotPassword.js) 发现,重置密码的下一步需要一个名为 reset_token 的参数。

攻击者的猜想 :既然后端 API 可以根据 field 参数返回 usernameemail 相关的信息,那它是否也能返回其他敏感信息,比如 reset_token

  • 最终的攻击载荷 (Payload):

    bash 复制代码
    username=administrator%26field=reset_token%23
    • 前端服务器的操作:它将这个值拼接到后端请求中,最终后端收到的请求被我们劫持为:

      html 复制代码
      ...lookup?username=administrator&field=reset_token
    • 后端的反应 :后端 API 的逻辑可能是"根据用户名查找用户,然后返回该用户指定的字段信息"。它接收到指令,查找 administrator 用户的 reset_token 字段,并直接将令牌返回给了你

    • 漏洞根源 :后端 API 过度相信了前端传来的 field 参数,没有设置一个白名单来限制哪些字段是允许被查询的,导致了敏感信息的泄露。


4. 收尾工作:接管账户 👑

拿到了管理员的密码重置令牌后,剩下的就非常简单了:

  1. 访问密码重置链接

    bash 复制代码
    /forgot-password?reset_token=d1cre6vbql3s34hp1u7zaw8w2w79i2mo
  2. 设置一个新密码。

  3. administrator 和新密码登录。

  4. 进入后台删除 carlos,完成任务。

总而言之,这个靶场完美地展示了当一个系统存在分层架构(前端应用 -> 后端 API)时,如果层与层之间的信任和数据传递没有得到妥善处理,攻击者就可以如何利用这些缝隙,通过巧妙的注入和试探,一步步地获取信息并最终完全控制系统。

三、成功通关

相关推荐
NineData8 小时前
NineData 迁移评估功能正式上线
数据库·dba
用户9623779544813 小时前
DVWA 靶场实验报告 (High Level)
安全
NineData13 小时前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师15 小时前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
数据智能老司机16 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机16 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户9623779544818 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star18 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
全栈老石20 小时前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
用户9623779544821 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全