upload-labs基础关卡

# Pass-01

# 过程

第一关,通常随便传把哈哈哈

来个 php 一句话

1
2
3
<?php
@eval($_POST['hqxx']);
?>

哦豁,弹窗提示了:该文件不允许上传,请上传.jpg|.png|.gif 类型的文件,当前文件类型为:.php

弹窗提示,没有发请求包,说明是前端验证了,那就去找 js 验证代码,干掉他

方法 1:Ctrl+F 找哪个标签用了这个函数,删掉它,然后点击上传

方法 2:复制 checkFile 函数,将.php 类型加进白名单,在控制台输入运行后点击上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function checkFile() {
var file = document.getElementsByName('upload_file')[0].value;
if (file == null || file == "") {
alert("请选择要上传的文件!");
return false;
}
//定义允许上传的文件类型
var allow_ext = ".jpg|.png|.gif|.php";
//提取上传文件的类型
var ext_name = file.substring(file.lastIndexOf("."));
//判断上传文件类型是否允许上传
if (allow_ext.indexOf(ext_name) == -1) {
var errMsg = "该文件不允许上传,请上传" + allow_ext + "类型的文件,当前文件类型为:" + ext_name;
alert(errMsg);
return false;
}
}

上传后通过查看器得到文件路径

上菜刀

菜刀没上去,上蚁剑

# 总结

在控台运行函数的方法,我还是一个月之前才知道的(别说 de),明明很容易想到或者尝试到的点…

感觉还是要脑洞大一点,多尝试一些

# Pass-02

date:2020-11-25 22:01:47

# 过程

通过查看器,找到前端的 onsubmit 事件,但是删除后,还是判定文件类型不正确

并没有在前端看见 js 代码,应该是后台判断了

看一下提示:本 pass 在服务端对数据包的 MIME 进行检查!

上传文件,bp 抓包,更改 MIME 类型为 image/png,同时得到路径

上蚁剑连接即可。

# 总结

真百度了好多次了,每次都忘记

“MIME 的全称是 Multipurpose Internet Mail Extensions, 即多用途互联网邮件扩展类型。 这是 HTTP 协议中用来定义文档性质及格式的标准。

文件类型 后缀 数据包中的文件类型
超文本标记语言文本 .html text/html
xml 文档 .xml text/xml
普通文本文档 .text text/plain
RTF 文本 .rtf application/rtf
PDF 文档 .pdf application/pdf
Miscrosoft Word 文件 .word application/msword
PNG 图像 .png image/png
GIF 图形 .gif image/gif
JPEG 图形 .jpeg,.jpg image/jpeg
任意的二进制数据 application/octet-stream

# Pass-03

date:2020-11-25 22:53:30

# 过程

不废话直接传 php 上爆破抓包,send to repeater

根据上传 php 文件后的提示,非常有理由认为后台设置了后缀的黑名单

大小写绕过,没绕过去,空格绕过去了但是不解析,那既然是黑名单,就把后缀改成 php4 呗

上蚁剑连接的时候,脚本改成 php4 类型的就可以了

# 总结

据说,空格可以那啥,windows 会忽略空格和点,可是我上传成功不能解析

然后 00 截断上传,右键看源代码是我的一句话,后来查了一下截断上传的条件:

  1. php 版本小于 5.3.29
  2. magic_quotes_gpc = Off

# Pass-04

date:2020-11-25 23:03:25

# 过程

提示:

本 pass 禁止上传.php|.php5|.php4|.php3|.php2|php1|.html|.htm|.phtml|.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 后缀文件!

看了下源码空格大小写啥的,都被弄了

但是没有过滤.htaccess 后缀

要启用.htaccess,要更改 httpd.conf

1
2
AllowOverride None 
更改为:AllowOverride All

去掉框住这行的注释符号

上传.htaccess,所有文件都会解析为 php

1
SetHandler application/x-httpd-php

然后上传 hqxx.png 图片马

1
<?php phpinfo(); ?>

题目也给了路径了,地址栏直接输入就行

# 总结

我最后也没把.png 解析 php 成功

在.htaccess 里面随便输错误字符,报 500,去看 apache 的日志说我输入的错误字符不对,说明我上传的.htaccess 文件是被解析了的

把 httpd.conf 里面所有的 AllowOverride None 都改成了 AllowOverride All,重写模块也开了,文件路径也没有问题,php 版本也调低了,phpstudy 也重启了,但永远就是这样:

我觉得应该还是配置文件的问题,可是到底是哪里出了问题啊!!!

而后修改 htaccess 为,把文件名包含 hqxx 的文件全部以 php 解析:

1
2
3
<FilesMatch "hqxx" >
SetHandler application/x-httpd-php
</FilesMatch>

