01- 本地文件包含

感觉没有什么说的,因为这个靶场没有很好的展示效果。有限制的本地文件包含漏洞是指代码中为包含文件指定了特定的前缀或者.php、.html等扩展名,攻击者需要绕过前缀或者扩展名过滤,才能利用文件包含漏洞读取操作系统中的文件,获取敏感信息。

可以看到这个关卡是没有进行任何过滤的

那么我们就可以直接读取重要的系统文件了。

注意,这里大家可能会对…/的数量产生疑问。这里我解释一下,只要你的…/的数量>你使用最少…/从当前目录回到根目录/的数量即可。也就是说你这里使用1000,10000个…/最终回到的就是根目录

可以看到…/的数量只要足够多就可以。

02- 本地文件包含绕过

可以看到这个使用指定后缀。那么使用%00截断即可

ok,这个也讲完了。

03- session本地文件包含

当可以获取Session文件的路径并且Session文件的内容可控时,就可以通过包含Session文件进行攻击。直接看源码

可以看到满足Session文件的内容可控。

所以我们就要差获取Session文件的路径。有两种方法

1)通过phpinfo的信息获取Session的存储位置,这里可以利用第一关获取

可以看到路径为/var/lib/php/session

2)通过猜测默认的Session存储位置尝试。

通常在Linux中session默认存储在/var/lib/php/session目录下。

我们先访问http://192.168.6.153/fi//03.php?iwebsec=,然后利用第一关访问Session文件,因为这一关没有文件包含可以利用。

大家可以在访问的时候F12查看信息获取SeeionID的值。

然后访问http://192.168.6.153/fi/01.php?filename=/var/lib/php/session/sess_ilbuddbmsbmg5aod59s07cctv7

然后访问靶机中的session目录验证一下

注意,这里不是在根目录,大家可以使用sudo find / -name session查看

日志文件包含

服务器中的中间件、SSH等服务都会有记录日志的功能。如果开启了记录日志的功能,用户访问的日志就会存储到不同服务的相关文件中。如果日志文件的位置是默认位置,就可以通过访问日志将恶意带代码写入日志文件中,然后通过文件包含漏洞日志中的恶意代码,获取权限。

这里使用第一关来做这个日志文件包含的实验。

首先我们修改User-Agent的内容,将恶意代码存储到日志文件中,这里我使用hackbar自带的修改功能,或者可以使用bp进行修改

接下来,看最终的结果

可以看到顺利执行,接下来读取/etc/passwd文件内容

可以看到顺利读取。

04- 远程文件包含

远程文件包含是指包含的文件并不是本地服务器的,而是通过URL的形式包含的其他服务器上面的文件,从而使目标主机执行恶意代码。

漏洞利用条件:allow_url_fopen = on 和 allow_url_include = on

可以看到没有任何过滤,直接远程包含即可

这里大家filename里面的ip地址直接在cmd下ipconfig查看把192的都试一下,如果你知道自己是哪一块网卡也行。对了,这个要开启apache,要不然没用。

大家注意看一下这两张图片中php的版本,为什么会版本不同呢?

这里给大家解释一下,第一张图片版本为5.4.45的原因是因为文件为shell.php在文件包含前这个php文件就会允许生成的phpinfo,然后靶机会将结果显示出来,大家可以看一下自己启动apach服务器php的版本

可以看到我的版本是5.4.45的。

然后第二张图片的php版本就是靶机的php版本了。因为上传的是txt文档,虽然自己的服务器不会运行,但是被目标靶机包含后就会执行了。

这里给大家看一下在自己主机上访问shell.txt和shell.php的结果

这也是文件包含具体步骤。好了,远程文件包含也解释清楚了

05- 远程文件包含绕过

这和04一样没什么说的,说一下绕过方法

1)'?'绕过

2)‘#’ 绕过 %23

3)空格绕过 %20

这里大家自己去搞吧。

06- php://filter伪协议

php://filter是元封装器,设计用于数据流打开时的筛选过滤应用,对本地磁盘文件进行读取。

以下两种用法相同

1) ?filename=php://filter/convert.base64-encode/resource=xxx.php

2) ?filename=php://filter/read=convert.base64-encode/resource=xxx.php

利用php://filter读取本地磁盘文件 时,PHP配置文件不需要开启allow_url_fopen 和 allow_url_include.

​ php://filter参数

