上传绕过

Note:

1) PHP获取文件后缀名(提供7种方法)

1.$file = 'x.y.z.png';
echo substr(strrchr($file, '.'), 1);
解析:strrchr($file, '.')   
 strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符
2.$file = 'x.y.z.png';
echo substr($file, strrpos($file, '.')+1);
解析:strrpos($file, '.')   
查找 "." 在字符串中最后一次出现的位置,返回位置   substr()从该位置开始截取
3.$file = 'x.y.z.png';
$arr=explode('.', $file);
echo $arr[count($arr)-1];
4.$file = 'x.y.z.png';
$arr=explode('.', $file);
echo end($arr);  //end()返回数组的最后一个元素
5.$file = 'x.y.z.png';
echo strrev(explode('.', strrev($file))[0]);
6.$file = 'x.y.z.png';
echo pathinfo($file)['extension'];
解析:pathinfo() 函数以数组的形式返回文件路径的信息。包括以下的数组元素:
[dirname]
[basename]
[extension]
7.$file = 'x.y.z.png';
echo pathinfo($file, PATHINFO_EXTENSION);
总结:字符串截取2种,数组分割3种,路径函数2种

2) 文件上传原

    将客户端文件上传到服务器端,再将服务器端的文件(临时文件)移动到指定目录即可。

   上传绕过_第1张图片

 

$filename=$_FILES['myFile']['name'];
$type=$_FILES['myFile']['type'];
$tmp_name=$_FILES['myFile']['tmp_name'];
$size=$_FILES['myFile']['size'];
$error=$_FILES['myFile']['error'];
 
//将服务器上的临时文件移动到指定位置
//方法一move_upload_file($tmp_name,$destination)
//move_uploaded_file($tmp_name, "uploads/".$filename);//文件夹应提前建立好,不然报错
//方法二copy($src,$des)
//以上两个函数都是成功返回真,否则返回false
//copy($tmp_name, "copies/".$filename);
//注意,不能两个方法都对临时文件进行操作,临时文件似乎操作完就没了,我们试试反过来
copy($tmp_name, "copies/".$filename);
move_uploaded_file($tmp_name, "uploads/".$filename);
//能够实现,说明move那个函数基本上相当于剪切;copy就是copy,临时文件还在

3) 文件上传00截断

    在上传的时候,当文件系统读到[0x00]时,会认为文件已经结束。利用00截断就是利用程序员在写程序时对

   文件的上传路径过滤不严格,产生0x00上传截断漏洞。

Link:http://ctf5.shiyanbar.com/web/upload 

考点:文件上传漏洞绕过

上传绕过_第2张图片

随便上传一个文件(txt)得到错误信息


按照要求传一个jpg格式的文件,却显示必须上传php文件,前后矛盾

想到只有00截断绕过,先用BP抓个包

上传绕过_第3张图片

00截断要用到临时文件移到的文件夹(uploads/),最终要上传php文件

改变uploads/=>uploads/12.php+

接着将报文发送到repeater,修改对应的十六进制,将12.php后的+对应的十六进制2b改为00

(本来最终是12.php+12.jpg后来就变成了12.php%0012.jpg最后相当于上传了12.php%00后面的内容被忽略了)点击go即可成功绕过

上传绕过_第4张图片

你可能感兴趣的:(Web)