Path Traversal 문제이다.

제목에서 봤을 때 경로 조작 순서가 제거되었다.. 라는 뜻이라고 한다.

아마 경로 특수문자(../)가 필터링된 것 같다.

 

 

테스트 페이지에 접근해보면 앞선 문제들 처럼 임의의 shop 페이지를 확인할 수 있다.

 

 

임의의 게시글을 클릭한 뒤 request 값을 확인해보면 filenamae 파라미터를 통해 파일을 불러오고 있어

../../../../../../etc/passwd 를 시도하였으나 "No such file"을 확인할 수 있다.

 

 

예상대로, ../ 를 필터링하고 있는 것으로 보인다.

그렇다면 ../ 자체를 필터링 하고 있는지 특수문자(. / 등) 을 필터링하는 것인지 확인하기 위해

💡....//....//....//....//....//....//etc/passwd 를 시도하면 된다.

 

 

../ 필터링이 우회되어 /etc/passwd 파일에 접근이 가능하게 된다. 👏

 

 

Path Traversal 문제이다.

문제 제목에서 힌트를 얻을 수 있다.

absolute path bypass 즉, 절대 경로 우회라는 뜻이다.

 

 

테스트 페이지에 접근해보면 임의의 shop 페이지가 존재한다.

 

 

임의의 게시글 클릭 후 burp suite로 request를 잡아보면,

filename 파라미터를 통해 게시글의 이미지를 불러오는 것을 알 수 있다.

 

 

먼저 ./8.jpg로 접근을 시도하였을 때 이미지를 그대로 불러오는 것으로 보아 ./가 먹히는 것으로 확인해

filename=../../../../../etc/passwd 를 입력하였으나

response 에서 /etc/passwd 파일을 불러오지 못하고 "No such file" 문구를 확인하게 된다.

 

 

그럼 제목에서 처럼 절대경로 우회 방법을 사용하면 어떨까?

 

절대경로를 간단히 설명하자면, root에서부터의 전체 경로로 어느 곳에서든 접근이 가능하고

 

이와 반대되는 상대경로의 경우 파일의 위치를 기준으로 상대적인 경로를 갖는다.

 

 

 

../../../../etc/passwd 구문의 경우 현재 위치에서의 경로를 나타내기 때문에 💡절대경로로 접근하기 위해 filename=/etc/passwd 로 접근을 시도해보자.

 

절대경로로 입력 시 passwd 파일의 내용에 접근이 가능하다.👏

 

 

What Is❔

 

Path Traversal 취약점은 "디렉터리 조작" 으로도 알려져 있으며 파일 다운로드 취약점과 유사한 부분이 많다.

 

사용자로부터 경로(path) 형태의 입력값을 받아 서버의 파일에 접근할 수 있는 공격 기법이다.

 

즉, 경로 조작을 통해 서버 내에 존재하는 파일의 내용을 확인할 수 있게 된다.

 

 

How To❓

 

웹 서비스의 파라미터나 헤더에서 사용자 입력값을 처리하는 부분에 해당 취약점이 발현될 가능성이 존재한다.

 

파일 다운로드 취약점을 진단하는 것처럼 특수문자(../ 등)의 필터링 유무를 먼저 파악하는 것이 중요하다.

> Portswigger의 File Path traversal, simple case 문제로 설명을 진행하자면, 

 

아래의 테스트 페이지에서 임의의 게시글을 클릭한다.

테스트 페이지

 

이미지를 불러올 때 filename 파라미터를 통해서 이미지를 가져온다.

게시글 클릭 시 reqeuset 값

 

사용자로부터 경로 입력값을 받는지 확인해보기 위해 아래와 같은 요청을 보내면

  GET /image?filename=1.png   →   200 OK
  GET /image?filename=./1.png   →   200 OK

  또는
  
  GET /path=/upload/abc/123&filename=1.pdf    →   200 OK
  GET /path=/upload/abc/123/../123&filename=1.pdf    →   200 OK

 

두개의 요청값 모두 200 ok 응답을 확인할 수 있다.

 

위의 결과로 알 수 있는 것은

 

./ 특수문자가 서버 단에서 필터링되어 있거나 현재 디렉터리를 나타내는 ./가 실제 경로로 처리가 된 경우이다.

 

실제 경로로 처리가 된 경우 ../를 사용하여 서버의 파일에 접근을 시도할 수 있다. 

 

/image?filename=../../../../../../etc/passwd  을 입력하면 response 에서 /etc/passwd 파일에 접근이 가능하게 된다. 

 

Good to Know👍

1. 특수문자 Bypass

 

