文件上传upload-labs

yang-ace / 2024-04-26 / 原文

文件上传upload-labs

相关函数

  • move_upload_file(file,newloc)、

file:要移动的文件

newloc:规定文件的位置

将上传的文件移动到新位置

通过HTTP POST 上传文件

如果目标文件已存在,则会被覆盖

  • unlike(file)

删除文件

  • in_array(search,array)

search:规定在数组中搜索的值

array:数组

搜索数组中是否存在指定的值

  • pathinfo

以数组形式返回文件路径信息,可以提取后缀,但存在绕过风险

explode()

  • 将字符串打散成数组

reset(array)

  • 返回数组中第一个元素并输出

empty()

  • 检查变量是否为空

count(array)

  • 返回数组中元素的数目

Pass-01(前端JS绕过/客户端校验绕过)

Tips:
查看网页源代码是否有限制的js代码,点击上传后直接弹框提示,但是没有发送数据包,即用了客户端认证方法

image-20240425102207892

方法:

删掉前端jscheck函数

image-20240425101418978

开启火狐插件过滤前端上传

image-20240425101636786

bp修改文件后缀上传

Pass-02(MIME绕过)

bp抓包修改MIME类型

image-20240425102440252

  • 源码分析

服务器对文件的扩展进行了判断

image-20240425102721167

Pass-03(黑名单绕过)

查看源码黑名单

image-20240425105233149

服务器需对绕过的文件进行解析,其apache配置文件httpd.conf中有如下配置(这里为了演示手动添加!)

重启服务

image-20240425104654408

修改后缀phtml上传成功

image-20240425105102823

Pass-04(黑名单绕过 .htaccess攻击)

黑名单限制大部分后缀文件

image-20240425105445085

由于上传的文件名未经过处理,这里使用.htaccess文件攻击

Tips:
.htaccess:apache服务器配置文件,负责相关网页针对目录下的配置,即在一个特定目录下放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。

先上传.htaccess文件

SetHandler application/x-httpd-php

在上传木马bp修改后缀名png上传成功解析

Pass-05(黑名单绕过 大小写文件名混淆)

与上一关相比,将.htaccess添加到黑名单里,并且没有大小写转换

image-20240425113353084

抓包修改成大写

image-20240425181814312

Pass-06(黑名单绕过 后缀双写逻辑绕过)

较上关多了转换小写

image-20240425181759732

利用双写点与空格绕过

image-20240425182009647

Pass-07(黑名单绕过 填点绕过)

源码

image-20240425182233666

抓包

image-20240425182341580

Tips:
利用windows下文件后添加的.会自动忽略

Pass-08(黑名单绕过 Win文件流特性绕过)

看源码

image-20240425182723176

Tips:
采用windows流特性绕过,在这里意思是php运行在windows上+"::DATA"会把::DATA之后的数据当作文件流处理,不会检测后缀名,且保持"::$DATA"之前的文件名,目的即使不检查后缀名

上传php文件,修改文件后缀添加::$DATA

image-20240425183350576

Pass-09(黑名单绕过 点空格点代码逻辑绕过)

看代码,黑名单严格,删除文件名末尾点,大小写转换,去除字符串,首尾去空

image-20240425183631842

绕过方法:

Tips:
代码逻辑绕过(这里代码逻辑先删除文件名末尾点,再首尾去空都只进行一次,因此可构造点空格绕过,利用windows特性)

抓包修改

image-20240425184003032

Tips:
目标服务器是windows皆可用此方法绕过

Pass-10(黑名单绕过 双写绕过)

上传,正常,文件被切掉后缀

image-20240425185729976

查看源码

image-20240425185927381

绕过方法:

str_ireplace()函数不区分大小写,因此不适用大小写,使用双写文件名绕过

image-20240425190432492

Pass-11(白名单绕过 00截断GET型绕过)

看源码

image-20240425191004744

构造文件存储路径使用get传入,导致服务器最终存储文件名可控

绕过方法:使用00截断绕过

条件:

php版本<5.3.4
php.ini的magic_quotes_gpc为OFF
所以我们要设置下小皮

php扩展及设置---参数开关设置---把magic_quotes_gpc关闭

版本切换成5.3.29

image-20240425200459445

Pass-12(白名单绕过 00截断POST型绕过)

post差别是post不会自行解码,我们需要对%00编码,

image-20240425200815731

Pass-13(图片马+文件包含绕过)

制作图片马

test.php内容

<?php @eval($_POST[1]); phpinfo();?>

image-20240425204728537

image-20240425204741229

不在桌面cmd使用copy都不会报错

使用010查看

image-20240425204853289