名称描述resource=<要过滤的数据流>该参数是必需的。指定要过滤的数据流read=<读链的筛选器列表>该参数可选。可以设定一个或多个筛选器名称,以管道符(|)分分隔write=<写链的筛选器列表>该参数可选。可以设定一个或多个筛选器名称,以管道符(<;两个链的筛选器列表>未read=或write=作前缀的筛选器列表会视情况应用于读或写链

可以看到利用?filename=php://filter/convert.base64-encode/resource=/etc/passwd,就可以读出passwd的内容

07- php://input伪协议

php://input可以访问请求的原始数据的只读流,即可以直接读取POST上没有经过解析的数据,但是使用 enctype = "multipart/form-data"的时候 php://input 是无效的。也就是POST里面的数据会被执行,从而导致非常严重的危害。

需要目标主机开启allow_url_include

大家可以看到这里面直接就是有 php://input,我们直接POST传数据就可以了。搞的我还以为我搞错了,原理后台就直接已经添加了这个。

可以看到php://input 可以获取POST传入的数据。这个没什么好玩的,下面用 第六关 演示php://input 虽然第六关是使用filter,但是都一样。

大家可以看到,传入的POST数据顺利执行了。

那么大家会好奇,为什么第七关显示的是数据,而第六关直接运行了呢?

不知道大家有没有注意到一个使用了file_get_contents一个使用的是include。

这里给大家看一个好玩的。

不知道大家发现了什么没有,POST 和 GET 的结果竟然是一样的。为什么呢?

其实这两者是没有什么区别的,源码中获取filename是使用GET 方式获取的,所以说,无论你使用GET还是POST请求最终filename获取的都是一样的内容 php://input 。

到这里我们就可以想到,如果使用POST方式获取filename这种方法是不是就不行了呢? 对的,如果后台使用POST方式获取filename的话,php://input就不可以使用了。 OK,这一关到这也就结束了。

08-php://input伪协议利用

07已经讲解了。这里就不重复讲了。

09- file://伪协议利用

file:// 伪协议可以访问本地文件系统,读取文件的内容。

利用file:// 时,PHP配置文件不需要开启allow_url_fopen 和 allow_url_include.

?filename=file:///etc/passwd

这个也没有什么可以讲的。下一个

10-data://伪协议利用

从PHP 5.2.0 起,数据流封装器开始有效,主要用于数据流的读取,如果传入的数据是PHP代码,就会执行任意代码。

使用方法

data://text/plain;base64,xxxxx(Base64 编码后的数据)

利用data://时,PHP配置文件需要开启allow_url_include 和 allow_url_fopen。

?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

大家这里要注意以下。

==> 进行base64编码 PD9waHAgcGhwaW5mbygpOz8+

此时出现特殊符号 + ,我们要将 + 进行一次url编码 变为 %2b ,否则不会正常执行。

Base64 空格,加号问题 - hongdada - 博客园 (cnblogs.com)

phar://伪协议

phar:// 是用来进行解压的伪协议,phar://参数中的文件不管是什么扩展名,都会被当作压缩包。

需要开启allow_url_include,利用版本应高于php5.3.0

用法:

?file=phar://压缩包/内部文件

这里先给大家简单演示一下。后面配合文件上传和phar来一起搞

大家可以看到我a.php文件内容为

error_reporting(0);

$filename = $_GET['filename'];

include($filename);

highlight_file(__FILE__);

?>

shell.zip文件中就只含有shell.php文件。注:这里使用phar一定要用zip压缩,rar等其他不可以。

这里可以将shell.zip改为shell.jpg

同样可以达到目的。

下面的实验大家可以看一下

接下来我就来做文件上传+文件包含配合phar的简单实验。首先一点是要有文件包含的点,否则没用。

给大家先看一下做实验的源码

请选择要上传的文件:

error_reporting(0);

$uploaddir = 'uploads/';

if (isset($_POST['submit'])) {

if (file_exists($uploaddir)) {

if (move_uploaded_file($_FILES['upfile']['tmp_name'], $uploaddir . '/' . $_FILES['upfile']['name'])) {

echo '文件上传成功,保存于:' . $uploaddir . $_FILES['upfile']['name'] . "\n";

}

} else {

exit($uploaddir . '文件夹不存在,请手工创建!');

}

//print_r($_FILES);

}

$filename = $_GET['filename'];

include($filename);

// highlight_file(__FILE__);

?>

我们先上传zip文件展示一下效果。

可以看到上传成功,并且路径也知道。

接下来使用phar就好了。

可以看到顺利执行了。

接下来我将shell.zip改为shell.jpg

大家可以把Content-Type修改一下,不修改也没有问题,因为源码没有任何过滤。

可以看到同样顺利执行了。好了,phar就讲到这里了。

zip://伪协议

zip://伪协议和 phar://伪协议在原理上类似,但用法不一样。

用法如下:

zip://[压缩文件绝对路径]#[压缩文件内的子文件名]

注意:#在浏览器中要转换为为%23

可以看到成功执行。好了文件包含到此结束。

好文阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。