承接上篇,这次我们继续做下半部分。

有些题目有其他做法是针对于windows系统特性的,并不能在linux上奏效,因此不在考虑范围之内。

Pass-11

制作图片马直接上传

copy a.jpg /a + b.php /b c.jpg

或者使用%00截断

Pass-12

同11,将%00进行url编码

Pass-13

制作图片马进行上传

Pass-14

直接上传前面题目用过的图片马提示文件类型未知,此时我们的抓个包看看情况

发现并不是MIME拦截,猜测是检测文件头,我们在文件内容前加上GIF89a伪装直接绕过。

Pass-15

方法同14

Pass-16

经过上面两题的操作之后仍然提醒我们不是jpg格式的文件。怀疑不止检测了文件头,还检测了文件内容。初步怀疑是文件内容被识别过滤。尝试上传一个空内容的图片马,仍然不可行。接着我们分析空内容的图片马和普通图片的区别,判断是对图片进行了二次压缩。我们找一个已经经过二压但仍然存在木马的图片进行上传直接绕过。

Pass-17

此题可以直接用图片马搞定。
但是我们看这道题的提示,其实并不是让我们用这种方法。提示我们进行代码审计,通过查看提供的源代码,发现使用ulink删除文件,流程:先让你传文件,传到服务器上了,再进行判断,不符合就删除。
因此我们竞争上传。丢进burp进行暴力上传,让木马文件来不及被删除。

Pass-18

图片马也能搞定。
经代码审计,如果看到代码中出现.7z .zip .rar .gz这种压缩类型的文件,php有可能会自动解压
如果发现目标需要给文件重命名,可以使用竞争上传的原理,快速提交x.php.7z会来不及被重命名,并且可以被当作php执行。

Pass-19

%00截断

Pass-20

此题来源CTF,源代码如下

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
//检查MIME
$allow_type = array('image/jpeg','image/png','image/gif');
if(!in_array($_FILES['upload_file']['type'],$allow_type)){
$msg = "禁止上传该类型文件!";
}else{
//检查文件名
$file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
if (!is_array($file)) {
$file = explode('.', strtolower($file));
} $ext = end($file);
$allow_suffix = array('jpg','png','gif');
if (!in_array($ext, $allow_suffix)) {
$msg = "禁止上传该后缀文件!";
}else{
$file_name = reset($file) . '.' . $file[count($file) - 1];
$temp_file = $_FILES['upload_file']['tmp_name'];
$img_path = UPLOAD_PATH . '/' .$file_name;
if (move_uploaded_file($temp_file, $img_path)) {
$msg = "文件上传成功!";
$is_upload = true;
} else {
$msg = "文件上传失败!";
}
}
}
}else{
$msg = "请选择要上传的文件!";
}

这道题是一个比较简单的代码审计,发现验证了MIME,文件后缀名。
首先end函数取post传参数组中的最后一个值,

$file_name = reset($file) . '.' . $file[count($file) - 1]

我们可以post一个参数名为一个[0]一个[2],然后 file[count(file) - 1]就为空,[file_name最终就为reset(file)即$file[0],就可以绕过判断。

总结

文件上传在实际应用过程中并没有源代码给你参考,需要根据错误提示和试错来摸清waf的规则,图片马相对来说是一个比较简单和奏效的方法,我们一般可以通过MIME绕过、修改文件头、后缀、内容免杀来绕过大多数的过滤。但是单纯的文件上传常需要配合文件包含来进行更近一步的操作。

Upload-labs通关指南(下) 11-20的更多相关文章

  1. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  2. SUCTF 2019 Upload labs 2 踩坑记录

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

  3. Ubuntu_10.04下Hadoop-0.20.2集群配置手册

    Ubuntu_10.04下Hadoop-0.20.2集群配置手册 一.软硬件环境的准备 下面的文章来自hadoopor.com,我先交待一下我自己的环境: 两台机器,每台机器上面两个虚机(vmware ...

  4. 位于/var/log目录下的20个Linux日志文件

    位于/var/log目录下的20个Linux日志文件[译] from:http://buptguo.com/2014/01/16/linux-var-log-files/ 原文地址:20 Linux ...

  5. RabbitMQ-Java客户端API指南-下

    RabbitMQ-Java客户端API指南-下 使用主机列表 可以将Address数组传递给newConnection().的地址是简单地在一个方便的类com.rabbitmq.client包与主机 ...

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

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

  7. Upload - Labs (下)

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

  8. sqli-labs通关----11~20关

    第十一关 从第十一关开始,就开始用post来提交数据了,我们每关的目的都是获取users表下password字段的内容. post是一种数据提交方式,它主要是指数据从客户端提交到服务器端,例如,我们常 ...

  9. 深度学习与计算机视觉教程(15) | 视觉模型可视化与可解释性(CV通关指南·完结)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

随机推荐

  1. Javascirpt 面向对象总结-继承

    JS继承的实现方式 既然要实现继承,那么首先我们得有一个父类,代码如下: // 定义一个动物类 function Animal (name) { // 公有属性 this.name = name || ...

  2. 爱思助手备份 iPhone 时没有设置密码,恢复备份时需要密码的问题

    i4.cn 备份时 iPhone 上登陆的 Apple ID 曾经设置过备份密码,这个密码就是恢复备份时需要输入的密码!

  3. vue 微信二维码扫码登录,附加 自定义样式

    大概流程:   先安装 微信 的登录, 然后 局部引入,局部注册,方法调用,存 token,跳转路由 npm 安装 npm install vue-wxlogin --save-dev 微信安装 微信 ...

  4. 【odoo】【知识杂谈】单一实例多库模式下定时任务的问题分析

    欢迎转载,但需标注出处,谢谢! 背景: 有客户反应有个别模块下的定时任务没有正常执行,是否是新装的模块哪些有问题?排查后发现,客户是在一台服务器上跑着一个odoo容器,对应多个数据库.个别库的定时任务 ...

  5. Identity用户管理入门六(判断是否登录)

    目前用户管理的增删改查及登录功能已经全部实现,但存在一个问题,登录后要取消登录按钮显示退出按钮,未登录应该有注册按钮,现实现过程如下 一.Startup.cs中增加服务 app.UseAuthenti ...

  6. JS014. toFixed( )调试踩坑 - 浏览器思维 点常量 & 点运算符

    Number.prototype.toFixed( ) 在观察toFixed()丢失精度问题,和对toFixed()方法重写的调试过程时,发现toFixed()对Number的识别有它自己的规则,并找 ...

  7. Java单例-双重检查锁

    问题引入 Java中实现单例模式,一般性的做法是如下方式: class Singleton { private static Singleton INSTANCE = null; private Si ...

  8. C# 反射 + Quartz,实现流程处理

    场景: 前不久,公司里项目经理要求我实现流程处理,比如,用户可以定义一个定时任务,每周一查看报表.定时任务很简单,用Quartz可以实现,但是用户自己选择报表就比较麻烦,因为系统的不同模块的生成报表的 ...

  9. ElasticSearch集成SpringData史上最全查询教程

    1.简单介绍 springboot 使用springdata操作es,ElasticsearchRepository使用QueryBuilder构造查询条件 2.集成es //maven集成 < ...

  10. 多线程run()方法是不能够被直接调用的

    操作系统线程的五种状态: 1.新建状态(New):新创建了一个线程对象. 2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于"可运行 ...