十二、目录可控%00 截断绕过
1、简介
以上都是一些黑名单被绕过的,如果黑名单上传检测后,没有限定后缀名,绕过的方法很多,与黑名单相对的就是白名单,使用白名单验证会
相对比较安全,因为只允许指定的文件后缀名。但是如果有可控的参数目录,也存在被绕过的风险。
2、代码分析
代码中使用白名单限制上传的文件后缀名,只允许指定的图片格式。但是$_GET['save_path']服务器接受客户端的值,这个值可被客户端
修改。所以会留下安全问题。
3、绕过攻击
上传参数可控:
1、当 gpc 关闭的情况下,可以用%00 对目录或者文件名进行截断。
2、php 版本小于 5.3.4
首先截断攻击,抓包上传将%00 自动截断后门内容。
例如:1.php%00.1.jpg 变成 1.php
十三、目录可控 POST 绕过
1、简介
上面是 GET 请求的,可以直接在 url 输入%00 即可截断,但是在 post 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断
才有效。才能把目录截断成文件名。
2、代码分析
这段代码同样是白名单限制后缀名,$_POST['save_path']是接收客户端提交的值,客户端可任意修改。所以会产生安全漏洞。
3、绕过上传
文件名可控,通过抓包修改可控的参数,与不同的中间件的缺陷配合使用。
1、使用%00 截断文件名,在 post 环境下%00 要经过 decode,但是受 gpc 限制使用 burpsutie POST %00 截断文件名。
十四、文件头检测绕过
1、简介
有的文件上传,上传时候会检测头文件,不同的文件,头文件也不尽相同。常见的文件上传图片头检测,它检测图片是两个字节的长度,如果
不是图片的格式,会禁止上传。
常见的文件头:
1、JPEG (jpg),文件头:FFD8FF
2、PNG (png),文件头:89504E47
3、GIF (gif),文件头:47494638
4、TIFF (tif),文件头:49492A00
5、Windows Bitmap (bmp),文件头:424D
2、代码分析
这个是存在文件头检测的上传,getReailFileType 是检测 jpg、png、gif 的文件头,如果上传的文件符合数字即可通过检测。
function getReailFileType($filename){
$file = fopen($filename, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch($typeCode){
case 255216:
$fileType = 'jpg';
break;
case 13780:
$fileType = 'png';
break;
case 7173:
$fileType = 'gif';
break;
default:
$fileType = 'unknown';
}
return $fileType;
}
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_type = getReailFileType($temp_file);
if($file_type == 'unknown'){
$msg = "文件未知,上传失败!";
}else{
$img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload = true;
} else {
$msg = "上传出错!";
}
}
}
3、绕过攻击
3.1 第一种方法
1.制作图片一句话,使用 copy 1.gif/b+phpinfo.php shell.php,将php文件附加再jpg图片上,直接上传即可。
本例子因为限制了后缀为 jpg,可以考虑文件包含将图片文件包含进去 getshell。
3.2 第二种方法
burpsuite 上传的数据包头加上 GIF89a