文件上传漏洞20关通关方法

文章详细介绍了在靶场环境中如何通过多种方法绕过前端校验、Content-Type限制、黑名单过滤、.htaccess配置、大小写过滤、点字符利用、::DATA流、点空格点、双写后缀、%00截断、GET与POST参数处理、图片马、getimagesize与exif_imagetype检测、二次渲染及条件竞争等上传漏洞防御机制,展示了渗透测试中的技巧和策略。
摘要由CSDN通过智能技术生成

通关攻略
靶场通关
先准备一个shell.php文件
在这里插入图片描述

Pass-01(前端校验)
当直接上传php文件时,页面进行了弹窗
在这里插入图片描述

方法:浏览器禁止JS

1.对于chrome浏览器,设置–隐私设置和安全性–JavaScript

2.刷新页面,上传shell.php文件

image-20220817114357674

3.复制图片地址进行打开

在这里插入图片描述

mage-20220817114456559

Pass-02(Content-Type)
知识点

Content-Type用于定义网络文件的类型和网页的编码,决定浏览器将以什么形式、什么编码读取这个文件

Content-type 标头告诉客户端实际返回的内容类型

常见的媒体格式类型:

text/html : HTML格式
text/plain :纯文本格式
text/xml : XML格式
image/gif :gif图片格式
image/jpeg :jpg图片格式
image/png:png图片格式
通关

1.同样先上传shell.php文件,提示为文件类型不正确
在这里插入图片描述

2.通过Burp抓取shell.php的上传流量

在这里插入图片描述

4.上传成功,访问图片地址
在这里插入图片描述
在这里插入图片描述

Pass-03(黑名单)
知识点-php扩展名

默认状态下.php3,.php4,.php5,.phtml 都是会被解析为php
能被解析的文件扩展名列表:
jsp jspx jspf
asp asa cer aspx
php phtml php3 php4 php5
exe exee
通关

1.上传php文件后,提示不允许上传.php后缀文件
在这里插入图片描述

2.将.php后缀修改为.phtml后缀

在这里插入图片描述

3.上传成功,访问图片地址

image-20220817114850698

提示

当上传的phtml没有解析时

在phpstudy中,其他选项菜单–打开配置文件–http-conf
在这里插入图片描述

将#号去掉,就可以解析phtml文件为php文件

image-20220817114920843

保存文件,重启phpstudy即可

Pass-04(.htaccess文件)
知识点

.htaccess文件–>分布式配置文件

提供了针对目录改变配置的方法,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于次目录及其所有子目录

.htaccess的功能:

可帮助我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、禁止目录列表等一些功能

靶场

1.用编辑器将下列指令写入.htaccess文件中

AddType application/x-httpd-php .png

指令表示 .jpg文件会当做php来解析

在这里插入图片描述

2.先上传.htaccess文件

在这里插入图片描述

3.将木马文件的php后缀修改为jpg后缀,进行上传,打开图片
在这里插入图片描述

Pass-05(大小写)
从给出的提示来讲,过滤了很多后缀,但是仔细观察没有过滤PHP

image-20220817115057515

故修改文件后缀PHP,上传成功,访问图片地址

在这里插入图片描述
在这里插入图片描述

Pass-06(空格)
通过观察源代码,文件上传后的大致流程为:

获取上传的文件名
删除文件名末尾的.
返回最后一次小数点出现的位置到字符串结束之间的字符
转换大小写
去除字符串::$DATA
故可以构造payload

a.php+空格
a.php+空格=>.php+空格
对于黑名单而言 a.php+空格与a.php是不一样的
但对于Windows,a.php+空格与a.php是一样的
1.上传php文件后通过burp抓包,在后缀php后面添加一个空格
在这里插入图片描述

2.访问图片地址

image-20220817115211392

Pass-07(点)
利用strrchr()函数绕过,strrchr()函数:查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

1.上传php木马文件,抓包将php文件后缀处多加一个.

在这里插入图片描述

2.访问图片地址

image-20220817115211392

Pass-08(:: D A T A ) 1. : : DATA) 1.:: DATA1.::DATA Windows文件流

对于Windows而言

a.php 与a.php::$DATA 是一样的

但是对于黑名单检测来讲是不一样的

2.将PHP上传,抓包修改php文件后缀

image-20220817115301885

3.访问图片地址后显示 访问时将文件后缀名 ::$DATA后缀删除即可

image-20220817115211392

Pass-09(点空格点)
1.关键函数

image-20220817115337542

大致流程

获取上传文件名
删除文件名末尾的点
返回最后一次点出现的位置到字符串结束之间的字符串
转换为小写
去除字符串::$DATA
首尾去空
构造payload

构造函数名:a.php.空格.
删除文件名末尾的点:a.php.空格
返回最后一次点出现的位置:.空格
转换小写、去除::$DATA、首尾去空: .
最后文件名为a.php. 在Windows中,文件名最后的点可以被自动忽略

2.上传文件,修改文件后缀名
在这里插入图片描述

3.访问上传后的图片地址
image-20220817115211392

Pass-10(双写)
1.主要利用点为str_ireplace() 函数

str_ireplace() 函数:替换字符串中的一些字符(不区分大小写)

如果上传文件名中出现了黑名单中的后缀名就会将后缀名替换为空

