먼저 Path Traversal이 무엇인지 간단하게 알아본다.
공격자가 웹 어플리케이션이 파일 경로를 잘못 검증하는 취약점을 이용하는 것을 의미한다. 원래 접근이 불가능한 시스템 파일이나 민감한 정보에 접근하는 공격이다.
웹 어플리케이션이 사용자 입력을 이용해 파일을 읽거나 쓰는 경우, 공격자는 ../ 과 같은 상위 디렉터리 참조를 통해 루트 디렉토리까지 올라간 후 민감한 파일에 접근할 수 있다.
예를 들어 어떤 파일의 내용을 보여주는 POST 요청이 있다고 한다.
정상적인 파일 요청은
http://example.com/view?file=report.pdf
위와 같이 문제가 없다.
하지만 만약 공격자가 url을 다음과 같이 조작하고, 서버에는 별다른 제재가 없을 경우 아래와 같이
http://example.com/view?file=../../../etc/passwd
공격자는 시스템 파일을 열어 정보유출로 이어질 수 있다.
입력 검증 : ../ 과 같은 패턴 차단 또는 제거
화이트리스트 사용 -> 허용된 파일 이름 목록을 이용하여, 파일 허용의 목록을 최소화
가상 디렉터리 제한 : chroot, Docker 등으로 루트 디렉토리의 범위 제한
권한 설정 제한 : 서버가 읽을 수 있는 파일 범위를 최소화 ( 권한 분리 )
파일 경로 고정 : 사용자에게 전체 경로를 노출시키지 않고, 서버 내부에서 매핑 처리
드림핵의 문제를 통해 더 자세히 알아본다.
먼저 문제파일과 웹 사이트가 주어진다.

사용자 정보를 조회하는 API 서버라고 한다.

각 함수별로 살펴보면
먼저 '/'은 초기 화면, 'get_info' 는 get과 post요청을 처리한다.
post요청에서는 사용자의 userid Input을 통해 해당 userid에 대한 내용을 읽어와서 텍스트로 출력해준다.
flag는 /api/flag.txt의 경로에 존재한다. 만약 우리가 /api/flag에 접속하면 자연스럽게 flag를 반환할 것 이다.
아래는 웹사이트이다. userid에 admin을 입력하였더니 나온 결과이다.

먼저 처음에는 바로 접속을 시도해 보았다.

직접 호출을 하니 코드에 나와있는대로 401 에러를 반환한다.
Path Traversal을 이용해야 하니 ../flag 를 입력해 보았다. get_info에서 {API_HOST}/api/user/{userid} 로 요청받고 있으므로 userid 자리에
../flag를 넣으면 반환을 해줄 것 만 같다.

반환을 해주지 않는다. 어디에선가 문제가 생긴 것 같다.
경로가 틀린건가 하고 다른 경로도 해보았지만 같았다. Burpsuite를 이용해서 요청 값을 제대로 확인해 보았다.

userid에 admin을 넣고 해당 요청을 잡아보았더니, 1로 변환되어 있었다. 아까 코드에서 내부 API의 동작 코드를 보여주었는데, 그 때문인 것 같다. 즉 API 요청 시에 적절
한 값으로 변경이 되는 로직이 추가되어 있는 것 같다.
그래서 이번에는 이 Burpsuite를 통해 userid 파라미터에 직접 ../flag를 추가해 보았다.


이렇게 Path Traversal를 이용해서 FLAG를 획득하였다.