文件上传漏洞

文件上传漏洞基本概念

查找方式

常见文件上传存在问题

判断前端还是后端验证

文件上传验证的绕过

后缀名验证 

文件类型验证

文件头验证

过滤代码知识

简易的一个上传功能代码分析

 upload文件上传靶场第二关代码分析

upload第三关代码分析

插件漏洞

那么如何知道是什么编辑器?

如何利用? 

cms文件上传漏洞

文件上传思路

WAF绕过

 上传参数名解析:明确哪些东西能更改?

​编辑 WAF常见绕过方式

数据溢出-防匹配(xxx...)

符号变异-防匹配(' " ;)

 数据截断-防匹配(%00 ; 换行)

重复数据-防匹配(参数多次)

防御方案

案例 

案例1:vulhub靶场文件上传,解析漏洞利用

案例2:前端js过滤绕过

如果判断过滤方式

 如何绕过前端验证

案例3 cms和cve第三方插件如何进行文件上传漏洞

案例4:文件类型验证绕过,MIME绕过

案例5:黑名单的后缀名验证绕过,特殊解析后缀

 案例6:.htaccess解析(只存在Apache)

 案例7:大小写绕过

案例8:空格绕过

 案例9:点绕过

案例10:::$DATA绕过

 案例11:双后缀名绕过

 案例12:双后缀名绕过

  案例13:00截断

%00截断

案例14:apache低版本解析漏洞

案例15:Apache HTTPD换行解析漏洞

 案例16:Nginx解析漏洞

如果查看是否存在解析漏洞 

案例17:Nginx文件名逻辑漏洞(CVE-2013-4547)

案例18:错误的一个waf绕过

案例19:数据溢出绕过

案例20:fuzz模糊测试爆破


类型 

首先我们需要分清楚文件上传的类型 

常规类,网站扫描敏感文件,会员中心上传,后台上传,其他途径

cms类,插件类,系统类cve等其他

文件上传漏洞基本概念

存在:存在文件上传可能存在文件漏洞但不一定是存在文件上传漏洞

简单来说就是存在上传但不一定是漏洞

风险:高危漏洞,能够直接获取权限

获取权限,服务器提权,内容权限,

查找方式

黑盒查找:

目录敏感文件扫描,通过网站一下上传的地方
后台的一些上传,后台权限仅仅是后台,网站权限是网站权限

白盒查找:

代码分析,查找文件上传功能
尝试在应用里面找有没有上传功能,进行抓包判断是否存在文件上传漏洞
注意点:编辑器(网站搜索该插件),应用的,会员中心,

常规文件上传地址的获取说明(怎么找文件上传)

想要进行测试文件上传漏洞,首先需要发现能上传文件的地方,那么如何发现文件上传功能呢
方法一:利用扫描工具进行目录扫描,御剑、7kbscan等工具
方法二:谷歌语法 site:网址 upload


方法三:在网页进行寻找一些上传文件的位置,例如一些论坛会有一些上传图片,文档类
upload


还有各种其他方法找到存在文件上传的地方进行测试漏洞

常见文件上传存在问题

不同格式下的文件类型的后门类型

众所周知文件有jpg,png,txt,js,bat,php,zip等等文件类型

而每个文件后缀并不是毫无意义,他相对的会让系统进行识别,从而达到对应解析

而经常遇到一个问题:为什么上传了一个后门然后连接不上
这就可能存在一个原因:无法解析

上传的是一个简单的图片格式文件,但是在文件内写入了代码,企图直接进行连接

所以是不可以的,对应的文件要用对应的脚本格式进行解析

好比php写的后面需要使用php的文件格式进行解码

如果上传的是一个图片格式文件里面进行编码写入后门上传了他是会以图片形式解码

因此是解析不了的,所以是无法通过直接上传其他不被限制的图片和txt文件就能直接进行解析

 另外还有一个原因是因为文件上传的路径的权限不够,所以不能进行连接

判断前端还是后端验证

通过提交文件,但是提交的时候burp抓不到上传的文件的数据包

文件上传验证的绕过

后缀名验证 

黑名单(不允许上传的脚本格式后缀)

通过字典将已知的脚本格式进行限制,如:asp,php,jsp,aspx等

黑名单缺陷:只要后缀名不完整的情况下,可以通过其他格式达成效果(根据实际情况)

白名单验证(允许上传脚本格式)

通过字典放行该后缀名的格式,如:jpg,png,zip,rar,gif

补充:获取文件名后缀是从右到左,碰到指定字符进行执行

文件类型验证

MIME信息:发送数据包的时候会进行验证,可修改进行伪造

文件头验证

 文件头部信息

 修改文件头内容可伪造

过滤代码知识

简易的一个上传功能代码分析

enctype="multipart/form-data" 为提交类型

参考:HTML <form> 标签的 enctype 属性 (w3school.com.cn)
method="post"          请求方法为post
οnsubmit="return checkFile()"    鼠标触发时间,点击之后会使用一个checkFile函数进行过滤
action 指向提交地址,为空则是提交到当前文件夹

Files函数:

PHP $_FILES函数详解 - 1O(∩_∩)O1 - 博客园 (cnblogs.com)

 html加php混编上传代码

<?php
$name=$_FILES['upload_file']['name'];
#FILES函数接受上传栏文件的upload_file的文件原名称
echo $_FILES['upload_file']['name'];#输出原名称
echo $_FILES['upload_file']['type'];#输出文件类型MIME信息
'''
MIME过滤方式
if $_FILES['upload_file']['type'] !='image/png'{
    echo pass
}

'''
echo $_FILES['upload_file']['size'];#输出文件大小
echo $name;#输出文件名

?>


<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()" action="">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
#上传文件栏 name的参数值与上方$_FILES['']内接受的文件对应
<input class="button" type="submit" name="submit" value="上传"/>#上传按钮
</form>

 upload文件上传靶场第二关代码分析

isset($_POST['submit'] 判断是否点击上传按钮进行上传

<input class="button" type="submit" name="submit" value="上传"/>#上传按钮

($_FILES['upload_file']['type'] == 'image/jpeg')判断文件类型是否等于jpg

($_FILES['upload_file']['type'] == 'image/png')判断文件类型是否等于png

($_FILES['upload_file']['type'] == 'image/gif')判断文件类型是否等于gif

||为或的意思 其中符号.为加号进行连接'的作用

一个白名单文件类型验证方式,只允许通过 

<?php
$is_upload = false;#声明变量
$msg = null;
if (isset($_POST['submit'])) {#判断是否有点击上传按钮
    if (file_exists(UPLOAD_PATH)) {#判断UPLOAD_PATH路径是否存在
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {#判断类型,||为或
            $temp_file = $_FILES['upload_file']['tmp_name'];#如果等于获得文件的一个文件名
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']#UPLOAD_PATH/文件名            
            if (move_uploaded_file($temp_file, $img_path)) {#将文件从$temp_file移动上传到$img_path
                $is_upload = true;#如果路径无错输出正常
            } else {
                $msg = '上传出错!';#出现问题输出错误
            }
        } else {
            $msg = '文件类型不正确,请重新上传!';#第六行判断文件类型,如果上传文件不符跳出循环输出错误
        }
    } else {
        $msg = UPLOAD_PATH.'文件夹不存在,请手工创建!';#无法找到上传路径输出错误
    }
}
?>

upload第三关代码分析

后缀名不允许的一个验证

$file_name = deldot($file_name);

xx.jpg.zip.php 如果不使用该过滤的情况下,获取的是jpg文件后缀

xx.jpg.zip.php 使用该过滤的情况下,获取的是php文件后缀

<!DOCTYPE heml>
<html>
<body>

<?php
echo strrchr("hello world!Today is a beautiful day!",Today);#strrchr函数为分割作用
?>

<body>
<html>

输出结果为Today is a beautiful day!

 从Today开始进行分割,将前面的进行舍弃

<?php
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');#deny拒绝,ext后缀名,array数组,:此处为拒绝后缀名为asp,aspx,php,jsp的一个数组字典
        $file_name = trim($_FILES['upload_file']['name']);#trim移除字符串两侧的空格和其他定义字符 ;去除获取的数据名的空格和其他定义符号
        $file_name = deldot($file_name);//删除文件名末尾的点
        $file_ext = strrchr($file_name, '.');#分割符号,从点之后进行分割
        $file_ext = strtolower($file_ext); //转换为小写
        $file_ext = str_ireplace('::$DATA', '', $file_ext);//去除字符串::$DATA ;检测$file_ext的值中如果存在::$DATA,将该字符串变为空字符
        $file_ext = trim($file_ext); //再次去除包含的空格

        if(!in_array($file_ext, $deny_ext)) {#如果不在参数值和拒绝的后缀名内执行以下代码,否则跳出循环提示不允许上传.asp,.aspx,.php,.jsp后缀文件!
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                $msg = '上传出错!';
            }
        } else {
            $msg = '不允许上传.asp,.aspx,.php,.jsp后缀文件!';
        }
    } else {
        $msg = UPLOAD_PATH . '文件夹不存在,请手工创建!';
    }
}
?>

