从0到1CTFer成长之路-第二章-Web文件上传漏洞


Web文件上传漏洞

声明

好好向大佬们学习!!!

攻击

文件上传漏洞

摘自

https://book.nu1l.com/tasks/#/

使用BUUCTF在线环境

https://buuoj.cn/challenges

访问

http://3e8b5e24-d936-4a8f-9d1b-15ee36321db8.node3.buuoj.cn

在这里插入图片描述

在这里插入图片描述

一个上传文件功能,随便点点看,点到了提交查询,发现只能上传zip、jpg、gif、png,看看怎么绕过过滤上传

我的文件上传本来就薄弱,这个题也确实很打击我

上来一看是上传,而且只能图片,什么图片马,各种content-type绕过,十六进制编码绕过,在脑海中闪过,但是唯独这个zip格格不入,这不是明摆了和书中的上传zip,利用zip解压,最后解析有点类似吗,所以果断放弃了前面的想法,但是由于本身也比较菜还是参考了大佬的博客

https://blog.csdn.net/rfrder/article/details/108930033

由于上传功能比较特殊,不是光绕过上传检测就完了,还需要知道上传到哪了,如何解析,还涉及路径穿越解析,所以环境需要我们可操控,我们就自己用docker搭建环境吧,就不用了BUUCTF的环境了

docker搭建

vim docker-compose.yml

内容如下

version: '3.2'
services:
  upload:
    image: registry.cn-hangzhou.aliyuncs.com/n1book/web-upload:latest
    ports:
      - 80:80

执行

docker-compose up -d

为什么在BUUCTF开的没有源码

访问docker搭建的80端口

http://192.168.137.144

在这里插入图片描述

可以看到,浏览器往下拉是有源码的,先看看源码,反正我比较菜,源码中我把HTML都省略了

<?php
header("Content-Type:text/html; charset=utf-8");
// 每5分钟会清除一次目录下上传的文件

//会包含文件pclzip.lib.php,感觉这个php里面是有一些针对zip包进行解压等的操作的
require_once('pclzip.lib.php');

//要是没上传文件,就输出上传页面
if(!$_FILES){
echo '省略的HTML'
    show_source(__FILE__);
}else{
    $file = $_FILES['file'];

//限制上传的文件名不为空
    if(!$file){
        exit("请勿上传空文件");
    }
    $name = $file['name'];

    $dir = 'upload/';
//strrchr($name, '.') 
//strrchr() 函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
//比如上传的文件名为$name=1.php.txt,这里strrchr($name, '.') 执行结果为.txt
//substr(strrchr($name, '.'), 1)
//substr字符串截取,从下标为1开始截取,那就是把点略过,截取后为txt
//通过strtolower函数将所有字符转换为小写,赋值给ext变量
    $ext = strtolower(substr(strrchr($name, '.'), 1));
//如果我们上传的文件名为1.txt,那么path变量就为upload/1.txt
    $path = $dir.$name;

//检查是否为目录
    function check_dir($dir){
        $handle = opendir($dir);
        while(($f = readdir($handle)) !== false){
            if(!in_array($f, array('.', '..'))){
                if(is_dir($dir.$f)){
                    check_dir($dir.$f.'/');
                 }else{
                    $ext = strtolower(substr(strrchr($f, '.'), 1));
                    if(!in_array($ext, array('jpg', 'gif', 'png'))){
                        unlink($dir.$f);
                    }
                }
            
            }
        }
    }
    
//创建目录    
    if(!is_dir($dir)){
        mkdir($dir);
    }

//将目录名拼接一个随机数,读到这里,基本上就知道需要路径穿越了,因为我们不知道随机数值,所以就算绕过上传,解析也是一大关
    $temp_dir = $dir.md5(time(). rand(1000,9999));
    if(!is_dir($temp_dir)){
        mkdir($temp_dir);
    }

//首先进行后缀的校验,把刚刚拿到的,最后一个.后面的字符串和这里的zip、jpg、gif、png进行对比校验
    if(in_array($ext, array('zip', 'jpg', 'gif', 'png'))){
        if($ext == 'zip'){
//使用PclZip进行解压缩        
            $archive = new PclZip($file['tmp_name']);
//遍历解压缩后的每个目录            
            foreach($archive->listContent() as $value){
                $filename = $value["filename"];
//一段较为简单的正则,就是匹配每个文件结尾的位置,是否是.php                
                if(preg_match('/\.php$/', $filename)){
                     exit("压缩包内不允许含有php文件!");
                 }
            }
            if ($archive->extract(PCLZIP_OPT_PATH, $temp_dir, PCLZIP_OPT_REPLACE_NEWER) == 0) {
                check_dir($dir);
                   exit("解压失败");
            }

            check_dir($dir);
            exit('上传成功!');
        }else{
            move_uploaded_file($file['tmp_name'], $temp_dir.'/'.$file['name']);
            check_dir($dir);
            exit('上传成功!');
        }
    }else{
        exit('仅允许上传zip、jpg、gif、png文件!');
    }
}