2.构造payload:.phphpp –> .php

3.,修改上传的文件后缀名
在这里插入图片描述

4.访问上传后的图片地址
image-20220817115211392

Pass-11(%00截断)
环境准备

php版本低于必须为5.2.x
php.ini配置中magic_quotes_gpc = Off
关键代码

在这里插入图片描述

函数:

strrpos():查找字符串在另一字符串中最后一次出现的位置
substr():返回字符串的一部分,substr(string,start,length)
in_array():搜索数组中是否存在指定的值
substr( F I L E S [ ′ u p l o a d f i l e ′ ] [ ′ n a m e ′ ] , s t r r p o s ( _FILES['upload_file']['name'],strrpos( FILES[uploadfile][name],strrpos(_FILES[‘upload_file’][‘name’],“.”)+1); //获取上传文件名的后缀名
代码大致流程:

大概意思为 截取上传文件的后缀名,如果符合ext_arr数组,将会把文件移动到指定目录并且进行重命名操作
如果文件的后缀名不再ext_arr数组中,会提示上传失败

url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束

1.抓取数据包,上传的是shell.php,但是抓包时要改为png或者jpg等图片格式,在改upload存储路径,用%00隔开

在这里插入图片描述

2.访问图片链接 直接访问shell.php
image-20220817115211392

Pass-12(%00截断)
与Pass11大致相同,只不过是GET传参,改为了POST

URL编码==》16进制编码

GET会对URL编码(16进制)进行解码

POST并不会对16进制进行解码

可以使用burp抓包工具改16进制

1.抓取文件上传包

image-20220817115632430

2.在Hex中修改a的16进制为00
在这里插入图片描述

3.修改后

image-20220817115701326
上传成功
在这里插入图片描述

4.访问图片地址
在这里插入图片描述

Pass-13(图片马)
图片马

一句话木马和图片 结合在一起

1.制作图片马

cmd命令:copy

image-20220817115726699

2.以16进制方式打开2.png

在这里插入图片描述

注意:由于图片马的使用场景问题,故只要我们上传的图片马上传成功,下载到本地后,一句话木马依然存在,则算通关

3.上传图片马,上传成功

在这里插入图片描述

4.访问图片地址

在这里插入图片描述

.jpg/.gif的制作方式和png相同

Pass-14(getimagesize)
关键代码

在这里插入图片描述

getimagesize获取图像信息

1.使用上一关的图片马进行上传

image-20220817115803056
注意,此关需要用png图片木马

2.访问图片地址

在这里插入图片描述

Pass-15(exif_imagetype)
关键代码

image-20220817115853265

exif_imagetype函数:判断一个图像的类型
需要开启php_exif模块
在 php.ini配置文件去掉;
重启phpstudy

1.使用上一关的图片马,上传成功

image-20220817115902123

2.访问图片地址

在这里插入图片描述

Pass-16(二次渲染)
代码部分

image-20220817140805160

二次渲染–后端重写文件内容

basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名
strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像
imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像
imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像
1.二次渲染 通常用gif绕
木马写在 GIF图片中间空白处
在这里插入图片描述

2.上传成功

image-20220817142454807

Pass-17(条件竞争)
1.关键代码

image-20220816110903550

大致流程:先上传,再检测,重命名,不符合条件则unlink删除文件

2.先上传普通图片,获取文件路径

http://127.0.0.1/xxx/upload/2420230225150906.png

3.既然是先上传后检测,则再文件被删除之前生成一个新的文件即可

先上传一句话木马.php,再443.php删除之前,访问到443.php,利用PHP中file_put_contents()函数,把一个字符串写入文件中

在这里插入图片描述

4.上传443.php文件并且抓取到,放到跑包模式中

在这里插入图片描述

再抓取访问443.php的包,同样放到burp跑包模式中
在这里插入图片描述

6.两个数据包同时进行null payload 跑包

在这里插入图片描述

7.访问成功
在这里插入图片描述

Pass-18(二次竞争)
关键代码

image-20220816122709607

逻辑顺序

1、服务器先将文件与白名单作对比

2、检查大小看文件是否已经存在

3、再进行重命名

保存到重命名之间,会有一段时间差

在这段时间内,文件还是能被访问到的,并被解析执行

于Pass-17相同操作

Pass-19(黑名单检测)
关键函数

image-20220816141452411

move_uploaded_file() 函数把上传的文件移动到新位置。

如果成功该函数返回 TRUE,如果失败则返回 FALSE。

对上传的文件,没有任何检测,但对其保存的文件名进行检测

1.构造木马文件shell.php
在这里插入图片描述

2.使用.绕过,使用Burp抓取上传的数据包

在这里插入图片描述

3.访问图片地址
在这里插入图片描述

Pass-20(白名单检测)
关键代码

在这里插入图片描述

三目运算符:(expr1) ? (expr2) : (expr3); 如果条件expr1 成立,执行expr2,否则执行expr3;
explode() 函数:把字符串打散为数组
end()函数:删除数组中最后一个值
count()函数:统计数组个数
reset()函数:将内部指针指向数组中的第一个元素,并输出
可使用 数组绕过

1.抓取数据包,改包,用%00截断

在这里插入图片描述

2.上传成功,

image-20220816152512605

3.访问图片地址

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值