upload-labs通关笔记
9unk Lv5

什么是文件上传漏洞?


文件上传漏洞是指由于程序员在对用户文件上传部分的控制不足或者处理缺陷,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者 WebShell 等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。

Pass-01

第一关是在客户端使用 js 对上传的图片进行检查,简单来说就是只要骗过我自己的浏览器就可以上传文件。


方法一

表单中的 onsubmit 事件,会调用 js 函数来检查上传文件的扩展名。第一个方法就是把 onsubmit 事件删除。


  1. 检查 from 表单的属性和触发的事件
1
<form enctype="multipart/form-data" method="post" onsubmit="return checkFile()">

Pass01-1.png

onsubmit 表示表单提交时验证的事件,它是在表单中的确认按钮被点击时出发的,一般是 js 函数。

  1. 删除 onsubmit 事件,并尝试上传 php 文件

Pass01-2.png

注:从上图可以看到 php 文件已经上传成功

方法二

既然是调用 js 进行验证的,我把 js 禁用掉不就行了


  1. 禁止网站使用 js 脚本

Pass01-3.png

  1. 刷新网站,上传文件

Pass01-4.png

方法三

将文件后缀改为 png,然后再使用 burpsuite 抓包将后缀改为 php


  1. 抓包修改后缀

Pass01-5.png

  1. 上传成功

Pass01-6.png

Pass02

第二关是服务端对数据包的 MIME 进行检查,简单来说就是检查 HTTP 头的 Content-Type 字段。


  1. 选择好要上传的 webshell

Pass02-2.png

  1. 设置好 burpsuite 和 firefox

Pass02-3.png

Pass02-4.png

Pass02-5.png

  1. 点击 “上传”,可以看到抓的数据包

Pass02-6.png

  1. 将 “Content-Type” 改为 “image/png”

Pass02-7.png

  1. 点击 “forward” 提交修改后数据包

Pass02-8.png

  1. 关闭 “Intercept is off”

Pass02-9.png

  1. 最后可以看到 webshell 上传成功

Pass02-10.png

Pass03

第三关不允许上传.asp,.aspx,.php,.jsp后缀文件,但是可以上传其他任意后缀。


方法一

修改文件后缀,即可上传文件。例如:.php .phtml .phps .php5 .pht

前提是 apache 的 httpd.conf 中有如下配置代码:

1
2
# 这行配置表示:将以 .php .phtml .phps .php5 .pht 为后缀的文件,会被当作正常的 php 文件去解析。如果没有这行配置,你上传的 webshell 是没有用的。
AddType application/x-httpd-php .php .phtml .phps .php5 .pht

Pass03-1.png

方法二

上传 .htaccess 文件。


基础知识

  • 说明:.htaccess文件是Apache服务器的一个配置文件,负责相关目录下的网页配置。

  • 作用:通过 htaccess 文件,可以帮我们实现:网页 301 重定向、自定义 404 错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。

  1. 在 http.conf 中开启 mod_rewrite 模块;在 /var/www/html 目录下开启 AllowOverride;指定 .htaccess 文件
1
2
3
4
5
6
7
8
9
10
# 开启 mod_rewrite 模块。作用:mod_rewrite 提供了基于正则表达式规则动态修改传入的请求的 URL 的方法。
LoadModule rewrite_module modules/mod_rewrite.so

# AllowOverride 从字面上解释是允许覆盖的意思,即 Apache 允许另一配置文件覆盖现有配置文件。
<Directory "/var/www/html">
AllowOverride All
</Directory>

# 在文件末尾添加,指定 .htaccess 文件
AccessFileName web.htaccess
  1. 编写 .htaccess 文件
1
2
3
<FilesMatch "webshell.png">
SetHandler application/x-httpd-php
</FilesMatch>
  1. 成功上传文件,效果如下图所示:

Pass03-2.png

方法三

抓包修改文件名

  1. 将 webshell.php 改为 webshell.png

Pass03-3.png

  1. 可以看到 webshell 上传成功

Pass03-4.png

Pass04

过滤了各种罕见后缀,但是没有过滤 .htaccess。


方法一

用 pass-03 的 .htaccess 方法即可,这里就不重复写了。

方法二

同 Pass-03 抓包修改文件名

  1. 将 webshell.php 改为 webshell.png

Pass04-1.png

  1. 可以看到 webshell 上传成功

Pass04-2.png

Pass05

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


方法一

对比 Pass04 和 Pass05 的源码,可以发现 Pass05 没有对上传的文件进行大小写转换。因此可以通过修改后缀大小写来绕过。

Pass05-1.png

Pass05-2.png

