Web安全技术 课件 5 文件上传攻击_第1页
Web安全技术 课件 5 文件上传攻击_第2页
Web安全技术 课件 5 文件上传攻击_第3页
Web安全技术 课件 5 文件上传攻击_第4页
Web安全技术 课件 5 文件上传攻击_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章文件上传攻击01文件上传攻击的原理02文件上传的业务流程03文件上传攻击的条件04文件上传检测绕过技术目录CONTENTS文件上传攻击的原理上传攻击文件上传攻击的定义

文件上传功能是用户与服务器进行文件交互的重要手段。通过上传功能,用户可实现自有内容的个性化修改,为业务开展及用户体验提供良好的实现方式。

但是,上传过程中存在重大安全隐患。攻击者的目的是取得当前Web服务器的权限。如果通过Web层面开展攻击,那么必须将攻击者的木马插入Web系统中,并在服务器端执行。这个过程就是对Web服务器进行文件注入攻击。这时,上传点可作为上传木马有效途径,上传攻击将直接威胁当前系统的安全性。文件上传攻击的原理上传攻击文件上传攻击的定义

文件上传攻击,是指攻击者利用Web应用对上传文件过滤不严的漏洞,将应用程序定义类型之外的文件上传到Web服务器,并且此类文件通常为木马,在上传成功后攻击者即可获得当前的Webshell。webshell就是以asp、php、jsp或者cgi等网页文件形式存在的一种命令执行环境,也可以将其称做为一种网页后门。黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。顾名思义,“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为入侵者通过网站端口对网站服务器的某种程度上操作的权限。由于webshell其大多是以动态脚本的形式出现,也有人称之为网站的后门工具。文件上传攻击的原理上传攻击文件上传攻击的原理

攻击者想取得Webshell,最直接的方式就是将Web木马插入服务器端并进行成功解析。假设目标服务器为PHP环境,那么针对上传点就要利用PHP木马,并且要求木马在服务器以.php为后缀名进行保存。因此,上传木马的过程就是在Web系统中新增一个页面,当木马上传成功后,攻击者就可以远程访问这个木马文件,相当于浏览一个页面,只当过这个页面就是木马,具备读取、修改文件内容、连接数据库等功能。

因此,上传漏洞存在的前提是:存在上传点且上传点用户可独立控制上传内容,同时上传文件可被顺利解析。01文件上传攻击的原理02文件上传的业务流程03文件上传攻击的条件04文件上传检测绕过技术目录CONTENTS文件上传的业务流程文件上传的业务流程用户发送请求客户端提交上传表单表单服务器接收上传信息上传信息存储为临时文件文件用户上传攻击转存为正式文件临时文件调用与执行文件正式文件文件上传的业务流程文件上传的业务流程上传攻击客户端表单:<html><head><metacharset="UTF-8"><title>fileupload</title></head><body><formaction="upload_file.php"method="post"enctype="multipart/form-data"><labelfor="file">上传文件:</label> <inputtype="file"name="upfile"id="file"/> <inputtype="submit"name="submit"value="上传"/></form></body></html>文件上传的业务流程文件上传的业务流程上传攻击<?phpif(is_uploaded_file($_FILES["upfile"]["tmp_name"]))

{$upfile=$_FILES["upfile"];

$name=$upfile["name"];

$type=$upfile["type"];

$size=$upfile["size"];

$tmp_name=$upfile["tmp_name"];

echo"上传文件名:".$name."</br>";

echo"上传文件类型:".$type."</br>";echo"上传文件大小:".($size/1024)."KB</br>";

$destination="./file/".$name;

move_uploaded_file($tmp_name,$destination);

echo"文件上传成功!";}else

{echo"文件上传失败!";echo$_FILES["upfile"]["error"];}?>服务端:$_FILES参数详解:$_FILES["file"]["name"]–被上传文件的名称$_FILES["file"]["type"]–被上传文件的类型$_FILES["file"]["size"]–被上传文件的大小,以字节计$_FILES["file"]["tmp_name"]–存储在服务器的文件临时副本的名称$_FILES["file"]["error"]–由文件上传导致的错误代码$_FILES["file"]["error"]中的["error"]值情况:0:没有错误发生,文件上传成功UPLOAD_ERR_OK1:上传的文件超过了php.ini中upload_max_filesize(默认情况为2M)选项限制的值UPLOAD_ERR_INI_SIZE

