加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

文件上传漏洞通关教程

发布时间:2022-09-30 16:00:29 所属栏目:PHP教程 来源:网络
导读: 原理:应用程序中存在上传功能,但是对上传文件没有经过合法性校验或者检验函数存在缺陷,导致攻击者可以上传木马文件到服务器application/octet-stream
pass-01:(前端js+抓包)
上传php文

原理:应用程序中存在上传功能,但是对上传文件没有经过合法性校验或者检验函数存在缺陷,导致攻击者可以上传木马文件到服务器application/octet-stream

pass-01:(前端js+抓包)

上传php文件页面提示不允许上传(前端JS过滤),

php文件上传下载系统_php 文件上传源码_PHP文件上传

查看源码发现允许上传的文件类型 ,可通过禁用JavaScript,抓包,修改js代码进行过滤

1、页面F12打开设置,勾选禁用js

上传成功

php 文件上传源码_php文件上传下载系统_PHP文件上传

2、选择允许上传格式的文件进行上传抓包,在抓包软件中进行修改后缀名

php 文件上传源码_php文件上传下载系统_PHP文件上传

放包后查看上传成功

PHP文件上传_php 文件上传源码_php文件上传下载系统

pass-02: (抓包)

通过查看源代码发现允许上传的文件格式.png.jpeg.gif)

选择通过抓包修改文件后缀进行上传

上传成功

PHP文件上传_php 文件上传源码_php文件上传下载系统

pass-03:(等价扩展名)

查看源代码,发现不允许上传php此类文件,进行抓包修改尝试

php文件上传下载系统_PHP文件上传_php 文件上传源码

提示不允许上传php文件

PHP文件上传_php 文件上传源码_php文件上传下载系统

因为代码限制全部转换为大小写,放弃使用大小写绕过,采用php1-5等多种扩展名进行尝试

PHP文件上传_php文件上传下载系统_php 文件上传源码

发现可以上传成功,但浏览器无法解析,解决方法:更换低版本php,在php.in配置文件后加入php5等。

语言

等价扩展名

asp

asa, cer, cdx

aspx

ashx, asmx, ascx

php

php2 php3 php4 phps phtml.htm.html.pht

jsp

jspx jspf

pass-04:(.htaccess)

查看源代码发现过滤了各种后缀,且转换大小写

php 文件上传源码_php文件上传下载系统_PHP文件上传

.htaccess文件上传(Hypertext Access超文本入口),也被称为分布式配置文件,提供针对目录改变配置的方法,在一个特定文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录。.htaccess可以帮我们实现包括:文件夹密码保护、用户自动重定向、自定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、只允许特定IP地址的用户、禁止目录列表,以及使用其他文件作为index文件等一些功能。

通过编辑 .htaccess文件内容为:

//代表.jpg文件会被当成.php文件来执行

SetHandler application/x-httpd-php //把文件当成php的代码来解析

上传后将一句话木马重命名为15.jpg进行上传,查看后发现发生内部错误

PHP文件上传_php 文件上传源码_php文件上传下载系统

PHP文件上传_php文件上传下载系统_php 文件上传源码

修改PHP study配置文件PHP文件上传,其他选项菜单--打开配置文件--httpd.conf,重启PHP study。

php文件上传下载系统_PHP文件上传_php 文件上传源码

将将文件内的none改为all

php文件上传下载系统_PHP文件上传_php 文件上传源码

还是不行。。。。。。。。。。

方法二:

抓包后修改后缀添加 .空格.也可以

PHP文件上传_php 文件上传源码_php文件上传下载系统

pass-05:(点空格点绕过)

没有循环验证,也就是说这些收尾去空,删除末尾的点,去除字符串::$DATA,转换为小写这些东西只是验证了一次。所以我们的绕过思路就很简单,在数据包中把后缀名改为.php. .验证过程,首先他发现有一个点,这时会把他去掉,又发现有一个空格,也会把它去掉,我们这时还有一个点,也就是.php. 由于他只是验证一次,所以不会在去掉我们的点,这时就可以上传成功,也可以解析成功

php 文件上传源码_php文件上传下载系统_PHP文件上传

查看解析文件,上传成功

php 文件上传源码_PHP文件上传_php文件上传下载系统

pass-06:(大小写绕过)

查看源码,发现过滤了后缀名和.htaccess文件,但没有过滤大小写

PHP文件上传_php文件上传下载系统_php 文件上传源码

进行后缀名大小写进行尝试,发现上传成功

php文件上传下载系统_php 文件上传源码_PHP文件上传

pass-07:(空格绕过)

查看源码发现没有对空格进行过滤

php文件上传下载系统_PHP文件上传_php 文件上传源码

抓包后修改后缀,进行上传成功

php 文件上传源码_PHP文件上传_php文件上传下载系统

查看浏览器解析

php 文件上传源码_php文件上传下载系统_PHP文件上传

pass-08: (点点绕过)