插件漏洞

网站在进行使用的时候会使用一些编辑器

如果该网站的这个编辑器存在漏洞我们也是可以进行利用的

前提条件:你能识别网站有哪种编辑器以及编辑器的目录地址

那么如何知道是什么编辑器?

进入一些后台中心、会员中心、通过扫描文件目录进行查看、以及黑暗引擎、goole搜索关键词

还有一些网站的地方进行查看

如何利用? 

我们只需要网上百度找到对应编辑器就能有该相关漏洞然后进行复现

 因为编辑器他是存在一些上传图片文件的作用,由于市面上的编辑器漏洞太多就不演示了

goole搜索intitle:xx漏洞 

cms文件上传漏洞

如果是辨认出一个是某种的cms,同样是可以在网上寻找该cms的相关漏洞

找到该cms登陆界面,通过F12查看源代码,获取该cms名称

通达OAcms下载:

链接:https://pan.baidu.com/s/1fr6CW3Pw6SdoEPKPldSNkw 
提取码:ZRIP 

通达OA文件上传+文件包含漏洞 - 终落 - 博客园 (cnblogs.com)

文件上传思路

第一步:确定中间件类型和版本,存在WAF类型

第二步:是否存在解析漏洞,解析漏洞规则

第三步:寻找文件上传漏洞(字典扫描、会员中心)

