DVWA文件上传高级源码分析详解
2023-6-17 20:32:16 Author: www.freebuf.com(查看原文) 阅读量:7 收藏

freeBuf

主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

1.源码详解

<?php
if( isset( $_POST[ 'Upload' ] ) ) {
// post传参
$target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
//设定文件上传路径
$target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
//上传后的文件路径=文件上传的路径+文件名
//上传文件的参数(名字,大小,后缀名)
$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
$uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
//输出后缀名
//strrpos()在这里的作用返回后缀名前一位的位数,即.前面的字母是整个文件名字符串的第几位。(例如:abc.jpg的j是整个字符串的第5位)
//substr()在这里的作用是分割字符串,例如将abc.jpg字符串从第5位开始分割,并将分割后的字符串返回(jbg)
$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 ) ) {
    // strtolower()将后缀名字符串转化为小写
    //if判断后缀名的格式,文件的大小(97kb),文件的文件头
   //getimagesize()函数用于获取图像大小及相关信息,即不仅后缀名要           符合上传要求,图像内容也要符合上传要求
   // Can we move the file to the upload folder?
   if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
       // move_uploaded_file()检查并确保$uploaded_tmp是合法             的上传文件,如果文件合法,则将其移动为由 $target_path 指               定的文件
       echo '<pre>Your image was not uploaded.</pre>';
  }
   else {
       // Yes!
       echo "<pre>{$target_path} succesfully uploaded!</pre>";
  }
}
else {
   // 如果不是png,jpg,jpeg格式,小于97kb,文件内容不属于图片的,输出下列内容
   echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
}
}
?>

2.函数

函数解释
basename返回路径中的文件名部分
strrpos计算指定字符串在目标字符串中最后一次出现的位置
substr返回字符串的子串
strtolower将字符串转化为小写
getimagesize用于获取图像大小及相关信息
move_uploaded_file将上传的文件移动到新位置

3.案例

(1).basename

basename($path,  $suffix = "")

参数

path
一个路径。
在 Windows 中,斜线(/)和反斜线(\)都可以用作目录分隔符。在其它环境下是斜线(/)。
suffix
如果文件名是以 suffix 结束的,那这一部分也会被去掉。

1687004499_648da55358b2e6750ba9d.png!small?1687004499338

(2).strrpos()

strrpos($haystack, $needle,$offset)

参数

haystack,在此字符串中进行查找。
needle,指定该字符串
offset,如果为 0 或正数,则从左到右搜索,如果为负数,则从右向左执行搜索

1687004570_648da59a81586a7f39216.png!small?1687004570399

(3).substr()

substr($string, $offset, $length)

参数

string,输入字符串。 
offset,如果为 0 或正数,则从左到右搜索,如果为负数,则从右向左执行搜索,如果 string 的长度小于 offset,将返回空字符串
length,如果为正数,则从左到右搜索,如果为负数,则从右向左执行搜索,如果提供了值为 0 的 length,那么将返回一个空字符串。

1687004581_648da5a5ec979ba05c3cd.png!small?1687004581938

(4).strtolower()

strtolower($string)

参数

string,输入字符串

1687004590_648da5aecd9bcc56a15e1.png!small?1687004591140

(5).getimagesize

getimagesize($filename)

1687004606_648da5bec5bc73a7b0b04.png!small?1687004606827

(6).move_uploaded_file

move_uploaded_file($from,$to)

参数

from,上传的文件的文件名。       

to,移动文件到这个位置。

本函数检查并确保由from指定的文件是合法的上传文件(即通过 PHP 的 HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由to指定的文件。 这种检查显得格外重要,如果上传的文件有可能会造成对用户或本系统的其他用户显示其内容的话。

该函数需要与上传文件的函数配合使用,故不在此演示。


文章来源: https://www.freebuf.com/articles/web/369786.html
如有侵权请联系:admin#unsafe.sh