1.危害:
(1)文件读取。可以传入一个服务器配置文件或者网站配置文件从而读取到该文件的内容。
(2)如果被包含的文件符合PHP语法,则会将该文件当成PHP文件解析执行,无关后缀。
2.类型:
(1)本地文件包含:包含存放在目标服务器本地的文件。
(2)远程文件包含:包含存在在攻击者服务器的文件。
3.漏洞利用
(1)包含本地文件:
仅能够对服务器本地的文件进行包含,由于服务器上的文件并不是攻击者所能够控制的,因此该情况下,更多的会包含一些固定的系统配置文件,从而读取系统敏感信息。很多时候本地文件包含漏洞会结合网站的文件上传功能,从而形成更大的威力。
1.包含系统敏感文件
2.包含图片马
3.包含日志文件
4.利用php伪协议进行攻击
对于读取系统敏感文件,主要要让大家了解常见windows和Linux的敏感文件的存放位置,当然这个位置也不是绝对的。
1和2在我的上一篇文章已经说过了,所以这里就不再多说了,有兴趣的可以去看看sql注入漏洞。
A 日志包含
首先讲一下日志包含:
我们可以看到,在我们将<?php @eval($_POST[a]); ?>写入我们的日志的时候,我们的一句话木马里面的字符会被进行url编码,可是在我们执行phpinfo的时候,我们会发现,页面没有任何反应,这是因为我们的一句话木马已经不符合php语法了,所以在进行文件包含的时候,无法被解析。此时我们只需要在burp里面将我们的一句话木马改回来就行了。
B:PHP伪协议利用
PHP伪协议 是 PHP 支持的协议与封装协议,可利用这些协议完成许多命令执行。
file:// ---访问本地文件系统
http:// ---访问 HTTP(S)网址
ftp:// ---访间 FTP(S)URL
php:// ---访问各个输入/输出流(I/0streams)
zlib:// ---压缩流
data:// ---数据(RFC 2397)
glob:// ---查找匹配的文件路径模式
phar:// --- PHP 归档
ssh2:// ---Secure Shell 2
rar:// --- RAR
ogg:// ---音频流
expect:// ----处理交互式的流
为什么会有这些协议?
在 PHP 网站开发中,使用特殊协议(如 data://text/plain、php://input 等)通常是为了处理一些特定的情况或满足特定的需求。以下是一些常见的情况或需求,可能会用到这些协议:1.动态生成内容:有时候需要动态生成一些内容并包含在 PHP 文件中,而不是通过实际的文件路径进行包含。例如,生成一些配置信息、动态生成一些文本内容等。在这种情况下,使用 data://text/plain 协议可以方便地将文本内容作为文件进行包含。
2.处理特殊数据格式:如果你的应用程序使用了非标准的数据格式,无法直接使用 PHP 的表单解析功能或其他库进行处理,你可以使用特殊协议来读取和处理原始数据。例如,使用php://input 协议可以获取 POST请求的原始数据,然后根据自定义的数据格式进行解析和处理。
3.自定义文件处理:有时候需要自定义文件处理逻辑,例如在文件上传过程中进行特殊的操作。通过使用php://input,可以读取请求主体中的原始文件数据,并进行自定义的文件处理操作,而无需依赖表单上传功能。
(1)php://input
在 PHP 的文件包含中,php://input 可以用作包含文件的路径。 php://input 是一个特殊的流(stream),它允许你读取请求的主体内容。
前提条件: php.ini 文件中的 allow_url_include 设置为 on
GET: url/?xxx=php://input
POST: 符合php语法的代码
这里要注意一下,当我们在Hackbar里面进行操作的时候,我们会发现页面没有任何回显,但我们打开burp的时候,会发现,php代码已经不见了,这就是Hackbar比较操蛋的地方,这就需要我们在burp下面加上我们的php代码了。
(2)data:// 数据流封装器,以传递相应格式的数据
data://text/plain,<?php phpinfo(); ?>
或者可以配合base64来使用,data://text/palin;base64,<?php phpinfo(); ?> 但是记得要把我们的PHP代码base64编码,但是在这里要注意一点,当我们对代码进行编码的时候我们会发现页面报错了,显示语法错误。这是因为在编码后最后面会有一个+号,服务器把他当成了运算符,这时候我们需要将+再次进行url编码才可以成功。
注意:在连接蚁剑的时候记得不要加base64,不然会连不上。
(3)php://filter
php://filter 是一种元封装器,设计用于数据流打开时的筛选过滤。根据名字, fiiter 可以很容易想到这个协议可以用来过滤一些东西。主要用来查看源码。在进行PHP代码审计时,需要查看目标的源代码,但是包含PHP文件时会被解析,不能看到源码,这时可以用 php://filter 来读取源代码文件。
格式:php://filter/read=convert.base64-encode/resource=index.php
使用不同的参数可以达到不同的效果
其他过滤器:(对convert.base64-encode进行替换)
string.rot13 ---进行rot13转换
string.toupper ---将字符全部大写
string.tolower ---将字符全部小写
(4)zip://
zip://、bzip2://、 zlib://协议,都属于压缩流,可以访问压缩文件中的子文件。
格式:zip://绝对(相对)路径/xx.zip%23被压缩的文件
其中的路径不同的PHP版本用不同的路径(nts版本可以用相对路径)。优点是可以利用该协议绕过网站固定包含文件后缀的限制。这里的 %23 是#号的 URL编码,如果不进行 URL编码 的话#号后面的内容是传不到服务器的,#代表网页中的一个位置。其右面的字符,就是该位置的标识符
步骤:
1):先将一个php文件修改为txt文件,然后再压缩这个文件(这个时候我们就有了两个文件1.zip 和1.txt)
2):将我们的1.zip文件修改为合法且允许上传的的后缀的文件,然后将我们的这个文件上传到我 们的目标服务器
3):再使用zip://进行包含
注意:1.使用zip的时候要求php版本 > 5.3
2.在%23后面加的是由php文件改动的txt文件
(5)phar://
与 zip:// 协议类似。
格式: phar://相对路径/xx.zip/被压缩的文件
适用范围为php>5.3.0。优点是可以利用该协议绕过网站固定包含文件后缀的限制。
(2)远程文件包含
前提: php.ini 的 allow_ur1_fopen 的值为 on(默认开启),并且 a1low_ur1_include 的值也为 on(默认关闭)。
1.攻击者在自己的服务器上新建一个文件,内容为:<?php eva1($_POST['a']);?>。该文件需要能被目标服务器访问到,这里使用 python3 启动一个 http 服务:
//这里在kali里面给各位展示一下
先在桌面建一个文件1.txt,vim编辑,写入php代码
conda activate base //先进入base环境
python -m http.server 1234 //开启http服务,并启用1234端口
这里一定要注意,要在1.txt文件所在的目录里面启用这些服务。
或者这样也可以:
如果可以成功查看我们在文件里面所写的内容,就说明我们包含成功了
这样就可以实现远程文件包含了。
4.修复方案
1.设置白名单:代码在进行文件包含时,如果文件名可以确定,可以设置白名单对传入的参数进行比较。
2.路径限制:限制被包含的文件只能在某一文件夹内,PHP配置文件中有open basedir选项可以设置用户需要执行的文件目录,如果设置目录的话,PHP仅仅在该目录内搜索文件。
3.关闭危险配置:PHP配置中的allow url include选项如果打开,PHP会通过Include/Require进行远程文件包含,由于远程文件的不可信任性及不确定性,在开发中禁止打开此选项,PHP默认是关闭的。
4.过滤危险字符:严格检査用户输入,参数中不允许出现../之类的目录跳转符;
5.尽量不要使用动态包含,可以在需要包含的页面固定写好,如:include( 'head.php')。