文件包含漏洞原理与实践

一、什么是文件包含漏洞?
文件包含漏洞常出现在「PHP语言」中。

PHP为了提高「代码复用性」,提供了文件包含函数 include() 和 require(),被包含的文件内容会被当做代码来执行。

就像造轮子一样:把「重复使用」的一段代码,单独写到一个文件里,再用文件包含函数来包含这个文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mzN1gTTa-1677309377365)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162706744.png)]

为了灵活的包含文件,一些程序员会把文件名通过「参数」的形式传递给文件包含函数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FvLOTsLz-1677309377366)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162722817.png)]

当传递文件名的参数可以被用户「修改」时,用户就可以包含任意文件,而文件中的代码就会被服务器执行,这就造成了文件包含漏洞。

二、文件包含函数
PHP提供了四个文件包含函数:

include() :当被包含的文件不存在时,会报错(Error),后面的代码不被执行。
include_once() :只包含一次,包含过的文件不会被重复包含。
require() :当被包含的文件不存在时,会告警(Wrainng),后面的代码可以继续执行。
require_once() :只包含一次,包含过的文件不会被重复包含。
文件包含函数「不关心」文件的「后缀名」,它只是简单的执行被包含的文件,如果文件的内容是代码,就会执行代码;如果不是代码,就当做文本输出到页面。这个特点在后面的练习中可以体现出来。

三、两种文件包含
文件包含漏洞根据包含文件的「位置」可以分为「本地文件包含」和「远程文件包含」。

1、本地文件包含
本地文件包含是指:包含「服务器本地」的文件。

本地文件包含的payload通常以根目录(/)或文件名开头。也就是绝对路径和相对路径。

利用条件:

配置文件开启fopen(allow_url_fopen=On)
用户可控参数,后台未过滤包含的文件。
1.1 使用教程演示
我们拿DVWA中的 File Injection 模块,简单了解一下本地文件包含的使用。

功能很简单:点不同的链接,跳转到对应的文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IlTDTpBq-1677309377366)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162754807.png)]

在地址栏中,手动修改page的参数为 file1.php 和 file2.php,页面也会跳转到对应的页面,本质上是后台用文件包含函数 包含了这个文件。

这意味着「参数可控」,我们可以通过修改page的参数,让页面包含指定的文件,前提是文件存在。

我们提交账号文件的路径,在地址栏输入 /etc/passwd:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3BiXJ1CS-1677309377367)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162808711.png)]

可以看到,页面显示了passwd文件的内容。我们可以修改成其他的文件名,来包含服务器上其他的文件。

2、远程文件包含
远程文件包含是指:包含「远端」的文件。

远程文件包含的payload通常以 http:// 或 ftp:// 开头。

利用条件:

配置文件开启 fopen 和 include(allow_url_include=On)
用户参数可控,且后台没有过滤包含的文件。
1.1 使用教程演示
还是拿DVWA中的 File Injection 模块,简单了解一下远程文件包含的使用。

地址栏提交一个某牛的主页文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V0v7q0rN-1677309377367)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162826494.png)]

可以看到,页面包含了这个文件,网下滑可以看到,DVWA的页面被顶到下面去了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HQh8RFhJ-1677309377367)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162837080.png)]

这意味着,我们包含的远端文件,被执行了。我们可以更换其他远端文件

四、配置文件
PHP的配置文件 php.ini 中,有两个文件包含相关的配置:allow_url_fopen、allow_url_include。

可以根据这两个配置项来判断,文件包含漏洞是否存在。

1、allow_url_fopen
所有版本默认开启。

开启后,可以把 http:// 和 ftp:// 形式的URL当成文件打开。

allow_url_fopen=On,允许打开URL文件。
allow_url_fopen=Off,禁止打开URL文件。

2、allow_url_include
PHP5.2开始默认关闭。

开启后,文件包含函数 include() 和 require() 可以把 http:// 和 ftp:// 形式的URL当成文件打开。

allow_url_include=On,允许包含URL文件。
allow_url_include=Off,禁止包含URL文件。

禁用 fopen 和 include,只能防止 http:// 和 ftp:// 这种URL文件的,对5.2版本提供的php和data则无能为力。

五、PHP伪协议
PHP提供了一些「伪协议」,这些伪协议可以帮助我们更好的使用文件包含。

1、php://filter
php://filter 常用来「读取文件源码」。

php文件被包含时,里面的代码会被执行,我们就看不到文件中的内容了。

1)用 php://filter 把文件内容进行base64编码,编码后的内容不会被当做代码执行,而是在页面中显示出来。我们复制下来用工具解码,就能拿到文件的源码了。使用格式如下:

?url=php://filter/read=convert.base64-encode/resource=phpinfo.php
1
前面是固定格式,只需要把后面的 phpinfo.php换成其他文件就可以了。