发现 a.php 可以解析成功,而 hqxx.php 不能解析,我真真真呵呵了

找了好久终于发现有一个人和我一样的问题了,哭唧唧

谢谢大哥

在新版中 php 环境默认都是带 nts 的,而在旧版本中则可以选择不带,选一个不带 nts 的 php 版本就可以正常玩了,但是我的 phpstudy 里的 php 全是带 nts 的,谢谢您了

  1. .htaccess 上传漏洞

    漏洞形成条件

    • apache 服务器
    • 能够上传.htaccess 文件,一般为黑名单限制。
    • AllowOverride All,默认配置为关闭 None。
    • LoadModule rewrite_module modules/mod_rewrite.so #模块为开启状态
    • 上传目录具有可执行权限。
  2. .htaccess 文件 (或者 "分布式配置文件"), 全称是 Hypertext Access (超文本入口)。

    概述来说,htaccess 文件是 Apache 服务器中的一个配置文件,它负责相关目录下的网页配置。

    启用.htaccess,需要修改 httpd.conf,启用 AllowOverride,并可以用 AllowOverride 限制特定命令的使用。

    .htaccess 的主要作用就是实现 url 改写,也就是当浏览器通过 url 访问到服务器某个文件夹时,作为主人,我们可以来接待这个 url,具体地怎样接待它,就是此文件的作用。

    .htaccess 使用方法介绍

# Pass-05

# 过程

看源码,已经不让上传.htaccess 了,但是这次没有把后缀名全转成小写了,也就是说嘿嘿嘿

上传 hqxx.phP

1
<?php phpinfo(); ?>

上传成功,地址栏直接输入路径

# 总结

我把 apache 玩崩了,重装都不行,换了 Nginx 哈哈哈

顺便查了下 nginx 用 htaccess 的方法,想看点我

# Pass-06

# 过程

看源码,依然是黑名单

并且将后缀名全部转换为小写了,但是空格啥的没去除了

在文件名末尾加一个空格上传

解析成功

# 总结

利用 Windows 特性 在 Windows 中文件后缀名末尾有空格会自动去掉

# Pass-07

# 过程

看源码,转换了大小写,去除了首位空格

那就在文件末尾加。呗

上传成功,解析成功

# 总结

下一题

# Pass-08

# 过程

上传 hqxx.php::DATA

# 总结

利用 windows 特性:

必须是 windows, 必须是 php, 必须是那个源文件
php 在 window 的时候如果文件名后加上 "::$DATA"

会把 "::$DATA" 之后的数据当成文件流处理,不会检测后缀名

且保持 "::$DATA" 之前的文件名

他的目的就是不检查后缀名

改源代码测试了一下,其实和。空格是一样的,就是利用 windows 特性绕过黑名单,上传到文件夹时,文件后面的 "::DATA…" 已经被去掉了

# Pass-09

# 过程

看提示:本 pass 只允许上传.jpg|.png|.gif 后缀的文件!

看了源码发现,你这个骗子,明明还是黑名单,下次不看提示了

看源码:先删除了末尾的点,然后去掉了::$DATA,后缀转成了小写,最后去除首尾空格

那就 hqxx.php. .

这样最后在末尾就留下了一个点,上传成功

# 总结

跟着代码逻辑走~,可是黑盒都看不到源代码唉

# Pass-10

# 过程

哈哈哈,源代码注释没了

先去除文件名中的所有空格,再把文件名中所有在黑名单中存在的字符置空

那么就,双写,成功绕过

# 总结

下一题

# Pass-11

# 过程

观摩源代码,发现是白名单,允许的类型有’jpg’,‘png’,‘gif’,而且还给文件重命名了

上传 php 抓包发现 save_path=…/upload

源码中文件保存路径就是 $img_path = GET[savepath]."/".rand(10,99).date("YmdHis")."."._GET['save_path']."/".rand(10, 99).date("YmdHis").".".file_ext;

用 00 截断,在路径后面加上 hqxx.php%00

# 总结

通过字符拼接,连接路径文件名,后台处理后上传到 windows 时,os 看见 %00 自动截断

00 截断的前提条件:PHP 版本小于 5.3.4,PHP 的 magic_quotes_gpc 为 OFF 状态

move_uploaded_file 函数的底层实现类似于 C 语言,遇到 0x00 会截断

# Pass-12

# 过程

上传文件抓包,发现路径也在表单中了,在后面加上 /hqxx.php ,注意后面有一个空格

因为 post 请求没办法解析 %00,所以我们在 hex 中更改数据包

找到对应行,代表空格的 20,改为 00

上传成功

# 总结

为啥网上有人说这是二进制代码,可是这明明不是二进制啊

