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

小公司做网站需要注意什么问题哪里app开发公司好

小公司做网站需要注意什么问题,哪里app开发公司好,南京网站制作网页,wordpress评论密码保护文件上传漏洞-upload靶场5-12关通关笔记#xff08;windows环境漏洞#xff09; 简介 ​ 在前两篇文章中#xff0c;已经说了分析上传漏的思路#xff0c;在本篇文章中#xff0c;将带领大家熟悉winodws系统存在的一些上传漏洞。 upload 第五关 #xff08;大小写绕过…文件上传漏洞-upload靶场5-12关通关笔记windows环境漏洞 简介 ​ 在前两篇文章中已经说了分析上传漏的思路在本篇文章中将带领大家熟悉winodws系统存在的一些上传漏洞。 upload 第五关 大小写绕过 思路 分析源码 $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);//删除文件名末尾的点$file_ext strrchr($file_name, .);$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./.date(YmdHis).rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file, $img_path)) {$is_upload true;} else {$msg 上传出错;}} else {$msg 此文件类型不允许上传;}} else {$msg UPLOAD_PATH . 文件夹不存在,请手工创建;} }与pass-4的源码相比此处在效验规则中把转换小写的$file_ext strtolower($file_ext);规则去掉了也就是说我们上传的文件后缀大小写将不会验证. ​ strtolower()函数用于将字符串中的所有大写字母转换为小写字母。这一行代码将变量$file_ext中的后缀名转换为小写字母。 例如 上传一个1.Php,给后端验证它会直接通过验证因为在黑名单中没有对这个后缀进行限制它和.php虽然是黑名单的一员但是在计算机眼中.Php 它不等于.php所以才能通过验证在Windows文件系统如NTFS默认是不区分文件名的大小写的只区分文件名中的字母数字字符本身。因此无论是大写还是小写的后缀名操作系统都会将其视为相同的文件类型。 攻击思路 我们先上传一个webshell的php文件使用burpsuite抓包 在抓到的请求包重将文件名后缀改为1.Php或1.phP(pHp已经在黑名单中所以会出现无法上传)。 修改完后放行该请求包就发现该webshell已经被成功上传。 webshell已经被正常解析。证明了我们已经成功了。 upload 第六关空格绕过 思虑 源码分析 $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 $_FILES[upload_file][name];$file_name deldot($file_name);//删除文件名末尾的点$file_ext strrchr($file_name, .);$file_ext strtolower($file_ext); //转换为小写$file_ext str_ireplace(::$DATA, , $file_ext);//去除字符串::$DATAif (!in_array($file_ext, $deny_ext)) {$temp_file $_FILES[upload_file][tmp_name];$img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file,$img_path)) {$is_upload true;} else {$msg 上传出错;}} else {$msg 此文件不允许上传;}} else {$msg UPLOAD_PATH . 文件夹不存在,请手工创建;} } 分析源码发现该源码没有首尾去空格的函数( $file_ext trim($file_ext); )所以我们就可以利用该漏洞上传一个后缀带有空格的webshell。 trim()函数用于删除字符串开头和结尾处的空格或其他指定字符。这一行代码将变量$file_ext中的后缀名首尾的空格去除。 原理解析 在windows中Windows操作系统会自动删除后缀名中的空格例如 “1.php “后缀加了空格windows会将其更正为1.php以符合文件后缀名的规范。这是操作系统的默认行为旨在确保文件的正确标识和处理。 攻击思路 和pass-05关的思路差不多因为本关卡中设置了转化小写的操作去掉了首位去空格的规则我们只要稍作改变就OK。 还是规矩打开burpsuite拦截并上传一个webshell文件。 修改上传webshell后缀。在.php后面加上一个空格。 从拦截到的请求包中找到我们上传php的路径 把它拼接到靶场url后进行访问 成功运行phpinfo();函数证明成功过关。 upload 第七关 (点号绕过) 思路 源码分析 $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_ext strrchr($file_name, .);$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 . 文件夹不存在,请手工创建;} }在本关的源码中可以发现转换小写、首尾去空格的漏洞都已经修复但是它缺少了 $file_ext strrchr($file_name, ‘.’); strrchr()函数用于从字符串中获取最后一个出现的指定字符此处为’.‘及其后面的所有字符。它返回从最后一个出现的指定字符到字符串末尾的子字符串。所以这一行代码的意思是将文件名中的后缀包括’.提取出来并将结果赋值给变量$file_ext。 原理也非常简单这些都是windows系统对文件后缀的特性pass5一直到pass6基本都是一个意思在windows文件系统中 后缀名中不允许包含空格或点 Windows不允许在文件后缀名中包含空格或点。如果在文件名中添加空格或点作为后缀的一部分时系统会自动将其删除以确保后缀的有效性。 后缀名一般是不区分大小写的 Windows文件系统默认情况下是不区分文件后缀名的大小写的。也就是说.jpg 和 .JPG 会被视为同一种文件类型JPEG图像文件。当我们双击一个文件时Windows会根据后缀名来确定使用哪个程序打开它而不考虑后缀名的大小写。 攻击思路 和pass5、pass6一样的套路。打开burpsuite拦截上传一个webshell文件。 在拦截到的请求包中更改webshell的后缀在最后加上一个点. 从响应包中找到上传文件的路径并拼接到靶场url中。 成功执行并也解析phpinfo(); 成功通关 upload 第八关::DATA 绕过 思路 源码分析 $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);//删除文件名末尾的点$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];$img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext;if (move_uploaded_file($temp_file, $img_path)) {$is_upload true;} else {$msg 上传出错;}} else {$msg 此文件类型不允许上传;}} else {$msg UPLOAD_PATH . 文件夹不存在,请手工创建;} }在这关的源码中发现转换小写、首位去空格、删除文件末尾的点等规则操作已经全部修复。但是缺少了$file_ext str_ireplace(‘::$DATA’, ‘’, $file_ext);的规则他的目的去除字符串::$DATA那么这个::$DATA是什么呢它其实是windows系统的流文件。每个文件都可以具有一个或多个数据流其中默认的数据流称为 “::$DATA” 流。 文件流介绍 Windows流文件是一种特殊的文件特性允许在文件中存储额外的数据或属性。流文件是 Windows 文件系统中的一项功能允许将文件分为多个数据流并且每个数据流可以独立地读取和写入。 在Windows文件系统中流文件可以根据其用途和功能可以进行分类 ::$ATTRIBUTE_LIST 包含组成文件的所有属性的列表并标识每个属性的位置。 ::$BITMAP 索引用于管理目录的 b 树可用空间的位图。 无论群集大小) b 树都以 4 KB 区块 (进行管理这用于管理这些区块的分配。 此流类型存在于每个目录中。 ::$DATA 数据流。 默认数据流没有名称。 可以使用 FindFirstStreamW 和 FindNextStreamW 函数枚举数据流。 ::$EA 包含扩展属性数据。 ::$EA_INFORMATION 包含有关扩展属性的支持信息。 ::$FILE_NAME 文件的名称以 Unicode 字符为单位。 这包括文件的短名称以及任何硬链接。 ::$INDEX_ROOT 此流表示索引的 b 树的根。 此流类型存在于每个目录中。 ::$OBJECT_ID 用于标识链接跟踪服务的文件的 16 字节 ID。 ::$REPARSE_POINT 重新分析点数据。 这些特殊的流文件在Windows文件系统的内部使用用于存储和管理文件的元数据、属性和内容。对于普通用户和常规文件操作来说通常不需要直接操作这些特殊流文件。这些流文件由操作系统和相关的文件系统驱动程序进行管理和处理。 流文件就像是文件夹中的小抽屉用于存储和管理文件的额外信息但并不影响文件的主要内容。它们可以存储标签、备注、备份、版本等等为文件提供了更多的灵活性和功能。 假设你有一个文件夹里面有很多文件。每个文件都是一个完整的物品就像一个完整的文件。现在你想在文件夹中为每个文件添加一些额外的标签或备注以提供更多的信息。为了实现这一点你在文件夹中为每个文件添加了一个小抽屉称之为流文件。 这些流文件小抽屉不影响文件的主要内容但它们允许你存储附加的信息。你可以将文件的标签、说明、属性等写在相应的流文件中。当你需要查看这些额外的信息时你可以打开相应的流文件类似于打开小抽屉查看里面的纸条。 如果我们把::$DATA 数据流文件比作文件的主要内容或实际数据。如果我们有一本书而 ::$DATA 数据流文件就相当于书中的文字内容。 在计算机中文件通常包含实际的数据比如文本、图像、音频或视频等。这些数据被存储在文件的 ::$DATA 数据流文件中。它是文件系统默认的数据流没有具体的名称。 当我们打开一个文本文件时文本中的每个字符和单词都被存储在 ::$DATA 数据流文件中。类似地当我们打开一个图像文件时图像的像素信息会存储在 ::$DATA 数据流文件中。 在操作系统中当我们访问或使用一个文件时系统会自动处理 ::$DATA 数据流文件以便读取和展示其中的实际数据。对于大多数用户而言这是透明和无需关注的过程。 所以简而言之::$DATA 数据流文件存储了文件的实际内容就像书中的文字内容一样。它是默认的数据流由操作系统负责处理和读取。无论是文本、图像、音频还是其他类型的文件所有的实际数据都存储在 ::$DATA 数据流文件中。 如果我们执行1.php::$DATA 指的是读取 1.php 文件的默认数据流中的内容。操作系统会将其视为要运行 1.php 文件中的 PHP 代码而不是直接读取默认数据流中的内容。 攻击思路 我们限制已经知道的::$DATA的作用那么我们就可以利用这个文件流在上传webshell并执行。 还是老规矩打开burpsuite拦截并上传一个webshell文件。 把::$DATA加入到1.php后面 在返回的请求包中找到我们刚才上传文件的路径并拼接到靶场的url上 当我们直接运行这个路径时候会报错说我们没有访问权限。这是因为windows文件系统的特性上传的文件 1.php::$DATA 可能只保留了原始文件 1.php而没有创建 ::$DATA 数据流文件所以这时我们把::$DATA去掉直接访问1.php。 成功拿下。 upload 第九关点空格点绕过 思路 源码分析 $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);//删除文件名末尾的点$file_ext strrchr($file_name, .);$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 . 文件夹不存在,请手工创建;} }分析该源码之前关卡的漏洞都已经修复了此源码的执行顺序是 第一步去掉文件名的首尾空格第二部删除文件名末尾的点第三步找到文件名中的点返回后面的扩展名第四步把扩展名转成小写第五步去除扩展名后字符串::$DATA第六步去除扩展名首尾的空格第七步判断扩展名是否在黑名单中如果不在执行后续操作。第八步获取临时文件路径$temp_file。第九步拼接目标文件路径$img_path由上传目标文件夹和处理后的文件名组成。第十步使用 move_uploaded_file() 函数将临时文件移动到目标位置如果移动成功则将 $is_upload 设置为 true。 在此我们分析到它并没有对我们的文件进行重命名的操作这里就有很大的操作成分我们创造一个不满足黑名单的后缀并在执行文件验证时候去掉多余的字符不久了按照该源码的执行顺序 我们就创建一个这样的文件1.php. . 在第二步的时候会去掉1.php. .最后的.因为我们中间有空格所以它去不掉我们第二个.这样我们就得到了一个名为1.php. 的文件这时候就又来疑问了。这也步是后缀.php啊后面还有一个.呢它能被正常解析吗 答案是它可以被正常解析因为windows文件系统中文件名后缀中的点和空格字符会受到一些限制和规则。这些限制可能导致操作系统自动删除或修改文件名中的这些字符。 原理 在上传的时候它是1.php.后端验证的时候把1.php当作了文件名.当作了后缀名完美的绕过了黑名单的验证但是1.php.上传到windows服务器之后windows服务器会自动把1.php.最后的那个.给删掉从而我们就得到了1.php的文件 想杜绝这种漏洞的方法也非常简单对所有上传的文件进行重命名例如我现在在上传一个1.php. .系统误把1.php认为是文件名了但是我现在后端验证完了以后又要从新命名把1.php命名为20230831,当与后缀拼接的时候他就会变成20230831.,没有后缀了。那就自然也无法执行了。 攻击思路 说完了原理攻击就非常简单了还是老规矩打开burpsuite进行拦截并上传以个webshell 把请求包中上传文件的名字1.php改为1.php. . 在从响应包中找出上传文件的路径 测试webshell是否能成功解析phpinfo(); 成功解析通关成功继续下一关 在来看看上传后的文件和我们理论一致windows自动删除.不过我们在url中加.也是可以成功解析的 upload 第十关 双写后缀绕过 思路 源码分析 $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,jsp,jspa,jspx,jsw,jsv,jspf,jtml,asp,aspx,asa,asax,ascx,ashx,asmx,cer,swf,htaccess);$file_name trim($_FILES[upload_file][name]);$file_name str_ireplace($deny_ext,, $file_name);$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 UPLOAD_PATH . 文件夹不存在,请手工创建;} }在该源码中我们发现了一个新函数str_ireplace()它的作用是在字符串中进行不区分大小写的替换操作。这个函数就是这串源码是核心 函数内第一个参数是$deny_ext黑名单数组包含要被替换的字符串函数内第二参数是空字符它是要被替换字符串函数内第三个参数是$file_name文件名要被搜索替换的目标字符串 这个函数的目的就在于将文件名中的黑名单字符替换为空格字符以进一步处理和清理文件名。 也就是说我们上传的文件内只要是存在黑名单中的名字都会被替换成空例如 我上传一个php.jpg的图片文件经过str_ireplace()函数的清洗后这个文件名会直接变成’.jpg,而没有文件名因为php的文件名已经被替换成了空字符 或者我上传一个 1.php的文件金国str_ireplace()函数清洗后这个文件名会变成1.,扩展名被替换成了空字符 在这一串源码逻辑下之前关卡所用的手段均无法成功上传因为不管你是使用pass-9中使用点空格点的漏洞把1.php变成文件名还是使用大小写的方法绕过黑名单把后缀变成.Php都无法逃脱str_ireplace()的清洗因为它直接检查是文件名只要文件名中存在黑名单规则的字符串都会被它替换成空字符。 但是它也不是万能的它也存在这一个漏洞假如我上传的文件用这种格式它会怎么办呢 1.pphphp,用刚才的规则找出个文件名中符合黑名单的字符串在后缀中能找出一个php并把它替换成空字符但是这样恰巧就帮助了我们因为在提取出php这个字符串的时候剩下来的文件名刚好就是1.php而且已经执行str_ireplace()函数的清洗后面又没有其他的验证直接就上传成功了 所以如果要使用此类的验证一定要在加一道防线从多处阻止黑名单数组中的成员成功上传。 攻击思路 说实话这种以上几关验证在我们已经知道规则的情况下可以说它们是非常lose的有些验证甚至都不用burp suite来进行抓包分析直接更改名称上传即可。但是作为杠精的我就是想尝试一下假装不知情的状态下如何攻克这这给关卡。 老规矩打开burp suite拦截上传一个webs hell文件 然后把抓到的包仍到repeater进行重发分析 不做任何修改直接发送给后端然后分析后端给的响应包 分析完响应包 发现一个img标签其中又以个相对地址为upload/1.。此时没有百分之百把握确定它就是我们上传的webshell所以使用repeater去重新发送一个请求包并把文件名后缀改为.jpg图片格式 重新发了请求包后发现刚才的img图片标签中地址也变成我们刚才更改的jpg后缀可以确定这个就是上传文件后返回的文件路径。 再次分析 确定了上传文件的路径为../upload/第一次我们上传1.php为什么上传后只剩1.而第二次上传1.jpg却能保留后缀后端对php后最做了限制使用后最phtml 再次进行测试 上传1.phtml发现上传后后缀的html没了只留下1.p,初步怀疑后端黑名单会针对扩展名指定删除相应的关键字接下来上传一个1.php. .测试是否能成功上传。 此次上传发现1.php. .上传后也是php关键字被删除留下了三个.,由此确定了后端黑根据黑名单去删除相应的关键字。继续尝试上传1.pphphp文件。 判断正确上传成功尝试解析phpinfo(); 拿下权限 成功解析phpinfo();成功过关。 到此为止upload黑名单验证windows相关的漏洞已经全部通过总结来说在windows环境中我们要不断去尝试修改后缀去尝试判断后端验证的方式 相对的如果我们要在windows环境中使用黑名单的方式去防御文件上传漏洞一定要把验证的规则写严格使用多重验证来防御。 upload 第十一关 %00截断 GET绕过 思路 源码分析 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],.)1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES[upload_file][tmp_name];$img_path $_GET[save_path]./.rand(10, 99).date(YmdHis)...$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload true;} else {$msg 上传出错;}} else{$msg 只允许上传.jpg|.png|.gif类型文件;} }从源码分析pass-11是一个白名单验证源码大概的含义 初始化上传状态变量 $is_upload 和消息变量 $msg。 检查是否有名为 submit 的表单提交。 定义一个数组 $ext_arr包含允许上传的文件扩展名“jpg”、“png” 和 “gif”。 使用 substr() 函数和 strrpos() 函数获取上传文件的扩展名。 substr($_FILES[upload_file][name], strrpos($_FILES[upload_file][name], .)1) 的作用是从上传文件名中获取最后一个 “.” 后面的部分即文件扩展名。这里的 strrpos() 函数用于找到最后一个 “.” 的位置。 如果上传文件的扩展名在允许的扩展名数组 $ext_arr 中继续处理上传流程。 根据您提供的代码如果扩展名符合允许的扩展名代码将执行以下操作 获取上传文件的临时存储路径 $temp_file。构建新的文件路径 $img_path其中包括日期时间和随机数作为文件名的一部分。使用 move_uploaded_file() 函数将临时文件移动到目标路径 $img_path。根据移动文件的结果设置 $is_upload 的值。 如果扩展名不在允许的扩展名数组内则将错误消息赋给变量 $msg提示用户只允许上传指定类型的文件。 在此源码中出现了两个个关键函数substr()和strrpos(): substr() 是 PHP 中的内置函数用于截取字符串的一部分,它由三个参数。并有一个返回值当截取失败时返回false。 第一个参数作用是要截取的原始字符串第二个参数作用是截取的起始位置。第三个参数它是个可选参数作用是指定截取的长度 strrpos() 也是 PHP 中的内置函数用于在字符串中查找最后一次出现指定字符或子字符串的位置它有三个参数。它也有一个返回值如果找到了指定的字符或子字符串则返回最后一次出现的位置从 0 开始计数如果没有找到指定的字符或子字符串则返回 false 要在其中查找的原始字符串要查找的字符或子字符串也是可选参数指定查找的起始位置。 在本源码中substr()的两个参数表达的意义 $_FILES[upload_file][name] 是上传文件时的文件名。$_FILES 是 PHP 中用于处理文件上传的超全局变量upload_file 是文件上传表单中 file input 的 name 属性。 strrpos($_FILES[upload_file][name], .) 使用 strrpos() 函数查找文件名中最后一个 “.” 的位置。这个函数返回最后一个 “.” 的索引即字符串中 “.” 最后出现的位置。 substr($_FILES[upload_file][name], strrpos($_FILES[upload_file][name], .) 1) 使用 substr() 函数从文件名中截取最后一个 “.” 之后的部分即扩展名部分。 strrpos($_FILES[upload_file][name], .) 1 表示截取位置的起始索引即从最后一个 “.” 之后的下一个位置开始截取。通过将起始索引设置为 strrpos() 找到的位置加 1可以避免将 “.” 作为扩展名的一部分。 最终上述代码将获取到上传文件的扩展名部分并返回该扩展名。 例如如果上传的文件名是 “test.jpg”则 substr() 函数将返回 “jpg”。这样就可以根据扩展名进行后续的判断和处理验证是否在允许的扩展名列表中。 在该源码中存在最大的漏洞就是 $img_path $_GET[save_path]./.rand(10, 99).date(YmdHis)...$file_ext; 使用了get方法进行传递路径拼接一个随机数和时间在加上扩展名在使用$_GET[save_path]的时候很容易导致路径遭到遍历攻击从而造成文件上传到系统的任意路径上。 还有一个漏洞就是move_uploaded_file,它是将上传的文件从临时目录移动到指定位置确保上传的文件能保存到指定的目标路径但是它在早期的php版本中存在一个漏洞。 在php版本5.3.4,并且php.ini主配置文件中的magic_quotes_gpc 关闭off的情况下 magic_quotes_gpc 是一个 PHP 配置选项用于自动转义用户提交的 GET、POST 和 COOKIE 数据中的特殊字符。它的目的是防止数据库注入和其他类型的代码注入攻击 当 magic_quotes_gpc 设置为 on 时PHP 会自动将用户提交的数据中的特殊字符例如单引号、双引号和反斜杠添加反斜线进行转义。 这个漏洞就是%00截断该漏洞利用了 C 语言字符串处理函数中的空字节null byte终止符 \0 的特性。在一些旧版本的编程语言和应用程序中通过将文件名或路径中的输入数据以空字节结尾可以导致字符串处理函数错误地终止字符串从而导致路径或文件名被截断。 在计算机编程中“%00是一个特殊字符序列表示ASCII码为0的字符也称为空字符或NUL字符。它是一种控制字符用于表示字符串的结束或标记字符串的结束位置。在某些编程语言和文件格式中遇到”%00会被解释为字符串的结束后面的内容将被忽略。 这两个漏洞搭配在一起就形成了在任意路径上上传任意文件使用$_GET[save_path]来控制文件路径使用move_uploaded_file来控制文件后缀。 攻击思路 还是老规矩开启burpsuite拦截并把一个webshell文件的后缀修改成能正常上传的后缀。 在后端新建一个目录尝试将文件上传到指定目录中 现在我在C盘下创建了一个test的测试目录并在响应包里修改了想对应的路径尝试是否能上传成功。 这里已经成功上传到指定路径在尝试是否能解析成功。 很遗憾在apache的规则中 Apache Web 服务器只会解析并提供位于 DocumentRoot 目录通常是 “www” 目录下的文件。这是为了防止恶意用户访问服务器上的敏感文件。 但是在此我们也证明了使用$_GET[save_path]去上传文件可能会造成攻击者可以把恶意文件上传到系统上的任意位置。 使用绝对路径也是可以的这证明这个漏洞的可怕之处。接下来我们上传一个webshell文件到它的正常目录下看看能否正常解析。 还是使用了绝对路径把webshell上传到了指定的路径下。尝试解析。 成功解析。成功过关。 upload 第十二关 %00截断 POST绕过 思路 源码分析 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],.)1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES[upload_file][tmp_name];$img_path $_POST[save_path]./.rand(10, 99).date(YmdHis)...$file_ext;if(move_uploaded_file($temp_file,$img_path)){$is_upload true;} else {$msg 上传失败;}} else {$msg 只允许上传.jpg|.png|.gif类型文件;} }本关卡的源码与pass-11 基本一致唯一的区别就是把GET方法换成的POST方法但是它们的漏洞点和原理基本都一致的在此也不在啰嗦了。 攻击思路 老规矩直接开burpsuite拦截上传一个满足白名单的webshell。 我们直接修改请求体的save_path的值修改一个绝对路径。 上传后直接失了What 什么情况难道POST方法不支持%00截断码我们深入去分析分析问题出现在哪里。 在分析到发送的原始数据流中我们发现了问题问题就出现在我们发送的%00它在原始数据流中被当作3个字符处理并没有发挥截断的作用。为什么会这样呢 原因是HTTP的报文发送和接收一般都是使用ACLLS编码我们在请求体中修改的%00它其实是一种URL编码在URL编码中%00等于ACLLS码的NUL0x0空字符它在请求体中发送出去后并不能按照我们理想的状态去解析这里有人可能就会说我把%去除直接发送00不就可以了吗答案是仍然不能被理想解析这里我们已经发现了它们解析规则是ACLLS码发送0安装ACLLS码解析它也是一个字符0x30那我们要怎么样去触发POST方法的%00截断呢我们换个思路如果我能去直接修改它的十六进制的数值不就可以发送出ACLLS码中的0截断了吗问题分析清楚后我们开始行动。 我们在上传的文件名后加上一个随意的字符任何符号都可以只要是一个字符就OK上传这一个字符的目的是方便我们去找到对应的位置对该字符对应的ACLLS码进行修改。 找到刚才我们随意输入的字符并把它的值设置为ACLLS码中的0(NUL),因为这里是用的十六进制十六进制的0就是 00所以这里的值我们修改为00。 修改后发现对应的字符变成空了不过注意这里的空和空格是有区别的空格的ACLLS码是0x20而NUL(0)的ACLLS 码是0, 上传成功那就证明我们的理论是正确的接下来再去尝试是否能正常解析webshell 成功解析成功完成pass-12 总结 由于Windows文件命名的特性攻击者可能利用特殊的文件名来绕过后端验证执行恶意操作或攻击您的应用程序。 为了最大程度地防止这些上传漏洞我们一定要严格地、仔细地编写后端验证规则并将其写死。 文件类型验证除了简单地验证文件扩展名尽可能使用多种方式来判断文件类型如MIME类型、文件头Magic Number检查等。 文件名过滤对上传的文件名进行过滤删除或替换任何可能导致安全问题的特殊字符、空格、目录分隔符等。 文件路径控制确保上传的文件存储在合适的位置并阻止潜在的路径穿越攻击。不要依赖用户提供的上传文件名构造保存路径而是自动生成文件名。 文件大小限制限制上传文件的大小避免过大的文件占用服务器资源或造成拒绝服务DoS攻击。 病毒扫描使用病毒扫描程序对上传的文件进行检查以确保文件不包含任何恶意代码或病毒。 文件权限确保上传文件所在的目录具有适当的文件权限设置限制对上传文件的访问权限。
http://www.sadfv.cn/news/197020/

