upload-labs是一个和sqli-labs类似的靶场平台,只不过是一个专门学习文件上传的。整理的很好,虽然并不能将服务器解析漏洞考虑进去,但毕竟一个靶场不可能多个web容器吧,关键是思路很重要,github地址:https://github.com/c0ny1/upload-labs

感觉这个思路图做的很好,测试的时候大体流程可以按照这个来,同时将服务器特性以及中间件的解析漏洞考虑进去就差不多了。

开始做题,同时看下后台的实现代码对代码审计也很有帮助的。

第一关是一个前端校验,第二关是服务器端对content-type的一个判断,由于个人习惯,我一般都是在本地写一个一句话木马后文件名改为jpg之类的,直接上传(这个时候content-type是图片格式),抓包将文件名后最改为.php脚本后缀,所有能通过绕过这两关。

第三关是服务器端对文件后缀的黑名单校验(后面的关卡中不特殊说明默认都是服务器端校验)。先看下代码:

采用的黑名单,php的话有时候(配置的原因)php、php3、php4、php5、phtml、pht这些后缀也是可以被解析的,其他语音也有类似的情况,需要尝试:

由于我这里使用的是phpstudy+windows,所以复现不了(由于配置原因是解析不了php3等等这些后缀的)。

第四关:上传php文件显示不合法,然后上传了个aaa后缀的可以,说明还是使用的黑名单。看下源码可以发现基本上将所有非法的脚本后缀就禁用了

但是没有禁用.htaccess,可以通过上传.htaccess文件然后将该文件夹下的所有例如.jgp的文件都按照脚本语言解析,详细信息可以问度娘,上传如下内容的.htaccess文件

意思是将该文件夹下的one.jpg文件按照php格式去解析,然后再上传一个文件名是one.jpg内容是一句话木马的文件,然后访问,可以执行代码。

第五关:将.htaccess后缀也禁止了,但是相比第四关,没有将文件后缀置换成小写,所有可以通过大小写绕过

第六关:依然是黑名单,但这次程序没有对文件后缀去空(其实如果程序没有对文件进行重命名的话,可以借one.php .jpg绕过白名单的)

上传一个php文件,抓包将文件名后缀加上空格,如下图

可以发现windows下保持文件时会自动将空格去除

第七关和第六关类似,利用windows特性,会自动去掉后缀名中最后的”.”,可在后缀名中加”.”绕过,所以

这里访问的时候是可以不要.的,存在windows下的时候也是没有.的

第八关;老实说第八关这个绕过方式我之前是不知道的,就是在php+windows的情况下:如果文件名+"::$DATA"会把::$DATA之后的数据当成文件流处理,不会检测后缀名.且保持"::$DATA"之前的文件名。

可以看到在服务器中保存的文件还是以php结尾的,访问该文件即可。具体原理还不是很清楚。。。

第九关:这关算是一个逻辑漏洞吧

程序先是去除文件名前后的空格,再去除文件名最后所有的.,再通过strrchar来寻找.来确认文件名的后缀,但是最后保存文件的时候没有重命名而使用的原始的文件名,导致可以利用类似one.php. .(两个点号之间有一个空格)绕过,如果重名名了文件的话应该会用$file_ext来进行拼凑文件,这样保存在服务器中的文件将没有后缀(去除了.空格)

第十关:

看代码可以发现程序将所有脚本后缀名都替换为空了,但是可以利用.phphpp这样,去除中间的php后再一次组成了.php。

第十一关:白名单校验

这关考验的是一个00截断的漏洞,当有php环境中有两个截断条件: 1.php版本小于5.3.4 详情关注CVE-2006-7243 2.php的magic_quotes_gpc为OFF状态

给请求中会自动将%00进行url解码,在后台进行拼凑的时候会自动阶段后面的字符串

于是存在服务器中的文件是这样的

第十二关:也是00截断,只不过由于文件路径这个参数是通过post请求发送的,需要抓包后再hex中修改

第十三、十四关、十五关、十六关:

都是利用copy one.jpg /b + one.php /a one.jpg 制作图片马后上传,再结合文件包含漏洞使用,没什么好说的。

