实际的环境中,很少有直接可以任意上传文件的漏洞 常见于前端限制,小东根据个人经验整理出主要的三大类突破文件上传拦截的方法。
方法教程
操作 说明 前端禁用JS 前端限制,禁用JS,去除input
标签的accept
属性 修改文件后缀 抓包工具,修改文件后缀为黑名单之外的后缀 修改文件后缀 修改文件后缀为index.jpg.php
修改文件后缀 %00
截断,比如index.php%00.jpg
修改文件后缀 文件名末尾添加::$DATA
,windows
会把::$DATA
之后的数据当成文件流,不会检测后缀名.
且保持::$DATA
之前的文件名 修改文件后缀 在linux
主机上的文件名大小写敏感,文件后缀大小混写 修改文件后缀 在文件末尾添加空格,黑名单的方式没法儿检测 修改文件类型 抓包工具,修改Content-Type:image/png
修改文件后缀 修改文件名shell.php:.jpg
,上传后会得到一个空的文件shell.php
,然后修改文件名为shell.>>>
或者shell.<
、shell.<<<
、shell.>><
再上传,重写shell.php
换行解析 Apache2.4.0~2.4.29
换行解析漏洞%0d
,%0a
(CR
,LF
(回车,换行)) 未知后缀名 Apache
配置AddHandler application/x-httpd-php .php
不当导致未知后缀脚本执行 后缀名正则替换 这种需要构造,使得替换之后的可以重组成为新的可执行后缀,双后缀名绕过 修改上传路径 name="upload_file/1.php%00"; filename="shell.jpg"
条件竞争 条件竞争删除/重命名文件时间差绕过 图片马 copy code.jpg/b + shell.php/b hourse.jpg
图片重绘包含马 做一个就好了 上传压缩包 配合PHP伪协议、文件协议等读取执行本地文件 数据库写文件 UDF
,select
查询输入
实战事例
来自
Upload-labs
漏洞演示靶场的文件上传的第九关示例,一看到下面这种情况,是不是感觉完全没思路?
面对这样的情况,该怎么上传绕过呐?各位不妨先思考一下!
看到这样的情况是这样思考的:
1、什么操作系统?
2、如何绕过函数?
环境是自己的windows
笔记本,那么通过windows
系统特征可以尝试正则绕过,文件流::$DATA
,大小写绕过,换行截断等方式。
如果是linux
,就有文件大小写,换行截断,解析文件上传等等方式。
分析上面的文件:黑名单限制文件后缀,限制文件后缀大小写,去除::$DATA
,限制上传.htaccess
,难道这个题是假的?
这里可以尝试二次上传的方式,借助windows
平台的正则匹配规则:
如下符号在windows平台下等效果
" => .
> => ?
< => *
- 首先随便上传一个
shell.php
,使用抓包工具(比如:burpsuite
),将文件后缀修改为:shell.php:.jpg
- 此时,会在
upload
目录下生成一个名为shell.php
的空文件: - 然后,修改数据包文件名为:
shell.<<<
,这里在move_uploaded_file($temp_file, '../../upload/shell.<<<')
类似与正则匹配,匹配到.../../upload/shell.php
文件,然后会将此次上传的文件数据写入到shell.php
文件中,这样就成功写入我们的小马了。
在这里,对于文件上传的练习靶场,非常推荐Uplaod-labs
这个项目: https://github.com/c0ny1/upload-labs