关于PHP $_REQUEST逻辑缺陷导致密码重置绕过的技术疑问
TryHackMe《Authentication Bypass》房间:PHP $_REQUEST相关疑问解答
疑问1:为何需要在POST参数中携带username,而不在query string中使用?
这得看目标网站的后端逻辑设计。大概率是后端代码只从POST请求体里读取username参数来做用户存在性校验——要是把username放在URL的query string里,后端根本不会去读这个位置的参数,连用户身份都验证不了,密码重置流程直接就走不下去。还有可能是网站前端原本就只通过POST提交username,后端跟着这个逻辑走,没处理query string里的username参数。
疑问2:$_REQUEST优先取POST数据,但POST中的邮箱不存在,为何仍能收到重置邮件?
这就是这个房间要练的逻辑漏洞!虽然$_REQUEST确实会优先取POST里的attacker@hacker.com,但后端的校验逻辑有明显缺陷:它只验证了POST里的username=robert是存在的有效用户,却没校验这个POST里的邮箱是不是属于robert。说白了,后端的流程是:先通过username找到对应的用户,然后直接把重置邮件发到$_REQUEST['email']指定的地址(也就是你的攻击者邮箱),完全跳过了“邮箱必须与用户绑定”这一关键校验步骤,这才让咱们能绕过限制,把重置邮件改发到自己的邮箱。
内容的提问来源于stack exchange,提问作者Amr
相关产品推荐
相关产品推荐

