【网络安全】DVWA之File Inclusion攻击姿势及解题详析合集

本文介绍了DVWA中的不同级别文件包含漏洞,包括低级、中等级别通过大写绕过和双写绕过,以及高级和不可能级别的代码审计。文章详细讲解了如何利用str_replace()函数的大小写敏感性以及URL编码进行绕过,并展示了各种级别的防护措施及绕过方法。

low level

D:\Software\PHPStudy\phpstudy_pro\WWW路径写入1.php

在这里插入图片描述

源码

<?php

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

?> 

并未进行任何过滤

直接文件包含即可:

GET ?page=http://127.0.0.1/1.php

在这里插入图片描述

medium level

源码

<?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() 函数是 PHP 中用于字符串替换的内置函数。它可以在字符串中查找并替换指定的内容,返回替换后的新字符串。其基本语法如下:

str_replace( $search, $replace, $subject, $count = null )

其中,search 参数指定要查找的字符串,可以是一个字符串或者一个字符串数组;
replace 参数指定要替换成的字符串,可以是一个字符串或者一个字符串数组;
subject 参数指定要进行替换操作的原始字符串,可以是一个字符串或者一个字符串数组;
count 参数(可选)指定要替换的最大次数,默认为全部替换。

例如,下面的代码将字符串中的空格字符替换为下划线字符:

$str = "hello world";
$new_str = str_replace( " ", "_", $str );
echo $new_str;  // 输出:hello_world

需要注意的是,str_replace() 函数对大小写敏感,不会改变原始字符串的大小写。
如果要对大小写进行不敏感的替换,则需要使用 str_ireplace() 函数。

此外,如果要用一个字符串数组来替换多个字符串,也可以使用 preg_replace() 函数来实现。

如果在调用 str_replace() 函数时不指定 $count 参数,则默认将所有的匹配项都进行替换,也就是像下面这样:

$new_str = str_replace($search, $replace, $subject);

在这种情况下,函数会在 $subject 字符串中查找 $search 字符串,并将全部匹配到的字符串都替换为 $replace 字符串,并返回替换后的新字符串。

在源码中,str_replace()将http://https://../..\转换为 (空格)

大写绕过

由于str_replace() 函数对大小写敏感
?page=http://127.0.0.1/1.php
修改为?page=HTTP://127.0.0.1/1.php
文件包含成功:
在这里插入图片描述使用?page=Http://127.0.0.1/1.php?page=HttP://127.0.0.1/1.php等均可

双写绕过

原理

双写绕过是一种常见的绕过字符过滤规则的方法,其原理是将需要过滤的字符在 URL 中双倍输入,从而绕过简单的过滤器。例如,如果字符过滤器禁止输入单引号 ',则可以通过输入两个单引号 '' 来绕过过滤器。

举个例子:

// Get the input parameter from the URL
$user = $_GET['user'];

// Filter out single quotes to prevent SQL injection attacks
$user = str_replace("'", "''", $user);

// Execute the SQL query
$sql = "SELECT * FROM users WHERE username = '$user'";
$result = mysql_query($sql);

在上面的代码中,使用 str_replace() 函数将用户名中的单引号替换成两个单引号,以防止 SQL 注入攻击。然而,这种简单的过滤方式容易被双写绕过,例如将输入参数设置为 admin'',即可成功绕过过滤器,执行恶意操作。

实操

?page=http://127.0.0.1/1.php
修改为?page=httphttp://://127.0.0.1/1.php
文件包含成功:
在这里插入图片描述

Url编码绕过

?page=httphttp://://127.0.0.1/1.php进行url编码以绕过前端限制,
变为?page=httphttp://:/%2F127.0.0.1/1.php,再被浏览器解码
文件包含成功:
在这里插入图片描述


high level

源码

<?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;
} 
?>

代码审计

该代码从 URL 中获取名为 page 的参数,并将其赋值给变量 $file。然后使用 fnmatch() 函数对 $file 进行验证,判断它是否匹配指定的条件。如果 $file 不以 file 开头且不等于 include.php,则说明用户请求的不是目标文件,因此输出错误信息并调用 exit() 函数,结束程序执行。

姿势: file://包含的文件路径

GET ?page=file://D:\Software\PHPStudy\phpstudy_pro\WWW\1.php

文件包含成功:

在这里插入图片描述


Impossible level

源码

<?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;
}

?> 

代码审计

上述代码首先从 URL 参数中获取 $file 的值,然后使用 if 语句来检查该值是否等于 include.php、file1.php、file2.php 或 file3.php 中的任意一个。
如果是,则可以包含该文件。其他情况下,都会输出错误信息并结束程序执行。

此时文件包含姿势就失效了。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值