PHP:文件包含漏洞

简单记录一些文件包含漏洞的常用方法

产生原因:

文件包含漏洞的产生原因是在通过引入文件时,由于传入的文件名没有经过合理的校验,或者校检被绕过,从而操作了预想之外的文件,就可能导致意外的文件泄露甚至恶意的代码注入。

常见的导致文件包含的函数如下:
 
PHP: include(), include_once(), require(), require_once(), fopen(), readfile() ...
当使用前4个函数包含一个新的文件时,该文件将作为 php 代码执行,php 内核不会在意该被包含的文件是什么类型。

本地文件包含(LFI):

当被包含的文件在服务器本地时,就形成的本地文件包含漏洞。我们可以通过该漏洞读取服务器文件,并执行包含php代码的文件。以DVWA为例:

我们成功读取了php探针文件。而本地文件包含在遇到过滤的情况下也需要一些绕过方法,比如%00截断,点号截断等。

%00截断:
`/etc/passwd%00`
(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)

%00截断目录遍历:
`/var/www/%00`
(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)

路径长度截断:
`/etc/passwd/././././././.[…]/./././././.` 
(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)

点号截断: 
`/boot.ini/………[…]…………`
(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)

修复方案:

限制用户访问区域,并校验和过滤用户传入的参数。

远程文件包含(RFI):

这里注意一下,当我们远程服务器上的文件为xx.php与xx.txt时,存在远程文件包含漏洞的服务器在执行这两个文件时结果是不同的,以DVWA为例:

这是xx.txt文件执行phpinfo后所显示的ip。

这是xx.php执行phpinfo后的ip地址。

这说明远程文件包含漏洞所包含的文件为非php后缀才是正确的,因为当后缀名为php结尾的文件被执行时实在攻击者本机上执行的,而非php后缀的文件实在受害机上执行的。

PHP的部分常用伪协议:

* file 协议读取本地文件:`file=file://etc/passwd`  
(需要allow_url_fopen=On并且 allow_url_include=On)
 
* 利用php流input:`?file=php://input`
  (需要allow_url_include=On,详细→http://php.net/manual/en/wrappers.php.php)
   
* 利用php流filter:`?file=php://filter/convert.base64-encode/resource=index.php`
  (同上)
   
* 利用data URIs:`?file=data://text/plain;base64,SSBsb3ZlIFBIUAo=%00`
  (需要allow_url_include=On)

当网站存在本地文件包含漏洞和上传漏洞时我们可以配合两个漏洞GETSHELL。

任重而道远,共勉!

原文地址:https://www.cnblogs.com/s1ye/p/8283651.html