Unsafe-FilesUpload 不安全的文件上传 | DVWA&Pikachu

[复制链接]
发表于 2026-1-10 09:59:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
目次

概念
DVWA
low
medium
high
impossible
Pikachu 
client check
MIME type
getimagesize
文件上传毛病防护


概念

**文件上传毛病**是网络安全中常见的毛病之一,攻击者可以使用该毛病上传恶意文件,进而在服务器上实验恶意代码、绕过权限验证或获取敏感数据。文件上传毛病重要发生在答应用户上传文件的Web应用步伐中,比如图像、文档上传功能等。
### 毛病危害
1. **远程代码实验**:攻击者可以上传带有恶意代码的文件(如PHP、ASP等脚本文件),并通过访问这些文件在服务器上实验恶意代码,控制服务器。
2. **权限绕过**:攻击者上传伪装的文件,如改名为合法扩展名的文件,绕过上传限定,上传实验有害内容。
3. **Webshell**:攻击者上传一个 Webshell,答应他们通过这个入口对服务器举行进一步的操纵和攻击。
4. **存储型XSS攻击**:攻击者上传包罗恶意JavaScript的文件,并在其他用户查察时实验这些脚本,从而偷取用户数据或实验恶意操纵。
### 文件上传毛病的范例
1. **无文件范例限定**:应用步伐没有限定上传文件的范例或扩展名,答应上传恣意范例的文件。
2. **扩展名绕过**:构建上传文件后缀黑名单。
3. **MIME范例绕过**:通过修改文件的 MIME 范例,绕过服务器的检测。
4. **双扩展名攻击**:攻击者通过使用双扩展名(如 `shell.php.jpg`)迷惑上传机制,上传后服务器大概会根据末了一个扩展名来处置处罚,导致恶意代码实验。
###毛病条件
1.目标网站具有上传功能。
2.上传的目标文件可以或许被Web服务器剖析实验。
3.知道文件上传到服务器后的存放路径和文件名称。
4.目标文件可被用户访问。
DVWA

low

代码分析:
  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. //判断上传是否为空
  4. //文件上传时,通常会将上传的文件保存到临时目录中,然后使用move_upload_file()将其移动到最终的存储位置。
  5.     // Where are we going to be writing to?
  6.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  7. //定义了文件上传的目标路径,这里假设DVWA_WEB_PAGE_TO_ROOT是一个常量或变量,表示网站的根目录路径。目标路径为 “hackable/uploads/” 子目录。
  8.     $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  9. //basename(path,suffix)函数用于获取文件名部分
  10. //将上传的的原始文件名添加到目标路径中。
  11. //即:$target_path = 根目录/hackable/uploads/123.php
  12.     // Can we move the file to the upload folder?
  13.     if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
  14. //使用move_upload_file(string $filename,string $destination)函数将上传的文件从临时目录移动到目标路径
  15.         
  16. // No
  17.         echo '<pre>Your image was not uploaded.</pre>';
  18.     }
  19.     else {
  20.         // Yes!
  21.         echo "<pre>{$target_path} succesfully uploaded!</pre>";
  22.     }
  23. }
  24. ?>
复制代码
此代码仅做了上传判断,并没有对上传文件的后缀做判断,以是这里做恣意上传即可。
上传phpinfo.php,以及一句话木漏洞本。


 蚂剑链接:

总结:恣意文件上传。


medium

代码分析:
  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3.     // Where are we going to be writing to?
  4.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5.     $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  6.     // File information
  7.     $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  8.     $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  9.     $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  10. //提取上传文件的文件名、类型、大小
  11.     // Is it an image?
  12.     if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
  13.         ( $uploaded_size < 100000 ) ) {
  14. //判断过滤上传文件的后缀类型为image/jpeg,image/png以及大小
  15.         // Can we move the file to the upload folder?
  16.         if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
  17.             // No
  18.             echo '<pre>Your image was not uploaded.</pre>';
  19.         }
  20.         else {
  21.             // Yes!
  22.             echo "<pre>{$target_path} succesfully uploaded!</pre>";
  23.         }
  24.     }
  25.     else {
  26.         // Invalid file
  27.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  28.     }
  29. }
  30. ?>
复制代码
此次上传木马报错:

于是我们抓包修改--抓包右键--发送至repeater:

 修改为如下:

 上传乐成:

蚁剑链接:

总结:抓包修改Content-Type范例(实体主题文件范例)


high

