前言
本文中文件相关漏洞列举了, 文件读取漏洞文件上传漏洞文件写入漏洞 文件删除漏洞文件包含漏洞
文件读取漏洞
0x01 简介
任意文件读取漏洞, 是 web 安全里高危的漏洞, 它可以泄露源码数据库配置文件等等, 导致网站处于极度不安全状态
0X02 漏洞代码
- <?php
- $template = isset($_GET['template']) ? $_GET['template'] : 'index.html';
- $file = file_get_contents('2.1/'.$template);
- echo $file;
- ?>
未对 ../ 进行过滤, 导致可以跨目录读取文件未对后缀名进行限制, 导致可以读取 php 文件内容
不允许 .. 等跨目录字符出现, 使用 addslashes 防止 %00 截断, 且限制后缀白名单
0X03 修复代码
- $template = isset($_GET['template']) ? addslashes($_GET['template']) : 'index.html';
- if(strstr($template, '..') || substr($template,-5,5) != '.html')
- {
- echo '输入不合法';
- exit;
- }
0X04 漏洞代码
- <?php
- $action = isset($_GET['action']) ? $_GET['action'] : 'login';
- $fp="./2.1/".$action."/index.html";
- $f= fopen($fp,'r');
- $strout = fread($f,filesize($fp));
- fclose($f);
- echo $strout;
- ?>
未对 ../ 进行过滤, 导致可以跨目录读取文件未过滤 %00 字节, 在 <PHP5.3.4 版本中, 可在截断后自定义路径和文件名
不允许 .. 等跨目录字符出现, 使用 addslashes 防止 %00 截断
0X05 修复代码
- $action = isset($_GET['action']) ? addslashes($_GET['action']) : 'login';
- if(strstr($template, '..'))
- {
- echo '输入不合法';
- exit;
- }
文件上传漏洞
0x01 简介
上传文件的时候, 如果服务器端脚本语言, 未对上传的文件进行严格的验证和过滤, 就有可能上传恶意的脚本文件, 从而控制整个网站, 甚至是服务器
0X02 漏洞代码
- <?php
- if(isset($_FILES['file']))
- {
- if (($_FILES["file"]["type"] == "image/gif" || $_FILES["file"]["type"] == "image/jpeg" || $_FILES["file"]["type"] == "image/pjpeg") && $_FILES["file"]["size"] <20000) {
- if ($_FILES["file"]["error"]> 0) {
- echo "Return Code:" . $_FILES["file"]["error"] . "<br />";
- } else {
- echo "Upload:" . $_FILES["file"]["name"] . "<br />";
- echo "Type:" . $_FILES["file"]["type"] . "<br />";
- echo "Size:" . $_FILES["file"]["size"] / 1024 . "Kb<br />";
- echo "Temp file:" . $_FILES["file"]["tmp_name"] . "<br />";
- if (file_exists("2.2/upload/" . $_FILES["file"]["name"])) {
- echo $_FILES["file"]["name"] . "already exists.";
- } else {
- move_uploaded_file($_FILES["file"]["tmp_name"], "2.2/upload/" . $_FILES["file"]["name"]);
- echo "Stored in:" . "2.2/upload/" . $_FILES["file"]["name"];
- }
- }
- } else {
- echo "Invalid file";
- }
- }
- ?>
仅对 Content-type 验证, 因为 Content-type 可以伪造导致可以绕过限制图片验证, 导致任意文件上传
对后缀进行校验, 采用白名单模式保存文件名采用随机文件名 + 后缀的方式保存
0X03 修复代码
- <?php
- if(isset($_FILES['file']))
- {
- $ext = substr($_FILES["file"]["name"], strrpos($_FILES["file"]["name"], '.')+1);
- $filename = time().rand(100,999).'.'.$ext;
- if (($ext == "jpg" || $ext == "jpeg" || $ext == "png") && $_FILES["file"]["size"] <20000)
- {
- if ($_FILES["file"]["error"]> 0)
- {
- echo "Return Code:" . $_FILES["file"]["error"] . "<br />";
- }
- else
- {
- echo "Upload:" . $_FILES["file"]["name"] . "<br />";
- echo "Type:" . $_FILES["file"]["type"] . "<br />";
- echo "Size:" . $_FILES["file"]["size"] / 1024 . "Kb<br />";
- echo "Temp file:" . $_FILES["file"]["tmp_name"] . "<br />";
- if (file_exists("2.2/upload/" . $filename))
- {
- echo $filename . "already exists.";
- }
- else
- {
- move_uploaded_file($_FILES["file"]["tmp_name"], "2.2/upload/" . $filename);
- echo "Stored in:" . "2.2/upload/" . $filename;
- }
- }
- }
- else
- {
- echo "Invalid file";
- }
- }
- ?>
0X04 漏洞代码
- <?php
- $imageinfo = getimagesize($_FILES['userfile']['tmp_name']);
- if ($imageinfo['mime'] != 'image/gif' && $imageinfo['mime'] != 'image/jpeg')
- {
- echo "Sorry, we only accept GIF and JPEG images\n";
- exit;
- }
- $uploaddir = '2.2/upload/';
- $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
- if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile))
- {
- echo "File is valid, and was successfully uploaded.\n";
- }
- else
- {
- echo "File uploading failed.\n";
- }
- ?>
仅通过读取文件头判断文件类型, 可被绕过; 后缀名未进行校验, 导致任意文件上传
参考漏洞代码 1 的修复方式
0X05 漏洞代码
- <?php
- $blacklist = array(".php", ".phtml", ".php3", ".php4");
- foreach ($blacklist as $item) {
- if (preg_match("/{$item}\$/i", $_FILES['userfile']['name'])) {
- echo "We do not allow uploading PHP files\n";
- exit;
- }
- }
- $uploaddir = '2.2/upload/';
- $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
- if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
- echo "File is valid, and was successfully uploaded.\n";
- } else {
- echo "File uploading failed.\n";
- }
- ?>
扩展名黑名单过滤不严, 可上传 .php5 文件进行绕过导致任意文件上传
参考漏洞代码 1 的修复方式
文件写入漏洞
0X01 简介
在生成配置文件或者缓存文件的时候, 未对传入的内容进行过滤, 导致 php 代码执行漏洞
0X02 漏洞代码
- <?php
- if($isset($_POST['debug']))
- {
- $setting = $_POST['debug'];
- $content = "<?php\r\n";
- $content .= "\$YCF['debug'] ='" . $setting . "';\r\n";
- $content .= "?>";
- file_put_contents("2.3/config.php", $content);
- }
- ?>
未对传入内容进行任何过滤, 用单引号绕出去可以引起代码执行漏洞
进行 addslashes 函数过滤且不要拼接在双引号内, 否则同样会引起代码执行漏洞
0X03 修复代码
$setting = addslashes($_POST['debug']);
文件删除漏洞
0X01 简介
删除文件时对路径或文件名过滤不严, 会导致任意文件删除
0X02 漏洞代码
- <?php
- if(@$_GET['action'] == 'del')
- {
- if(isset($_GET['img']))
- {
- $img = $_GET['img'];
- unlink('2.4/'.$img);
- echo '删除图片成功';
- }
- }
- ?>
对删除文件过滤不严, 导致任意文件删除
不允许 .. 等跨目录字符出现进行 addslashes 函数过滤
0X03 修复代码
- $img = addslashes($_GET['img']);
- if(strstr($img, '..'))
- {
- echo '输入不合法';
- exit;
- }
文件包含漏洞
0X01 简介
如果允许客户端用户输入控制动态包含在服务器端的文件, 会导致恶意代码的执行及敏感信息泄露, 主要包括本地文件包含和远程文件包含两种形式通常是由于 include require 引起恶意包含
0X02 漏洞代码
- <?php
- if ($_GET['func']) {
- include $_GET['func'];
- } else {
- include '3.1/default.php';
- }
- ?>
在未过滤的情况下, 可包含带有恶意代码的 JPG 文件日志文件, 甚至可以远程包含
不允许 .. 等跨目录字符出现, 对前缀跟后缀都进行限制, 使用 addslashes 过滤 %00 防止被截断包含
0X03 修复代码
- <?php
- if ($_GET['func']) {
- $file = addslashes($_GET['func']);
- if(strstr($file, '..'))
- {
- echo '输入不合法';
- exit;
- }
- include '3.1/'.$file.'.php';
- } else {
- include '3.1/default.php';
- }
- ?>
来源: https://bingyishow.top/Resources-and-technology/84.html