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

文件上传漏洞

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

挖掘思路

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

  前提

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

案例

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

LOW

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

 PHP代码审计学习(9)——文件上传_第1张图片

  查看源码

 PHP代码审计学习(9)——文件上传_第2张图片

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

Medium

查看源码

 PHP代码审计学习(9)——文件上传_第3张图片

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

 

High

 PHP代码审计学习(9)——文件上传_第4张图片

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

关键代码

 

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

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

 

Impossible级别

 PHP代码审计学习(9)——文件上传_第5张图片

 

 

 PHP代码审计学习(9)——文件上传_第6张图片

加入了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
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代码审计学习(9)——文件上传)