第四步:根据实际判断黑白名单或者内容哪个验证

第五步:cms漏洞》》编辑器漏洞》》CVE漏洞

再次补充:

不是有文件上传就有文件上传漏洞

直接上传图片文件不可行,需配合解析和其他漏洞解析调用,或者上传脚本文件

是否有存在解析漏洞进行利用,版本,中间件,相应解析规则

第三方漏洞(因为大部分编辑器有存在上传图片和文件)

WAF绕过

 上传参数名解析:明确哪些东西能更改?

Content-Disposition:表单数据,一般可更改

fotm-data表单数据

name:表单传参的一个名称,不可更改

修改之后上传会出现问题

filename:自己所上传的一个文件名,可以更改(意义不大)

Content-Type:文件MIME类型,根据情况修改(如果是MIME验证可以进行修改)

在upload上传靶场第二关是验证一个MIME类型信息

虽然通过了该代码的一个过滤但是安全狗对其进行了拦截

在网站进行拦截,他会直接进行一个拦截脚本文件

而我们所做的就是让waf检测不到这个php和其他脚本格式或者一个其他的格式让web能够正常执行

  其他的一个脚本格式也是一样,只要能执行代码即可

 WAF常见绕过方式

提醒:本篇WAF貌似是在进行搭建的时候出现问题,明明被拦截也是能上传,甚看

如果有知道什么原因的麻烦大佬评论告知

数据溢出-防匹配(xxx...)

当大量数据的时候,程序会有一个崩溃和截至,插入的地址可见上方可更改的一个位置,案例19

数据溢出位置一:文件名位置

一直写直到成功为止,注意,名字的位置会导致服务器崩溃,详情看案例

数据溢出位置二:通过加入一些可修改的位置

见案例19参考,需要增加分号

