DVWA代码审计--文件上传

NO.1 Low

首先来看下代码


<?php 

if( isset( $_POST[ 'Upload' ] ) ) { 
    // Where are we going to be writing to? 
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; 
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); 

    // Can we move the file to the upload folder? 
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { 
        // No 
        echo '<pre>Your image was not uploaded.</pre>'; 
    } 
    else { 
        // Yes! 
        echo "<pre>{$target_path} succesfully uploaded!</pre>"; 
    } 
} 

?> 

先学习学习函数!!!


basename() 函数返回路径中的文件名部分。

语法:basename(path,suffix)

参数:

  1. path 必需。规定要检查的路径。

  2. suffix 可选。规定文件扩展名。如果文件有名有文件扩展名,将不会显示这个扩展名。


move_uploaded_file() 函数将上传的文件移动到新位置。

语法: move_uploaded_file(file,newloc)

:本函数仅用于通过 HTTP POST 上传的文件。

参数:

  1. file 必需。规定要移动的文件。

  2. newloc 必需。规定文件的新位置。


$_FILES函数

$_FILES数组内容如下:

$_FILES['myFile']['name']   客户端文件的原名称。

$_FILES['myFile']['type']   文件的 MIME 类型,需要浏览器提供该信息的支持,例如”image/gif”。

$_FILES['myFile']['size']   已上传文件的大小,单位为字节(Byte)。

$_FILES['myFile']['tmp_name']   文件被上传后在服务端储存的临时文件名

$_FILES['myFile']['error']   和该文件上传相关的错误代码。

[‘error’] 有六种值,分别是:

UPLOAD_ERR_OK
值:0; 没有错误发生,文件上传成功。


UPLOAD_ERR_INI_SIZE
值:1; 上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值。


UPLOAD_ERR_FORM_SIZE
值:2; 上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。


UPLOAD_ERR_PARTIAL
值:3; 文件只有部分被上传。


UPLOAD_ERR_NO_FILE
值:4; 没有文件被上传。
值:5; 上传文件大小为0.


注:
文件被上传结束后,默认地被存储在了临时目录中,

这时必须将它从临时目录中删除或移动到其它地方,如果没有,则会被删除。


来解读一下代码,

if判断有没有文件上传,

如果有的话设置一个$target_path变量来接收文件上传的路径(hackable/uploads/),

然后使用basename() 函数获取上传的文件名,然后再拼接上传的路径,

为了方便看可以换成这样,

$target_path = $target_path.basename( $_FILES[ 'uploaded' ][ 'name' ] );

假如上传一个名为shell.php的文件,

$target_path 依然是不变的,为hackable/uploads/

然后basename() 函数获取文件名就为shell.php

拼接起来就是hackable/uploads/shell.php


这段代码没有对上传的文件后缀做任何的判断,

导致任意文件上传,

这里直接上传php后缀的一句话即可

上传成功后返回的路径

images


NO.2 Medium

代码,


<?php 

if( isset( $_POST[ 'Upload' ] ) ) { 
    // Where are we going to be writing to? 
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; 
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); 

    // File information 
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; 
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ]; 
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; 

    // Is it an image? 
    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) && 
        ( $uploaded_size < 100000 ) ) {  // 100kb

        // Can we move the file to the upload folder? 
        if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) { 
            // No 
            echo '<pre>Your image was not uploaded.</pre>'; 
        } 
        else { 
            // Yes! 
            echo "<pre>{$target_path} succesfully uploaded!</pre>"; 
        } 
    } 
    else { 
        // Invalid file 
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; 
    } 
} 

?> 

这段代码也是挺简单的,

加了三个判断,判断类型是不是jpgpng,还有文件不能大于100kb

这里依旧没有判断文件后缀,只是检测了MIME 类型,也就是这个东西,

images


这里直接抓包将Content-Type 值改为image/jpeg 即可绕过

images


这种方法在渗透测试中也经常使用,

另外,如果不修改mime类型的话,此题没有其他绕过方法了。


NO.3 High


<?php 

