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,

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netcat一键开始瑞士军刀模式(KALI工具系列五)

目录 1、KALI LINUX简介 2、netcat工具简介 3、在KALI中使用netcat 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 测试某IP的端口是否打开 4.2 TCP扫描 4.3 UDP扫描 4.4 端口刺探 4.5 直接扫描 5、即时通信 5.1 单击对话互联 5.2 传…

知识表示概述

文章目录 知识表示研究现状技术发展趋势 知识表示 知识是人类在认识和改造客观世界的过程中总结出的客观事实、概念、定理和公理的集合。知识具有不同的分类方式&#xff0c;例如按照知识的作用范围可分为常识性知识与领域性知识。知识表示是将现实世界中存在的知识转换成计算机…

巨某量引擎后台登录实战笔记 | Playwright自动化框架

前言 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 入正题看看滑块是怎么个事…

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络&#xff1f; 网络就是有许多台设备包括计算机单不仅限于计算机&#xff0c;这些设备通过相互通信所组成起来系统&#xff0c;我们称之为网络所以如…

Gartner发布中国数据安全安全与风险管理领导者指南:将孤立的数据安全产品集成到数据安全平台中,实施一致的数据安全策略

在中国开展业务或与中国相关的组织面临着越来越多的数据安全风险和法规。安全和风险管理领导者必须采用风险优先的数据安全计划和投资&#xff0c;以响应监管要求&#xff0c;以增强数据驱动的数字创新能力。 主要发现 跨组织职能的分散的数据安全举措和不协调的利益相关者责任…

服务器c盘爆满了,这几种方法可以帮助C盘“瘦身”

我们在使用服务器的时候基本不会在C盘安装软件&#xff0c;那么用久了发现C盘满了&#xff0c;提示空间不足&#xff1f;那么这是怎么回事&#xff0c;为什么空间会占用这么快呢&#xff1f; 原因一&#xff1a; C盘满了&#xff0c;很可能是因为电脑里的垃圾文件过多。操作系…

薪资不公、晋升无望?动笔写一份申诉材料吧!

薪资不公、晋升无望&#xff1f;动笔写一份申诉材料吧&#xff01; 引言&#xff1a;每个努力工作的人都值得公平对待 在职场上&#xff0c;我们付出了汗水和智慧&#xff0c;期待着相应的回报——合理的工资和公正的晋升机会。然而&#xff0c;现实并不总是如此美好。当你感觉…

芯片设计公司外协ERP数字化运营:科技与管理的融合

随着信息技术的快速发展&#xff0c;ERP(企业资源计划)系统已经成为现代企业管理不可或缺的一部分。在芯片设计行业&#xff0c;由于产品的复杂性、技术的高要求以及市场的快速变化&#xff0c;外协ERP数字化运营显得尤为重要。 芯片设计公司的外协ERP数字化运营&#xff0c;主…

xxe漏洞--xml外部实体注入漏洞

1.xxe漏洞介绍 XXE&#xff08;XML External Entity Injection&#xff09;是一种攻击技术&#xff0c;它允许攻击者注入恶意的外部实体到XML文档中。如果应用程序处理XML输入时未正确配置&#xff0c;攻击者可以利用这个漏洞访问受影响系统上的敏感文件、执行远程代码、探测内…

晶体振荡器

一、晶振与晶体区别 晶振是有源晶振的简称&#xff0c;又叫振荡器&#xff0c;英文名称是oscillator&#xff0c;内部有时钟电路&#xff0c;只需供电便可产生振荡信号&#xff1b;晶体是无源晶振的简称&#xff0c;也叫谐振器&#xff0c;英文名称是crystal&#xff0c;是无极…

机械臂与Realsense D435 相机的手眼标定ROS包

本教程主要介绍机械臂与 Realsense D435 相机手眼标定的配置及方法。 系统&#xff1a;Ubuntu 20.0.4 ◼ ROS&#xff1a;Noetic ◼ OpenCV 库&#xff1a;OpenCV 4.2.0 ◼ Realsense D435&#xff1a;librealsense sdk&#xff08;2.50.0&#xff09;、realsense-ros 功能包&…

Kafka-文件存储机制

Kafka概述 Kafka-文件存储机制 1. 分区&#xff1a; Kafka中的每个主题&#xff08;topic&#xff09;都可以分成一个或多个分区。 Topic是逻辑上的概念&#xff0c;而Partition是物理上的概念。 分区是消息的基本单元&#xff0c;每个分区都是一个有序的log日志文件。 Pr…

Linux网络配置全攻略:解读/etc/network/interfaces文件的精髓

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Linux网络配置全攻略&#xff1a;解读/etc/network/interfaces文件的精髓 前言文件结构与基本概念配置网络接口的常用参数高级网络配置技巧实用工具与调试技巧实战案例与最佳实践 前言 在我们的日常生…

【数据库基础】基本认识数据库--入门引导

文章目录 什么是数据库&#xff1f;主流数据库基本使用安装MySQL连接服务器服务器、数据库、表关系使用案例数据逻辑存储 MySQL架构SQL语句分类什么叫存储引擎 什么是数据库&#xff1f; 数据库是指在磁盘和内存中存储特定结构组织的数据。数据库通常用于存储于某个系统、组织或…

基于springboot实现的校园博客系统

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Mac SourceTree配置ssh git仓库

一、准备条件 1、Mac系统电脑 2、安装好SourceTree 3、获取ssh git仓库地址 二、配置步骤 1、打开终端命令行 ssh -t rsa -C "xxx""xxx"代表注册git仓库时&#xff0c;使用的用户名&#xff0c;可以是字符串也可以是邮箱地址。 如果遇到输入密码&#xf…

无线网络安全技术基础

无线网络安全技术基础 无线网络安全风险和隐患 随着无线网络技术广泛应用,其安全性越来越引起关注.无线网络的安全主要有访问控制和数据加密,访问控制保证机密数据只能由授权用户访问,而数据加密则要求发送的数据只能被授权用户所接受和使用。 无线网络在数据传输时以微波进…

数据访问层设计_6.连接对象管理设计

1.数据库连接管理 在基于JDBC的数据库应用开发中&#xff0c;数据库连接的管理是一个难点&#xff0c;因为它是决定该应用性能的一个重要因素。 对于共享资源&#xff0c;有一个很著名的设计模式——资源池。该模式正是为了解决资源频繁分配、释放所造成的问题。把该模式应用到…

Centos7.9安装卸载Docker

文章目录 1、官网安装1.1、卸载旧版本Docker1.2、通过rpm仓库安装1.2.1、设置仓库1.2.2、安装Docker Engine1.2.3、启动Docker1.2.4、验证安装 1.3、通过rpm软件包安装1.4、通过便捷脚本安装 2、yum安装2.1、安装docker-ce以及客户端2.2、启动docker2.3、配置镜像加速 3、卸载D…

Linux安装刻录软件

在工作场景经常使用光盘和刻录机&#xff0c;在windows系统下有nero软件&#xff0c;在linux下有k3b,但是原始的k3b只能一次刻录&#xff0c;十分浪费光盘&#xff0c;这里我们使用经优麒麟优化过的刻录软件&#xff0c;实现多次追加刻录。 进入优麒麟软件仓库&#xff0c;需要…