符号变异-防匹配(' " ;)

没有双引号的为在系统上为识别为自带的函数

带有引号的识别为赋值

#正常来说字符串的是需要双引号包含起来的,达到一个命名作用
a="abc"#正常输出
b=efg #报错

而安全狗匹配一个过滤是匹配一个双引号或者是不进行匹配,

还有一种情况就是前方有双引号后方没有所以匹配不到

所以根据安全狗的一个匹配规则让他无法进行匹配达成过滤 

如图:

正常拦截

未拦截 

 未拦截

拦截

未拦截 

 

  所以可知安全狗匹配的是同时存在两个双引号的一个php或者两个单引号

只有当匹配到才会被拦截 

另外,在前面加双引号是能进行绕过,后方加不能绕过,

这个是因为匹配规则是将双引号前的存在php的将其进行过滤 

所以放在前面匹配不到,放后方会被检测到

 由此演变

 

 

 不过有部分是需要搭配解析漏洞才能实现

 当然符号不能加在php内,不然会影响网站的一个解析

 数据截断-防匹配(%00 ; 换行)

以下存在被拦截但是还是成功上传了

我们需要明白安全狗是一个程序,他不会和人一样有主观想法去进行判断

在当安全狗进行检测到中断之后也是会停止进行匹配

由此可以利用安全狗识别了之前的然后将后续的一个代码进行截断,让他以为已经结束了,

分号代表了一个语句结束,然后由于安全狗在识别到分号进行了结束,所以没有识别到php

然后php数据包又正常一个进行上传了,而且也是能够进行一个解析

 同样的%00(现在不可以了) 

 换行防匹配

在数据包和开发中存在\n才是为换行,而安全狗在进行匹配的时候,数据包换行也识别为\n

所以在上传之后,该php文件没有换行,因为他们需要写\n,如:

安全狗匹配的是"Z\nR\nI\nP\n.ph\np"           

与分块传输原理一样

 

重复数据-防匹配(参数多次)

递归循环利用,首先判断他获取的一个前后,其次判断他是获取一个识别还是所有后缀名进行利用

可见获取一个最后的后缀名为准,然后安全狗也是有一个匹配次数的

此时我们上传最后的一个后缀名为我们需要的,其余编写多个进行干扰他的一个识别到jpg

虽被拦截一样能上传,一样能进行解析 

 同样也可以利用原来数据包存有的进行一个利用 

防御方案

后端验证:采用服务端验证模式

后端检测:同时黑名单,白名单过滤

MIME检测:基于上传自带类型检测

内容检测:文件头,完整性检测

自带函数过滤:参考uploadlabs函数

自定义函数过滤:function check——file(){}

getimagesize函数,定义只允许图片

Waf防护产品:宝塔,云盾,安全公司产品等

案例 

案例1:vulhub靶场文件上传,解析漏洞利用

在存在解析漏洞的情况下(混乱解析),我们在上传图片的格式的时候能通过解析漏洞

使一个本为图片的格式文件让系统进行脚本格式进行解析

首先打开我们的靶场,详情可参考我的另一篇文章:

发现靶场位置有一个文件上传功能,对其上传正常文件,

 无法对其上传文本格式,说明对格式进行过滤,通过网站得知白名单的只有图片格式

并且存在文件大小限制 

 

 最后找到可以进行上传的图片

 然后在对应的文件中写入对应网站的编码格式,这个网站是php的所以写php

当然你也可以使用将这个文件进行二进制解码,然后将木马进行二进制编号转换之后导入进去上传

 此时我们会发现上传的图片文件进行访问他只是单纯的显示了图片的内容,没有弹出php的执行

 但是,有一种情况,如果说,这个网站存在解析漏洞的情况下

我们就可以在其url后加入脚本格式后缀进行混淆

以此达到解析到了php的脚本格式 (前提是存在解析漏洞)

由此我们可以通过这个方法进行写后门,利用菜刀等工具进行连接

如果一些平台没有解析漏洞,也是可以通过一些插件和其他漏洞进行配合

让它存在文件解析格式混淆

最后:存在解析漏洞就利用,没有就什么格式上传什么解析
图片文件是用不了其他方法解析的
如果存在解析漏洞;代码过滤的无论多严格,存在上传文件可以利用解析漏洞对该地址进行漏洞测试

案例2:前端js过滤绕过

那么通常情况下,都是没有解析漏洞的,我们该如何去进行测试?

首先,正常情况下99%都是不允许上传脚本格式文件的

一般能够上传的也就是图片,压缩文件,运行文件等(取决与管理员做的限制,难免会有疏忽)

那相对应我们做一个欺骗,通过突破绕过验证达到上传

补充:文件上传靶场搭建 

下载地址:https://pan.baidu.com/s/1GoEKHsneRwsSANXhBO8Ovw 
提取码:k4qz

直接将其压缩包解压至phpstudy的网站根目录下

 然后即可访问靶场

这里我们将使用第一关进行练习

上传一个正常文件,是否正常运行

 拒绝上传脚本格式

 判断是何种过滤方式,这里是前端过滤

如果判断过滤方式

前端通常是使用html5和JavaScript过滤后端则是php,c语言

如果是前端在进行查看获得的代码是一致的,但是如果是后端,获取的F12源代码是不一样的

如果存在前端的验证,可以直接对其前端验证代码进行修改,删除,禁用

如果是使用禁用的情况下,可能会影响到其他一些正常代码的运行

前端是进行过滤了再选择是否上传,而后端是接受了再进行过滤

 如何绕过前端验证

首先将其代码复制放到一个txt文件内

 对其代码进行修改限制的文件类型

 

 然后由于我们是修改的是一个本地文件,由于那边服务器访问的是那边的脚本文件

这时候我们就需要给这个文件修改一个导向,让这个文件通过上传指向对应网站

 否则直接将其打开的是本地的一个网页

查找action指导地址

 由于没有存在,所以需要自己增加一个让网页知道提交给谁

通过源代码中可知这个文件提交给了哪个地址

 然后将其添加的action进行导向

然后将其文件后缀改为html网页格式

进行访问然后上传文件

 

 这时候我们就会发现网站内有我们上传的一句话木马,之后使用菜刀进行连接

思路:首先判断是属于什么验方法,然后进行过滤绕过

不一定需要上传脚本格式,只有能将上传的代码可以进行解析调用即可

部分情况下如果存在后端提交,将代码发送到后端可以进行抓包

抓包内进行修改文件为脚本格式文件也可,如果是本地验证则是无法抓取

案例3 cms和cve第三方插件如何进行文件上传漏洞

 首先我们需要明确,cms和cve漏洞和常规的操作不一样

文件上传漏洞不一定只存在web程序上 ,同时他所按照的cms和第三方插件也可能存在

cms找到对应的源码进行分析和找是否存在相关漏洞

直接在网上搜索相关对应漏洞按照文档操作即可利用

为什么说找相关文档进行测试,因为像CVE漏洞,不只是单纯得直接进行上传

同时也需要他的一些特定的信息才能够进行上传,哪怕拥有漏洞没有他的相关信息

同样也是无法对这个漏洞进行利用

这里演示的是CVE-2018-2894漏洞

参考文档:Vulhub - Docker-Compose file for vulnerability environment

启动靶场

 获取管理员密码,管理员用户名为weblogic

docker-compose logs | grep password

 访问网页

访问http://your-ip:7001/console

按照文档进行操作

 

访问地址设置路径后保存        访问地址:http://your-ip:7001/ws_utc/config.do

/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

 依次添加用户然后上传文件

 提交的时候进行抓包,然后在抓包中的重发器中找到时间戳

 然后对其访问

http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]