UPLOAD_ERR_FORM_SIZE2:上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项指定的值3:文件只有部分被上传UPLOAD_ERR_PARTIAL4:没有文件被上传UPLOAD_ERR_NO_FILE5:上传文件大小为0判断文件是否通过httppost上传的,如果是,返回true继续执行上传文件操作01文件上传攻击的原理02文件上传的业务流程03文件上传攻击的条件04文件上传检测绕过技术目录CONTENTS条件二条件一条件四条件三目标网站具有上传功能上传攻击实现的前提是:目标网站具有上传功能,可以上传文件,并且文件上传到服务器后可被存储。上传的目标文件能够被Web服务器解析执行在Apache+PHP环境下,要求上传的Web木马采用.php后缀名(或能有以PHP方式解析的后缀名),并且存放上传文件的目录要有执行脚本的权限。知道文件上传到服务器后的存放路径和文件名称如果上传成功但不知道真实路径,那么攻击过程没有意义。目标文件可被用户访问如果文件上传后,却不能通过Web访问,或者真实路径无法获得,木马则无法被攻击者打开,那么就不能成功实施攻击。上传攻击文件上传攻击的条件文件上传攻击的流程上传攻击文件上传攻击的条件编写一句话木马:上传一句话木马:文件上传攻击的流程上传攻击文件上传攻击的条件打开“中国菜刀”:连接网站:01文件上传攻击的原理02文件上传的业务流程03文件上传攻击的条件04文件上传检测绕过技术目录CONTENTS文件上传检测绕过技术文件上传攻击的防护DVWA-Medium上传攻击<?phpif(isset($_POST['Upload'])){$target_path=DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path.=basename($_FILES['uploaded']['name']);$uploaded_name=$_FILES['uploaded']['name'];$uploaded_type=$_FILES['uploaded']['type'];$uploaded_size=$_FILES['uploaded']['size'];

if(($uploaded_type=="image/jpeg"||$uploaded_type=="image/png")&&

($uploaded_size<100000))

{

if(!move_uploaded_file($_FILES['uploaded']['tmp_name'],$target_path))

{echo'<pre>Yourimagewasnotuploaded.</pre>';

}

else

{echo"<pre>{$target_path}succesfullyuploaded!</pre>";}}else

{echo'<pre>Yourimagewasnotuploaded.WecanonlyacceptJPEGorPNGimages.</pre>';

}}?>对上传文件的类型、大小做了限制文件上传检测绕过技术文件上传攻击防护的绕过DVWA-Medium绕过上传攻击尝试修改filename为hack.php。Burpsuite抓包:文件上传检测绕过技术文件上传攻击的防护DVWA-High上传攻击<?phpif(isset($_POST['Upload'])){$target_path=DVWA_WEB_PAGE_TO_ROOT."hackable/uploads/";$target_path.=basename($_FILES['uploaded']['name']);

$uploaded_name=$_FILES['uploaded']['name'];$uploaded_ext=substr($uploaded_name,strrpos($uploaded_name,'.')+1);$uploaded_size=$_FILES['uploaded']['size'];$uploaded_tmp=$_FILES['uploaded']['tmp_name'];if((strtolower($uploaded_ext)=="jpg"||strtolower($uploaded_ext)=="jpeg"||strtolower($uploaded_ext)=="png")

&&($uploaded_size<100000)&&getimagesize($uploaded_tmp))

{if(!move_uploaded_file($uploaded_tmp,$target_path))

{echo'<pre>Yourimagewasnotuploaded.</pre>';}

else

{echo"<pre>{$target_path}succesfullyuploaded!</pre>";}}else

{echo'<pre>Yourimagewasnotuploaded.WecanonlyacceptJPEGorPNGimages.</pre>';}}?>strrpos(string,find,start)返回字符串find在另一字符串string中最后一次出现的位置,如果没有找到字符串则返回false,可选参数start规定在何处开始搜索。substr(string,start,length)返回string串中从start开始,长度为length的子串(默认可以不指定length,直到string串的末尾)getimagesize(stringfilename)函数会通过读取文件头,返回图片的长、宽等信息,如果没有相关的图片文件头,函数会报错。文件上传检测绕过技术文件上传攻击的防护DVWA-Impossiable上传攻击imagecreatefromjpeg(filename)函数返回图片文件的图像标识,失败返回falseimagejpeg(image,filename,quality)从image图像以filename为文件名创建一个JPEG图像,可选参数quality,范围从0(最差质量,文件更小)到100(最佳质量,文件最大)。