十三关是对比文件的前两个字节

十四关是用了getimagesize函数来对文件类型做判断

十五关是用的exif_imagetype函数

十六关是用的二次渲染

第十七关:

可以看到并没有对文件名的后缀做任何校验,但是上传后会改名并马上删除该文件,需要用到并发漏洞(网上都喜欢叫条件竞争)。可以正常上传php文件,抓包后放入intruder模块中选择发送多次,然后在浏览器中访问就好了,在就算程序会对文件名改名也没关系的,直接访问原文件名就好了(one.php)

第十八关:

也是考验竞争条件的问题,由于程序对文件后缀做了白名单校验,所以只能是上传图片木马然后用文件包含。

第十九关:

利用CVE-2015-2348这个漏洞也是00截断的问题,由于也是需要在低版本的php中就不演示了

------------------------------------------------------------------2019.2.27  补充 -------------------------------------------------------------

php中的%00截断    PHP<5.3.29,且GPC关闭  两个条件缺一不可

但当%00截断不能用时,也可以使用zip协议  参考文章https://www.cnblogs.com/milantgh/p/5293628.html   我有时间再补上实例吧

最后我再自己补上各中间件的解析漏洞吧

iis5.x   iis6.0

1. 如果能创建文件夹的话,创建xx.asp文件夹,那么该文件夹下的所有文件都会按asp格式去解析,在该文件夹下上传evil.jpg  访问www.xxx.com/xx.asp/evil.jpg  执行代码

2. 直接上传evil.asp;.jpg文件绕过黑白名单校验,访问www.xxx.com/evil.asp;.jpg时iis会按照asp文件去解析

IIS 5.x/6.0在从文件路径中读取文件后缀时,遇到一个“.”后,便进入了一种截断状态,在该状态下遇到特殊符号——“/”和“;”,都会进行截断,只保留特殊符号前的部分,即:“.asp”,从而认为文件后缀为“.asp”。

IIS 7.0/IIS 7.5/ Nginx <8.03畸形解析漏洞:

在默认Fast-CGI开启状况下,黑阔上传一个名字为evil.jpg,内容为     <?PHP fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>');?>    的文件,

然后访问evil.jpg/.php,在这个目录下就会生成一句话木马 shell.php

Nginx <8.03 空字节代码执行漏洞      影响版:0.5.,0.6., 0.7 <= 0.7.65, 0.8 <= 0.8.37
Nginx在图片中嵌入PHP代码然后通过访问   evil.jpg%00.php      来执行其中的代码

Apache解析漏洞  :

Apache 是从右到左开始判断解析,如果为不可识别解析,就再往左判断.   比如 evil.php.owf.rar “.owf”和”.rar” 这两种后缀是apache不可识别解析,apache就会把wooyun.php.owf.rar解析成php.

如何判断是不是合法的后缀就是这个漏洞的利用关键,测试时可以尝试上传一个evil.php.rara.jpg.png…(把你知道的常见后缀都写上…)去测试是否是合法后缀

另附一篇不错的文章 https://www.cnblogs.com/shellr00t/p/6426945.html

