본문 바로가기
드림핵

[드림핵] php - 1 풀이

by jwcs 2023. 7. 24.
728x90

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

 

php-1

php로 작성된 Back Office 서비스입니다. LFI 취약점을 이용해 플래그를 획득하세요. 플래그는 /var/www/uploads/flag.php에 있습니다. Reference Server-side Basic

dreamhack.io

 

LFI 취약점을 이용하는 문제이다.

LFI(local file inclusion)는 파일을 포함시키는 과정이다. 이 문제에서는 그 과정에서 생기는 취약점을 다룬다.

 

/

인덱스 페이지다. 주어진 파일과 코드를 살펴보자.

주어진 파일들이다.

    <div class="container">
      <?php
          include $_GET['page']?$_GET['page'].'.php':'main.php';
      ?>
    </div>

page 변수를 받아와서 이 변수 값 뒤에 .php 를 붙인다. page=list의 값을 보낸다면 list.php 파일을 include 시키는 것이다.

include문은 파일을 읽은 후 해당 파일을 출력한다. 안에 php 태그가 들어있다면 php 코드를 실행시킨다.

include에 관한 드림핵 강의 내용도 첨부하겠다.

include 함수는 파일의 확장자 또는 파일의 타입과는 상관없이 파일의 내용에 php 태그가 포함될 경우
php 코드가 실행되기 때문에 사용 시 주의해야합니다.

 

<h2>List</h2>
<?php
    $directory = '../uploads/';
    $scanned_directory = array_diff(scandir($directory), array('..', '.', 'index.html'));
    foreach ($scanned_directory as $key => $value) {
        echo "<li><a href='/?page=view&file={$directory}{$value}'>".$value."</a></li><br/>";
    }
?>

따라서 위의 코드를

 

다음과 같이 php코드를 실행시킨 모습으로 보여준다.

 

flag.php가 보인다. 바로 들어가보자.

접근이 제한되어 있다. 코드를 보자.

 

<h2>View</h2>
<pre><?php
    $file = $_GET['file']?$_GET['file']:'';
    if(preg_match('/flag|:/i', $file)){
        exit('Permission denied');
    }
    echo file_get_contents($file);
?>
</pre>

flag가 필터링되어 있다. view.php를 이용해서 flag.php 파일을 열 수는 없을 것같다.

 

우리는 list.php 코드에서 flag.php가 어디에 위치해 있는지 확인했다. $directory를 확인해보면 '../uploads/' 이다.

 

아까 우리는 첫 화면에서 get 메소드로 값을 받아 .php를 붙여 include 시키는 것을 확인했다. 여기가 취약해 보인다. '../uploads/flag'를 입력한다면 flag.php를 실행시킬 수 있을 것이다.

 

뭔가 나왔는데 네비게이션 바가 먹어버렸다. (이는 웹 개발할 때 padding을 해주지 않아서 생기는 문제점이라고 한다.)

우클릭 후 페이지 소스 보기로 보면 수월하게 볼 수 있다.

 

can you see $flag?라고만 나왔다. $flag라고 표현한 것을 보니 php 변수에 플래그가 담겨 있을 것이다. 하지만 php 코드가 실행되어 이 변수를 보지 못하고 있는 것이다. 따라서 우리는 코드 전체를 실행시키지 않고 가져와야 한다. php wrapper를 사용하면 코드 전체를 가져올 수 있다.

 

php wrapper 에서 우리는 'php://filter/' 를 사용해보자.

php://filter/read=convert.base64-encode/resource=../uploads/flag

이렇게 하면 flag.php의 php코드가 실행되지 않고 base64로 인코딩되어 전해진다. 즉, 값이 랩으로 감싸져서 보존된 상태로 주어진 것과 같다.

 

이와 같이 인코딩된 값을 준다. 디코딩하면 플래그가 나오게 될 것이다.

 

짜자잔

 

요약

-include를 사용하여 파일을 포함시키면서 생기는 취약점을 진단

-include는 php태그가 있다면 실행시킨다.

-php wrapper를 사용하면 base64로 인코딩하여 php 태그를 실행시키지 않고 값을 가져올 수 있다. 단순 인코딩된 값이기 때문에 이 값을 디코딩하면 원본 데이터를 볼 수 있다.

728x90
반응형

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

[드림핵] amocafe 풀이  (0) 2023.08.02
[드림핵] login filtering 풀이  (0) 2023.08.01
[드림핵] Apache htaccess 풀이  (0) 2023.07.16
[드림핵] simple_sqli_chatgpt 풀이  (0) 2023.07.16
[드림핵] [wargame.kr] strcmp  (0) 2023.07.12