0X00什么是文件包含
文件中包含这个漏洞,总之是一个程序猿在开发中为了方便,代码将多个页面重复写入到一个单独的文件中,需要的时候直接包括在内,这个文件同时也是等同于整个文件的内容复制到包括。由于它经常用于开发,已成为攻击者的攻击目标,并导致了各种基于文件的攻击。
0x01包括本地文件
先来感觉一下,当这个值可以直接控制的情况下就像下面的代码:
<? php $ file = $ _GET ['file']; include ($ file);
可以看到上面的代码,直接包含了$ file这个情况,是可控的情况。
让我来谈谈文件的一个要点:文件中包含的任何文件,即使文件与当前编程语言无关,甚至是图片,只要包含文件,其内容将包含在包含文件的当前语言被执行。
首先在当前文件夹中随便建立任何后缀格式的文件,如:( file.txt如果图片格式那么效果如下)文件内容如下:
<? php phpinfo ();
文件包含漏洞还包含当前服务器中的其他文件,同时支持包含web应用程序的目录,如下所示:
尝试包括其中的一些内容C drive。如:C: / WINDOWS / system.ini
可以直接看到包含。
那么上面说的是传入文件的值是完全可控的方法,那么如果猿程序固定在文件后缀的开发中,该怎么办?代码如下所示:
<?php $file = $_GET['file'] . '.php'; echo $file; include($file);
在这种情况下,我们按照上面的方法去尝试,为了方便查看视觉效果,这里是输出$ file。
我们可以看到,如果程序中的固定后缀,就像上面的图一样,不会找到你需要包含的文件。可以看到最后的文件名是:. / Include.txt.php。
所以这里有另外一个办法:% 00截断。然后% 00剪下来,可以在很多地方使用,这里不多谈。想知道童鞋可以在网上查一查有关资料。
这里要讲一下% 00在PHP 中使用的前提:
- PHP版本<5.3(不含5.3);
PHP magic_quotes_gpc = off;
PHP不会在收到的参数中使用addslashes函数,例如上面代码中的$ _GET [‘file’]
由于PHP版本5.3或更高版本已经解决了这个问题,如果gpc打开或使用addslashes函数,它将被转义。
首先,我们可以尝试如果gpc打开会发生什么(效果与使用该功能相同)
可以看到它。效果非常明显。
接下来看5.3中的情况是怎样的
也可以看。没有效果。
所以我们可以看到只要满足上述三个条件% 00就可以使用;
首先我们改变了PHP版本5.2和重新启动Apache后php.ini的变化magic_quotes_gpc = on来magic_quotes_gpc = off,试图在使用截断。
成功使用截断包含。所以文件只包含所包含的功能?这当然不是,因为文件包含了,那么我们可以直接包含一个句子。首先创建一个文件:shell.txt一个句子的内容。
可以看,拿shell不是问题。
那么两者有什么区别呢?其实没有什么区别,原理是一样的,但是第一个是用后缀来介绍的,第二个是固定在程序后缀后面的。但% 00可以使用,因为它在程序流遇到% 00终止符时直接终止。
远程文件包含
本地文件包含与远程文件相同的原理,但前者只能包含服务器上存在的文件,而后者可以包含远程服务器上的文件。
远程文件包含一些注意事项:
1.需要allow_url_include = on和allow_url_fopen = on在php.ini
2.所需的远程文件后缀格式不能与目标服务器的语言相同,如(目标服务器解析PHP代码,则远程文件后缀格式不能PHP)
解释第二点:因为如果你的远程文件是php后缀,那么如果你的远程文件内容是:phpinfo(),而不是代码,那么包含的信息不是目标服务器,而是你的远程服务器。如下:php
<? php phpinfo ();
这是我的远程机器信息为PHP5.6版本,目标机器是版本5.2。包括它。
可以看到,结果包含后,我们的远程机器,为什么??
因为目标服务器包含的代码不是:` 而是远程服务器执行这个代码的源代码,如下所示:
<? php phpinfo ();?>
所以远程文件只包含以上两点正常包含的内容。
首先要修改以下内容:
1.修改配置
2.修改文件后缀
来包含它。
可以看到这个收录后返回的信息是我们的目标机器信息。
然后继续尝试shell
远程文件包含使用的前提是符合本地文件包含的前提和符合远程文件包含其可用性的前提。
文件包含伪协议
使用包含在文件中的伪协议,本文演示了以下伪协议:
data: text / plain或data: text / plain; base64
php: // input
php: // filter
file: //
zip: //
其他协议可以读取官方文档:直通车
数据:文本/纯文本
直接在相应的URL参数中输出:data:text / plain,需要执行php代码如下图所示:
这个伪协议还有另一种使用方式,那就是需要用base64编码来执行PHP代码:data:text / plain; base64,需要执行base64php代码,如下所示:
php://输入
php: // input 访问所请求的原始数据的只读流,将该请求中的数据作为PHP代码执行。
你可以看到程序是死的后缀,然后include php: // input会自动拼接,.php所以肯定是不能正常工作的php: // input。所以我们也可以使用% 00截断
你可以看到终结者是非常强大的。
php:// filter
php: // filter伪协议可以读取php文件的代码base64编码输出,比如我们要读取一个php文件但是不希望它成为正常的php代码的执行结果,我们要的是php文件的代码你可以使用这个伪协议。
用法:php://filter/read=convert.base64-encode/resource=需要读取文件代码的内容
解码后可以得到内容
file://
file: //用于访问本地文件系统,不受allow_url_fopen或受影响allow_url_include。
用法:file://文件绝对路径
压缩: //
zip: //您可以访问zip文件中的文件。但是你需要绝对路径。
使用:zip:// [档案绝对路径]#[压缩档案名称]
在本地创建一个文件并将其压缩到一个zip压缩文件中。
你可以看到我已经填入了文件的绝对路径和名字,但是为什么你不能成功包含它,你可以看到它是错误的:警告:include(zip:// C:/ phpStudy / WWW / include /phpinfo.zip.php)We do not include this file, we want to include the file inside the zip, why the value after#is gone, because # will ignore the parameters behind, so we need to use the code%23`表格,还有一点就是程序死机后缀php,因为我们压缩了php后缀的文件。所以我们不需要有后缀,如下所示:
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论