upload-labs的更多相关文章

  1. SUCTF 2019 Upload labs 2 踩坑记录

    SUCTF 2019 Upload labs 2 踩坑记录 题目地址 : https://github.com/team-su/SUCTF-2019/tree/master/Web/Upload La ...

  2. Upload - Labs (下)

    Pass - 11: 1.查看源代码,发现进行了一次对后缀名替换成空格,因此考虑双写绕过, 2.上传成功, 关键代码: $is_upload = false; $msg = null; if (iss ...

  3. Upload - Labs (上)

    Pass - 01: 1.尝试上传一个php文件:aaa.php,发现只允许上传某些图片类型,用bp抓包,发现http请求都没通过burp就弹出了不允许上传的提示框,这表明验证点在前端,而不在服务端 ...

  4. [web安全原理分析]-文件上传漏洞基础

    简介 前端JS过滤绕过 待更新... 文件名过滤绕过 待更新 Content-type过滤绕过 Content-Type用于定义网络文件的类型和网页编码,用来告诉文件接收方以什么形式.什么编码读取这个 ...

  5. [原题复现+审计][SUCTF 2019] WEB CheckIn(上传绕过、.user.ini)

    简介  原题复现:https://github.com/team-su/SUCTF-2019/tree/master/Web/checkIn  考察知识点:上传绕过..user.ini  线上平台:h ...

  6. buu学习记录(上)

    前言:菜鸡误入buu,差点被打吐.不过学到了好多东西. 题目名称: (1)随便注 (2)高明的黑客 (3)CheckIn (4)Hack World (5)SSRF Me (6)piapiapia ( ...

  7. Upload-labs通关指南(上) 1-10

    Upload-labs 所有文章和随笔(随笔将不于csdn更新)将于我的个人博客(移动端暂未适配)第一时间更新. 一些网站存在文件上传接口,一旦存在这个接口就有可能存在漏洞. 文件上传漏洞的逻辑是将一 ...

  8. 解决ngnix服务器上的Discuz!x2.5 Upload Error:413错误

    1.修改php.ini sudo nano /etc/php5/fpm/php.ini #打开php.ini找到并修改以下的参数,目的是修改上传限制 max_execution_time = 900 ...

  9. 页面无刷新Upload File

    页面无刷新Upload File. 利用jquery.form.js的ajaxForm提交文件. 具体参考以下代码: 前台html <%@ Page Language="C#" ...

  10. 基于Picture Library创建的图片文档库中的上传多个文件功能(upload multiple files)报错怎么解决?

    复现过程 首先,我创建了一个基于Picture Library的图片文档库,名字是 Pic Lib 创建完毕后,我点击它的Upload 下拉菜单,点击Upload Picture按钮 在弹出的对话框中 ...

随机推荐

  1. phpunit assert断言分类整理

    布尔类型 方法名 含义 参数 返回值 assertTrue 断言为真     assertFalse 断言为假     NULL类型 方法名 含义 参数 返回值 assertNull 断言为NULL ...

  2. 【nodejs】exports 和 module.exports 的区别

    require 用来加载代码,而 exports 和 module.exports 则用来导出代码.但很多新手可能会迷惑于 exports 和 module.exports 的区别,为了更好的理解 e ...

  3. HTTP 02 HTTP1.1 协议

    发送请求: 返回时, content-type 与 HTTP 正文之间有一个空格 HTTP 是不保存状态协议, 也就是说在 HTTP 这个级别, 协议对于发送过的请求或相应都不做持久化处理. 但是, ...

  4. Activity的Launch mode详解,A B C D的singleTask模式

    本文参考了此文http://hi.baidu.com/amauri3389/blog/item/a54475c2a4b2f040b219a86a.html 另附 android task与back s ...

  5. 【Python】安装error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"

    pip install Scrapy --> error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft ...

  6. 在k8s上配置ingress并启用HTTPS证书

    第一步,定义Secret文件 该文件设置tls的证书私钥和公钥内容,通过base64编码的内容 tls.crt: 证书公钥 tls.key: 证书私钥 示例 apiVersion: v1 kind: ...

  7. Linux下的at定时执行任务命令详解

    之前说了使用crontab实现定时执行任务,假如我们只是想要让特定任务运行一次,那么,这时候就要用到at监控程序了.一.at服务 cron是一个linux下 的定时执行工具,可以在无需人工干预的情况下 ...

  8. RE:从零开始的莫比乌斯反演

    炫酷反演魔术根本看不懂啊...也就看看PoPoQQQ的ppt了. 这个赛季结束了,一年可以学很多很多东西呢. 因为我是写给自己看的所以写的很垃圾. 公式: 按我的理解,反演就是  x可以表示成y,然后 ...

  9. 萌新 学习 vuex

    vuex官网文档 https://vuex.vuejs.org/zh-cn/ 注: Mutation事件使用commit触发, Actions事件使用dispatch触发 安装 npm install ...

  10. 22.1 、react生命周期(一)

    在每个react组件中都有以下几个生命周期方法~我们需要在不同阶段进行讨论 组件生命周期概述 1.初始化 在组件初始化阶段会执行 constructor static getDerivedStateF ...