最后,
cms和第三方cve漏洞,和常规的测试是不一样的,需要找到网上对应的漏洞文档执行一样的操作顺序和信息才能实现

案例4:文件类型验证绕过,MIME绕过

首先因为分析过ipload靶场第二关代码,确定了此种方式是通过代码中只进行文件类型验证

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

正常情况下进行上传php脚本格式被过滤

但此时我们可以通过,抓包工具 抓取获取的数据包 

 然后我们进行修改验证数据包类型的地方,让其验证为未被拦截的类型

 修改数据包之后由于代码是php编写无法用jpg格式解析所以会导致破损

 但在指定目录还是存在这个的文件的

至于为什么没有修改这个地方也能进行上传

 这是因为在这一关里面,只是通过文件类型进行了过滤,并没有过滤掉后缀名的验证

如果在遇到类型和后缀都验证的情况下就都需要进行一个更改

案例5:黑名单的后缀名验证绕过,特殊解析后缀

更改其后缀名进行上传,前提是该上传的一个格式是该网站能够解析的代码格式 

取决与一个平台的一个配置文件,正常情况下是默认支持,但有开发人员会疏忽所以可以利用

看看配置黑名单的脚本文件与支持的一个脚本格式,支持但没有拦截的情况下使用 

通过其他格式,例如php5和php,实现一样但是只是单纯格式不一样 

 apache服务器能够使用php解析.phtml .php3_柠檬呀qaq的博客-CSDN博客

 