相关文章:

  • 建网站需要什么设计专业即墨网络有限公司
  • 哈尔滨中国建设银行网站首页今天最新体育新闻
  • 南沙高端网站建设wordpress 权限 分类
  • 营销微网站建设公司wordpress用HTML
  • 十堰微网站建设报价南阳网站建设的公司
  • 网站功能结构图 怎么做镇江当地网站
  • 商务网站安全方案设计做网站的税率
  • 建设银行官网首页 网站网站建设伍际网络
  • 网站代维护网站开发课题的目的与意义
  • 国内全屏网站有哪些wordpress 适合程序员主题
  • 网站二级页面设计网站建设费怎么入账
  • 网站优化网络福清做网站
  • 成品网站制作公司中国广告网站
  • 诸暨企业网站建设个人博客网站素材
  • 安阳企业网站建设天猫商城官网下载
  • 做网站外包好吗wordpress首页是什么意思
  • 网站怎么加统计代码个人小程序免费制作平台
  • 太原专门做网站建设地区网站建议
  • dedecms下载站天津建设网官方网站
  • 建个网站公司j建网站
  • 网站域名列表是什么id怎么转wordpress
  • 夺宝网站制作wordpress 启用ssl
  • ppt链接网站怎么做巴中区建设局网站
  • 国外网站界面使用jquery做网站
  • 做响应网站的素材网站wap网站开发语言
  • 做网站接口多少钱wordpress文章名字相同的不发布
  • 16岁做分期网站全国各大网站
  • 最新远程网站建设服务器做婚礼效果图的网站有哪些
  • 建网站服务器用哪种长安网站制作公司
  • 网站建设人工智能青岛建网站公司哪家专业