注:此方法只有在 windows 服务器中用,因为 windows 会忽略大小写。在 linux 中需要特殊配置才可使用。

方法二

抓包修改文件名

  1. 将 webshell.php 改为 webshell.png

Pass05-3.png

  1. 可以看到 webshell 上传成功

Pass05-4.png

Pass06

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


方法一

对比 Pass04 和 Pass06 的源码,可以发现 Pass06 没有对上传的文件结尾去空格。因此可以在文件末尾添加空格来绕过
Pass06-1.png

抓包修改文件名,在文件名后添加空格

Pass06-2.png

Pass06-3.png

方法二

抓包修改文件名

  1. 将 webshell.php 改为 webshell.png

Pass06-4.png

  1. 可以看到 webshell 上传成功

Pass06-5.png

Pass07

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


对比源码发现少了删除文件末尾的点的函数

1
$file_name = deldot($file_name);//删除文件名末尾的点

没有对后缀名进行去’.’处理,利用windows特性,会自动去掉后缀名中最后的’.’,上传后文件名后缀的点会被去除,所以可在抓包在后缀名后加’.’绕过

Pass07-1.png

Pass07-2.png

Pass08

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


对比源码发现缺少了去除字符串的函数

1
$file_ext = str_ireplace(‘::$DATA’, ‘’, $file_ext);//去除字符串::$DATA

Pass08-1.png

Pass08-2.png

NTFS文件系统包括对备用数据流的支持。这不是众所周知的功能,主要包括提供与Macintosh文件系统中的文件的兼容性。备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。上传.php::$DATA绕过。(仅限windows)

Pass09

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


从源码中可以看到,deldot函数删除文件名末尾的点,最后的trim函数首尾去空格,就没有了对点的处理了,所以姿势就是在文件名后面加点空格点’. .’

Pass09-1.png

Pass09-2.png

Pass09-3.png

Pass10

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


看一下源码的 str_ireplace 函数可以知道,它把符合黑名单的后缀去掉了,因此可以想一些比较奇怪的后缀,使经过这个函数之后变成我们需要的后缀。是从左往右去掉后缀,因此可以把后缀名构建为.pphphp

Pass10-1.png

Pass10-2.png

Pass11

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


关键的代码在于这里的’save_path’是一个可控的变量,但是后面还拼接上一个后缀名,也需要绕过

1
$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

这个时候可以使用%00截断,但这东西有点过气了,因为需要两个条件

  • php 版本小于 5.3.4
  • php 的 magic_quotes_gpc 为 OFF 状态

如果要完成这一个题目就必须要实现上面的两个条件,但是现在都PHP7了,这东西也就很少见了,满足上面的条件的时候php就是把它当成结束符,后面的数据直接忽略,这也导致了很多的问题,文件包含也可以利用这一点

所以如果要绕过,我们可以这样去实现,另save_path等于下面的值

1
../upload/1.php%00

Pass11-1.png

Pass11-2.png

Pass11-3.png

Pass11-4.png

Pass12

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


本关和 11 关一样,只是这一关是用 POST 方式上传文件。POST 方式不会像 get 一样自动 url 解码,所以需要手动将 %00 右键 url decode

Pass12-1.png

Pass12-2.png

Pass12-3.png

Pass13

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


这一关要求上传图片马,但是图片马是无法直接执行的。这里用到了文件包含漏洞,文件包含漏洞简单说就是,在这个include.php中需要引用其他应用程序,php中应用程序文件是.php也就是说,他本来想引用一个php文件,但是漏洞就是,他不会识别什么是php文件,只要是他引用的,他都当php来解析,所以如果他引用的是jpg,但是jpg中有图片马,那么他就相当于引用了图片马,同样的道理还会有zip马等等

图片马制作

在 cmd 下使用 copy 命令将 doge.jpg 和 webshell.php 合并成 1.jpg

copy doge.jpg/b + webshell.php/a 1.jpg

Pass13-1.png

Pass13-2.png

Pass13-3.png

注:最好使用 十几KB 的小图片来做图片马

Pass14

过滤了 .php|.php5|.php4|.php3|.htaccess 等各种罕见后缀后缀文件!


这一关同 Pass13 ,这一关就是对图片的大小和后缀做了检查。上传的jpg 变成了 jepg

Pass14-1.png

reference


文件上传漏洞 学习笔记

upload-labs刷关记录

Upload-labs 20关通关笔记

upload-labs 通关笔记

  • 本文标题:upload-labs通关笔记
  • 本文作者:9unk
  • 创建时间:2020-01-15 13:48:17
  • 本文链接:https://9unkk.github.io/2020/01/15/upload-labs-tong-guan-bi-ji/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!