⽂件上传漏洞-解析、验证、伪造1
⽂章⽬录
⽂件上传漏洞:
⽂件上传漏洞是指⽹络攻击者上传了⼀个可执⾏的⽂件到服务器并执⾏。这⾥上传的⽂件可以是⽊马,病毒,恶意脚本或者WebShell等。这种攻击⽅式是最为直接和有效的,部分⽂件上传漏洞的利⽤技术门槛⾮常的低,对于攻击者来说很容易实施。
⽂件上传漏洞本⾝就是⼀个危害巨⼤的漏洞,WebShell更是将这种漏洞的利⽤⽆限扩⼤。⼤多数的上传漏洞被利⽤后攻击者都会留下WebShell以⽅便后续进⼊系统。攻击者在受影响系统放置或者插⼊WebShell后,可通过该WebShell更轻松,更隐蔽的在服务中为所欲为。
这⾥需要特别说明的是上传漏洞的利⽤经常会使⽤WebShell,⽽WebShell的植⼊远不⽌⽂件上传这⼀种⽅式。
webshell:
WebShell就是以asp、php、jsp或者cgi等⽹页⽂件形式存在的⼀种命令执⾏环境,也可以将其称之为⼀
种⽹页后门。攻击者在⼊侵了⼀个⽹站后,通常会将这些asp或php后门⽂件与⽹站服务器web⽬录下正常的⽹页⽂件混在⼀起,然后使⽤浏览器来访问这些后门,得到⼀个命令执⾏环境,以达到控制⽹站服务器的⽬的(可以上传下载或者修改⽂件,操作数据库,执⾏任意命令等)。
⽂件上传漏洞的原因:
⽂件上传时检查不严。没有进⾏⽂件格式检查。
⽂件上传后修改⽂件名时处理不当。⼀些应⽤在服务器端进⾏了完整的⿊名单和⽩名单过滤,在修改已上传⽂件⽂件名时却百密⼀疏,允许⽤户修改⽂件后缀。如应⽤只能上传.doc⽂件时攻击者可以先将.php⽂件后缀修改为.doc,成功上传后在修改⽂件名时将后缀改回.php。
⽂件上传常见检测:
1.客户端检测
asp网页文件的格式⼀般都是在⽹页上写⼀段js脚本,通过js去检测上传⽂件的后缀名,有⽩名单形式也有⿊名单形式。
判断⽅式:在浏览加载⽂件,但还未点击上传按钮时便弹出对话框,内容如:只允许上传.jpg/.jpeg/.png后缀名的⽂件,⽽此时并没有发送数据包。前端验证⾮常不可靠,通过修改数据包后缀名就可以绕过,甚⾄关闭js都可以尝试绕过。
2.服务端检测
检查content-type(内容类型)
检查后缀(多为检查后缀)
检查⽂件头
靶场实战
我们通过upload-labs这个靶场实践来进⼀步认识⽂件上传漏洞:
1.前端验证绕过
发现有⼀个上传点:
我们试着上传⼀个带⼀句话的php上去,并开启burp抓包:
发现被拦截下来,提⽰只能上传图⽚类型,⽽在burp上并⽆抓取到任何数据,这证明就是⼀个典型的客户端前端检测
我们通过将php⽂件改成jpg⽂件使其符合检测要求,再在抓取数据包时将⽂件后缀改回php,从⽽完成绕过:
发现成功上传
通过菜⼑连接即可。
2.Content-Type⽅式绕过
分析源码,知道了是对Content-Type(内容类型)和⽂件头的检测,
$is_upload=false;
$msg=null;
if(isset($_POST['submit'])){
if(file_exists(UPLOAD_PATH)){
if(($_FILES['upload_file']['type']=='image/jpeg')||($_FILES['upload_file']['type']=='image/png')||($_FILES['upload_file']['type']=='image/gif')){ $temp_file=$_FILES['upload_file']['tmp_name'];
$img_path=UPLOAD_PATH.'/'.$_FILES['upload_file']['name']
if(move_uploaded_file($temp_file,$img_path)){
$is_upload=true;
}else{
$msg='上传出错!';
}
}else{
$msg='⽂件类型不正确,请重新上传!';
}
}else{
$msg=UPLOAD_PATH.'⽂件夹不存在,请⼿⼯创建!';
}
}
3.⿊名单绕过
查看源码
$is_upload=false;
$msg=null;
if(isset($_POST['submit'])){
if(file_exists(UPLOAD_PATH)){
$deny_ext=array('.asp','.aspx','.php','.jsp');
$file_name=trim($_FILES['upload_file']['name']);
$file_name=deldot($file_name);//删除⽂件名末尾的点
$file_ext=strrchr($file_name,'.');
$file_ext=strtolower($file_ext);//转换为⼩写
$file_ext=str_ireplace('::$DATA','',$file_ext);//去除字符串::$DATA
$file_ext=trim($file_ext);//收尾去空
if(!in_array($file_ext,$deny_ext)){
$temp_file=$_FILES['upload_file']['tmp_name'];
$img_path=UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
if(move_uploaded_file($temp_file,$img_path)){
$is_upload=true;
}else{
$msg='上传出错!';
}
}else{
$msg='不允许上传.asp,.aspx,.php,.jsp后缀⽂件!';
}
}else{
$msg=UPLOAD_PATH.'⽂件夹不存在,请⼿⼯创建!';
}
}
发现是⼀个⿊名单绕过,它拦截了.asp,.aspx,.php,.jsp后缀的⽂件,但他拦截了php,是不是就意味着我们就不能上传php⽂件了呢?其实不是的,在默认状态下php,php3,php4,php5,phtml是会被解析成php的,请看下图
我们将图⽚马后缀改成php3,成功将上传,调⽤⼀句话,最后成功调⽤,证明是可以php3是可以被php解析的;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论