if( isset( $_POST[ 'Upload' ] ) ) { 
    // Where are we going to be writing to? 
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/"; 
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); 

    // File information 
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ]; 
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1); 
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; 
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ]; 

    // Is it an image? 
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) && 
        ( $uploaded_size < 100000 ) && 
        getimagesize( $uploaded_tmp ) ) { 

        // Can we move the file to the upload folder? 
        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) { 
            // No 
            echo '<pre>Your image was not uploaded.</pre>'; 
        } 
        else { 
            // Yes! 
            echo "<pre>{$target_path} succesfully uploaded!</pre>"; 
        } 
    } 
    else { 
        // Invalid file 
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>'; 
    } 
} 

?>

substr() 函数返回字符串的一部分。

语法: substr(string,start,length)

参数: string 必需。规定要返回其中一部分的字符串。

start 必需。规定在字符串的何处开始。
  正数 - 在字符串的指定位置开始
  负数 - 在从字符串结尾的指定位置开始
  0 - 在字符串中的第一个字符处开始

length 可选。规定要返回的字符串长度。默认是直到字符串的结尾。
  正数 - 从 start 参数所在的位置返回
  负数 - 从字符串末端返回


strrpos() 函数查找字符串在另一字符串中最后一次出现的位置(区分大小写)。

语法: strrpos(string,find,start)

参数:

  1. string 必需。规定被搜索的字符串。
  2. find 必需。规定要查找的字符。
  3. start 可选。规定开始搜索的位置。

例: 查找 “php” 在字符串中最后一次出现的位置 输出19


<?php
echo strrpos("I love php, I love php too!","php");
?>

相关函数:

  1. strpos() - 查找字符串在另一字符串中第一次出现的位置(区分大小写)
  2. stripos() - 查找字符串在另一字符串中第一次出现的位置(不区分大小写)
  3. strripos() - 查找字符串在另一字符串中最后一次出现的位置(不区分大小写)

strtolower() 函数把字符串转换为小写。

语法: strtolower(string)

:该函数是二进制安全的。

  • 相关函数:
    • lcfirst() - 把字符串中的首字符转换为小写
    • strtoupper() - 把字符串转换为大写
    • ucfirst() - 把字符串中的首字符转换为大写
    • ucwords() - 把字符串中每个单词的首字符转换为大写

getimagesize() 函数用于获取图像大小及相关信息。

语法: array getimagesize ( string $filename [, array &$imageinfo ] )

这里的话是判断文件头是否为图片。


先来详解一下这段代码:

$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);

变量$uploaded_name接收上传的文件名,假如上传一个shell.php文件

先看看strrpos 函数

上传文件后就会变成 strrpos( 'shell.php', '.' ) ,

意思是查找.出现的文章,然后会输出5,点的前一位,


再来看看substr 函数

然后就会变成 substr( "shell.php", 5 + 1) ,为什么要加一呢?

如果是5的话,则会截取.php,不包括5,会从第六位开始截取,

6的话则会截取到php,当然整段代码意思也很明确,就是获取文件后缀。


这个级别除了判断文件后缀之外,还判断了文件头,

普通一句话改成jpg都过不了了,

这里我们可以使用一句话图片马,

合成语法为: copy x.jpg /b + b.txt /a c.jpg

注意: x.jpg为图片(png,gif都行) ,b.txt为一句话 ,c.gif为最后欲生成的文件名

images


然后打开编辑器可以看到一句话

images


然后这里直接以jpg后缀上传,然后采用文件包含的方式访问,

http://localhost/dvwa/vulnerabilities/fi/?page=file:///D:\phpStudy\PHPTutorial\WWW\dvwa\hackable\uploads\c.jpg

发现可以解析

images


然后上菜刀就行了,注意: 这里的话可能需要菜刀上的浏览器登录一下dvwa才能连接shell,

浏览器左上角菜单栏可以打开

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/633234.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

u盘里文件损坏无法打开怎么恢复?五种方法恢复数据全解析

