一个 Django 应用程序使用名为 ALLOWED_HOSTS 的内置设置,将请求主机标头列入白名单。这是必需的,因为 Django 在某些情况下使用客户端提供的 Host 标头来构造 URL。
ALLOWED_HOSTS=djangoapp.com,subdomain.djangoapp.com
fakehost.com
我向 Django 端点发出了十个带有假主机头(我们称之为)的请求: /example
.
curl -i -s -k -X $'GET' \
-H $'Host: fakehost.com' -H $'Accept-Encoding: gzip, deflate' -H $'Accept: */*' -H $'Accept-Language: en' -H $'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' -H $'Connection: close' \
$'https://subdomain.djangoapp.com/example'
在应用程序日志中,我看到django.security.DisallowedHost
错误出现了十次。但是,根据 的日志fakehost.com
,它确实收到了/example
.
据我了解,这是一个服务器端请求伪造 (SSRF) 漏洞,因为可以使 Django 服务器向任意 URL 发出请求。
它使调试变得困难,并且奇怪的是问题不会始终如一地发生。同样奇怪的是,假主机似乎被 Django 识别,但仍然以某种方式达到了一个请求fakehost.com
。
有没有人知道我可以进一步调查什么来修复这个 Django 应用程序中的明显漏洞?问题可能在服务器级别而不是应用程序级别?