当前位置: 首页 > news >正文

文件上传漏洞2-常规厂商检测限制绕过原理讲解

一.厂商检验限制方式:

我们先将DVWA的级别调为中级别。

进入文件上传功能点,点击查看源代码:

<?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 ) ) {

// 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>';
}
}

?>

相较于低级别的文件上传它多了一下代码进行校验机制:

$uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];      /*获取文件名字
$uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];          /*获取文件类型
$uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];           /*获取文件大小

// Is it an image?                  /*判断获取的文件类型是否属于image/jpeg文件
if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
( $uploaded_size < 100000 ) ) {

如果我们依然传上去一个php文件它就会检测到并不属于image/jpeg文件。

这就是常规所增加的校验机制。

二.绕过原理分析:

         厂商获取文件类型,并且直接对获取的文件类型进行校验,那我们需要研究他是从哪里获取

的文件类型,我们利用bp抓包进行研究。

        我们依旧上传fjw.php查看数据包。

可以看到上传失败,说明校验机制起了作用。

在数据包中我们发现是Content-Type传递的文件类型。

       那我们或许也可以通过修改数据包Content-Type为image/jpeg发送给目标服务器让其检验通过

或许可以进行绕过机制。下面进行尝试:

第一步.依旧上传文件:

第二布.抓取数据包并修改类型。

我们自主将Content-Type:改为image/jpeg进行放行。

可以看到我们上传成功,成功的绕过了检测机制。

逆向思维拓展:

       我们既然可以改变Content-Type类型,去绕过检验如果厂商直接检验文件后缀类型怎么办:

第一步:我们可以先修改fjw.php为fjw.jpg

然后我们依旧上传抓包:

我们查看数据包

可以看到他自动的将Content-Type识别为image/jpeg,那么我们的jpg文件上传上去可以用吗?

答案是当然不可以的。

第二布:我们将filename="fjw.jpg"改为:fjw.php,放包。

可以看到成功的上传文件。

以上就是中级别常规的文件上传绕过机制。

http://www.lryc.cn/news/585846.html

相关文章:

  • 【学习笔记】Nginx常用安全配置
  • 新型深度神经网络架构:ENet模型
  • 零基础搭建监控系统:Grafana+InfluxDB 保姆级教程,5分钟可视化服务器性能!​
  • 《通信原理》学习笔记——第一章
  • PID控制算法理论学习基础——单级PID控制
  • houdini vat 学习笔记
  • LangChain 代理(Agents)学习
  • 《Java Web程序设计》实验报告五 Java Script学习汇报
  • dubbo源码学习3-dubbo反射调用服务源码分析
  • Leetcode百题斩-二分搜索
  • 【Linux仓库】虚拟地址空间【进程·陆】
  • 【学习笔记】Linux命令
  • AI:机器人未来的形态是什么?
  • 咨询导览,AI发展趋势
  • Leet code 每日一题
  • 【设计模式】外观模式(门面模式)
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态
  • ubuntu18.04 升级Ubuntu 20.04
  • vue3 el-table动态表头
  • Vue 项目打包部署还存在问题?你知道怎么做吧?
  • React - css 模块化(modules)
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • 智慧公安总体建设方案PPT(78页)
  • 江协科技STM32入门教程——通信接口
  • 《Java Web程序设计》实验报告四 Java Script前端应用和表单验证
  • Vue.js:从 Web 到桌面的跨端实践与技术选型指南
  • C++11的整理笔记
  • 【PTA数据结构 | C语言版】出栈序列的合法性
  • 20250712-3-Kubernetes 应用程序生命周期管理-服务编排(YAML)及编写技巧_笔记
  • 【算法笔记】7.LeetCode-Hot100-图论专项