Webug4.0靶场通关笔记14- 第18关 文件上传之Nginx解析缺陷

目录

[第18关 渗透实战](#第18关 渗透实战)

1.打开靶场

2.构造php脚本

3.源码分析

(1)客户端源码

(2)服务的源码

4.Nginx解析法渗透

(1)缺陷原因

(2)缺陷条件

(3)构造脚本

(4)上传脚本

(5)访问脚本

5.生僻字绕过渗透实战

(1)制作脚本

(2)上传图片并bp抓包

(3)生僻字绕过

(4)访问脚本


本文通过《webug4.0靶场第18文件上传之前端拦截》来进行渗透实战。Nginx解析缺陷是指在 Nginx 服务器配置或解析过程中存在的一些安全缺陷,可能导致服务器受到攻击,本文通过2种不同的方法实现渗透测试。

第18关 渗透实战

1.打开靶场

打开webug4.0靶场的第18关卡文件上传之解析关卡,具体如下所示。

复制代码
http://192.168.71.1/webug4/control/upload_file/upload_file_2.php

2.构造php脚本

构造info.php目的是获取服务器的php信息,具体如下所示。

复制代码
<?php phpinfo();?>

随手上传php脚本,提示不允许上传该格式类型,说明第18关卡同样有文件类型检查。

3.源码分析

(1)客户端源码

如下客户端存在js前端验证的问题,而且使用的白名单绕过要求文件的格式属于图片,具体如下所示。

(2)服务的源码

接下来我们来查看服务端是否进行文件格式过滤,打开upload_file_2.php文件,分析可知存在后缀的白名单过滤,仅允许上传jpg和png以及gif的文件,注释后的源代码如下所示。

复制代码
<?php
// 引入公共配置文件,通常这里面包含一些全局的函数、常量、配置信息等
// 路径是相对于当前文件上两级目录下的 common 文件夹中的 common.php 文件
require_once "../../common/common.php";

// 检查会话中是否存在 'user' 变量,如果不存在,意味着用户未登录
// 使用 header 函数将用户重定向到登录页面
if (!isset($_SESSION['user'])) {
    header("Location:../login.php");
}

// 定义一个允许上传的文件扩展名数组,这里只允许上传 .jpg、.png 和 .gif 格式的图片文件
$filter = array(".jpg", '.png', '.gif');

// 检查上传文件是否出现错误,$_FILES['file']['error'] 会返回上传文件的错误码
// 如果存在错误,直接终止脚本执行
if ($_FILES['file']['error']) {
    die();
}

// 检查是否有文件被上传
if ($_FILES['file']) {
    // 将上传文件的相关信息(如文件名、临时文件路径、错误码等)赋值给变量 $arr
    $arr = $_FILES['file'];

    // 获取上传文件的扩展名,步骤如下:
    // strrchr($arr['name'], ".") 从文件名中找到最后一个 '.' 及其后面的部分,即扩展名
    // strtolower() 将扩展名转换为小写,以忽略大小写的影响
    // trim() 去除扩展名前后可能存在的空格
    $file_ext = trim(strtolower(strrchr($arr['name'], ".")));

    // 检查获取到的文件扩展名是否不在允许的扩展名数组 $filter 中
    // 如果不在,意味着文件类型不被允许
    if (!in_array($file_ext, $filter)){
        // 弹出一个警告框提示用户 "error"
        echo "<script>alert('error')</script>";
        // 终止脚本执行
        die();
    }

    // 检查目标上传目录中是否已经存在同名文件
    // TPMELATE 应该是一个预先定义好的常量,表示上传目录的路径
    if (file_exists(TPMELATE."/upload/".$arr['name'])){
        // 如果文件已存在,弹出警告框提示用户
        echo "<script>alert('该文件已经存在')</script>";
    } else {
        // 将文件名从 UTF - 8 编码转换为 gb2312 编码,可能是为了适应服务器文件系统的编码要求
        $filename = iconv("UTF-8","gb2312",TPMELATE."/upload/".$arr['name']);

        // 将临时上传的文件从临时目录移动到目标上传目录
        move_uploaded_file($arr["tmp_name"],$filename);

        // 输出文件的完整路径,并终止脚本执行
        echo $filename;
        die();
    }
}

// 引入上传文件页面的 HTML 文件,通常该文件包含文件上传表单
require_once TPMELATE."/upload_file_1.html";

这段 PHP 代码实现了一个带有登录验证和文件类型过滤的文件上传功能。首先检查用户是否登录,若未登录则重定向到登录页面。接着定义了允许上传的文件扩展名数组,当有文件上传时,会检查文件是否有上传错误,若有则终止脚本。然后获取文件扩展名,检查其是否在允许的扩展名列表中,若不在则提示错误并终止。之后检查目标目录是否已存在同名文件,若不存在则将文件从临时目录移动到目标上传目录,并输出文件完整路径;若存在则提示用户。最后引入文件上传页面的 HTML 文件。

4.Nginx解析法渗透

(1)Nginx解析缺陷原理

本文利用Nginx文件扩展名解析缺陷来进行渗透,原理是Nginx 在处理文件请求时,可能会根据文件扩展名来确定如何解析和处理该文件。如果配置不当,可能会导致 Nginx 将某些本应被视为静态文件的文件,按照脚本文件的方式进行解析,从而执行恶意代码。

当php.ini中 cgi.fix_pathinfo = 1配置开启时,会产生解析缺陷。

当访问http://x.x.x.x:8000/parse/index.jpg/x.php时,如果x.php不存在,PHP会递归向前解析,如果index.jpg存在就会把index.jpg当做PHP解析,造成了解析缺陷。

(2)缺陷条件

1) cgi.fix_pathinfo = 1