通常 JPEG/JPG: FF D8 , PNG:89 50,GIF:47 49

  1. JPEG;.JPE;.JPG,”JPGGraphic File”
  2. gif,”GIF 89A”
  3. zip,”Zip Compressed”
  4. doc;.xls;.xlt;.ppt;.apr,”MS Compound Document v1 or Lotus Approach APRfile”

# Pass-13

# 过程

源代码中读取文件前 2 字节,来判断文件类型是否属于 jpg、png 或者 gif 类型

类型判断成功后,还更改了文件名

这里用文件包含来解析图片马

手动在 upload 文件夹添加一个文件包含的 php

然后浏览器解析

# 总结

unpack () 函数从二进制字符串对数据进行解包。

也就是说本身没有文件包含漏洞的话这个图片马是没有办法解析的,唉

# Pass-14

# 过程

看源码,换了一种方式验证类型

getimagesize () 这个函数功能会对目标文件的 16 进制去进行一个读取,去读取头几个字符串是不是符合图片的要求的

所以还是伪造一个头部信息,上传图片马

图片马的利用可以结合文件包含,解析漏洞等… 反正就是要把他用 php 解析嘛

比如,nginx 解析漏洞,和版本无关,属于用户配置不当产生的

# 总结

菜鸟教程

getimagesize () 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

实例 1:本地图片文件

1
2
3
4
5
6
<?php
list($width, $height, $type, $attr) = getimagesize("runoob-logo.png");
echo "宽度为:" . $width;
echo "高度为:" . $height;
echo "类型为:" . $attr;
?>

以上实例输出结果为:

1
宽度为:290高度为:69类型为:3属性:width="290" height="69"

实例 2:远程图片文件

1
<?php$remote_png_url = 'http://www.runoob.com/wp-content/themes/w3cschool.cc/assets/img/logo-domain-green2.png';$img_data = getimagesize($remote_png_url);print_r($img_data );?>

以上实例输出结果为:

1
Array(    [0] => 290    [1] => 69    [2] => 3    [3] => width="290" height="69"    [bits] => 8    [mime] => image/png)

返回结果说明

  • 索引 0 给出的是图像宽度的像素值
  • 索引 1 给出的是图像高度的像素值
  • 索引 2 给出的是图像的类型,返回的是数字,其中 1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF (intel byte order),8 = TIFF (motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
  • 索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的 标签
  • 索引 bits 给出的是图像的每种颜色的位数,二进制格式
  • 索引 channels 给出的是图像的通道值,RGB 图像默认是 3
  • 索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如: header (“Content-type: image/jpeg”);

# Pass-15

# 过程

使用 exif_imagetype () 检查是否为图片文件

用图片马进行绕过

但是还得帮 php 安装 exif.so 扩展库

上传成功

# 总结

exif_imagetype ( string $filename ) : int exif_imagetype() 读取一个图像的第一个字节并检查其签名。

# Pass-16

# 过程

看源码,判断了后缀,然后利用 imagecreatefrompng () 等函数创建图片,同时也利用这个函数判断图片类型是否一致了,然后再重命名文件

依然用图片马绕过,但是简单的在文件前加入 GIF89a 已经不可

那就把图片和木马合在一起叭,cmd 执行以下命令

1
copy pig.jpg/b +  a.php/a haha.jpg

再上传 haha.jpg

往下翻可以看到木马被插在了图片的中间

# 总结

过过过

# Pass-17

# 过程

看源码,是先上传文件移动到 upload 文件夹后,再对后缀进行判断,判断允许后重命名文件再删除原来的文件,否则直接删除文件

那就搞文件竞争,在上传文件和删除文件之间的时间,进行访问上传的文件,并且通过上传的文件创建新的木马

利用 py 脚本不断访问上传的 haha.php

1
import requestswhile True:    requests.get('http://www.upload-labs.com/upload-labs/upload/haha.php')

然后运行 request.py

然后不断点击发包

上传成功

# 总结

抄作业的感觉,唉

# Pass-18

# 过程

源代码中,先检查了后缀,大小等等,再上传,再重命名

它检查后缀用的白名单,所以试一下截断➕竞争

想法很美好,现实很骨感,看报错信息,是卡在文件名后缀上了

所以直接和之前一样上传图片马哈哈哈

再用文件包含之类的配合…

# 总结

世上无难事只要肯放弃

值得注意的是这里也可以将 php 文件后缀名更改为.php.7z,因为白名单中允许上传.7z 的文件,但是 apache 又不能解析这个格式,所以会把该文件当 php 的格式解析

# Pass-19

# 过程

可以自定义名称

上传 a.php

自定义名称 haha.php.

因为用的黑名单,上传成功

大小写都能绕哈哈哈

# 总结

哈哈哈