본 글은 워게임 문제를 풀던중 다음과 같은 코드에서 시작되었다.
if url.startswith("file://"):
return 'wrong'
#, @, : 등 다양한 character 들로 파서를 우회 한 후 원하는 값으로 위조된 요청을 보내는 방법들 보다
file URI 를 중심으로 서술하겠다.
다음은 공격자가 서버가 연결하는 URL을 제어 할 수 있는 예이다.
def url_request():
url = request.args.get('url', '').lower()
title = request.args.get('title', '')
data = urlopen(url).read()
localhost 필터링을 우회하여 어드민 경로(flag 경로)에 접속하는 것 뿐만 아니라 다양한 URI 스키마로 원하는 결과값을 얻어 올 수 있다.
사용자가 URI 스키마를 제어할 수 있게 되면 공격자는 http / https 와는 다른 프로토콜을 사용할 수 있게 된다.
- up://
- ldap://
- jar://
- gopher://
- mailto://
- ssh2://
- telnet://
- expect://
이러한 프로토콜로 다음과 같은 공격들을 수행 할 수 있게 된다.
- 인트라넷 리소스 포트 스캐닝
- 방화벽 무시
- 응용 프로그램 서버 또는 인트라넷에서 실행 중인 취약 프로그램 공격
- Injection 공격 또는 CSRF를 활용한 내/외부 웹 응용 프로그램 공격
- file:// 스키마를 활용하여 로컬 파일에 접근
- Windows 시스템에서 공격자가 file:// 스키마 및 UNC 경로를 통해 내부 공유 자료에 접근 및 스캔 가능
- DNS 캐시 감염 공격 수행
이 중에서도 file:// 은 로컬 파일에 접근 할 수 있게 하기 떄문에 공격자에게 있어 일감이다.
보통 소유자의 local 에서 파일을 찾기 위해 사용되는 file URI Scheme 는 다음과 같은 구조를 지닌다
file://host/path
host 부분은 생략 가능하며, 생략시 localhost 로 자동 지정되는데, 이때는 다음과 같이 사용하여야 유요한 문법이다.
file:///
file: 뒤 "//" 는 뒤 hostname 또는 localhost 가 온다는 것을 의미하며 생략될 수 있다.
host 부분과 path 부분 사이의 slash는 URI에서 로컬 경로의 시작을 의미하므로 생략 불가능 하다.
따라서 유효한 문법은
file:/path
file:///path
file://hostname/path
으로 정리 할 수 있다.
따라서 file:///etc/passwd 와 같은 방법으로 공격을 시도해 볼 수 있다.
추가적으로
dict:// , sftp:// , ldap:// 도 시도 해 볼 수 있다.
특히 LDAP는 학교, 회사와 같은 집단에서 사용자 인증 정보를 중앙화 해 한곳에서 관리할 수 있도록 만들어졌기 떄문에 한번쯤 시도해볼만 하다
?url=ldap://localhost:11211/%0astats%0aquit
'Web > Website security' 카테고리의 다른 글
toLowerCase(), toUpperCase() 유니코드 우회 (1) | 2024.04.02 |
---|---|
[SSRF / LFI] Bypass WAF with url globbing (1) | 2023.11.20 |
Content-Security-Policy (CSP) 정책 총정리 (+bypass) (0) | 2022.12.01 |
CSTI (Client-Side Template Injection) 취약점 (0) | 2022.11.08 |
UUID v1 사용은 안전하지 않습니다 (0) | 2022.10.11 |