源码示例:

PHP文件上传_php文件上传下载系统_php 文件上传源码

抓包修改(此处为两个 .)

php文件上传下载系统_php 文件上传源码_PHP文件上传

解析成功

php 文件上传源码_PHP文件上传_php文件上传下载系统

pass-09: (::$DATA)

查看源代码,没有去除 ::$DATA ,抓包后在php后缀后直接添加,

PHP文件上传_php文件上传下载系统_php 文件上传源码

进行抓包修改后缀,上传成功,提示禁止访问

php文件上传下载系统_php 文件上传源码_PHP文件上传

删除php后缀::$DATA,成功解析

PHP文件上传_php文件上传下载系统_php 文件上传源码

pass-10:(点切割后缀名)

源码如下

php文件上传下载系统_php 文件上传源码_PHP文件上传

抓包修改后缀名,这里使用的是用 . 去分割后缀名

php 文件上传源码_php文件上传下载系统_PHP文件上传

文件上传成功,但无法解析,打开页面自动下载脚本文件

pass-11:(双写绕过)

查看源码,使用::$DATA,发现上传成功,但在解析时发现php后缀被注释掉了

php 文件上传源码_PHP文件上传_php文件上传下载系统

打开源码发现将符合的字符串替换为空,这里选择采用双写绕过

php文件上传下载系统_php 文件上传源码_PHP文件上传

抓包后进行修改文件后缀名,这里使用1.pphphp(注:不要与被注释的一致)

php文件上传下载系统_php 文件上传源码_PHP文件上传

解析为

php文件上传下载系统_PHP文件上传_php 文件上传源码

pass-12:(GET-截断)

查看源代码,十二关设置了白名单

PHP文件上传_php文件上传下载系统_php 文件上传源码

漏洞利用条件

截断条件:php版本小于5.3.4,php的magic_quotes_gpc为OFF状态

1、php版本小于5.3.4

2、php的magic_quotes_gpc为OFF状态(php.ini配置文件,默认on修改为off)没找到!旧版小P有

白名单判断,但$img_path是直接拼接,因此可以利用截断绕过。

这里应该选择选择php文件进行上传截断,

php文件上传下载系统_PHP文件上传_php 文件上传源码

进行抓包,在路径中添加1.php进行截断,并修改上传的文件后缀为白名单中(这里的文件名要与上传的文件图片名一致)

php 文件上传源码_PHP文件上传_php文件上传下载系统

修改Content-Type:image/jpeg,可以上传图片jpg文件,显示上传成功,复制右侧文件路径,如果直接放包,在地址栏12.php后的东西删掉即可。

php文件上传下载系统_PHP文件上传_php 文件上传源码

解析成功

PHP文件上传_php文件上传下载系统_php 文件上传源码

pass-13: (POST-截断)

基本操作与上个类似,只是需要对进行URL编码( 截断在 GET 中被 url 解码之后是空字符,

但是在 POST 中 不会被 url 解码,)

php 文件上传源码_php文件上传下载系统_PHP文件上传

url编码:

上传成功,复制文件路径进行查看

php 文件上传源码_PHP文件上传_php文件上传下载系统

上传成功

PHP文件上传_php文件上传下载系统_php 文件上传源码

pass-14: (图片马)

(注!!!!!:此处php版本改为5.4.45)

getimagesize()函数将测定任何GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。函数成功返回的就是一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

图片马制作:

创建一个txt文件,内容一句话木马:

在随便选找一个图片文件,打开cmd进行图片马制作:

copy 做木马的图片/b + 一句话木马文件(php/txts后缀) 生成的图片名.jpg

php文件上传下载系统_php 文件上传源码_PHP文件上传

(原图)

php 文件上传源码_PHP文件上传_php文件上传下载系统

(做好的图片马)

浏览上传,成功后复制图片链接,点击文件包含漏洞进行查看

php 文件上传源码_PHP文件上传_php文件上传下载系统

输入图片地址(注意要加 ?file=文件所在路径)

php文件上传下载系统_php 文件上传源码_PHP文件上传

pass-15:(图片马)

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

PHP文件上传_php文件上传下载系统_php 文件上传源码

所以这关还是用和14关一样的方法,生成带有php代码的图片上传,配合包含漏洞拿下此关。

pass-16:(打开php_exif)

第16关同14,15关思路一样,操作一样。但是需要打开php_exif

php 文件上传源码_PHP文件上传_php文件上传下载系统

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

php 文件上传源码_php文件上传下载系统_PHP文件上传

本函数可用来避免调用其它 exif 函数用到了不支持的文件类型上或和 $_SERVER['HTTP_ACCEPT'] 结合使用来检查浏览器是否可以显示某个指定的图像。

然后直接上传图片马,打开查看

php 文件上传源码_PHP文件上传_php文件上传下载系统

php 文件上传源码_php文件上传下载系统_PHP文件上传