有时可能会遇到&#xff1a;插入U盘后&#xff0c;发现里面的文件损坏无法打开&#xff0c;有多种方法可以尝试来恢复损坏的文件。本文将介绍常见的方法解决U盘文件损坏无法打开的问题。 1. 使用文件修复工具 许多文件修复工具可以修复损坏文件。这些工具能够检测并修复文件中…

网关路由SpringCloudGateway、nacos配置管理(热更新、动态路由)

文章目录 前言一、网关路由二、SpringCloudGateway1. 路由过滤2. 网关登录校验2.1 鉴权2.2 网关过滤器2.3 登录校验2.3.1 JWT2.3.2 登录校验过滤器 3. 微服务从网关获取用户4. 微服务之间用户信息传递 三、nacos配置管理问题引入3.1 配置共享3.1.1 在Nacos中添加共享配置3.1.2 …

蓝桥杯物联网竞赛_STM32L071KBU6_关于sizo of函数产生的BUG

首先现象是我在用LORA发送信息的时候&#xff0c;左边显示长度是8而右边接收到的数据长度却是4 我以为是OLED显示屏坏了&#xff0c;又或者是我想搞创新用了const char* 类型强制转换数据的原因&#xff0c;结果发现都不是 void Function_SendMsg( unsigned char* data){unsi…

【Unity2D 2022:Cinemachine】相机跟随与地图边界

一、导入Cinemachine工具包 1. 点击Window-Package Manager&#xff0c;进入包管理界面 2. 点击All&#xff0c;找到Cinemachine工具包&#xff0c;点击Install 二、相机跟随角色 1. 选中Main Camera&#xff0c;点击Component-Cinemachine-CinemachineBrain&#xff0c;新建…

面了一个程序员,因为6休1拒绝了我

人一辈子赖以生存下去的主要就考虑三件事&#xff0c;职业&#xff0c;事业&#xff0c;副业&#xff0c;有其1-2都是很不错的。如果还没到40岁&#xff0c;那不妨提前想下自己可能遇到的一些情况&#xff0c;提前做一些准备&#xff0c;未雨绸缪些。 今年整体就业大环境也一般…

05 JavaSE-- 异常、IOStream、多线程、反射、Annotation、泛型、序列化

Exception 异常 异常也是对象&#xff0c;也有自己的体系&#xff0c;在这个体系中&#xff0c;所有异常对象的根类是 throwable 接口。异常和 error 错误是不同的概念。 错误是严重的 JVM 系统问题&#xff0c;一般不期待程序员去捕获、处理这些错误&#xff0c;同时&#xf…

55. UE5 RPG 处理当前功能在多人模式中的问题

在UE里面&#xff0c;我们运行项目可以设置多种网络模式&#xff0c;主要是分为三种&#xff1a; 运行Standalone 就是单人模式&#xff0c;没有网络交互以监听服务器运行&#xff0c;在界面里运行的游戏会作为服务器使用以客户端运行&#xff0c;UE会单独运行一个线程作为服务…

面向对象-----继承

前面向大家介绍了面向对象中的封装性&#xff0c;今天再来向大家介绍面向对象的继承和多态的两大特性。 1.继承 1.1 为什么需要继承&#xff1f; 在java语言中&#xff0c;我们用类来描述世间万物&#xff0c;虽然万物非常复杂&#xff0c;但总有一些共同点&#xff0c;如果…

深入Django项目实战与最佳实践

title: 深入Django项目实战与最佳实践 date: 2024/5/19 21:41:38 updated: 2024/5/19 21:41:38 categories: 后端开发 tags: Django 基础项目实战最佳实践数据库配置静态文件部署高级特性 第一章&#xff1a;Django项目架构与设计原则 Django框架概述 Django是一个高级的P…

linux的用户管理

新建用户&#xff1a;1.useradd 2.passwd 完成的操作&#xff1a; (1)/etc/passwd添加一行 (2)/etc/shadow添加一行 (3)/etc/group添加一行 (4)创建用户家目录 (5)创建用户邮件文件 例&#xff1a;创建用户jerry&#xff0c;要求: uid:777&am…

