文件上传进阶(三)值得关注的3种类型漏洞

发布时间:2024年01月18日

★★免责声明★★
文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。

0、前置说明和绕过原理

0.1、环境说明

请移步《文件上传靶场实战:upload-labs第1-3关》

0.2、一句话木马

一句话木马文件命名info.php,打印服务器相关信息的,在后面实验过程中都是同一个,源码内容如下:

<?php phpinfo();?>
0.3、路径相关知识
"./":代表当前目录
"../":代表上一层目录
"/":代表根目录
0.4、00截断原理

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

注意:一定要关闭GPC,否则无法成功。 靶场实验:Pass-11~12

0.5、图片Webshell

在服务端的PHP代码中,对于用户上传的文件做文件类型检查,查看文件格式是否符合上传规范。可以检查文件二进制格式的前几个字节,从而判断文件类型是否正确。所以可以在文件头加上GIF89A欺骗,以一句话木马为例

GIF89A
<?php phpinfo();?>

靶场实验:Pass-13

0.6、任意文件包含漏洞

在PHP中,使用include、require、include_once、require_once函数包含的文件都会被当作PHP代码执行,无论文件的名称是什么,只要符合文件内容符合PHP代码规范,都会被当作PHP代码执行。 靶场实验:Pass-13~16都有用到文件包含。

include(): 找不到被包含文件,报错,但会继续运行脚本;
include_once(): 与include()类似,区别:当重复调用同一文件时,程序只调用一次;
require(): 找不到被包含文件,报错并且停止运行脚本;
require_once(): 与require类似,区别:当重复调用同一文件时,程序只调用一次;

include_once()和require_once()这两个函数只包含一次,适用于在脚本执行期想确保只被包含一次,以避免函数重定义,变量重新赋值等问题。

当使用以上四个函数包含一个新文件时,该文件将作为PHP代码执行,PHP内核并不会在意该包含的文件是什么类型(无论是txt、图片文件还是远程URL,都会被作为PHP代码执行)。

文件包含的特征: URL参数带?page=、?file= 、?home=等,具体情况具体分析。

需要3个条件:

1、include等函数通过动态变量的方式引入需要包含的文件

2、用户能够控制该动态变量

3、被包含的文件可被访问

漏洞危害:

一旦被恶意利用会带来很大的危害,本地文件包含不仅能够包含web文件目录中的一些配置文件(比如Web应用、数据库配置文件、config文件),还可以查看到一些Web动态页面的源代码,为攻击者进一步发掘web应用漏洞提供条件,甚至一旦与路径遍历漏洞相结合,还可能直接攫取目标系统的用户名与密码等文件。并且能执行任意代码,甚至控制服务器。

防护措施:

1、 包含文件的参数过滤
① 文件名过滤:白名单或者黑名单过滤
②不使用动态变量进行包含操作,设置字典等静态处理
③文件名后缀固定

2、路径限制
①目录限制,在用户提交的变量前增加固定的路径,限制用户可调用的目录范围
②目录回退符过滤,避免回退符生效导致路径变化

3、中间件的安全配置
①PHP版本小于5.4在php.ini中设置magic_quotes_gpc=on(5.4 以后被放弃用)magic_quotes_gpc设置是否自动为GPC(get,post,cookie)传来的数据中的’"\加反斜线
②限制访问区域:php.ini中设置open_basedir来限制用户访问文件的活动范围等;apache 也有相关配置
③设置访问权限:限制当前中间件所在用户的访问权限,例如:web 服务器独立用户,并且只拥有访问目录和使用中间件的权限,从而有效避免越权访问其他文件;

4.搭建RASP阻止代码注执行

1、Pass-11

1.0、攻击思路

参数配置:magic_quotes_gpc = Off,如果修改重启一下服务,操作如图:

在这里插入图片描述

GET-%00截断,看源码保存路径是GET方式获取,使用BP拦截把info.php再加截断%00拼接上,提交内容的文件名后缀修改为.jpg欺骗过去。上传成功,获取图片路径后把info.php后的内容手动删除掉,解析成功。
在这里插入图片描述

1.1、BurpSuite拦截

在这里插入图片描述

1.2、木马解析成功

回到文件上传页面,右击新标签页面打开,把?及后面的部分删除,木马解析成功。
在这里插入图片描述
在这里插入图片描述

2、Pass-12

2.0、攻击思路

和第11关类似,只是提交方法为POST方式,使用BP拦截把info.php再加截断%00拼接上,然后用URL编码的方式把%00编码后再放包提交,原提交内容的文件名后缀修改为.jpg欺骗过去。上传成功,获取图片路径后把info.php后的内容手动删除掉,解析成功。
在这里插入图片描述

2.1、BurpSuite拦截

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

2.2、木马解析成功

回到文件上传页面,右击新标签页面打开,把?及后面的部分删除,木马解析成功。
在这里插入图片描述
在这里插入图片描述

3、Pass-13

3.0、攻击思路

编辑info.php内容,在上面加上GIF89A,并把文件后缀名修改为.jpg,文件内容如下:

GIF89A
<?php phpinfo();?>

上传成功,利用文件包含的漏洞来攻击。

3.1、文件上传

选择制作的图片木马2.jpg上传成功,访问include.php看到源码是通过GET访问参数:file方式包含里面。因此右击访问图片获取到图片的路径来拼接上。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2、木马解析成功

注意访问路径是/include.php?file=,再拼接上【图片右击打开的路径】。
在这里插入图片描述

4、Pass-14

处理方式同Pass-13,验证过是一样的。就不再重复截图了。

5、Pass-15

5.0、攻击思路

看源码提示,php配置需要开启php_exif模块,到小皮/Extensions/php/目录下找到对应版本的php.ini,打开并搜索关键字:php_exif.dll把前面的分号删除就是打开了。然后重启Apache服务
在这里插入图片描述

其他操作就跟Pass-13一样了,验证成功。

6、Pass-16

6.0、攻击思路

从源码和提示得知是图片二次渲染,先从网上下载一个可以正常上传的gif格式的图片cat.gif。为什么选择gif,jpg格式有尝试过失败,也从网上其他人测试过建议使用gif格式成功率高。使用以下命令制作图片马

# 制作图片马命令
copy cat.gif/b + info.php/a 3.gif

# info.php内容
<?php phpinfo();?>
6.1、文件上传后下载并制作木马

上传3.gif成功后,右击新标签页下载到本地,使用工具EmEditor打开发现原来在最后的一句话木马不见了,被拼接上其他内容,跟原文件cat.gif比对,找到相同编码内容部分,找一处替换成一句话木马的编码内容,注意:长度要相同,替换完后注意确认图片是否正常显示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.2、再次文件上传

用第6.1、步骤文件上传后下载并制作木马的图片再重新上传。

6.3、木马解析成功

回到文件上传页面,右击新标签页面打开,注意访问路径是/include.php?file=,再拼接上【图片右击打开的路径】。
在这里插入图片描述
在这里插入图片描述

7、资料获取

请关注我的公众号:大象只为你,回复:EmEditor,获取EmEditor工具和靶场Pass-16使用的cat.gif图片原件。git图片也可以自行百度下载。

文章来源:https://blog.csdn.net/wuqixiufen2/article/details/135685516
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。