当前位置:   article > 正文

【网络安全之文件上传漏洞详解】

文件上传漏洞

一.原理:

文件上传漏洞是指攻击者利用网页等应用的上传功能上传恶意的可执行脚本文件,而系统未对其进行检测或存在检测漏洞,使攻击者将文件上传成功,从而实现控制目标网站实现攻击目的。

漏洞点:一切文件上传的地方都有可能。

挖掘方法:知道源码--->白盒测试;不知道源码--->黑盒测试。

漏洞分类:WEB前端验证,常规漏洞、中间件漏洞、编辑器漏洞。

二.防护与绕过技巧:

2.1前端验证

前端验证就是网页只在前端JS界面做了过滤限制,但是其过滤限制用户可控

例1:

如下upload第一关,上传一个带有后门的php文件,提示只能上传JPG,PNG,GIF格式,查看源代码之后发现是前端页面对上传类型做了检测限制。

此时可以在网页浏览器禁用JS,然后上传成功。 

 2.2 白名单

顾名思义,白名单就是服务端明确规定上传格式,比如JPG,GIF,PNG等格式,除此之外其他类型无法上传。

绕过

MIME绕过:

通过检查http中包含的Content-Type字段中的值来判断上传文件是否合法,因此可以将此字段改成允许上传的。 

例2: 

来到第二关,还是限制只能上传GIF,JPG,PNG格式,但是在禁用JS上传已经不管用了,因为对方用了MIME验证。 

 打开burp抓包,找到Content-Type字段,可以发现其与代码中允许的字段不一致,所以将Content-Type字段改成代码中允许的字段类型提交即可。

%00空字符截断:

在文件上传后验证文件扩展名往本地保存的时候,%00就会形成一个null字符,截断文件名,只保存%00之前的内容。  

注:只用于php5.3以下版本,并且要在php扩展设置>>参数开关设置中把magic_quotes_gpc关闭。

例3: 

修改路径值,添加%00,然后提交。 

2.3黑名单

与白名单相反,通过限制某些文件格式,使其无法上传之服务端。

绕过

.HTACCESS绕过:

只存在于APACHE中

主要功能:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。

简而言之,在httpd.conf文件中有对文件上传的过滤规则,我们通过给目目录下上传一个重新定义解析规则的.htaccess文件,此时生效的过滤规则就会替换原来http.conf中的规则。

 例4:

1.上传一个.htaccess文件

文件内容为:将xxx.jpg文件解析为PHP

  1. <FilesMatch "xxx.jpg">
  2. SetHandler application/x-httpd-php
  3. </FilesMatch>

2.然后创建xxx.jpg文件插入一句话木马,然后访问图片链接。

::$DATA绕过:

在 Windows 操作系统中,::$DATA 是一种用于隐藏文件的特殊附加数据流,如果文件名+::$DATA会把::$DATA之后的数据当成文件流处理,不会检测后缀名,且保持::$DATA之前的文件名,他的目的就是不检查后缀名。 

 2.4内容检测

文件头完整性检测:

文件头是文件开头的一段二进制代码,不同的文件其文件头类型也不同,可以用NotPad++查看。

  • GIF:47494638
  • JPG:FFD8FF
  • PNG:89504E47

在安全测试中不但可以对文件后缀格式进行检测,还可以对文件头部完整性检测,防止恶意文件上传。

例5:

由源码可知,此关卡对文件头部做了检测;并且题目已经提示使用文件包含漏洞。

  1. function getReailFileType($filename){
  2. $file = fopen($filename, "rb");
  3. $bin = fread($file, 2); //只读2字节
  4. fclose($file);
  5. $strInfo = @unpack("C2chars", $bin);
  6. $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
  7. $fileType = '';
  8. switch($typeCode){
  9. case 255216:
  10. $fileType = 'jpg';
  11. break;
  12. case 13780:
  13. $fileType = 'png';
  14. break;
  15. case 7173:
  16. $fileType = 'gif';
  17. break;
  18. default:
  19. $fileType = 'unknown';
  20. }
  21. return $fileType;
  22. }
  23. $is_upload = false;
  24. $msg = null;
  25. if(isset($_POST['submit'])){
  26. $temp_file = $_FILES['upload_file']['tmp_name'];
  27. $file_type = getReailFileType($temp_file);
  28. if($file_type == 'unknown'){
  29. $msg = "文件未知,上传失败!";
  30. }else{
  31. $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
  32. if(move_uploaded_file($temp_file,$img_path)){
  33. $is_upload = true;
  34. } else {
  35. $msg = "上传出错!";
  36. }
  37. }
  38. }

 首先创建两个文件,一个是正常的xxx.png文件

