File Upload

1. 题目

File Upload,即文件上传漏洞,通常是由于对上传文件的类型、内容没有进行严格的过滤、检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁灭性的,Apache、Tomcat、Nginx等都曝出过文件上传漏洞。

2. Low

a. 代码分析

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// 这段代码是有关文件上传之后的位置的。basename函数返回路径中的文件名部分。如果可选参数suffix为空,则返回的文件名包含后缀名,反之不包含后缀名。
$target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] ); // 判断是否可以上传。move_uploaded_file函数将上传的文件移动到新位置。
if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
// 上传失败
echo '<pre>Your image was not uploaded.</pre>';
}
else {
// 上传成功,并返回文件路径
echo "<pre>{$target_path} succesfully uploaded!</pre>";
}
}
?>

代码中

basename(path,suffix)函数返回路径中的文件名部分。
path 必需。规定要检查的路径
suffix 可选。规定文件扩展名。如果文件有名有文件扩展名,将不会显示这个扩展名 move_uploaded_file(file,newloc)函数将上传的文件移动到新位置。若成功,则返回 true,否则返回 false。
file 必需。规定要移动的文件。
newloc 必需。规定文件的新位置。

服务器对上传文件的类型、内容没有做任何的检查、过滤,存在上传漏洞。上传文件后返回文件路径。

b. 漏洞利用

文件上传漏洞的利用是有限制条件的,首先当然是要能够成功上传木马文件,其次上传文件必须能够被执行,最后就是上传文件的路径必须可知。

这里直接上传一句话木马。

3. Medium

a. 代码分析

<?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' ] ); // 上传文件的相关信息
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ]; // 判断上传的文件是否是jpeg和png图片且大小小于100000字节
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {
// 判断文件是否能够上传
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 {
// 上传的文件不是图片,返回以下信息给用户
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>

代码限制了上传文件类型为jpeg或png,大小不能超过100000B。

$_FILES['image']['type']的值是从浏览器中发送的MIME值确定的,而浏览器发送的数据都有可能是不安全的。MIME可用通过修改数据包,进行篡改。

b. 漏洞利用

方法一:抓包修改文件类型

使用burpsuite,修改MIME。

修改为image/png,上传成功:

方法二:使用文件包含漏洞

或者借助Medium级别的文件包含漏洞,构造payload:http://[ip]/dvwa/vulnerabilities/fi/?page=hthttp://tp://[ip]/dvwa/hackable/uploads/backdoor.png

然后使用菜刀连接,得到webshell。

使用菜刀工具时,需要Cookie参数。

方法三:截断绕过(转自大佬)

新手指南:DVWA-1.9全级别教程之File Upload

在php版本小于5.3.4的服务器中,当Magic_quote_gpc选项为off时,可以在文件名中使用%00截断,所以可以把上传文件命名为backdoor.php%00.png

4. High

a. 代码分析

<?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' ] ); // 文件信息。strrpos函数查找字符串在另一字符串中最后一次出现的位置(区分大小写);substr函数返回字符串的一部分。
$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' ]; // 判断是否是图片。strtolower函数将所有字符转换为小写;getimagesize函数用于获取图像的大小及相关信息。
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>';
}
}
?>

代码获取文件后缀名:

strrpos(string,find,start)函数查找字符串在另一字符串中最后一次出现的位置。
参数 描述
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定在何处开始搜索。

其实是防范iis 6.0文件解析漏洞的,有时我们为了绕过限制会提交这样形式的文件:

Xx.asp;.xx.jpg xx.jpg

而这句话的作用就是说它会验证文件的最后一个点之后的格式上面的例子来说就是不管你前面写了多少,我只验证最后的 .jpg

getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。

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

可以看到,High级别的代码读取文件名中最后一个”.”后的字符串,期望通过文件名来限制文件类型,因此要求上传文件名形式必须是.jpg.jpeg.png之一。同时,getimagesize函数更是限制了上传文件的文件头必须为图像类型。

b. 漏洞利用

制作图片马,上传后门。

将后门与图片进行结合。

上传成功:

借助High级别的文件包含漏洞,将图片当作php执行。

url为:http://[ip]/DVWA/vulnerabilities/fi/?page=file:///home/wwwroot/default/DVWA/hackable/uploads/hack.jpg

使用菜刀进行连接。

5. impossible