其实看了一下代码,大致是了解了,正如书上所说,需要将php文件达成zip包,然后,绕过路经检测,通过路径穿越将文件放到指定目录,然后访问

由于我们上传的路径目录是upload/随机值/上传的文件,这一点再验证一下,我们随便上传一张图片,进入docker看一下

在这里插入图片描述

所以我们要穿越两层,直到根目录下,一层随机目录,一层upload

所以需要文件名为/…/…/file.php,由于需要构造解析,利用apache的解析漏洞,如果从右开始,直到哪个能识别就解析哪个,构造最终文件名为/…/…/zzz.php.zzz,这个文件名长度为18位

在这里插入图片描述

windows操作系统下,右键创建文件,文件名随便写一个18位的(跟刚刚的文件名位数一样),这里是把后缀涵盖的,例如

123456789012345678

然后我用的WinRar,右键添加到zip

在这里插入图片描述

接下来就开始用010 Editor进行zip文件的编辑

010 Editor软件怎么下载?怎么破解?官网?破解教程?

NONONO,这里疯狂安利乌云安全公众号,感谢大佬的整理,大佬把CTF常用的工具都整到百度网盘了

乌云安全公众号大佬,访问下面这个找下载链接

https://mp.weixin.qq.com/s/WotJoG57CVGQ-mFqn2_cCQ

下载完之后,直接双击打开

在这里插入图片描述

左上角文件,打开刚刚那个zip

在这里插入图片描述

打开后重点关注下方的面板,看值那一列就是我们的文件名123456789012345678,选Start不为0h的那个,我这是30h

在这里插入图片描述

注意deFileName[18],现在的值是123456789012345678

在这里插入图片描述

修改为/…/…/zzz.php.zzz,ctrl+s保存

在这里插入图片描述

上传这个zip

在这里插入图片描述

在这里插入图片描述

docker里面皮一下,看一下,已经上传到根目录了

在这里插入图片描述

利用apache的文件解析漏洞,访问这个php,拿到flag

http://192.168.137.144/zzz.php.zzz
n1book{ThisIsUpLoadToPicfl4g}

在这里插入图片描述

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
CTFer成长之路中,SQL注入是一个重要的技术点。SQL注入是一种利用用户输入数据不当,从而欺骗数据库执行恶意操作的攻击方式。在CTF比赛中,了解和掌握SQL注入技术可以帮助你解决一些与数据库相关的题目。 首先,你需要了解SQL注入的原理和基本概念。SQL注入通常发生在应用程序与数据库之间的交互过程中。当应用程序未能正确过滤用户输入数据,并且将用户输入直接拼接到SQL查询语句中时,攻击者可以通过构造恶意输入来修改、删除或绕过原本应该执行的查询操作,从而获取敏感信息或控制数据库。 接下来,你需要学习一些常见的SQL注入技巧和工具。例如,可以使用单引号 `'` 来进行字符串注入,使用注释符 `--` 来注释掉原本的查询语句,使用 UNION 语句来进行查询结果的合并等等。同时,了解一些常见的防御措施,如参数化查询、输入验证和输出编码等,可以帮助你更好地理解和应对SQL注入攻击。 在实践中,你可以尝试挑战一些有关SQL注入的CTF题目。这些题目通常会提供一个具有漏洞的应用程序和一个数据库,你需要通过利用SQL注入漏洞来获取敏感信息或执行特定操作。通过解决这些题目,你可以加深对SQL注入的理解,并且熟悉常见的攻击场景和解决方法。 最后,记得在学习和实践过程中保持合法合规。只在合法授权的情况下进行演练和挑战,切勿用于非法用途。同时,及时更新和修补应用程序的漏洞,以保护自己和他人的信息安全。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值