文件上传疑点解析
文件上传漏洞成功的根本原理
本质
- 其本质就是欺骗服务器对文件后缀的解析,让一个后缀名被修改了的包含可执行恶意代码的文件可以被上传到服务器文件中使用户可以使用如中国蚁剑这样的工具去发送
POST
请求让服务器结构得到呈现从而实现黑进服务器的效果。
黑入成功的关键
首先要让文件能够被成功上传:
后缀名修改:
许多服务器仅通过文件后缀名验证文件类型。将.php
改为.jpg
/.png
可欺骗服务器认为这是合法图片文件,从而允许上传。代码关键字的修改:
有些服务器会对文件源码进行筛查,比如会过滤掉<?
这样的符号,需要人为使用代码特性进行绕过。文件头和
MIME
类型的修改:服务器可能会验证报单内容(文件头和
MIME
类型),从而使恶意文件难以被成功上传到服务器中。
(文件头是和被上传的文件源码紧挨着的,写入时请不要和上方的参数挨着)。
其次就是让文件被成功解析:
- 目前所遇到的情况:服务器会根据URL后缀名选择解析方式,使得文件得到解析后让恶意代码执行
和文件上传有关服务器报单参数
Content-Disposition
参数:
该参数形如:该参数对服务器如何解析该文件没有任何影响,它只会影响文件保存的后缀名,如以
png
、jpg
格式进行保存。做一个提醒:
在buuctf 极客大挑战 [Upload]这道题中,刚开始以在Content-Disposition
参数中以png
格式名上传文件后在url中使用phtml对文件进行解析,是回显没有找到该文件的,后来在Content-Disposition
参数中使用phtml
格式名又上传了一次文件,再在url中以phtml
形式解析,解析成功,但是我此时又以png
的后缀名上传保存文件,在url中以后缀名为phtml
解析文件也成功了,为什么第一次不能成功呢?
deepseek的解析,看看就得了:目前我只能说:
自己多尝试几次,修改Content-Disposition
和修改url
中文件的后缀名,多试试,看是否可以解析成功。url
中的文件后缀名:
该参数形如:/upload/demo.phtml
在一些服务器的配置中,修改后缀名才是可能让服务器改变对文件的解析方式的途径,从而使得恶意代码可以被成功执行。
关于冲突的方法
- 比如buuctf里的[Upload]2019这道题,传送门:buuctf[Upload]2019个人wp,这里使用了如下代码绕过对
<?
的过滤:
1 | <script language="php"> |
然而在ctfshow web151中写入这样运行
php
代码的js
代码却无法正常被蚁剑连接
原因就是:**PHP 5.x 环境 + 宽松的解析配置,允许.png
中的<script language="php">
执行。**在PHP 7.x后,移除该语法。所以不如直接写
<?php @eval($_POST['cmd']);?>