练习的网址是:https://portswigger.net/web-security/ssrf/lab-ssrf-with-whitelist-filter
解决办法是:
http://localhost:80%2523@stock.weliketoshop.net/admin/delete?username=carlos
稍微简化一下(没有指定端口):
http://localhost%2523@stock.weliketoshop.net/admin/delete?username=carlos
我们可以简单地集中精力:
http://localhost%2523@stock.weliketoshop.net
为什么凭据组件(@之前的所有内容)被处理得好像@之后的所有东西都是URL片段的一部分一样?在对#字符进行双重编码之前,URL如下所示:
http://localhost#@stock.weliketoshop.net
为什么@甚至是必要的,即使在我们对#进行双重编码之后?为什么http://localhost%2523stock.weliketoshop.net (不是no '@')不能工作?url片段语句是否优先于凭证语句?为什么@会被忽略而支持#呢?
发布于 2020-03-03 06:24:59
根据RFC 3986的规定:
userinfo子组件可以由用户名和(可选)特定于方案的信息组成,这些信息涉及如何获得访问资源的授权。用户信息(如果存在的话)后面是一个商业标识("@"),将其与主机分隔开来。
发布于 2021-01-14 23:23:09
我最近玩过这个。SSRF过滤器正在检查参数值是否为具有stock.weliketoshop.net主机名的实际URL。这不是一个简单的字符串检查。这就是为什么如果我们使用http://localhost%2523stock.weliketoshop.net,它会将其视为http://localhost#...而不起作用。
如果添加“@”,则筛选器将看到http://username@stock.weliketoshop.net,这是已接受的主机名。现在,如果我们使用传递过滤器的http://localhost%2523@stock.weliketoshop.net,并且web服务器将其定向到http://localhost#...
神秘的部分是为什么http://localhost%2523@stock.weliketoshop.net/admin工作。看起来还有另一个过滤器从%25开始删除所有内容,直到它看到/并连接起来,这将导致http://localhost/admin。正常的web服务器应该在结束时忽略/admin,因为它在#段之后。
我列举了所有字符,发现%252 f和$253 f也可以工作,哪个是?分别使用。我尝试了http://localhost%252fadmin%2523@stock.weliketoshop.net,它仍然通过过滤器并且更有意义,但是结果是%25之后的所有东西都被剥离了,所以它只属于http://localhost。
我的结论是,Portswigger为本教程创建了一个自定义过滤器,它并不完全类似于真实的SSRF过滤器。
https://security.stackexchange.com/questions/226714
复制相似问题