代码分析:
  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3.     // Where are we going to be writing to?
  4.     $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5.     $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  6.     // File information
  7.     $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  8.     $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  9. //        strrpos(string,find,start):返回指定字符串最后一次出现的位置
  10. //         string:必须。规定被搜索的字符串
  11. //         find:必须。规定要查找的字符
  12. //         start:可选。规定开始搜索的位置
  13. //substr(string,start,length):返回指定字符串的指定一部分
  14. //即过滤出文件后缀。
  15.     $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  16.     $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];
  17.     // Is it an image?
  18.     if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
  19.         ( $uploaded_size < 100000 ) &&
  20.         getimagesize( $uploaded_tmp ) ) {
  21. //strtolower():将字符转换小写,基本杜绝了大小绕过
  22. //getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息;
  23. //getimagesize() 函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型及图片高度与宽度。
  24.         // Can we move the file to the upload folder?
  25.         if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
  26.             // No
  27.             echo '<pre>Your image was not uploaded.</pre>';
  28.         }
  29.         else {
  30.             // Yes!
  31.             echo "<pre>{$target_path} succesfully uploaded!</pre>";
  32.         }
  33.     }
  34.     else {
  35.         // Invalid file
  36.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  37.     }
  38. }
  39. ?>
复制代码
由于这里使用了getimagesize()函数对上传图片做了属性验证,我们添加GIF文件头标识:GIF89a绕过:

上传乐成(只试出了GIF文件头表现收效,别的的可以再试试)
接下来我们通过文件包罗毛病访问(困难度不限定):
http://[靶机ip]/DVWA/vulnerabilities/fi/?page=X:\phpStudy\WWW\DVWA\hackable\uploads\phpinfo.png

总结:伪造文件头辨认上传文件的文件范例。


impossible

代码分析:
  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3.     // Check Anti-CSRF token
  4.     checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  5.     // File information
  6.     $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  7.     $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  8.     $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  9.     $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  10.     $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];
  11.     // Where are we going to be writing to?
  12.     $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
  13.     //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
  14.     $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  15.     $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
  16.     $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  17.     // Is it an image?
  18.     if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
  19.         ( $uploaded_size < 100000 ) &&
  20.         ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
  21.         getimagesize( $uploaded_tmp ) ) {
  22.         // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
  23.         if( $uploaded_type == 'image/jpeg' ) {
  24.             $img = imagecreatefromjpeg( $uploaded_tmp );
  25.             imagejpeg( $img, $temp_file, 100);
  26.         }
  27.         else {
  28.             $img = imagecreatefrompng( $uploaded_tmp );
  29.             imagepng( $img, $temp_file, 9);
  30.         }
  31.         imagedestroy( $img );
  32.         // Can we move the file to the web root from the temp folder?
  33.         if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
  34.             // Yes!
  35.             echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
  36.         }
  37.         else {
  38.             // No
  39.             echo '<pre>Your image was not uploaded.</pre>';
  40.         }
  41.         // Delete any temp files
  42.         if( file_exists( $temp_file ) )
  43.             unlink( $temp_file );
  44.     }
  45.     else {
  46.         // Invalid file
  47.         echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  48.     }
  49. }
  50. // Generate Anti-CSRF token
  51. generateSessionToken();
  52. ?>
复制代码


Pikachu 

client check


构造payload文件,比方phpinfo或一句话木马文件,文件范例为.jpg或.png上传绕过前端校验,
后抓包修改为.php文件,


访问该文件。已经直接给出文件存储路径,



MIME type

上传.php样本文件,修改Content-Type的字段值,

*MIME type:多用途互联网邮件扩展范例,本质是标识文件/数据格式化字符串,焦点作用是让欣赏器/服务器知道”当前处置处罚的是什么范例的数据“,从而精确剖析。比方:text/html(HTML文件),image/jpeg(JPG图片),applocation/json(JSON数据),application/pdf(PDF文件),audio/mp3(MP3音频),video/mp4(MP4视频)...一样平常前端上传文件时欣赏器会自动辨认文件的MIME type供服务器校验。


getimagesize

实验了前两种方式都不可,添加文件头方式:
  1. GIF89a
  2. <?php
  3. phpinfo();
复制代码




文件上传毛病防护

*限定高危扩展名上传。
        构建黑名单确定后缀名是否合法。
        上传文件后缀重定名。
*限定高危文件内容出现。
        使用内容检测是否存在非正常内容。
        确认图片格式与上传文件内容是否对应。
        图像加载二次渲染。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表