Luv{Flag}
반응형

본 글은 워게임 문제를 풀던중 다음과 같은 코드에서 시작되었다.

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

 

반응형

검색 태그

loading