pass-17:(二次渲染)

第十七关主要是把二次渲染绕过 imagecreatefromjpeg()函数

二次渲染是由Gif文件或 URL 创建一个新图象。成功则返回一图像标识符/图像资源,失败则返回false,导致图片马的数据丢失,上传图片马失败。

php文件上传下载系统_PHP文件上传_php 文件上传源码

这里推荐使用gif格式文件进行测试

php 文件上传源码_PHP文件上传_php文件上传下载系统

(原图)

进行图片马制作,然后进行上传,上传后下载下来使用WinHex进行图片对比,查看没有被修改的地方(尽量多的地方)然后输入一句话木马(此处已修改完!!!原来一样)

php 文件上传源码_php文件上传下载系统_PHP文件上传

将修改好的保存后上传改后的gif文件,查看解析

php文件上传下载系统_PHP文件上传_php 文件上传源码

注意输入的语句,正常打开是乱码,因为输入的是一句话木马不是探针文件,F12打开Hackbar

勾选Post data 输入探针语句,php版本页面显示

PHP文件上传_php 文件上传源码_php文件上传下载系统

php文件上传下载系统_php 文件上传源码_PHP文件上传

pass-18:(条件竞争)

我们看代码他是先将图片上传上去,才开始进行判断后缀名、二次渲染。如果我们在上传上去的一瞬间访问这个文件,那他就不能对这个文件删除、二次渲染。这就相当于我们打开了一个文件,然后再去删除这个文件,就会提示这个文件在另一程序中打开无法删除。

从源码来看的话,服务器先是将文件后缀跟白名单做了对比,然后检查了文件大小以及文件是否已经存在。从源码来看,服务器先是将上传的文件保存下来,然后将文件的后缀名同白名单对比,如果是jpg、png、gif中的一种,就将文件进行重命名。如果不符合的话,unlink()函数就会删除该文件。所以我们可以上传1.php只需要在它删除之前访问即可,这个也就叫做条件竞争上传绕过。

直接上传php文件进行抓包,将抓包发送到Intruder

PHP文件上传_php文件上传下载系统_php 文件上传源码

进入后选择positions,点击clear,

php文件上传下载系统_php 文件上传源码_PHP文件上传

然后进行修改

php 文件上传源码_php文件上传下载系统_PHP文件上传

进一步设置线程

php文件上传下载系统_php 文件上传源码_PHP文件上传

然后点击发包,打开另一个浏览器访问上传文件的所在路径(你不会找不到吧),不停的刷新,直到访问到

php文件上传下载系统_php 文件上传源码_PHP文件上传

php 文件上传源码_php文件上传下载系统_PHP文件上传

方法二:

1、创建x.php文件 内容为:

php文件上传下载系统_php 文件上传源码_PHP文件上传

2、上传x,php,并抓包

php 文件上传源码_PHP文件上传_php文件上传下载系统

3、右击转发到 intruder

php 文件上传源码_php文件上传下载系统_PHP文件上传

4、点击第二个标签 Positions 点击右侧 clear$按钮

PHP文件上传_php文件上传下载系统_php 文件上传源码

php 文件上传源码_php文件上传下载系统_PHP文件上传

5、点击第三个标签Payloads 打开列表 Payload type 选择 null payloads

PHP文件上传_php 文件上传源码_php文件上传下载系统

5点击第四个标签Options 修改线程数Number of threads 为20

6、然后点击 start attack 开始 无限上传

PHP文件上传_php文件上传下载系统_php 文件上传源码

7、执行.py文件来判断是否上传成功

import requests
url = "http://127.0.0.1/upload/upload/x.php"
#这里的IP地址为目标IP,路径为上传文件的准确路径,
#否则上传不成功,这里的ma.php是上面的木马文件
while True:
    html = requests.get(url) #获取请求的URL地址
    if html.status_code == 200: #代码200代表上传成功
        print("OK")  #成功后显示OK
        break
    else:
        print("NO")  #不成功显示ON

8、在执行 start attack时同时执行.py文件进行判断

9、.py·文件运行后 显示OK 后表示可能会上传成功 ,打开文件夹upload 如果真的上传成功文件则会生成一个shell.php 然后输入目标文件地址 成功访问到php网页

php 文件上传源码_PHP文件上传_php文件上传下载系统

PHP文件上传_php文件上传下载系统_php 文件上传源码

pass-19:(条件竞争)

第十九关的上传路径有点问题,不是上传到了upload里面,建议修改一下,进入第十九关,找到myupload.php文件,如图所示修改。 然后重启就可以了。

PHP文件上传_php文件上传下载系统_php 文件上传源码

这关是检查了后缀名,然后上传,然后在进行二次渲染。这时我们只能上传图片马,而且得配合解析漏洞进行通关

PHP文件上传_php文件上传下载系统_php 文件上传源码

如果觉得麻烦可以写一个python代码,进行跑脚本

import requests

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!