본문 바로가기

Security

[wargame] php-1

반응형

https://dreamhack.io/wargame/challenges/46/?page=6 

 

php-1

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

dreamhack.io

list.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/>";
    }
?>

view.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>

index.php

<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>PHP Back Office</title>
</head>
<body>
    <!-- Fixed navbar -->
    <nav class="navbar navbar-default navbar-fixed-top">
      <div class="container">
        <div class="navbar-header">
          <a class="navbar-brand" href="/">PHP Back Office</a>
        </div>
        <div id="navbar">
          <ul class="nav navbar-nav">
            <li><a href="/">Home</a></li>
            <li><a href="/?page=list">List</a></li>
            <li><a href="/?page=view">View</a></li>
          </ul>

        </div><!--/.nav-collapse -->
      </div>
    </nav><br/><br/>
    <div class="container">
      <?php
          include $_GET['page']?$_GET['page'].'.php':'main.php';
      ?>
    </div> 
</body>
</html>

 

main 화면

List에서 flag.php를 누르면

이와같은 경로로 리다이렉트된다.

view.php 소스를 확인해보면 preg_match를 통해 필터링을 하고있다.

preg_match('/flag|:/i', $file)

정규식이 뒤의 값과 일치하면 1 아니면 0을 반환한다.

// 사이에 들어가는 것이 찾을 표현.

| 는 or를 의미. i는 대소문자를 구분하지 않겠다는 뜻이다.

즉 flag 또는 :가 $file에서 발견된다면 1을 반환한다. 즉 flag와 관련없는 파일명에 대해서만 허용하겠다는 뜻.

preg_match()를 우회하려 해봤으나 마땅한 방법이 없었다. ($file명을 flag없이 접근해서 얻을 게 없음.)

 

index.php를 보면 $_GET['page']를 통해 입력을 받아서 include로 실행한다.

따라서 ?page=/var/www/uploads/flag 경로로 실행해봤다.

can you see $flag? 라는 문자가 출력되었다. 즉 접근이 가능하다는 뜻이다.

그리고 $flag는 php 변수이다.

 

include는 php파일의 경우 소스를 그대로 보여주는 것이 아니라 실행을 시켜버린다.

따라서 소스를 가져올 수 있다면 실마리를 얻을 수 있다.

wrapper를 통해 flag.php를 base64 인코딩하고 , 이를 디코딩해서 가져오기로 한다.

아래와 같이 요청한다. (/resource=파일) <- 주의 resource 빼먹지 말아야한다.

인터넷에 널린 디코더를 통해 디코딩하니 역시 flag 획득 가능.

반응형

'Security' 카테고리의 다른 글

[wargame] image-storage  (0) 2021.09.30
[Webhacking] Javascript  (0) 2021.09.30
[wargame] Tomcat Manager  (0) 2021.09.27
[Webhacking] PHP  (0) 2021.09.27
[Webhacking] language specific vulnerability  (0) 2021.09.27