目录遍历漏洞浅析.
目录遍历
Web应用中运行外界以参数的形式来指定服务器的文件时,如果没有对文件名进行充分的校验,就可能造成意料之外的事情、比如文件浏览篡改等。
目录遍历的英文名称为
Directory Traversal
或者Path traversal
.攻击者通过在URL或参数中构造
../
..%2F
%2e%2e%2f
测试代码
<?php
$filename = $_GET['filename'];
if($filename){
$content = @file_get_contents($filename);
if($content){
echo $content;
}
}
?>
读取文件
正常请求1
192.168.145.225/dir.php?filename=test.txt
攻击—1
payload
192.168.145.225/dir.php?filename=../waf.txt
攻击—2
payload
192.168.145.225/dir.php?filename=../../../etc/passwd
攻击—3
http://192.168.86.208/dir.php?filename=.\./.\./etc/passwd
这一种的payload
在特殊的场景下可以执行成功,是因为该程序在代码方面对其中的\
或者其他字符有过滤或者其他操作。
防御
限制文件名的字符种类仅为字母和数字,那么用于目录遍历的字符就会无法使用。
对设计到此功能的参数,需要严格进行过滤。
以下只是简单的对出现..
的进行的一个防御。
<?php
header("Content-type:text/html;charset=utf-8");
$filename = $_GET['filename'];
if(preg_match('/\.\./',$filename)){
die('非法字符');
}
else{
$content = @file_get_contents($filename);
if($content){
echo $content;
}
}
以上只是简单的测试,严格的生产环境需要特殊来设置。