Upload-labs通关指南(下) 11-20
承接上篇,这次我们继续做下半部分。
有些题目有其他做法是针对于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绕过、修改文件头、后缀、内容免杀来绕过大多数的过滤。但是单纯的文件上传常需要配合文件包含来进行更近一步的操作。
最新文章
- Spark RDD到底是个什么东西
- 利用springframework+javax.mail发邮件(普通邮件、带附件邮件、HTML格式邮件)
- 【Django】Django 直接执行原始SQL 如何防止SQL注入 ?
- (转)SQL SERVER的锁机制(四)——概述(各种事务隔离级别发生的影响)
- 基于Hadoop Sequencefile的小文件解决方案
- sizeof 和 strlen
- png图片的loading旋转
- LINQ实现行列转换
- 为VS2013添加SQLCE的支持
- JavaScript实现360度全景图片展示效果
- 关于数据结构的10个面试题(c语言实现)
- EBS开发之环境迁移
- 并发编程(十六)——java7 深入并发包 ConcurrentHashMap 源码解析
- Shell从入门到精通进阶之三:表达式与运算符
- Python------excel读、写、拷贝
- Win32汇编学习(9):窗口控件
- Struts2-052 RCE CVE-2017-9805
- Nginx 设置域名转向配置
- Kubernetes集群部署之一系统环境初始化
- vue.js如何实现点击按钮动态添加li