a.代码分析

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// Check Anti-CSRF token
checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
// File information
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
$uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
// Where are we going to be writing to?
$target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
// 将上传的文件进行改名以及确定上传的目录位置。uniqid函数基于以微秒计的当前时间,生成一个唯一的 ID;ini_get函数用于获取一个配置选项的值。sys_get_temp_dir函数用于返回临时文件的目录。
$target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
$temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
$temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
// Is it an image?
if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
( $uploaded_size < 100000 ) &&
( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
getimagesize( $uploaded_tmp ) ) { // 通过对图像重新编码来删除任何元数据(Note, using php-Imagick is recommended over php-GD)
if( $uploaded_type == 'image/jpeg' ) {
$img = imagecreatefromjpeg( $uploaded_tmp );
imagejpeg( $img, $temp_file, 100);
}
else {
$img = imagecreatefrompng( $uploaded_tmp );
imagepng( $img, $temp_file, 9);
}
imagedestroy( $img ); // Can we move the file to the web root from the temp folder?
if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
// Yes!
echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
}
else {
// No
echo '<pre>Your image was not uploaded.</pre>';
}
// Delete any temp files
if( file_exists( $temp_file ) )
unlink( $temp_file );
}
else {
// Invalid file
echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
// Generate Anti-CSRF token
generateSessionToken();
?>

ini_get ( string $varname ) 成功时返回配置选项的值。

imagecreatefromjpeg ( string $filename ) 由文件或 URL 创建一个新图象。

imagejpeg (resource $image, string $filename, int $quality)
从 image 图像以 filename 为文件名创建一个 JPEG 图像。
image 由图象创建函数(例如imagecreatetruecolor())返回的图象资源。
filename 文件保存的路径,如果未设置或为 NULL,将会直接输出原始图象流。
quality 可选项,范围从 0(最差质量,文件更小)到 100(最佳质量,文件最大)。默认为 IJG 默认的质量值(大约 75)。

imagedestroy ( resource $image ) 函数销毁图像资源

getcwd ( void ) 取得当前工作目录。

代码通过对上传文件进行了md5编码导致%00截断无法绕过过滤规则,加入Anti-CSRF token防护CSRF攻击,同时对文件的内容作了严格的检查,导致攻击者无法上传含有恶意脚本的文件。

DVWA学习记录 PartⅤ的更多相关文章

  1. DVWA学习记录 PartⅦ

    SQL Injection 1. 题目 SQL Injection,即SQL注入,是指攻击者通过注入恶意的SQL命令,破坏SQL查询语句的结构,从而达到执行恶意SQL语句的目的. 2. Low a. ...

  2. DVWA学习记录 PartⅣ

    File Inclusion 1. 题目 File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include ...

  3. DVWA学习记录 PartⅢ

    CSRF 1. 题目 CSRF,全称Cross-site request forgery,翻译过来就是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie.会话等),诱骗其点击恶意链接或者 ...

  4. DVWA学习记录 PartⅠ

    DVWA介绍 DVWA(Damn Vulnerable Web Application)是一个用来进行安全脆弱性鉴定的PHP/MySQL Web应用,旨在为安全专业人员测试自己的专业技能和工具提供合法 ...

  5. DVWA学习记录 PartⅨ

    XSS(DOM) 1. 题目 XSS,全称Cross Site Scripting,即跨站脚本攻击,某种意义上也是一种注入攻击,是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在 ...

  6. DVWA学习记录 PartⅧ

    Weak Session IDs 1. 题目 用户访问服务器的时候,为了区别多个用户,服务器都会给每一个用户分配一个 session id .用户拿到 session id 后就会保存到 cookie ...

  7. DVWA学习记录 PartⅥ

    Insecure CAPTCHA 1. 题目 Insecure CAPTCHA(全自动区分计算机和人类的图灵测试),意思是不安全的验证码. 指在进行验证的过程中,出现了逻辑漏洞,导致验证码没有发挥其应 ...

  8. DVWA学习记录 PartⅡ

    Command Injection 1. 题目 Command Injection,即命令注入,是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的. 2. Low a. 代码分析 ...

  9. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

随机推荐

  1. Spring导入外部资源

    创建一个数据库连接的 properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmbuil ...

  2. Android学习笔记Tab代替ActionBar做的顶部导航

    1.先准备5个Fragement作为标签页 package com.lzp.youdaotab; import android.os.Bundle; import android.view.Layou ...

  3. Eplan PLC连接点-两两相连接方法

    Eplan PLC连接点-两两相连接方法. 1.插入->符号连接->T节点(向右). 2.如图 3.如图 然后再.插入->符号连接->T节点(向左). 重复2,3.即可完成两两 ...

  4. 获取系统的IP地址

    获取linux主机的IP地址 问题描述 在很多软件配置过程中,都需要设置ID信息,通常我选择使用系统配置的eth0网卡的IP地址信息,比如salt-minion-id,在通过cobbler批量安装操作 ...

  5. koa2 的使用方法:(一)

    1. koa2 使用方法: 安装指令是: npm install koa2 使用koa2 创建项目工程: 1. koa2 (项目工程) 2. 进入项目工程: cd 进入您所创建的项目工程 3. npm ...

  6. react 的一个插件

    Reactjs code snippets  (vs code  编辑器里面的一个插件    支持 react 得简写) rcc     和 rfc    可以快速生成react代码 下面网址是个re ...

  7. Unable to resolve dependency for ':app@debug/compileClasspath': Could not find any version that matc

    错误展示: 错误提示: Unable to resolve dependency for ':app@debug/compileClasspath': Could not find any versi ...

  8. 想学好Python,你必须了解Python中的35个关键词

    每种编程语言都会有一些特殊的单词,称为关键词.对待关键词的基本要求是,你在命名的时候要避免与之重复.本文将介绍一下Python中的关键词.关键词不是内置函数或者内置对象类型,虽然在命名的时候同样也最好 ...

  9. springboot自动装配原理

    最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...

  10. CentOS 7 下安装 MySQL 8.0

    前言 本篇文章主要介绍在 CentOS 7 环境下安装 MySQL 8.0. 正文 1. 配置yum源 首先在 https://dev.mysql.com/downloads/repo/yum/ 找到 ...