imagedestroy(img)函数销毁图像资源可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入Anti-CSRFtoken防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。文件上传检测绕过技术文件上传攻击的防护客户端JavaScript检测上传攻击防护思路在网站中部署JavaScript脚本,在用户访问时,脚本随同网页一起到达客户端浏览器。当用户上传文件时,JS脚本对用户表单提交的数据进行检查,如果发现非法后缀,则直接终止上传,从而起到防护的效果。

文件上传检测绕过技术文件上传攻击的防护客户端JavaScript检测上传攻击防护代码:

</head><body><h2>文件上传漏洞——JavaScript防护</h2><formname="form1"action="upload_file.php"onsubmit="returnlastname()"method="post"enctype="multipart/form-data"><labelfor="file">上传文件:</label> <inputtype="file"name="upfile"id="file"/> <inputtype="submit"name="submit"value="上传"/></form>

文件上传检测绕过技术文件上传攻击的防护客户端JavaScript检测上传攻击

防护代码:JS代码<script>functionlastname()

{varfile=document.getElementsByName('upfile')[0].value;

if(file==null||file=="")

{alert("你还没有选择任何文件,不能上传!");

returnfalse;

} varallow_ext=".jpg|.jpeg|.png|.gif|.bmp|";//提取上传文件的类型

varext_name=file.substring(file.lastIndexOf("."));

ext_name=ext_name.toLowerCase();

if(allow_ext.indexOf(ext_name+"|")==-1)//判断上传文件类型是否允许上传

{varerrMsg="该文件不允许上传,请上传"+allow_ext+"类型的文件,当前文件类型为:"+ext_name;

alert(errMsg);

returnfalse;

}

}</script>

返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。substring(start,stop)返回从start开始到stop-1结束的子串,如果没有stop,则到串的结尾返回某个指定的子串在字符串中首次出现的位置。文件上传检测绕过技术文件上传攻击防护的绕过客户端JavaScript检测上传攻击

虽然上述方式实现了后缀名的检查,并且在用户端完成了检测,看似防护效果良好,其实还存在重大隐患。浏览器可以禁用JS方式,禁止防护脚本执行,导致防护功能直接失效。如果这种防护手段在HTTP数据包发出之前执行完毕,那么攻击者可利用Web代理类攻击,抓取含有上传表单的HTTP数据包,并在包中将其修改为预想的后缀,则也可绕过此JS防护手段。

文件上传检测绕过技术文件上传攻击的防护客户端MIME检测上传攻击防护思路

在HTTP协议中,会利用Content-Type标识本次上传的内容类型。这个类型由客户端的浏览器根据本次上传文件的反缀名自动生成。常见的类型如下:Content-Type类型含义Content-Type类型含义Image/jpgJPG图像Text/htmlHTML文档Image/gifGIF图像Applocation/XMLXML文档Image/pngPNG图像Applocation/PDFPDF文档文件上传检测绕过技术文件上传攻击的防护客户端MIME检测上传攻击防护思路

服务器接收到HTTP包后,先判断Content-Type是否合法。如果合法,则进行后续代码流程;如果非法,则直接中断本次上传。

许多地方将Content-Type称为MIME(MultipurposeInternetMailExtensions)信息。因此,此种防护手段通常也叫做MIME检测机制。文件上传检测绕过技术文件上传攻击的防护客户端MIME检测上传攻击防护代码$file_type=$_FILE[“upfile”][“type”];If($file_type==“image/gif”||$file_type==“image/jpg”||$file_type==“image/png”||$file_type==“image/gif”){if(move_uploaded_file($_FILE[“upload”][“tmp_name”],$destination.’/’.$_FILE[“upload”][name]))

{echo“文件上传成功!”;}

else

{echo“文件上传失败!”;

}}Else{echo“文件类型不正确!”;}