文心一言指令解析

1、介绍 文心一言是一款灵感启发类的产品&#xff0c;它以简洁而深刻的文字表达来激发读者的思考和感悟。该产品通过每天提供一句精选的短语&#xff0c;让用户在繁忙的生活中停下脚步&#xff0c;思考人生和内心的真实需求。 每一句文心一言都经过精心挑选&#xff0c;它们通…

苹果MacOS系统使用微软远程桌面连接Windows电脑桌面详细步骤

文章目录 前言1. 测试本地局域网内远程控制1.1 Windows打开远程桌面1.2 局域网远程控制windows 2. 测试Mac公网远程控制windows2.1 在windows电脑上安装cpolar2.2 Mac公网远程windows 3. 配置公网固定TCP地址 前言 日常工作生活中&#xff0c;有时候会涉及到不同设备不同操作系…

【SpringBoot】整合百度文字识别

流程图 一、前期准备 1.1 打开百度智能云官网找到管理中心创建应用 全选文字识别 1.2 保存好AppId、API Key和Secret Key 1.3 找到通用场景文字识别&#xff0c;立即使用 1.4 根据自己需要&#xff0c;选择要开通的项目 二、代码编写 以通用文字识别&#xff08;高精度版&am…

2024-5-4-从0到1手写配置中心Config之基于h2的config-server

添加依赖 新建的web工程中添加h2的依赖 添加h2的配置 设置数据源和密码设置初始化sql语句打开h2的控制台 初始化语句创建一个config表&#xff0c;保存服务配置信息。 完成CRUD接口 controller类 mapper接口 测试 在web控制台可以看到sql已经初始化完成&#xff0c;crud接口…

如何*永久*禁用edge打开PDF文件?

要永久禁用Microsoft Edge打开PDF文件&#xff0c;您可以按照以下步骤进行操作&#xff1a; 打开文件资源管理器并找到任意一个PDF文件。 右键单击该文件并选择“属性”。 在“属性”对话框中&#xff0c;单击“更改”按钮旁边的“打开方式”。 在“打开方式”对话框中&…

Leetcode - 398周赛

目录 一&#xff0c;3151. 特殊数组 I 二&#xff0c;3152. 特殊数组 II 三&#xff0c;3153. 所有数对中数位不同之和 四&#xff0c;3154. 到达第 K 级台阶的方案数 一&#xff0c;3151. 特殊数组 I 本题就是判断一个数组是否是奇偶相间的&#xff0c;如果是&#xff0c;…

【Floodfill算法】dfs或者bfs解决floodfill算法

1.图像渲染 图像渲染 dfs解决代码&#xff1a; class Solution { public:int dx[4] {0, 0, -1, 1};int dy[4] {-1, 1, 0, 0};int m, n;int prev;vector<vector<int>> ret;vector<vector<int>> floodFill(vector<vector<int>>& ima…

Java并发: 锁和同步

在Java并发: 面临的挑战那一篇中我们提到锁和同步是实现并发安全(可见性/原子性)的方法之一。这一章我们来讲讲Java中的锁和同步的各种工具&#xff0c;包括: LockSupportAbstractQueuedSynchronizerJava内置的锁实现 1. LockSupport LockSupport是基于Unsafe的park/unpark实…

linux 查看java线程与linux线程关系

linux 查看占用cpu高的 java 线程 linux 排查cpu占用100%故障 ##java程序 import java.util.Scanner; public class JavaThreadIDName {public static void main(String[] args) {Thread t Thread.currentThread();t.setName("laoyoutiao");System.out.println(&…

golang创建式设计模式---工厂模式

创建式设计模式—工厂模式 目录导航 创建式设计模式---工厂模式1)什么是工厂模式2)使用场景3)实现方式4)实践案例5)优缺点分析 1)什么是工厂模式 工厂模式(Factory Method Pattern)是一种设计模式&#xff0c;旨在创建对象时&#xff0c;将对象的创建与使用进行分离。通过定义…