[Web Application-모의해킹] 디렉터리 인덱싱 : 시큐어 코딩(디렉터리 내 초기 페이지 설정) #4-2

2024. 4. 30. 22:29Project/Web Application-모의해킹

 

시큐어 코딩 : 디렉터리 내 초기 페이지 설정

 

1) 개요

 

  Project:Web Site 웹 사이트 upload_folder와 upload_folder/사용자 계정 디렉터리에서 발견된 디렉터리 인덱싱 취약점을 방지하기 위하여 대응 방안 중 하나인 디렉터리 내 초기 페이지 설정을 적용시켜 실제로 디렉터리 인덱싱 취약점을 방지할 수 있는지 확인한다.

 

 

2) 방법

 

  Project:Web Site 웹 사이트에서 upload_folder와 upload_folder/사용자 계정은 해당 웹 사이트에서 업로드된 파일이 저장되는 위치다. 디렉터리 인덱싱 취약점이 발견된 디렉터리인 upload_folder 디렉터리는 단순하게 초기 페이지인 index.php 파일을 작성하면 해결되지만 upload_folder/사용자 계정 디렉터리는 해당 디렉터리가 처음부터 존재하는 것이 아니라 계정이 생성됨과 동시에 같이 생성되기 때문에 매번 초기 페이지를 작성할 수 없다. 그렇기 때문에 디렉터리를 생성한 후 바로 해당 디렉터리 내에 초기 페이지를 생성시켜 주는 코드를 추가로 입력해야 한다.

 

 

3) 시큐어 코딩

 

[1] upload_folder 디렉터리 내 초기 페이지 작성

 

 

  웹 브라우저 주소창에 /php/upload_folder을 입력하여 디렉터리 파일 리스트가 노출되는지 확인한다.

 

/php/upload_folder 디렉터리

 

  /php/upload_folder 디렉터리로 이동한다.

 

 

  텍스트 에디터 명령어를 사용하여 index.php 파일을 열고 내용으로는 간단하게 'Access Denial'을 입력하고 저장한다.

 

 

  시큐어 코딩 후 웹 브라우저 주소창에 /php/upload_folder을 입력하면 'Access Denial' 문자열이 출력되면서 디렉터리 파일 리스트가 출력되지 않는 것을 확인할 수 있다.

 

[2] upload_folder/사용자 계정 디렉터리 내 초기 페이지 작성

 

  upload_folder/사용자 계정 디렉터리는 계정이 등록됨과 동시에 해당 계정 전용 첨부 파일 저장 디렉터리 용도로 생성된다. 이는 개발자 입장에서 디렉터리가 생성될 때마다 해당 디렉터리의 초기 페이지를 설정하는 행동에는 무리가 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
        // 회원가입 페이지에서 전송된 변수 저장
        $user = array(
            'name' => $_POST['user_name'],
            'id' => $_POST['user_id'],
            'pass' => $_POST['user_pass'],
            'age' => $_POST['user_age']
        );
 
        // URL 직접 입력 접근 방지
        if(strlen($user['id'])==0 || strlen($user['pass'])==0 || strlen($user['name'])==0 || strlen($user['age'])==0)
        {?>
            <script>
                alert('권한이 없습니다.');
                window.location.replace('/php/login.php');
            </script>
            <?php 
                exit();
        }
 
        else
        {
            require_once("db.php");
 
            db_insert_to_sign_up($user['id'],$user['pass'],$user['name'],$user['age']);
            mkdir("upload_folder/".$user['id'],0777);?>
            <script>
                alert('회원가입이 완료되었습니다. 로그인 페이지로 이동합니다.');
                window.location.replace('/php/login.php');
            </script>
        <?php
        }
 
?>
cs

 

  위 코드는 회원가입을 처리하는 웹 페이지인 sign_up_proc.php 파일의 코드 전문이며 26번 라인을 보면 계정이 등록될 때 upload_folder/사용자 계정을 이름으로 하는 디렉터리가 동시에 생성되는 것을 확인할 수 있다. 이를 해결하기 위해 디렉터리가 생성됨과 동시에 해당 디렉터리 내 초기 페이지를 생성하는 코드를 입력하여 계정 등록 -> 디렉터리 생성 -> 초기 페이지 설정 로직을 구현한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
 
    require_once("db.php");
    db_insert_to_sign_up($user['id'],$user['pass'],$user['name'],$user['age']);
 
    mkdir("upload_folder/".$user['id'],0777);
 
    $file=fopen("upload_folder/".$user['id']."/index.php","w");
    fwrite($file,"Access Denial");
    fclose($file);?>
 
    <script>
        alert('회원가입이 완료되었습니다. 로그인 페이지로 이동합니다.');
        window.location.replace('/php/login.php');
    </script>
 
  <?php
?>
cs

 

  위 코드는 계정 등록 -> 디렉터리 생성 -> 초기 페이지 설정 로직을 구현한 코드이다. 먼저 회원가입 페이지에서 데이터가 해당 페이지로 전달되면 4번 라인에서 전달된 데이터를 DB에 저장한다. 그리고 6번 라인에서 upload_folder/사용자 계정 디렉터리를 생성한다. 8번부터 10번 라인까지는 생성된 디렉터리 내에 index.php 파일을 생성하여 파일 내용에 'Access Denial'을 입력함으로써 모든 과정을 끝낸다. 구현한 코드가 정상적으로 작동하는지 확인하기 위해 회원가입 페이지에서 계정을 생성해 본다.

 

 

  회원가입 페이지에 접속하여 사용자 입력 칸을 채운 후 회원가입 버튼을 클릭한다. 사용자 계정의 이름은 'test'이며 비밀번호는 '1234'이다.

 

 

회원가입이 성공적으로 됐는지 확인하기 위해 로그인 페이지에 접속하여 test 계정으로 로그인해본다.

 

 

  test 계정 전용 디렉터리가 생성됐는지 확인하기 위해 /php/upload_folder 경로로 이동한다.

 

 

  해당 계정 디렉터리 내에 index.php 파일이 생성됐는지 확인하기 위해 /php/upload_folder/test 경로로 이동한다.

 

 

  /php/upload_folder/test 디렉터리 내 index.php 파일에 내용이 제대로 적혀있는지 확인하기 위해 cat index.php 명령어를 사용하여 'Access Denial' 문자가 적혀있는지 확인한다.

 

 

  마지막으로 웹 브라우저 주소창에 해당 디렉터리 경로를 입력하여 정상 작동하는지 확인한다.