[Linux]

../           
%2e%2e%2f                        #url encoding
%252e%252e%252f            #double url encoding
%u002E%u002E%u002F    #16bit unicode encoding
....//
..././


[Windows]

..\          
%2e%2e%5c                       #url encoding
%252e%252e%255c           #double url encoding
%u002E%u002E%u005c    #16bit unicode encoding
....\\
...\.\

 

 

2. OS 별 주요 경로

 

[ Linux ]

/etc/passwd

../../../../etc/passwd%0a.png (개행문자 삽입 %0a, %0d)

/etc/issue  (로그인 전 배너 설정 파일_로컬에서)

/etc/issue.net (로그인 전 배너 설정 파일_telnet)

/etc/motd  (로그인 성공 메시지 설정 파일 ssh, telnet)

/etc/shadow

/etc/group

/etc/hosts (도메인 주소와 ip 주소가 존재하는 파일)

/var/log/wtmp  (성공한 로그인/로그아웃 정보 파일)

/var/log/btmp

/var/log/lastlog

/etc/my.cnf  (mysql 설정 파일)

/etc/mysql/my.cnf

/usr/local/mysql/etc/my.cnf

 

[ Windows ]

winnt/win.ini

boot.ini

C:\Windows\my.ini  (mysql 설정 파일)

C:\Windows\my.cnf

C:\my.ini

C:\my.cnf

 

Level 14번 문제이다.

 

 

USERNAME과 PW를 입력받는 폼이 존재한다. 

 

 

소스 코드를 확인해보면, username과 password 입력 시 아래의 쿼리를 통해 패스워드가 출력된다.

💡그렇다면 해당 쿼리를 우회하면 패스워드를 획득할 수 있다. 인증을 우회하는 SQL Injection 문제이다.

 

 

쿼리에서 따옴표(")로 username의 입력값을 받고 있으므로 " or 1=1-- 로 우회를 시도한다. 

 

 

다음 레벨의 패스워드를 획득할 수 있다. 👏

 

'Penetration Testing > Natas' 카테고리의 다른 글

[Natas] Level13 write-up  (0) 2023.10.24
[Natas] Level12 write-up  (0) 2023.09.14
[Natas] Level11 write-up  (0) 2023.09.12
[Natas] Level10 write-up  (0) 2023.09.11
[Natas] Level9 write-up  (0) 2023.09.11

natas 13번 문제이다.

 

 

12번 문제와 같이 파일 업로드 취약점이 존재하는 페이지로 보인다.

 

 

소스 코드를 확인해보면, 이미지 파일인지 확인하는 코드에 exif_imagetype() 함수를 사용하고 있다.

 

 

exif_imagetype() 함수는 파일의 시그니처를 통해 어떤 파일인지 확인한다. 

그렇다면 이 문제에서 이미지 파일인지 확인하는 방법은 파일의 시그니처를 보고 이미지 파일로 인식한다.

💡 php 코드 작성하고 맨 앞에 이미지 파일 시그니처만 넣어주면 해당 로직 우회가 가능해 업로드가 가능할 것이다!

https://www.php.net/manual/en/function.exif-imagetype

 

PHP: exif_imagetype - Manual

to checking file is image, I used this:function is_image($path){ $a = getimagesize($path); $image_type = $a[2]; if(in_array($image_type , array(IMAGETYPE_GIF , IMAGETYPE_JPEG ,IMAGETYPE_PNG , IMAGETYPE_BMP))) { return true; } return false;}

www.php.net

 

 


파일 시그니처(File Signature)

 

 

직접 파일 시그니처 hex 값을 넣어줘도 되지만

찾아보니 GIF 파일의 경우 문자열을 맨 앞에 넣어줘도 가능하므로 "GIF87a" 넣어주고 php 코드를 작성한다.

 

 

test.txt 파일 업로드를 시도한다. 

 

 

업로드는 완료했지만, jpg 파일로 업로드가 된다. 

 

 

파일 업로드 시, 요청 패킷에서 filename 의 파일 확장자를 php로 업로드 하면된다!

 

 

php 파일로 업로드가 완료되어 해당 경로로 접근 시 다음 레벨의 패스워드를 획득할 수 있다.👏

 

'Penetration Testing > Natas' 카테고리의 다른 글

[Natas] Level14 write-up  (0) 2023.10.24
[Natas] Level12 write-up  (0) 2023.09.14
[Natas] Level11 write-up  (0) 2023.09.12
[Natas] Level10 write-up  (0) 2023.09.11
[Natas] Level9 write-up  (0) 2023.09.11

+ Recent posts