01-2目录遍历
2021-06-16 本文已影响0人
测试有话说
一、漏洞描述
攻击者能够在web应用程序所在的根目录以外的文件夹上,任意地获取数据
二、攻击场景及形成原因
攻击场景
常见于展示系统配置信息等场景,该场景下需要通过文件名参数来获取对应配置文件的这类功能设计。
形成原因
没有过滤用户输入的../和./之类的目录跳转符
image.jpeg三、危害性
攻击者能够获取敏感数据,继而攻陷整个服务器。例如获取linux下的/etc/passwd文件后可能会破解出root用户的密码等。
四、攻击案例
某应用程序后台脚本中包含如下loader.php文件:
if(isset($_GET[‘js’]))
{
$js = explode(‘;’, $_GET[‘js’]);
foreach($js as $val)
{
$ext = substr($val,strrpos($val,’.’)+1);
If($ext == ‘js’ || $ext==’css’)
{
if(is_file($val))
{
echo file_get_contents($val);
echo “\n”;
}
}
}
}
该页面没有对用户提交的js参数的文件路径进行过滤,攻击者可通过目录跳转字符“../”进行目录遍历攻击。虽然程序将读取的文件类型限制为“js”和“css”,但是由于PHP 5.3.4之前的版本中存在空字符截断漏洞,同时程序也未对截断符“%00”进行过滤,攻击者可借助截断符读取任意类型文件。构造如下参数即可访问linux服务器下的/etc/passwd文件。
http://vulhost/loader.php?js=../../../../../../../etc/passwd%00.js
五、漏洞评级及处理
等级:严重
给出安全漏洞警告,12小时内必须进行修复。未修复漏洞之前禁止对外发布。
六、防御方法
使用相应的函数把特殊的字符(.、/、%等)给过滤掉
<?php
if(isset($_GET["file"]))
{
$file = $_GET["file"];
//
if(sizeof(explode("..",$file)) >1 || sizeof(explode("./", $file))>1 || sizeof(explode(".\\", $file))>1)
{
//正常文件名不会有两个以上的.
echo "filename error";
}
else
{
$ext = substr($file,strrpos($file,".")+1);
//通常文件下载会在这里加入文件后缀的判断
if(is_file($file))
{
//$file_type = mime_content_type($val);
header("Content-Type:".$ext);
echo file_GET_contents($file);
//echo "<br>";
}
}
}
?>
七、测试方法
如demo为以下代码
if(isset($_GET["file"]))
{
$file = $_GET["file"];
$ext = substr($file,strrpos($file,".")+1);
//通常文件下载会在这里加入文件后缀的判断
if(is_file($file))
header("Content-Type:".$ext);
echo file_GET_contents($file);
}
}
使用../../../../../etc/passwd 或针对windows系统使用 ../../../../../跳转至一个确定存在文件的路径,若展示目录内容,或对应目录结构内容,即存在目录遍历问题。
若提示错误或显示空白内容,则不存在目录遍历风险。