[web安全]CRLF漏洞浅析与实战
CRLF漏洞浅析与实战
HTTP协议就是一种约定。HTTP报文,本质上也就是一串字符串。服务端监听端口,当客户端向指定端口发送一串字符流(实际上是字节流,这里用了协议分层中的对等的思想),服务端在接收到字符流后,按照http协议的格式,将字符串进行处理。
漏洞原理
部分情况下,由于与客户端存在交互,会形成下面的情况
也就是重定向且Location字段可控
如果这个时候,可以向Location字段传点qqgg的东西
实战操作
下面网站功能是重定向到指定的URL。这种漏洞
//index.php
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CRLF 漏洞测试</title>
</head>
<body>
<center>
<h1>CRLF 漏洞测试</h1>
<form action="#" method="get">
<input type="text" name="url"/>
<input type="submit" name="submit" value="goto">
</form>
</center>
</body>
</html>
<?php
if(isset($_GET['submit'])){
echo "Header!";
header("Location:".$_GET['url']);
}
echo "No Header!";
会话固定
可能是因为开发能力不足,感觉固定会话攻击没啥危害
反射xss
细节:需要把Location字段后面的所有响应头推到响应体中
防御
-
对用户的数据进行合法性校验,对特殊的字符进行编码,如<、>、’、”、CR、LF等,限制用户输入的CR和LF,或者对CR和LF字符正确编码后再输出,以防止注入自定义HTTP头。
-
创建安全字符白名单,只接受白名单中的字符出现在HTTP响应头文件中。
-
在将数据传送到http响应头之前,删除所有的换行符