1. Directory Traversal이란?
- 상위 디렉터리로 이동가능한 문자 ../ 를 이용해 상위 디렉터리로 접근하여 파일을 검색/다운 등이 가능한 취약점.
- 접근 통제 및 검증, 서버 설정 미흡 등의 취약점으로 인해 중요 파일에 접근이 가능한 취약점.
- 해당 취약점을 이용해 공격자는 접근 불가한 디렉터리나 파일에 접근이 가능해짐.
2. bWAPP Directory Traversal
- 먼저 bWAPP 첫화면에서 식별되는 정보는 없다.
- URL의 page 매개변수에 디렉터리 이동문자인 ../를 이용해 상위 디렉터리로 이동
- 중요파일인 /etc/passwd 파일에 접근
- ../을 다수 입력한 이유는 다음과 같다.
① 공격자는 현재 자신이 위치한 디렉터리의 정확한 위치를 알지못한다.
② 공격자는 최상위 디렉터리인 root 디렉터리로 이동 후 원하는 디렉터리 및 파일에 접근하는 것이 목표이다.
③ root 디렉터리는 최상위 디렉터리이며, root 디렉터리의 상위 디렉터리 역시 root 이다.
④ 즉, 현재의 정확한 위치를 모르기 때문에 ../를 다수 입력해 root 디렉터리로 이동하기 위함이다.
- Bee-box에서 다음 명령을 통해 해당 페이지의 내용을 확인할 수 있다.
directory_traversal_1.php : 문제 페이지 내용 확인 가능
functions_external.php : 설정된 함수 확인 가능
① directory_traversal_1.php 내용
<중략>
<?php
if(isset($_GET["page"]))
{
$file = $_GET["page"];
switch($_COOKIE["security_level"])
{
case "0" :
show_file($file);
// Debugging
// echo "<br />" . $_GET['page'];
break;
case "1" :
$directory_traversal_error = directory_traversal_check_1($file);
if(!$directory_traversal_error)
{
show_file($file);
}
else
{
echo $directory_traversal_error;
}
// Debugging
// echo "<br />" . $_GET["page"];
break;
case "2" :
$directory_traversal_error = directory_traversal_check_3($file);
if(!$directory_traversal_error)
{
show_file($file);
}
else
{
echo $directory_traversal_error;
}
// Debugging
// echo "<br />" . $_GET["page"];
break;
default :
show_file($file);
// Debugging
// echo "<br />" . $_GET["page"];
break;
}
}
?>
<하략>
② functions_external.php 내용
<중략>
function directory_traversal_check_1($data)
{
// Not bulletproof
$directory_traversal_error = "";
// Searches for special characters in the GET parameter
if(strpos($data, "../") !== false ||
strpos($data, "..\\") !== false ||
strpos($data, "/..") !== false ||
strpos($data, "\..") !== false)
{
$directory_traversal_error = "Directory Traversal detected!";
}
/*
else
{
echo "Good path!";
}
*/
return $directory_traversal_error;
}
function directory_traversal_check_2($data)
{
// Not bulletproof
$directory_traversal_error = "";
// Searches for special characters in the GET parameter
if(strpos($data, "../") !== false ||
strpos($data, "..\\") !== false ||
strpos($data, "/..") !== false ||
strpos($data, "\..") !== false ||
strpos($data, ".") !== false)
{
$directory_traversal_error = "Directory Traversal detected!";
}
/*
else
{
echo "Good path!";
}
*/
return $directory_traversal_error;
}
function directory_traversal_check_3($user_path,$base_path = "")
{
$directory_traversal_error = "";
$real_base_path = realpath($base_path);
// echo "base path: " . $base_path . " real base path: " . $real_base_path . "<br />";
$real_user_path = realpath($user_path);
// echo "user path: " . $user_path . " real user path: " . $real_user_path . "<br />";
// int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
// URL: http://php.net/manual/en/function.strpos.php
if(strpos($real_user_path, $real_base_path) === false)
{
$directory_traversal_error = "<font color=\"red\">An error occurred, please try again.</font>";
}
/*
else
{
echo "Good path!";
}
*/
return $directory_traversal_error;
}
<하략>
3. 대응방안
- 보안장비 패턴(ex ../ 및 해당 문자열 인코딩 값) 등록 후 탐지 및 차단
- 입력값 검증 및 권한 검증 수행
- 해당 서버가 Apache일 경우 "conf/httpd.conf"에 모든 디렉토리 Options 지시자의 'Indexes'를 제거.
'취약점 > Directory Traversal' 카테고리의 다른 글
Check Point社 VPN Path Traversal 취약점 (CVE-2024-24919) (0) | 2024.06.04 |
---|---|
Openfire 경로 탐색 취약점 (CVE-2023-32315) (1) | 2024.02.02 |
F5 BIG-IP TMUI RCE (CVE-2020-5902) (0) | 2022.12.25 |
Citrix ADC and Gateway 취약점 (CVE-2019-19781) (0) | 2022.12.02 |
FortiOS SSL VPN Directory Traversal 취약점 (CVE-2018-13379) (0) | 2022.11.29 |