网站建设市场价,下载小程序官方免费,wordpress 前台文件上传,泰安市人才市场招聘网一、 文件上传漏洞与危害 什么是文件上传漏洞#xff1f; 文件上传漏洞是指攻击者利用网站的用户文件上传功能#xff0c;将恶意文件上传到服务器#xff0c;并利用服务器的解析执行功能来运行这些文件#xff0c;从而获得服务器的控制权限。这种漏洞主要是由于网站对用户上…一、 文件上传漏洞与危害什么是文件上传漏洞文件上传漏洞是指攻击者利用网站的用户文件上传功能将恶意文件上传到服务器并利用服务器的解析执行功能来运行这些文件从而获得服务器的控制权限。这种漏洞主要是由于网站对用户上传的文件类型、内容等没有进行严格的验证和处理所导致的。上传文件的时候如果服务器端脚本语言未对上传的文件进行严格的验证和过滤 就有可能上传恶意的脚本文件从而控制整个网站甚至是服务器。文件上传漏洞的危害主要包括以下几点重要信息泄露如果攻击者能够成功上传并执行恶意代码他们可能能够访问服务器上的敏感信息如用户数据、配置文件等。执行破坏性操作攻击者可以利用文件上传漏洞执行恶意代码对系统进行破坏如删除文件、修改数据等。在严重的情况下他们甚至可能完全控制系统导致系统瘫痪或数据被毁。为其他攻击打下基础一旦攻击者通过文件上传漏洞获得了系统的部分控制权他们可能会利用这一点来进一步发动更复杂的攻击如网络钓鱼、分布式拒绝服务DDoS攻击等。总的来说文件上传漏洞是一种严重的安全威胁需要网站管理员和开发人员高度重视并采取有效的防范措施。为了防范文件上传漏洞很多网站通常采取以下措施对用户上传的文件进行严格的类型和内容验证确保只允许上传安全的文件类型。对上传的文件进行重命名避免与服务器上已有的文件重名增加攻击者猜测文件路径的难度。将文件上传的目录设置为不可执行这样即使攻击者上传了恶意脚本服务器也不会执行它。使用随机数改写文件名和文件路径增加攻击者访问上传文件的难度。加强服务器的安全配置如登录强度控制、病毒扫描、数据库保护和入侵检测等。学习目标利用文件上传漏洞实现向指定靶场上传“恶意脚本文件”。二、实践预热- 抓包网络靶场Cyber Range是一种基于虚拟化技术对真实网络空间中的网络架构、系统设备、业务流程的运行状态及运行环境进行模拟和复现的技术或产品以更有效地实现与网络安全相关的学习、研究、检验、竞赛、演习等行为从而提高人员及机构的网络安全对抗水平。网络靶场的核心理念是仿真在一个脱离或部分脱离生产环境和业务环境的情况下对真实环境实现最大限度的模拟。自己搭建一个用于渗透学习的网站或者环境。upload-labs 靶场准备配置项配置描述操作系统windows老师用的window操作系统PHP版本5.2.17版本差异导致代码无法正常执行原版用5.2.17版本中间件Apache自带的搭建好之后访问http://自己的ip地址/index.phpBP抓包为什么要进行bp抓包为了绕过网站对于上传文件的检测我们可以选择在网址发送上传请求到后台的时候截停请求包修改请求信息以达到绕过后台对上传文件信息进行校验的目的。三、实战 -寻找漏洞绕过文件上传检测无文件解析安全问题上格式解析是一对一的不能把jpg的图片解析成php脚本 换句话来说有解析错误配置或后缀解析漏洞时才能实现格式差异解析Pass-01js验证漏洞绕过方式禁用js脚本加载改成jpg后缀然后抓包 再把jpg改成php漏洞原理对于文件上传的限制由js代码实现。// 定义一个名为 checkFile 的函数用于检查用户选择的上传文件是否符合要求 function checkFile() { // 通过 document.getElementsByName 方法获取名为 upload_file 的文件输入元素 // 并取得其 value 属性即用户选择的文件路径不同浏览器显示可能不同 var file document.getElementsByName(upload_file)[0].value; // 检查 file 变量是否为 null 或者为空字符串 if (file null || file ) { // 如果未选择文件弹出提示框告知用户请选择要上传的文件 alert(请选择要上传的文件!); // 返回 false表示文件检查不通过 return false; } // 定义一个字符串变量 allow_ext用于存储允许上传的文件类型 // 不同类型之间用竖线 | 分隔这里允许上传的文件类型有 .jpg、.png 和 .gif var allow_ext .jpg|.png|.gif; // 使用 lastIndexOf 方法找到文件路径中最后一个点 . 的位置 // 然后从该位置开始截取字符串得到文件的扩展名例如 .jpg、.png 等 var ext_name file.substring(file.lastIndexOf(.)); // 使用 indexOf 方法检查 allow_ext 字符串中是否包含当前文件扩展名加上竖线 | 的组合 // 如果返回 -1 表示不包含即该文件类型不被允许上传 if (allow_ext.indexOf(ext_name |) -1) { // 构建一个错误提示信息字符串 errMsg告知用户该文件不允许上传 // 并列出允许上传的文件类型和当前文件的实际类型 var errMsg 该文件不允许上传请上传 allow_ext 类型的文件,当前文件类型为 ext_name; // 弹出提示框显示错误信息 alert(errMsg); // 返回 false表示文件检查不通过 return false; } // 如果以上检查都通过函数默认会返回 undefined但在这种上下文中 // 可以理解为文件检查通过后续可以进行文件上传操作 }image/pngPass-02文件类型验证漏洞绕过方式使用bp拦截请求修改文件类型.1、使用BP拦截请求。2、修改请求参数 Content-Type 为 image/png漏洞原理网站服务器在接收到前端发起的文件上传请求后会验证请求信息中携带的文件类型是否正确不合法类型的文件上传会不成功。// 初始化一个布尔变量 $is_upload用于标记文件是否上传成功初始值为 false 表示未上传成功 $is_upload false; // 初始化一个变量 $msg用于存储上传过程中可能出现的提示信息初始值为 null 表示暂无提示信息 $msg null; // 检查是否通过 POST 方法提交了名为 submit 的表单数据通常意味着用户点击了提交按钮 if (isset($_POST[submit])) { // 检查上传文件的目标路径由常量 UPLOAD_PATH 定义是否存在 if (file_exists(UPLOAD_PATH)) { // 检查上传文件的 MIME 类型是否为允许的图片类型JPEG、PNG 或 GIF // MIME 类型是一种标准化表示文档、文件或字节流的性质和格式。由主类型type和子类型subtype两部分组成中间用斜杠/分隔其一般形式为 ype/subtype。 if (($_FILES[upload_file][type] image/jpeg) || ($_FILES[upload_file][type] image/png) || ($_FILES[upload_file][type] image/gif)) { // 获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 构建上传文件在目标路径下的完整路径将目标路径和上传文件的原始文件名拼接起来 // 注意原代码此处缺少分号正确的代码应该加上分号如下 $img_path UPLOAD_PATH . / . $_FILES[upload_file][name]; // 尝试将临时存储的文件移动到目标路径 if (move_uploaded_file($temp_file, $img_path)) { // 如果文件移动成功将 $is_upload 标记为 true 表示上传成功 $is_upload true; } else { // 如果文件移动失败将错误信息赋值给 $msg 变量 $msg 上传出错; } } else { // 如果上传文件的 MIME 类型不是允许的图片类型将错误信息赋值给 $msg 变量 $msg 文件类型不正确请重新上传; } } else { // 如果上传文件的目标路径不存在将错误信息赋值给 $msg 变量提示用户手动创建该文件夹 $msg UPLOAD_PATH.文件夹不存在,请手工创建; } } /* 常见的 MIME 类型拓展 文本类型 text/plain纯文本文件如常见的 .txt 文件。 text/htmlHTML 文档用于构建网页。 text/cssCSS 文件用于为网页添加样式。 text/javascriptJavaScript 文件为网页添加交互功能。 图像类型 image/jpegJPEG 格式的图像文件通常用于存储照片等色彩丰富的图像。 image/pngPNG 格式的图像文件支持透明背景常用于图标、logo 等。 image/gifGIF 格式的图像文件支持动画效果常用于制作动态图片。 音频类型 audio/mpegMPEG 音频文件如常见的 .mp3 文件。 audio/oggOgg Vorbis 音频文件是一种开放格式。 视频类型 video/mp4MP4 格式的视频文件兼容性较好广泛用于网络视频。 video/webmWebM 格式的视频文件是一种开放的网络视频格式。 应用类型 application/pdf PDF 文件用于跨平台的文档共享。 application/json JSON 数据常用于前后端数据交互。 application/zip ZIP 压缩文件用于文件的打包和压缩。 application/octet - stream 表示这是一个二进制数据流它不明确指定数据的具体格式是一种通用的二进制文件类型。 */Pass-03基础黑名单验证后缀验证漏洞绕过方式使用bp拦截请求文件info.php修改为info.php3上传info.php3即可。1、使用BP拦截请求。2、修改filenameinfo.php3漏洞原理网站后台虽然限制了php文件的上传但是。但是apache 服务器能够使用 php 解析.phtml、.php3后缀文件。// 初始化一个布尔变量 $is_upload用于标记文件是否上传成功初始值为 false 表示未成功上传 $is_upload false; // 初始化一个变量 $msg用于存储上传过程中产生的提示信息初始值为 null 表示暂无提示信息 $msg null; // 检查是否通过 POST 方法提交了名为 submit 的表单数据通常意味着用户点击了提交按钮 if (isset($_POST[submit])) { // 检查上传文件的目标目录由常量 UPLOAD_PATH 定义是否存在 if (file_exists(UPLOAD_PATH)) { // 定义一个数组 $deny_ext包含不允许上传的文件扩展名通常是可能执行恶意代码的脚本文件扩展名 $deny_ext array(.asp, .aspx, .php, .jsp); // 获取用户上传文件的原始文件名并去除首尾空格 $file_name trim($_FILES[upload_file][name]); // 调用自定义函数 deldot() 去除文件名末尾的点防止用户利用文件名末尾的点绕过扩展名检查 $file_name deldot($file_name); // 使用 strrchr() 函数从文件名中提取文件扩展名包括点号 $file_ext strrchr($file_name, .); // 将文件扩展名转换为小写以便不区分大小写地进行后续检查 $file_ext strtolower($file_ext); // 去除文件扩展名中可能包含的 ::$DATA 字符串这是为了防范 NTFS 流相关的绕过技术 $file_ext str_ireplace(::$DATA, , $file_ext); // 去除文件扩展名首尾的空格 $file_ext trim($file_ext); // 检查提取并处理后的文件扩展名是否不在禁止上传的扩展名数组中 if (!in_array($file_ext, $deny_ext)) { // 获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 构建上传文件在目标目录下的新文件名新文件名由当前日期时间精确到秒、一个 1000 - 9999 之间的随机数和文件扩展名组成 $img_path UPLOAD_PATH . / . date(YmdHis) . rand(1000, 9999) . $file_ext; // 尝试将临时存储的文件移动到目标目录并使用新文件名保存 if (move_uploaded_file($temp_file, $img_path)) { // 如果文件移动成功将 $is_upload 标记为 true 表示上传成功 $is_upload true; } else { // 如果文件移动失败将错误提示信息赋值给 $msg 变量 $msg 上传出错; } } else { // 如果文件扩展名在禁止上传的数组中将错误提示信息赋值给 $msg 变量 $msg 不允许上传.asp,.aspx,.php,.jsp后缀文件; } } else { // 如果上传文件的目标目录不存在将错误提示信息赋值给 $msg 变量提示用户手动创建该目录 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-04进阶黑名单验证漏洞绕过方式使用.htaccess(超文本访问)htaccess超文本访问文件是Apache HTTP服务器中的一个特殊配置文件。这个文件允许用户或网站管理员在不需要修改主服务器配置文件的情况下针对特定目录或网站进行详细的配置设定。1、新建文件.htaccess 文件中包含下面内容FilesMatch loudong.jpg SetHandler application/x-httpd-php /FilesMatch FilesMatch loudong.jpg 这是一个文件匹配指令表示对名为loudong.jpg的文件应用以下规则 SetHandler application/x-httpd-php 设置将匹配到的文件(loudong.jpg)当作PHP脚本文件来处理 正常情况下.jpg文件会被当作静态图片处理但这里强制让Apache用PHP解析器来解析它 这段配置的作用 当有人访问loudong.jpg时服务器不会直接返回这个图片文件 而是会尝试将其作为PHP脚本执行 如果这个jpg文件中实际包含PHP代码这些代码就会被执行2、上传.htaccess文件3、将info.php名称修改为loudong.jpg然后上传。漏洞原理网站后台虽然限制了许多类型文件的上传但是.htaccess超文本访问文件与图片后缀文件没有在被拦截的列表中。// 初始化一个布尔变量 $is_upload用于标记文件是否上传成功初始值为 false 表示还未成功上传 $is_upload false; // 初始化一个变量 $msg用于存储上传过程中的提示信息初始值为 null 表示暂无提示 $msg null; // 检查是否通过 POST 方式提交了名为 submit 的表单元素 // 如果提交了则意味着用户触发了文件上传操作进入后续的文件处理逻辑 if (isset($_POST[submit])) { // 检查常量 UPLOAD_PATH 所代表的上传目录是否存在 // 只有该目录存在才能进行文件上传操作 if (file_exists(UPLOAD_PATH)) { // 定义一个数组 $deny_ext其中包含了不允许上传的文件扩展名 // 这些扩展名对应的文件通常是服务器端脚本文件或可能包含恶意代码的文件 $deny_ext array(.php,.php5,.php4,.php3,.php2,php1,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,pHp1,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf); // 从 $_FILES 超全局数组中获取用户上传文件的原始文件名 // 并使用 trim 函数去除文件名首尾的空白字符 $file_name trim($_FILES[upload_file][name]); // 调用自定义函数 deldot 去除文件名末尾可能存在的点号 // 这是为了防止攻击者利用文件名末尾的点绕过扩展名检查 $file_name deldot($file_name); // 使用 strrchr 函数从文件名中提取文件扩展名包含点号 // 该函数会返回从最后一个指定字符这里是点号开始到字符串末尾的部分 $file_ext strrchr($file_name, .); // 将提取的文件扩展名转换为小写形式 // 这样可以避免因大小写不同而导致的检查不准确问题 $file_ext strtolower($file_ext); // 使用 str_ireplace 函数去除文件扩展名中可能包含的 ::$DATA 字符串 // 这是为了防范 NTFS 文件系统下的流注入攻击 $file_ext str_ireplace(::$DATA, , $file_ext); // 使用 trim 函数去除文件扩展名首尾可能存在的空白字符 $file_ext trim($file_ext); // 检查提取并处理后的文件扩展名是否不在禁止上传的扩展名数组 $deny_ext 中 // 如果不在数组中说明该文件类型是允许上传的 if (!in_array($file_ext, $deny_ext)) { // 从 $_FILES 超全局数组中获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 构建上传文件在目标上传目录中的完整路径和文件名 // 文件名由当前日期时间精确到秒、一个 1000 到 9999 之间的随机数和文件扩展名组成 // 这样可以避免文件名冲突 $img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext; // 使用 move_uploaded_file 函数将临时存储的文件移动到目标上传目录 // 并使用新构建的文件名保存 if (move_uploaded_file($temp_file, $img_path)) { // 如果文件移动成功将 $is_upload 变量设置为 true表示文件上传成功 $is_upload true; } else { // 如果文件移动失败将错误提示信息赋值给 $msg 变量 $msg 上传出错; } } else { // 如果文件扩展名在禁止上传的数组中 // 将不允许上传的错误提示信息赋值给 $msg 变量 $msg 此文件不允许上传!; } } else { // 如果上传目录不存在 // 将提示用户手动创建该目录的信息赋值给 $msg 变量 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-05大小写绕过漏洞绕过方式使用bp拦截请求将后缀改为大写的PHP1、使用BP拦截请求。2、修改filenameinfo.PHP漏洞原理虽然黑名单验证更加完善但是网站后台没有验证大写。// 初始化一个布尔类型的变量 $is_upload用于标记文件是否上传成功初始值为 false 表示尚未成功上传 $is_upload false; // 初始化一个变量 $msg用于存储文件上传过程中的提示信息初始值为 null 表示目前没有提示信息 $msg null; // 检查是否通过 POST 方式提交了名为 submit 的表单元素 // 若提交了则意味着用户触发了文件上传操作后续会进行文件上传的相关处理 if (isset($_POST[submit])) { // 检查常量 UPLOAD_PATH 所代表的文件上传目标文件夹是否存在 // 只有该文件夹存在才能将文件上传到该位置 if (file_exists(UPLOAD_PATH)) { // 定义一个数组 $deny_ext其中包含了不允许上传的文件扩展名 // 这些扩展名对应的文件类型可能存在安全风险如脚本文件或不希望被上传如 .htaccess 文件 $deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess); // 从 $_FILES 超全局数组中获取用户上传文件的原始文件名 // 并使用 trim 函数去除文件名首尾可能存在的空白字符 $file_name trim($_FILES[upload_file][name]); // 调用自定义函数 deldot去除文件名末尾可能存在的点号 // 这是为了防止攻击者利用文件名末尾的点绕过扩展名检查 $file_name deldot($file_name); // 使用 strrchr 函数从文件名中提取文件扩展名包含点号 // 该函数会返回从最后一个指定字符这里是点号开始到字符串末尾的部分 $file_ext strrchr($file_name, .); // 使用 str_ireplace 函数去除文件扩展名中可能包含的 ::$DATA 字符串 // 这是为了防范 NTFS 文件系统下的流注入攻击 $file_ext str_ireplace(::$DATA, , $file_ext); // 使用 trim 函数去除文件扩展名首尾可能存在的空白字符 $file_ext trim($file_ext); // 检查提取并处理后的文件扩展名是否不在禁止上传的扩展名数组 $deny_ext 中 // 如果不在数组中说明该文件类型是允许上传的 if (!in_array($file_ext, $deny_ext)) { // 从 $_FILES 超全局数组中获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 构建上传文件在目标上传目录中的完整路径和文件名 // 文件名由当前日期时间精确到秒、一个 1000 到 9999 之间的随机数和文件扩展名组成 // 这样可以避免文件名冲突 $img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext; // 使用 move_uploaded_file 函数将临时存储的文件移动到目标上传目录 // 并使用新构建的文件名保存 if (move_uploaded_file($temp_file, $img_path)) { // 如果文件移动成功将 $is_upload 变量设置为 true表示文件上传成功 $is_upload true; } else { // 如果文件移动失败将错误提示信息赋值给 $msg 变量 $msg 上传出错; } } else { // 如果文件扩展名在禁止上传的数组中 // 将不允许上传的错误提示信息赋值给 $msg 变量 $msg 此文件类型不允许上传; } } else { // 如果上传目标文件夹不存在 // 将提示用户手动创建该文件夹的信息赋值给 $msg 变量 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-06空格漏洞绕过方式使用bp拦截请求在后缀名后面加空格。1、使用BP拦截请求。2、修改filenameinfo.php 漏洞原理虽然黑名单验证更加完善但是网站并未对上传的文件做后缀名空格处理。// 初始化一个布尔类型变量 $is_upload用于标记文件是否上传成功初始值为 false 表示尚未成功上传 $is_upload false; // 初始化一个变量 $msg用于存储上传过程中产生的提示信息初始值为 null 表示暂无提示 $msg null; // 检查是否通过 POST 方式提交了名为 submit 的表单数据 // 若提交了意味着用户触发了文件上传操作后续将进行文件上传相关处理 if (isset($_POST[submit])) { // 检查常量 UPLOAD_PATH 所代表的文件上传目标文件夹是否存在 // 只有文件夹存在才能进行文件上传操作 if (file_exists(UPLOAD_PATH)) { // 定义一个数组 $deny_ext其中包含不允许上传的文件扩展名 // 这些扩展名对应的文件可能存在安全风险如脚本文件或可被利用篡改服务器配置的 .htaccess 文件 $deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess); // 从 $_FILES 超全局数组中获取用户上传文件的原始文件名 $file_name $_FILES[upload_file][name]; // 调用自定义函数 deldot 去除文件名末尾的点 // 这是为了防止攻击者利用文件名末尾的点绕过扩展名检查机制 $file_name deldot($file_name); // 使用 strrchr 函数从文件名中提取文件扩展名包含点号 // strrchr 会返回从最后一个指定字符这里是点号开始到字符串末尾的部分 $file_ext strrchr($file_name, .); // 将提取的文件扩展名转换为小写形式 // 这样做是为了统一大小写避免因大小写不同而导致的检查失误 $file_ext strtolower($file_ext); // 使用 str_ireplace 函数去除文件扩展名中可能包含的 ::$DATA 字符串 // 这是为了防范 NTFS 文件系统下的流注入攻击防止攻击者利用该特性绕过检查 $file_ext str_ireplace(::$DATA, , $file_ext); // 检查提取并处理后的文件扩展名是否不在禁止上传的扩展名数组 $deny_ext 中 // 若不在数组中说明该文件类型允许上传 if (!in_array($file_ext, $deny_ext)) { // 从 $_FILES 超全局数组中获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 构建上传文件在目标上传目录中的完整路径和文件名 // 文件名由当前日期时间精确到秒、一个 1000 到 9999 之间的随机数和文件扩展名组成 // 这样可以避免文件名冲突保证每个上传文件有唯一的文件名 $img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext; // 使用 move_uploaded_file 函数将临时存储的文件移动到目标上传目录并使用新构建的文件名保存 if (move_uploaded_file($temp_file, $img_path)) { // 如果文件移动成功将 $is_upload 变量设置为 true表示文件上传成功 $is_upload true; } else { // 如果文件移动失败将错误提示信息赋值给 $msg 变量 $msg 上传出错; } } else { // 如果文件扩展名在禁止上传的数组中将不允许上传的错误提示信息赋值给 $msg 变量 $msg 此文件不允许上传; } } else { // 如果上传目标文件夹不存在将提示用户手动创建该文件夹的信息赋值给 $msg 变量 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-07增加点漏洞绕过方式与第六题相似使用bp拦截请求在后缀末尾加一个点(英文点)1、使用BP拦截请求。2、修改filenameinfo.php.漏洞原理网站虽然对上传的文件进行了首尾去空但是并未对上传的文件做后缀名加点的处理。// 初始化一个布尔类型变量 $is_upload用于标记文件是否上传成功初始值设为 false 表示还未成功上传 $is_upload false; // 初始化一个变量 $msg用于存储文件上传过程中可能出现的提示信息初始值为 null 表示暂无提示 $msg null; // 检查是否通过 POST 方法提交了名为 submit 的表单元素 // 若提交了则意味着用户触发了文件上传操作后续会进行上传处理 if (isset($_POST[submit])) { // 检查常量 UPLOAD_PATH 所代表的文件上传目标文件夹是否存在 // 只有文件夹存在才能将文件上传到该位置 if (file_exists(UPLOAD_PATH)) { // 定义一个数组 $deny_ext其中包含不允许上传的文件扩展名 // 这些扩展名对应的文件通常是服务器端脚本文件、可执行文件或可能存在安全风险的文件类型 $deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess); // 从 $_FILES 超全局数组中获取用户上传文件的原始文件名 // 同时使用 trim 函数去除文件名首尾可能存在的空白字符 $file_name trim($_FILES[upload_file][name]); // 使用 strrchr 函数从文件名中提取文件扩展名包含点号 // strrchr 会返回从最后一个指定字符这里是点号开始到字符串末尾的部分 $file_ext strrchr($file_name, .); // 将提取的文件扩展名转换为小写形式 // 这样做是为了统一大小写避免因大小写不同导致的检查错误 $file_ext strtolower($file_ext); // 使用 str_ireplace 函数去除文件扩展名中可能包含的 ::$DATA 字符串 // 这是为了防范 NTFS 文件系统下的流注入攻击防止攻击者利用该特性绕过扩展名检查 $file_ext str_ireplace(::$DATA, , $file_ext); // 使用 trim 函数去除文件扩展名首尾可能存在的空白字符 $file_ext trim($file_ext); // 检查提取并处理后的文件扩展名是否不在禁止上传的扩展名数组 $deny_ext 中 // 若不在数组中说明该文件类型允许上传 if (!in_array($file_ext, $deny_ext)) { // 从 $_FILES 超全局数组中获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 构建上传文件在目标上传目录中的完整路径 // 直接使用用户上传时的原始文件名 $img_path UPLOAD_PATH./.$file_name; // 使用 move_uploaded_file 函数将临时存储的文件移动到目标上传目录 // 若移动成功说明文件上传完成 if (move_uploaded_file($temp_file, $img_path)) { // 将 $is_upload 变量设置为 true表示文件上传成功 $is_upload true; } else { // 若文件移动失败将错误提示信息赋值给 $msg 变量 $msg 上传出错; } } else { // 如果文件扩展名在禁止上传的数组中将不允许上传的错误提示信息赋值给 $msg 变量 $msg 此文件类型不允许上传; } } else { // 如果上传目标文件夹不存在将提示用户手动创建该文件夹的信息赋值给 $msg 变量 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-08前置知识文件数据流 在 Windows 系统中::$DATA 是一个与文件流File Streams相关的特殊标识符属于 NTFS 文件系统的特性主要用于处理文件的备用数据流Alternate Data StreamsADS。 任何数据流的完整名称格式为 文件名:数据流名:$DATA其中 $DATA 是固定后缀表明这是一个数据类型的流。 普通文件 test.txt 的默认数据流完整名称是 test.txt::$DATA 若为文件创建一个名为 info 的备用数据流其完整名称是 test.txt:info:$DATA info是数据流的名字 :$DATA是数据流的类型 所有存储实际内容的数据流类型都默认是 $DATA可以理解为 “这是一个存数据的流”。 系统会自动为数据流加上这个类型所以通常不需要手动写出来。 如何访问这个数据流 echo 我是隐藏内容 E:\test.txt:info:$DATA more E:\test.txt:info:$DATA ::$DATA省略了名字指文件的 “默认数据流”即你看到的文件主内容。 如果这样 echo 我是隐藏内容 E:\test.txt::$DATAwindow中的::$DATA漏洞绕过方式操作与第六题、第七题相似使用bp拦截请求在后缀末尾加::$DATA1、使用BP拦截请求。2、修改filenameinfo.php::$DATA3、访问图片的时候手动把::$DATA删除漏洞原理当项目部署在 window 上的时候。如果文件名 ::$DATA 会把 ::$DATA 之后的数据当成文件流处理不会检测后缀名且保持 ::$DATA 之前的文件名他的目的就是不检查后缀名例如phpinfo.php::$DATA Windows 会自动去掉末尾的::$DATA 变成phpinfo.php// 初始化上传状态变量用于标记文件是否上传成功初始值为 false 表示未上传成功 $is_upload false; // 初始化消息变量用于存储上传过程中产生的提示信息初始值为 null $msg null; // 检查是否通过 POST 方法提交了名为 submit 的表单元素 if (isset($_POST[submit])) { // 检查上传目录是否存在UPLOAD_PATH 是一个预先定义的常量表示上传文件的目标目录 if (file_exists(UPLOAD_PATH)) { // 定义一个数组包含不允许上传的文件扩展名这些扩展名通常与可执行脚本或危险文件类型相关 $deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess); // 获取上传文件的原始文件名并去除首尾的空白字符 $file_name trim($_FILES[upload_file][name]); // 调用 deldot 函数删除文件名末尾的点确保文件名的规范性 $file_name deldot($file_name); // 获取文件的扩展名strrchr 函数从文件名中找到最后一个点及其后面的字符 $file_ext strrchr($file_name, .); // 将文件扩展名转换为小写这样可以避免因大小写不同而导致的判断错误 $file_ext strtolower($file_ext); // 去除文件扩展名首尾的空白字符 $file_ext trim($file_ext); // 检查文件扩展名是否不在禁止上传的扩展名数组中 if (!in_array($file_ext, $deny_ext)) { // 获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 生成一个唯一的文件名格式为上传目录路径 日期时间精确到秒 4 位随机数 文件扩展名 $img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext; // 尝试将临时文件移动到指定的上传目录 if (move_uploaded_file($temp_file, $img_path)) { // 如果文件移动成功将上传状态标记为 true $is_upload true; } else { // 如果文件移动失败将错误信息存储在 $msg 变量中 $msg 上传出错; } } else { // 如果文件扩展名在禁止上传的数组中将错误信息存储在 $msg 变量中 $msg 此文件类型不允许上传; } } else { // 如果上传目录不存在将错误信息存储在 $msg 变量中提示用户手动创建目录 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-09代码不严谨漏洞绕过方式使用bp拦截请求在文件后缀中个空格变成phpinfo.php. ...就不会继续删除。1、使用BP拦截请求。2、修改filenameinfo.php. ...漏洞原理分析网站源码发现网站源码中用到deldot函数实现删除文件名末尾的点顺着代码找到deldot函数源码发现实现函数实现原理是从字符串的尾部开始从后向前删除点直到该字符串的末尾字符不是 点为止。$is_upload false; $msg null; if (isset($_POST[submit])) { if (file_exists(UPLOAD_PATH)) { $deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess); $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//用到deldot函数实现删除文件名末尾的点 $file_ext strrchr($file_name, .);// 获取文件的扩展名strrchr 函数从文件名中找到最后一个点及其后面的字符 $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA, , $file_ext);//去除字符串::$DATA $file_ext trim($file_ext); //首尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file $_FILES[upload_file][tmp_name]; $img_path UPLOAD_PATH./.$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload true; } else { $msg 上传出错; } } else { $msg 此文件类型不允许上传; } } else { $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }Pass-10内容替换漏洞绕过方式使用bp拦截请求修改后缀名为pphphp即使网站替换php为空则还剩下php1、使用BP拦截请求。2、修改filenameinfo.pphphp漏洞原理分析网站源码发现网站源码中用到了str_ireplace 函数str_ireplace 是一个 PHP 函数用于执行不区分大小写字符串替换。这个函数搜索一个字符串中的某些字符或字符串并将其替换为其他字符或字符串。其语法是 str_ireplace(findreplacestringcount)。参数 find 必需规定要查找的值参数replace 必需规定替换 find 中的值的值参数string 必需规定被搜索的字符串。# 黑名单列表 $deny_ext array(php,php5,php4,php3,php2,html,htm,phtml,pht,jsp,jspa,jspx,jsw,jsv,jspf,jtml,asp,aspx,asa,asax,ascx,ashx,asmx,cer,swf,htaccess); # 获取用户提交的file_name后缀 $file_name trim($_FILES[upload_file][name]); # 代码意思只要后缀名符合 变量deny_ext 中存储的数据则修改后缀 为空 $file_name str_ireplace($deny_ext,, $file_name);// 初始化一个布尔变量 $is_upload用于标记文件是否上传成功初始值为 false 表示未成功上传 $is_upload false; // 初始化一个变量 $msg用于存储上传过程中可能出现的错误信息初始值为 null $msg null; // 检查是否通过 POST 方式提交了名为 submit 的表单数据 if (isset($_POST[submit])) { // 检查上传目录是否存在 if (file_exists(UPLOAD_PATH)) { // 定义一个数组 $deny_ext包含不允许上传的文件扩展名 $deny_ext array(php,php5,php4,php3,php2,html,htm,phtml,pht,jsp,jspa,jspx,jsw,jsv,jspf,jtml,asp,aspx,asa,asax,ascx,ashx,asmx,cer,swf,htaccess); // 获取上传文件的原始文件名并去除首尾的空白字符 $file_name trim($_FILES[upload_file][name]); // 使用 str_ireplace 函数将文件名中的不允许的扩展名替换为空字符串忽略大小写 // str_ireplace 跟python的 relace其实是一样都是用于将指定的字符串替换成... $file_name str_ireplace($deny_ext,, $file_name); // 获取上传文件在服务器临时存储的路径 $temp_file $_FILES[upload_file][tmp_name]; // 拼接上传文件最终要保存的完整路径UPLOAD_PATH 为预先定义的上传目录 $img_path UPLOAD_PATH./.$file_name; // 尝试将临时文件移动到指定的上传路径 if (move_uploaded_file($temp_file, $img_path)) { // 如果移动成功将 $is_upload 标记为 true 表示上传成功 $is_upload true; } else { // 如果移动失败将错误信息赋值给 $msg $msg 上传出错; } } else { // 如果上传目录不存在将错误信息赋值给 $msg提示用户手工创建目录 $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } http://localhost/upload/info. }