upload-labs

最近一直再搞内网方面的知识,感觉自己越学越菜

拿了一个学院的后台,有文件上传,但方法都试过了,还是没法成功,编辑器也是,于是就先交edusrc,感觉自己还是对文件上传不够熟悉,把靶场操作一遍,练练手

这个靶场是upload-labs,github上有

image-20210914150226278

pass-01

第一个前端

老js脚本了

去掉checkfile()

或者禁用js都行

pass-02

对文件的类型抓包

未知的是

Content-Type: application/octet-stream

正常的是

Content-Type: image/jpeg

这个又叫mime绕过验证

pass-03

trim 移除字符串两侧的空白字符或其他预定义字符。
strrchr 来进行指定第二个参数对第一个参数的后面的截取读取

黑名单的采用

是不安全的,现在都采用白名单

限制的不全,有php5、php3、phtml等可以上传

这是需要在apahce的环境下才行

因为是php环境,所以一定要上传相关php的脚本木马才可以兼容

pass-04

通过.htaccess的攻击

因为没有过滤这个在黑名单

<FilesMatch "shana">
SetHandler application/x-httpd-php
</FilesMatch>

上传shana图片,就解析了shana.jpg

那个htaccess是指定的文件解析

还有一种全部解析为php的.htaccess

SetHandler application/x-httpd-php

只有apache有

注意靶场环境

这个.htaccess是为伪静态实现的

但也可以通过来攻击

pass-05

大小写绕过

这种只适合在win下,linux没有这个特殊的配置

pass-06

大小写,增加了当前时间和随机数的照片地址

pass-07

末尾增加空格,并且大小写同pass06

少了trim函数

pass-08

少了之前的

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

直接加在文件后.

过滤掉黑名单

并且计算机不会识别.

就变成了php文件

pass-09

少了一个检查的

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

直接在文件后加::$DATA

原理:

备用数据流允许文件包含多个数据流。每个文件至少有一个数据流。在Windows中,此默认数据流称为:$ DATA。

加了后自己就就上传取消了这个,跟空格差不多

pass-10

对于过滤的文件名的后缀只执行一次

所以可构造

chenyouxiu.php. .

从而上传

pass-11

str_ireplace是后面的参数跟前面的参数比较,如果跟前面的一样,就过滤

但还是一次的

直接
.phphpp

这个跟xss的那个绕过滤的差不多

pass-12

是个白名单

相对黑名单比较安全

substr() 函数返回字符串的一部分。

strrpos() 函数查找字符串在另一字符串中最后一次出现的位置。

$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
就是不断地对文件末尾的点进行去除

白名单使用%00截断

这个前提是

1、PHP 版本 < 5.3.4

2、php.ini 中 magic_quotes_gpc=off

image-20210914170237245

这个是get不用转换%00

因为url会自动转换

因为

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

这行的意思是

get路径然后/然后随机值加日期加文件名

%00就是把url后的截断,从而使上传的jpg变成了php的代码

pass-13

这个跟上一个不同的是请求上的

get变post了

post不会自动转化,路径在下面,直接ctrl+shift+u

然后进行

其实有两种截断在post下

可以输入%00然后ctrl+shift+u
或者hex20改为00
还可以输入+
然后在hex找到对应的目录
然后更改2b为00
同样是截断的方法

ps:还是burpsuite1.7.37好用,新的它的十六进制对%00和+有问题

pass-14

文件包含有个include的file参数进行,使用包含参数?file=xxx.jpg

然后就把图片变成php格式的了

这个是对文件头的识别

jpg,png,gif都有相关

  switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
        
1.Png图片文件包括8字节:89 50 4E 47 0D 0A 1A 0A。即为 .PNG。
2.Jpg图片文件包括2字节:FF D8。
3.Gif图片文件包括6字节:47 49 46 38 39|37 61 。即为 GIF89(7)a。
4.Bmp图片文件包括2字节:42 4D。即为 BM。

然后使用一句话木马,利用c32等16进制

还可以使用ps的文件简介的文件标题那里插入一句话

或者

copy 图片/b+地址.php 图漂片别名.jpg

然后还是上传一个图片

利用解析漏洞

image-20210914201244605

pass-15

这个高级了

使用的getimagesize的php函数

这个函数的意思就是获取图像,成功返回一个数组,返回失败产生错误

所以要是要是一个图片在加马,不能只是光加头的马

然后解析漏洞

pass-16

又来一个新的函数

exif_imagetype 获取图片信息的函数

一样文件包含

pass-17

一样

pass-18

二次渲染

这个比较不清楚

unlink函数是删除的作用

利用条件竞争删除文件时间差绕过

主要是把文件都先上传到指定的带自己当前的文件名的目录,然后判断后再进行重命名,如果占用就不会rename,所以这样就不断地访问上传的文件的图片的目录的路径的图片,然后使他无法重命名

然后利用bp的null paylaod进行放包不断,使得访问成功,并且不会重命名和判断是否是正常文件,但是这有个问题,就文件一直一会消失一会出现...很好玩

还有一个方法

还可以使用apache的解析漏洞,apache默认情况下是从后往前解析,如果后面的不对,就会接着向前,但apache不解析7z

所以还得向前

就变成了

x.php.7z
x.php

前提还是得不断发包,才行

pass-19

有两个文件

利用require_once引用了myupload.php

看翻译注释知道了这还是一个竞争上传

先检查后缀、大小、然后上传

不对就删除

对了就改名

在类中又定义了上传类型

 var $cls_arr_ext_accepted = array(
      ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
      ".html", ".xml", ".tiff", ".jpeg", ".png" );

用7z上传,就可以利用apache的解析特性来绕过

从而解析php文件

pass-20

还是黑名单

但名字需要自己命名

可以使用PHp来绕过

还可以使用截断

还可以使用php.来进行

总之各种偏僻的空格.也中

/.也行

pass-21

这个代码是白名单

然后针对jpeg,png,gif的mime检查

然后对文件填充自己输入的名字

再取.后面的后缀

并且判断是否为jpg类的格式

在进行文件的命名

还有ext=end($file)指的是对文件的最后一个元素进行存储到ext下

然后验证和allow_suffix

$file_name = reset($file) . '.' . $file[count($file) - 1];
参考
x.jpg
分为三部分
x
.
jpg
然后可以当作数组为
x[0]=x    x[1]=. x[2]=jpg
然后count就是减去一,就是二,也就是后缀jpg
其中reset指的就是第一个零数组
count($file) - 1就是第二个数组的后缀

然后就可以使用参数来进行

根据原始抓包数据知道

命名的文件叫save_name

然后更改为save_name[0]和save_name[2],为什么没有1

因为1的数组是文件的后缀,没有就为空,然后就为空

从而构造为

先用保存的文件名来绕过mime的检测

然后构造数组

image-20210914225702927

然后构造后就是ma.php空

就是ma.php

总结

实战下不知道上传的情况,因为没有源码,只能尝试,一般都是白名单,还需要不断的积累

posted @ 2021-09-14 23:47  testadm1n  阅读(202)  评论(0编辑  收藏  举报