2、php://input
php://input 会把「post请求体」的内容当做文件执行,导致任意代码执行。

1)GET请求参数中使用 php://input 伪协议:

?url=php://input
1
2)(配合其他工具)post请求体中,写需要执行的代码:

<?php system('ls'); ?>

1
enctype=multipart/form-data 时,php:/input 无法使用。

3、phar://
phar:// 可以「读取压缩文件」。

1)把代码文件压缩成zip格式,再上传到服务器(配合文件上传漏洞)。

2)用 phar:// 从服务器中读取压缩文件中的文件。

?url=phar://temp/shell.zip/shell.txt
1
提示:读取时,注意压缩文件中,目录的层级关系。

4、zip://
zip:// 可以「读取压缩文件」

1)把代码文件压缩成zip格式,再上传到服务器(配合文件上传漏洞)。

2)用zip:// 从服务器中读取压缩文件中的文件。

?url=phar://temp/shell.zip%23shell.txt
1
提示:zip:// 与 phar:// 相似,他们有两个区别

zip:// 只能读取单级目录,而 phar:// 可以读取多级目录
压缩文件中的分隔符 / 需要换成 %23 (/ 换成 # 后 再url编码成 %23)

5、data://
data:// 常用来「任意代码执行」

与php://input 相似,不同的是,php://input是将post请求体中的内容当做文件执行,而data://将GET请求中,逗号后面的内容当做文件执行。

方式一:data://text/plain,

逗号后面的内容,以纯文本形式执行

?url=data://text/plain,<?php phpinfo();?>
1
方式二:data://text/html,

逗号后面的内容,以html形式解析

?url=data://text/html,<?php phpinfo();?>
1
方式三:data://text/plain;base64,

先把需要执行的命令进行base64编码;

逗号后面的内容,先base64解码,再以纯文本形式执行(一种绕过方式)

?url=data://text/plain;base64,JTNDJTNGcGhwJTIwcGhwaW5mbyUyOCUyOSUzQg==
1
提示:JTNDJTNGcGhwJTIwcGhwaW5mbyUyOCUyOSUzQg== 是 <?php phpinfo(); base64加密的结果,加密代码时,后面不要加 ?> ,否则会报语法错误。

六、包含日志
包含日志文件,文件内容会显示到页面中,如果日志中包含代码,则会被执行。

1、包含Web访问日志
1)包含Web日志(Nginx日志路径:/usr/local/nginx//access_log),页面显示出日志内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8XkkFwb8-1677309377368)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162911692.png)]

2)Burp Suite修改访问请求,将代码写入Web日志。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvFmsltG-1677309377368)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162924711.png)]

3)再次访问Web日志,日志中的代码将被执行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VowY8Vrp-1677309377368)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230220162934437.png)]

2、包含ssh登录日志
1)ssh登录 ssh “<?php phpinfo();?>”@192.168.0.1 ,代码被记录到登录日志中。

2)包含日志文件,默认路径 /var/log/auth.log 或 /var/log/secure,日志中的代码将被执行。
再次访问Web日志,日志中的代码将被执行。

[外链图片转存中…(img-VowY8Vrp-1677309377368)]

2、包含ssh登录日志
1)ssh登录 ssh “<?php phpinfo();?>”@192.168.0.1 ,代码被记录到登录日志中。

2)包含日志文件,默认路径 /var/log/auth.log 或 /var/log/secure,日志中的代码将被执行。

网络安全基础入门需要学习哪些知识?

网络安全学习路线

这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!

img网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

需要的小伙伴也可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

阶段一:基础入门

img网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

需要的小伙伴也可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

网络安全导论

渗透测试基础

网络基础

操作系统基础

Web安全基础

数据库基础

编程基础

CTF基础

该阶段学完即可年薪15w+

阶段二:技术进阶(到了这一步你才算入门)

img网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

需要的小伙伴也可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

弱口令与口令爆破

XSS漏洞

CSRF漏洞

SSRF漏洞

XXE漏洞

SQL注入

任意文件操作漏洞

业务逻辑漏洞

该阶段学完年薪25w+

阶段三:高阶提升

img网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

需要的小伙伴也可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

反序列化漏洞

RCE

综合靶场实操项目

内网渗透

流量分析

日志分析

恶意代码分析

应急响应

实战训练

该阶段学完即可年薪30w+

阶段四:蓝队课程

img网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

需要的小伙伴也可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

蓝队基础

蓝队进阶

该部分主攻蓝队的防御,即更容易被大家理解的网络安全工程师。

攻防兼备,年薪收入可以达到40w+

阶段五:面试指南&阶段六:升级内容

img

需要上述路线图对应的网络安全配套视频、源码以及更多网络安全相关书籍&面试题等内容

网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

需要的小伙伴也可以扫描下方CSDN官方合作二维码免费领取哦,无偿分享!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值