2)IIS 7.0/IIS 7.5/Nginx <0.8.03

  1. phpStudy <= 8.1.0.7 (Windows版)

这里要强调,渗透环境要使用较低版本的phpstudy才可以复现此bug,其他版本的未必有此缺陷。

(3)构造脚本

将info.php复制一份,并重命名为info18.jpg。

(4)上传脚本

搭建好Nginx渗透环境后,上传info18.jpg,如下所示。

如上所示点击上传按钮后,可知图片上传成功,上传后的脚本路径如下所示。

复制代码
http://192.168.71.1/webug4/template/upload/info18.jpg

(5)访问脚本

接下来利用Nginx解析法构造脚本的访问路径,具体如下所示。

复制代码
http://192.168.71.1/webug4/template/upload/info18.jpg/x.php

由于x.php不存在,PHP会递归向前解析,如果info18.jpg存在就会把info18.jpg当做PHP解析,造成了解析缺陷,从而成功获取到服务器的php相关信息,具体如下所示。

5.生僻字绕过渗透实战

(1)制作脚本

将info.php复制一份,并重命名为info18.jpg。

(2)上传图片并bp抓包

将info18.jpg上传,并使用bp抓包,同时将报文发送给repeater。

(3)生僻字绕过

使用生僻字来绕过,具体如下所示。

复制代码

将文件名进行修改,添加生僻字后文件名如下所示。

复制代码
info18.php龘.jpg

修改完毕后点击发送,如下所示,渗透成功。

(4)访问脚本

根据上一步中的脚本上传地址来访问脚本地址,如下所示渗透成功。

相关推荐
小池先生11 小时前
服务请求出现偶发超时问题,经查服务本身没问题,问题出现在nginx转发。
运维·服务器·nginx
旺仔Sec11 小时前
新疆维吾尔自治区第一届“丝路杯”网络安全大赛暨2026年新疆职业院校技能大赛网络安全赛项竞赛样题
安全·web安全
Java水解19 小时前
Nginx平滑升级与location配置案例详解
后端·nginx
嗨丶王哪跑21 小时前
网络安全主动防御技术与应用
运维·网络·安全·web安全
火白学安全1 天前
《Python红队攻防脚本零基础编写:入门篇(一)》
python·安全·web安全·网络安全·系统安全
心灵宝贝1 天前
nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/SW64架构)
nginx·架构·kylin
好家伙VCC1 天前
**发散创新:渗透测试方法的深度探索与实践**随着网络安全形势日益严峻,渗透测试作为评估系统安全的
java·python·安全·web安全·系统安全
人邮异步社区1 天前
内网攻防实战图谱:从红队视角构建安全对抗体系
网络·安全·web安全
用户31187945592181 天前
nginx-1.16.1-2.p01.ky10.sw_64.rpm 安装教程(详细步骤,适用于Kylin V10/申威SW64架构)
nginx
携欢1 天前
PortSwigger靶场之CSRF where token validation depends on request method通关秘籍
安全·web安全·csrf