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

免责声明:本文仅分享SQL攻击相关知识,不承担任何法律责任。
DVWA请读者自行安装,本文不再赘述。


以下姿势均以本机环境为例

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 中双倍输入,从而绕过简单的过滤器。例如,如果字符过滤器禁止输入单引号 ',则可以通过输入两个单引号 '' 来绕过过滤器。

下面是一个示例 PHP 代码,演示如何使用双写绕过字符过滤:

// 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 中的任意一个。
如果是,则可以包含该文件。其他情况下,都会输出错误信息并结束程序执行。

总结

以上为[网络安全]DVWA之File Inclusion攻击姿势及解题详析合集,读者可借此入门文件包含攻击。
我是秋说,我们下次见。

posted @ 2023-05-03 23:08  秋说  阅读(15)  评论(0编辑  收藏  举报  来源