目录遍历漏洞浅析

目录遍历漏洞浅析.

目录遍历

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;
        }
    }

以上只是简单的测试,严格的生产环境需要特殊来设置。

参考

python和django的目录遍历漏洞(任意文件读取)

目录遍历攻击

目录遍历攻击详解

路径遍历漏洞检测与防范