一个是一句话木马,起名为1.php

  1. <?php
  2. phpinfo();
  3. ?>

 然后执行命令,将这两个文件合并到一个x.png文件中

 cmd /c 'copy xxx.png /b + 1.php /a x.png'

最后上传文件,利用文件包含漏洞执行图片木马,访问靶场提供的include.php文件路径,还有上传文件时burp抓包返回的更改后的图片路径,直接访问即可。

http://127.0.0.1/include.php?file=./upload/9720240114202606.png

二次渲染:

原理:

第一次上传一个包含木马的图片,服务器检测到木马后会对图片进行渲染,我们将渲染过的图片下载下来,与之前的图片对比会得出有问题但被系统渲染过的一部分和被系统认为不存在木马的一部分。然后再将认为没问题的地方放入木马,再上传时程序依然会认为那里还是没有问题,这样就能够达到绕过渲染的目的。

操作步骤跟上图一样。

2.5中间件解析漏洞

IIS解析漏洞:

1.目录解析

在以. asp文件名的文件夹下的任何文件都将作为asp文件执行。

2.文件解析

如果文件命名为1.asp;.jpg,因为IIS不解析;后面的内容,因此就会把文件当作1.asp进行解析。

修复建议:

  • 限制上传目录的执行权限,不允许执行脚本。   
  • 不允许创建目录。
  • 上传的文件进行重命名。

注:以上漏洞只存在与IIS的5.x/6.x版本。

IIS 7.x版本

如果将Fast-CGI开启,当看到不认识的文件后缀时,上传文件会被从右到左依次解析,直到能解析成功为止。例如上传一个/x.jpg/x.php文件,会被直接当做x.php执行。

利用方法: 

1.将IIS中的php.ini文件里的cgi.cgi_pathinfo改为1

cgi.cgi_pathinfo=1

2.制作图片马,将含有后门代码的文件写入到正常文件中

  1. <?php
  2. phpinfo();
  3. ?>

 3.将文件起名为/x.jpg./xx.php然后访问。

修复:

将cgi.cgi_pathinfo改为0,然后重启。

Apache解析漏洞:

跟IIS解析漏洞相似,文件以.后面的扩展名来解析,当遇见不认识的扩展名的时候,就会向前解析,直到遇到能够解析的后缀名为止。

因此,在遇到解析漏洞时,可以用php构造一句话木马并将其命名为x.php.jpg绕过后缀名验证。当访问文件时,因为服务器无法解析出包含php代码的文件内容就会向前解析文件后缀,这样后门就会被执行。

还有apache换行解析漏洞,详细漏洞复现可以搜索cve-2017-15715.

三.总结:

我自认为文件上传漏洞特点是多且杂,不像SQL注入那样成体系只要一步步往下走就行。

以上文章只是对文件上传漏洞重点部分原理做了介绍与复现,此外还有大小写绕过、双写绕过,将php解析为php5等绕过方式前文中并没有提。

就是说针对不同的过滤规则有不同的绕过方式,掌握原理后灵活应对即可。

针对中间件的解析漏洞除了apache和IIS外还有Nginx。因为需要docker环境,笔者比较懒,并且网上有很多中间件所爆出来的漏洞的详细利用过程,因此对中间件没有过多介绍与复现。

文件上传漏洞还有一点是针对编辑器的,比如某网站中的信息收集、表单提交等页面也许就是利用了第三方编辑器。如果确定了对方编辑器版本后,可以查找编辑器已经爆出来的漏洞加以利用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/418695
推荐阅读
相关标签
  

闽ICP备14008679号