总的来说:在进行上传脚本格式选择一些该服务器支持解析的别名格式

 案例6:.htaccess解析(只存在Apache)

首先.htaccess是Apache的一个配置文件,

.htaccess的作用是什么 - web开发 - 亿速云 (yisu.com)

.htaccess文件在线生成器 (uuz.cc)

其他作用:apache .htaccess文件详解和配置技巧总结 - 恩恩先生 - 博客园 (cnblogs.com)

我们来到upload上传靶场第四关

由于源码得知,该关卡将所知的脚本格式都限制了,那么我们该然后做呢

 这时候我们就可以应用.htaccess配置文件,将上传的文件以php进行解析 

首先编写一个.htaccess配置文件,写好要以php文件执行的文件内带有的名字

 代码意义:上传改文件,此文件目录下存在shana的文件会以php格式进行执行

其余不满足文件名字不影响正常访问

 配置文件.htaccess

<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>

 然后将该配置文件进行上传

​ 这时候再将我们写有php代码的文件进行上传,正常上传

打开文件地址成功以php进行解析

​ 

 不影响其他文件访问

总的来说该目录存在该配置文件,并且上传符合该配置文件的jpg后缀内有脚本代码可以正常对其他后缀文件进行解析为php

 案例7:大小写绕过

 upload上传靶场第6关

在进行分析代码上,没有将全部字符转换小写或者大小写,而限制的格式有大有小

进行尝试更换大小写即可上传脚本格式

案例8:空格绕过

 upload上传靶场第7关,将之前和现在的代码进行对比,发现没有限制收尾去空这个限制

 在进行上传文件的时候使用burp进行抓取数据包,在其文件类型后加空格

补充:直接在windows上面加空格更改后缀名会被电脑自动去除空格

提交过去的文件类型是没有空格

但是,如果是在数据包里面增加的空格,网站所收到的是php+空格

然后在对方网站接受到改文件后又会强制去掉空格还原为php格式

都是成功上传 

 

 案例9:点绕过

upload靶场第8关,与空格绕过原理大同小异

 上传进行抓包,然后在文件类型上进行添加.

但是不一样的是不能将点添加到中间

 上传成功

案例10:::$DATA绕过

与案例9原理一致在数据包结尾增加(需在结尾进行添加)

upload第9关

::$DATA

 进行修改

 成功上传

 案例11:双后缀名绕过

uploa第10关

了解一个过滤去除机制

#将代码中的php过滤去除
一次过滤的情况下
a.php #过滤后为a.
a.pphphp#过滤后为a.php 过滤了左边的PHP后剩余的p和hp组成了php

循环过滤
a.pphphp #过滤后为a.(核查多次进行过滤)

利用代码的一个循环过滤去除,检查这个代码得知去空次去点一次

  那么这时候就是这样一个运行

 之后成功进行上传

 案例12:双后缀名绕过

uploa第11关,原理一样

只不过在代码上他是以拒绝的代码换为空

 抓包进行修改

然后到对方服务器内空格被自动去除

  案例13:00截断

%00截断

upload靶场第12关, 分析代码是白名单验证,而且过滤得很全

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');#只允许上传jpg,png,gif格式
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);#验证文件内是否有多个点,然后进行循环
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

这是我们还可以试试00截断,首先我们需要知道 

%00和0x00是有区别的,%00加在地址上,0x00是用于文件名

 其次,在进行抓包的时候burp中数据包有参数是能够进行修改

$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

..upload/123456789.jpg#将文件重新数字命名获取后缀进行执行判断过滤


?save_path=../upload/1.php%00#利用命名新文件后缀然后截断php代码后面的执行
#截断之后相当于保存一个1.php文件

..upload/a.php%00123456789.jpg
#%00截断需要php5.3版本以下才能进行使用,而且是用于存储地址位置之后

 无法复现可能存在,php.inc文件配置的magic_quotes_gpc修改为off

 

 利用%00截断成功上传

 

 %00截断post提交

