php文件上传漏洞代码只允许上传图片

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php文件上传漏洞代码只允许上传图片相关的知识,希望对你有一定的参考价值。

参考技术A 文件限制。php文件上传漏洞代码只允许上传图片是由于文件限制导致的,用户通过高级选项,绕过上传机制上传代码并执行即可,php是一种在服务器端执行的嵌入html文档的脚本语言。

PHP代码审计学习——文件上传

文件上传漏洞

  文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。常见场景是web服务器允许用户上传图片或者普通文本文件保存,而用户绕过上传机制上传恶意代码并执行从而控制服务器。显然这种漏洞是getshell最快最直接的方法之一,需要说明的是上传文件操作本身是没有问题的,问题在于文件上传到服务器后,服务器怎么处理和解释文件。

挖掘思路

  这个比较好找,黑盒就在找页面到上传点就好了,白盒找相关的上传函数

  前提

  文件可上传
  知道文件上传的路径
  上传文件可以被访问
  上传文件可以被执行

案例

  还是直接上DVWA的吧(我太菜了)

LOW

  访问页面,直接上传.php文件

 

  查看源码

 

  并未做任何过滤而且给出了上传文件保存的位置,直接上传一句话就可以。(插眼)

Medium

查看源码

 

发现增加了一个文件类型和大小判断,但是$_FILES[‘uploaded’][‘name’]这里没有任何处理,所以上传php文件,抓包修改它的文件类型,也就是Content-Type值为image/jpeg

 

High

 

用到了substr函数对字符串进行分割,同时用strpos函数匹配.号最后出现的位置。

关键代码

 

这里对上传文件的类型做了限制,结合刚才判断.号位置的语句,首先可以把.php.jpg方法PASS掉。

同上一关一样,抓包修改文件类型,因为都没有对MIME进行严格判断。

 

Impossible级别

 

 

 

 

加入了token防止CSRF,对文件内容进行了严格的过滤,而且对上传的文件进行md5重命名,没有给上传恶意文件的机会

文件上传姿势

1、客户端JS检测

  这个比较常见也比较简单,一般都是在网页上写一段javascript脚本,校验上传文件的后缀名,有白名单形式也有黑名单形式。

function check()
{
  var filename = document.getElementById("file");
  var str = filename.value.split(".");
  var ext = str[str.length-1];
  if(ext==\'jpg\'||ext==\'png\'||ext==\'jpeg\'||ext==\'gif\')
  {
    return true;
  }
  else
  {
    alert("仅允许上传png/jpeg/gif类型的文件!")
    return false;
  }
  return false;
}

  这段代码就是检测我们上传的文件的后缀名,只允许png/jpeg/gif,判断该类检测的方法:选择一个禁止上传类型的文件上传,当点击确定按钮之后,浏览器立即弹窗提示禁止上传,一般就可以断定为客户端JavaScript检测。

  绕过这个很好绕,因为是在前端,所以设置代理,先将文件改为允许的类型上传绕过前端,然后再抓包将文件类型改回来

2、服务端MIME检测(Content-Type检测)

  这个就是DVWA的Medium级别,校验请求头content-type字段绕过

<?php
  if($_FILES[\'userfile\'][\'type\']!="image/gif")
  {//检测Content-type
    echo"错误文件类型";
    exit;
  }
  $uploaddir=\'uploads/\';  //上传路径
  $uploadfile=$uploaddir.basename($_FILES[\'userfile\'][\'name\']);
  if(move_uploaded_file($_FILES[\'userfile\'][\'tmp_name\'],$uploadfile))
  {
    echo"文件上传成功.\\n";
  }
  else
  {
    echo"文件上传失败.\\n";
  }
?>

  使用burp代理,修改Content-Type的参数

3、服务端文件扩展名检测

  比较一下,白名单比黑名单更安全,一般有个专门的 blacklist 文件,里面会包含常见的危险脚本文件。如.php、.jsp、.py等,但经常会出现漏网之鱼

  绕过方法:

    文件名大小写绕过:

 使用Asp、PhP之类的文件名绕过黑名单检测 

    名单列表绕过:    

用黑名单里没有的名单进行攻击,比如很名单中没有的asa或者cer之类

    特殊文件名绕过:

比如在发送的HTTP包中,将文件名改为”dama.asp.”或者”dama.asp_”(下划线为空格),这种命名方式在window系统里是不被允许的,所以需要在Burp Suite中抓包修改,上传之后,文件名会被window自动去掉后面的点或者空格,需要注意此种方法仅对window有效,Unix/Linux系统没有这个特性。

    0x00截断绕过:

操作方法:上传dama.jpg,Burp抓包,将文件名改为dama.php%00.jpg,选中%00,进行url-decode。

    上传.htaccess文件攻击:(适用于黑名单检测方式,黑名单中未限制.htaccess)

该文件仅在Apache平台上存在,IIS平台上不存在该文件,该文件默认开启,启用和关闭在httpd.conf文件中

    解析调用/漏洞绕过

https://www.cnblogs.com/Lee-404/p/12919552.html

    .user.ini文件绕过(适用于黑名单检测方式,黑名单中未限制.user.ini)

https://www.cnblogs.com/Lee-404/p/12838790.html CTF题
https://wooyun.js.org/drops/user.ini%E6%96%87%E4%BB%B6%E6%9E%84%E6%88%90%E7%9A%84PHP%E5%90%8E%E9%97%A8.html //.user.ini讲解

    文件头绕过

在木马内容基础上再加了一些文件信息,有点像下面的结构

GIF89a
<?php phpinfo(); ?>

    多个Content-Disposition

在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过,

文件上传防御

  • 文件扩展名服务端白名单校验。

  • 文件内容服务端校验。

  • 上传文件重命名。

  • 隐藏上传文件路径。

参考链接

https://www.cnblogs.com/wangtanzhi/p/12243206.html#autoid-0-5-0

https://www.secpulse.com/archives/95987.html

以上是关于php文件上传漏洞代码只允许上传图片的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码审计学习——文件上传

PHP图片上传安全检查清单

php过滤上传类型,只上传图片类型文件

挖洞姿势:特殊的上传技巧,绕过PHP图片转换实现远程代码执行(RCE)

PHP图片上传功能实现

文件上传漏洞