文件上传检测绕过技术文件上传攻击防护的绕过客户端MIME检测上传攻击防护绕过方式由于校验通过验证MIME值完成,而Content-Type类型是由客户端浏览器自动生成的,那么在这个过程中其实Content-Type类型是可控的。只要伪造MIME值即可绕过防护。利用Burpsuite抓包后修改Content-Type类型,即可绕过该检测。如DVWA-Medium级别。将Content-Type的值改为image/jpeg,即可绕过文件上传检测绕过技术文件上传攻击防护的绕过客户端MIME检测上传攻击防护绕过方式MIME在服务端检测,比JS在客户端的检测效果略好,但由于Content-Type类型依然由客户端浏览器生成,因此实际上MIME还是处于用户可控制状态(修改文件头、修改Content-Type等均可)。因此,MIME的防护效果依然较差,不建议作为主要防护手段使用。文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击既然用户可操控参数,那么从理论上说,基于客户端参数的检测手段都可以被攻击者绕过。因此,只能在服务器端进行全面检查,且不能依赖由用户浏览器生成并提交的数据。有效的防护思路为:当服务器接收到上传信息后,检验文件名是否合法。如果不合法,则直接丢弃,从而避免攻击者欺骗检测机制。完全不信赖用户所上传文件的后缀名,在用户上传文件之后,重新给上传文件添加后缀名。文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击防护思路(1)文件后缀重命名只允许单一文件上传,例如针对头像上传,只允许JPG格式(此种方式下,其他格式文件也可上传,但由于后缀名会被重命名为.jpg,因此其他格式文件无法执行)(2)白名单过滤只允许一种或几种类型的文件上传,如图片上传,允许jpg、png、gif三种(3)黑名单过滤禁止几种类型的文件上传,其他都放行。文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击防护代码(1)文件后缀重命名$filerename=‘jpg’;$newfile=md5(uniqid(microtime().’-’.$filerename));If(move_uploaded_file($_FILES[‘upfile’][tmp_name]),$destination.

‘/’.$newfile)……文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击防护代码(2)白名单防护$ext_arr=array(‘flv’,‘swf’,‘mp3’,‘mp4’);$file_ext=substr($_FILES[‘file’][‘name’],strrpos($_FILES[‘file’][‘name’],‘.’)+1);If(in_array($file_ext,$ext_arr))……文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击针对黑名单的防护代码绕过(1)多重测试过滤文件名针对黑名单过滤的文件名,考虑尝试其他类似的文件名是否也被过滤。例如.php被过滤,可以尝试.php4、.php5等文件名。(2)判断是否存在大小写绕过中间件会区分文件名的大小写,但操作系统并不区分文件后缀名的大小写。因此,如果黑名单写得不完全,攻击者可以利用大小写进行绕过。例如.php被过滤,可以尝试.PHp、.pHp等文件名。文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击针对黑名单的防护代码绕过(3)特殊文件名构造(Windows下)构造shell.php.或shell.php_(此种命名方式在Windows下不允许,可用Burpsuite劫持HTTP包并手动修改),当上传文件的HTTP包到达Web服务器后,并在中间件进行缓存转存时,由于Windows不识别上述后缀机制,会自动去掉.和_等特殊符号,从而使攻击者可以绕过黑名单防护规则。文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击针对黑名单的防护代码绕过(4)%00截断此绕过方式利用的是C语言的终止符特性。当C语言在执行过程中遇到%00,会被当成终止符,程序会自动截断后续信息,仅保留%00之前的内容。此漏洞仅存在于PHP5.3.7之前的版本,如shell.php%00.jpg,扩展名.jpg符合系统对文件扩展名的要求,在上传页面进行转存时,之前文件名中的%00会被当成终止符,导致其后的内容被忽略。因此,最终文件名会变为shell.php,从而绕过了文件后缀名检查。文件上传检测绕过技术文件上传攻击防护的绕过服务端文件扩展名检测上传攻击针对白名单的防护代码绕过白名单的限制更加严格,非允许的后缀名一律拒绝上传,所以在黑名单中常用的修改大小写绕过、多类型后缀名绕过等手段,都无法满足白名单的过滤规则,只有如下两种方式可以绕过防护机制:(1)特殊文件名构造(参考黑名单防护)(2)0x00截断(参考黑名单防护)文件上传检测绕过技术文件上传攻击防护的绕过服务端文件内容检测上传攻击

通过检测文件内容来判断上传文件是否合法,防护手段更加严格,允许的内容也就更加单一,这里针对图片上传功能进行防护分析。防护思路对文件内容的检测主要有以下三种方法:(1)通过检测上传文件的文件头来判断当前文件类型(2)调用API或函数对文件进行加载测试,常见的是图像二次渲染(3)检测上传文件是否为图像文件内容文件上传检测绕过技术文件上传攻击防护的绕过服务端文件内容检测上传攻击防护代码(1)文件头判断:读取文件开头部分的数个字节,判断文件头与文件类型是否匹配。通常情况下,通过判断前10个字节基本上就能判断出一个文件的真实类型。functiongetTypeList(){returnarray(array(“FFD8FFE0”,“jpg”),

array(“89504E47”,“png”),

array(“424D”,”bmp”));}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论