[MRCTF2020]你传你🐎呢-文件上传 .htaccess

小木 / 70 /

ChatGPT 可用网址,仅供交流学习使用,如对您有所帮助,请收藏并推荐给需要的朋友。
https://ckai.xyz

image.png
测试上传png文件
image.png
显示文件路径/upload/14857a68ceef6dc3c7bf72c57b6fb2b5/png_ex.png
测试上传php文件
image.png
被禁止了
bp抓包修改文件类型
image.png
也被禁止了,说明后台有文件类型过滤,只能上传png文件
思路就是先上传.htaccess文件,解析文件解析规则,把png文件当成php文件去解析,再上传一句话木马,文件类型修改成png
.htaccess文件写入
第一种 所有文件都会被当作php文件解析

<IfModule >
setHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行
</IfModule > 

第二种,只有ant.png会被当做php文件解析

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

在bp中修改content-type为image/png(后台对content-type也有检验)
image.png
显示上传成功
再传入ant.png
image.png
最后用蚁剑连接
image.png
连接成功,在根目录下找到flag

在上传.htaccess文件时,为什么要把content-type修改成image/png呢?
检查后台上传逻辑

<?php
session_start();
echo "
<meta charset=\"utf-8\">";
if(!isset($_SESSION['user'])){
    $_SESSION['user'] = md5((string)time() . (string)rand(100, 1000));
}
if(isset($_FILES['uploaded'])) {
    $target_path  = getcwd() . "/upload/" . md5($_SESSION['user']);
    $t_path = $target_path . "/" . basename($_FILES['uploaded']['name']);
    $uploaded_name = $_FILES['uploaded']['name'];
    $uploaded_ext  = substr($uploaded_name, strrpos($uploaded_name,'.') + 1);
    $uploaded_size = $_FILES['uploaded']['size'];
    $uploaded_tmp  = $_FILES['uploaded']['tmp_name'];
 
    if(preg_match("/ph/i", strtolower($uploaded_ext))){
        die("我扌your problem?");
    }
    else{
        if ((($_FILES["uploaded"]["type"] == "
            ") || ($_FILES["uploaded"]["type"] == "image/jpeg") || ($_FILES["uploaded"]["type"] == "image/pjpeg")|| ($_FILES["uploaded"]["type"] == "image/png")) && ($_FILES["uploaded"]["size"] < 2048)){
            $content = file_get_contents($uploaded_tmp);
            mkdir(iconv("UTF-8", "GBK", $target_path), 0777, true);
            move_uploaded_file($uploaded_tmp, $t_path);
            echo "{$t_path} succesfully uploaded!";
        }
        else{
            die("我扌your problem?");
        }
    }
}
?>

通过正则判断preg_match("/ph/i", strtolower($uploaded_ext))只要后缀里有ph都会被绕过

常见php文件后缀 .php .php1 .php2 .php3 .php4 .php5 .phtml

通过如下代码,验证content-type 白名单包括 image/jpeg`image/png`

if ((($_FILES["uploaded"]["type"] == "
            ") || ($_FILES["uploaded"]["type"] == "image/jpeg") || ($_FILES["uploaded"]["type"] == "image/jpeg")|| ($_FILES["uploaded"]["type"] == "image/png")) && ($_FILES["uploaded"]["size"] < 2048))

总结一下 这道文件上传题,采用黑名单验证文件类型、白名单验证content-type的方式验证上传文件类型,我们用黑名单的漏洞,上传.htaccess文件改变解析png文件的方式,以此来上传木马


[MRCTF2020]你传你🐎呢-文件上传 .htaccess
作者
小木
许可协议
CC BY 4.0
发布于
2023-09-18
修改于
2025-05-16
Bonnie image
尚未登录