对比第12关代码,第十三关无法就是提交方式不一样

 在其post提交的url里面进行修改

 不过在进行使用%00截断需要转换一下编码

 

 转换之后进行提交

如果还有失败检查一下上方魔术引号有无设置为off

 补充:%00是url编码,使用get请求是在URL地址添加,服务器自动解码

而在post提交中添加服务器不会自行解码,需要自己将%00解码为空字符再提交

案例14:apache低版本解析漏洞

在进行低版本的apache使用中,访问该地址会被正常解析

 如:ZRIP.php.a.b

他会进行识别b的后缀,如果不能访问他会识别a后缀,直到能够正常访问直到识别

利用场景:如果存在apache属于低版本,可以利用文件上传利用不识别的后缀,利用解析漏洞除非规则,将后门代码进行除非。而且他是从右往左进行解析的

案例15:Apache HTTPD换行解析漏洞

参考文献:Vulhub - Docker-Compose file for vulnerability environment

apache 2.4.0~2.4.29版本中存在一个解析漏洞

利用场景:

 首先启动我们一个靶场环境

 

上传一个带有php代码的jpg文件

 验证是否能正常提交jpg文件

 然后将jpg后进行添加\x0a

  也可以加空格后找到hex中该字符的20(空格编码)修改为

不再拦截之后,访问网站进行抓包,修改访问文件地址

 

 最后出错,实在找不出原因,求助

 案例16:Nginx解析漏洞

影响版本:

  • Nginx 1.x 最新版
  • PHP 7.x最新版

参考文档:Vulhub - Docker-Compose file for vulnerability environment 

 上传可上传的文件然后在访问地址后增加/文件名.脚本格式进行解析调用

如果查看是否存在解析漏洞 

在url后输入/.php如果正常解析则存在

inurl:asp  url后加/.php

 首先启动靶场

访问靶场

 查看版本

 将可以进行上传一个文件内写入php代码然后进行上传访问

 

 

 在其后面增加任意文件名/.php后缀名达成解析

 增加/文件名.解析格式进行触发

 

案例17:Nginx文件名逻辑漏洞(CVE-2013-4547)

 参考链接:Vulhub - Docker-Compose file for vulnerability environment

 影响版本:Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7

 补充:如果版本符合但是进行了打补丁的情况下也是无法进行操作

运行靶场:

环境启动后,访问http://your-ip:8080/ 然后上传一个带有php代码的图片进行抓包

 其数据包进行添加空格,然后获取对应文件的一个地址

 

 访问该网址的时候使用抓包软件进入抓包添加地址以及空格.php

,空格代表hex编码的20,2e为.

 然后将此处修改为20和00,2e点的前面

 然后就可以正常解析php代码了

案例18:错误的一个waf绕过

演示关卡upload靶场第二关

首先我们上传一个jpg文件,然后发送到重发器修改一个php的WAF绕过

 这里利用的是一个由于WAF识别的时候没有识别到空格,所识别的是.ph p的一个后缀

可见文件是成功的一个上传

 但是!当我们进行访问该文件的时候,他还是一个图片文件

这个是因为在进行waf绕过的一个同时,导致了web无法解析到php格式

案例19:数据溢出绕过

还是以upload第二关为例

在数据包进行增加垃圾数据防止匹配

 我这里写了大量的垃圾数据,本以为绕过不了,但是偶然发现我上传成功了

而且是删除了靶场里面的文件再次上传发现确实成功了

 需要增加分号,然后这个表单的参数才不会发生错误

案例20:fuzz模糊测试爆破

GitHub - fuzzdb-project/fuzzdb: Dictionary of attack patterns and primitives for black-box application fault injection and resource discovery.

GitHub - TheKingOfDuck/fuzzDicts: Web Pentesting Fuzz 字典,一个就够了。

首先将数据包发送到爆破测试模块

 清除原来的一个变量

 添加需要的一个变量的地方

 

 添加字典文件

这里关闭CC防护 ,实战的时候小一点避免被拦截,我这里图快

 

 进行攻击

 

 然后得出的结果可以进行参考,哪一个成功就可以上传利用

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值