CTF--WEB--文件上传

无验证

直接上传一句话木马
CTF--WEB--文件上传_第1张图片
使用蚁剑连接
得到flag
CTF--WEB--文件上传_第2张图片

前端验证

上传一个一句话木马,扩展名改成允许上传的扩展名。
CTF--WEB--文件上传_第3张图片
在把.jpg改成.php
CTF--WEB--文件上传_第4张图片
CTF--WEB--文件上传_第5张图片
上传的路径在这里
在这里插入图片描述
我们可以使用蚁剑来连接
CTF--WEB--文件上传_第6张图片
连接成功,得到flag。

文件头检查

上传.php
CTF--WEB--文件上传_第7张图片
把.php改成.jpg
CTF--WEB--文件上传_第8张图片
于是我们可以上传一张内容为图片的.png
CTF--WEB--文件上传_第9张图片
我们抓包来改内容,把除了文件头其他的图片内容全删了,然后添加一句话木马,然后改.png为.php
CTF--WEB--文件上传_第10张图片
然后使用蚁剑来连接
CTF--WEB--文件上传_第11张图片

MIME验证

MIME即文件类型检测
上传一个.php文件
CTF--WEB--文件上传_第12张图片
吧.php改成.jpg,上传成功,然后使用一句话木马来连接。
得到flag
CTF--WEB--文件上传_第13张图片
也可以上传.PHP文件然后修改content-cype
在这里插入图片描述
改成image/jpeg,然后发送,在使用蚁剑连接
CTF--WEB--文件上传_第14张图片

CTFHub 文件上传 - htaccess

按f12
CTF--WEB--文件上传_第15张图片
方法一:
发现使用的是黑名单判断,不能使用一些.php后缀的,但是我们可以大写绕过,我们可以把上传.PHP。
CTF--WEB--文件上传_第16张图片
然后使用蚁剑连接。
CTF--WEB--文件上传_第17张图片
但是返回数据一直为空。
写这道题目的时候一直想不明白为什么返回空,后来想有可能蚁剑连接里面不能出现大写字母,后来经过测试,发现果然如此。

方法二:
.1.知识点

(1)先简单介绍一下.htaccess文件:

.htaccess文件 (或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。

它提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。
  作为用户,所能使用的命令受到限制。
  管理员可以通过Apache的AllowOverride指令来设置。
  .htaccess文件是用于apache服务器下的控制文件访问的配置文件,因此Nginx下是不会生效的
  .htaccess可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档、文件的跳转等功能。

(2).htaccess 文件上传漏洞原理:

一般.htaccess可以用来留后门和针对黑名单绕过
  创建一个txt写入
   AddType application/x-httpd-php .png
  打开另存为
  保存类型为所有文件
  让 png 解析为 php
  还可以把png改成其他图片格式~例如jpeg、gif等等…

另外,还有一个知识~(此题没用到这部分知识)
  可以在.htaccess 加入php解析规则
  类似于把文件名包含1的解析成php


  SetHandler application/x-httpd-php
  

1.png 就会以php执行

我们先上传一个.htaccess文件
CTF--WEB--文件上传_第18张图片
将.png文件当成.php文件来解析。
然后我们在上传一句话木马以.png为扩展名
CTF--WEB--文件上传_第19张图片
然后可以使用蚁剑来连接
得到flag
CTF--WEB--文件上传_第20张图片

00截断:

选择.php上传,文件类型不匹配。
CTF--WEB--文件上传_第21张图片
把.php改成.jpg
CTF--WEB--文件上传_第22张图片
上传成功。
根据题目提示,我们使用%00截断,使用上传一个a.php%00.jpg的文件。
上传成功
CTF--WEB--文件上传_第23张图片

使用bp抓包
CTF--WEB--文件上传_第24张图片
没有出现上传文件的路径地址。
url地址栏出现了?road=/var/www/htm/ 没有返回文件的路径地址,多半是有临时文件名的存在,这就需要00截断,00截断的主要目的就是为了得到上传文件的路径地址,从而可以用蚁剑连接。


if (!empty($_POST['submit'])) {
    $name = basename($_FILES['file']['name']);
    $info = pathinfo($name);
    $ext = $info['extension'];                //首先取到上传文件的扩展名$ext
    $whitelist = array("jpg", "png", "gif");   //将扩展名与白名单进行匹配,为jpg、png或gif才能通过第一次过滤
    if (in_array($ext, $whitelist)) {
        $des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;   //扩展名匹配之后,为上传的文件构造了一个新的存储路径$des
        if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
            echo "";
        } else {
            echo "";
        }
    } else {
        echo "文件类型不匹配";
    }
}

move_uploaded_file( F I L E S [ ′ f i l e ′ ] [ ′ t m p n a m e ′ ] , _FILES['file']['tmp_name'], FILES[file][tmpname],des)这个函数就是把上传文件放到 d e s 的 路 径 上 并 且 改 了 文 件 名 , 而 des的路径上并且改了文件名,而 desdes中的随机数,当前时间等无法确定,那么,在$_GET[‘road’]后面进行00截断payload:POST /?road=/var/www/html/upload/a.php%00 HTTP/1.1重新上传,这样,上传文件就被保存到了upload/a.php下。
CTF--WEB--文件上传_第25张图片
然后使用蚁剑连接。
CTF--WEB--文件上传_第26张图片

CTFHub 文件上传——双写绕过:

上传a.php%00.jpg
CTF--WEB--文件上传_第27张图片
在上传a.php.php%00.jpg
CTF--WEB--文件上传_第28张图片
可以知道是自动把php给消去了,于是可以设置a.pphphp来绕过
上传a.pphphp
CTF--WEB--文件上传_第29张图片
然后使用蚁剑连接
CTF--WEB--文件上传_第30张图片
连接成功
抓包看响应,发现一段代码。



这段代码果然是消去。

你可能感兴趣的:(php,信息安全)