Local File Inclusion - Wrappers
flag를 찾으면 되는 문제이다.
문제 화면으로 들어가면 파일을 선택하여 업로드할 수 있는 기능이 있다.
문제풀이
업로드 기능을 이용하여 .php 파일을 업로드해보면
다음과 같이 JPG파일만 업로드 할 수 있다는 결과와 page파라미터를 볼 수 있다.
페이지에 index우리가 처음 보았던 페이지로 이동한다.
../는 필터링 되어있으며 .와 /는 개별적으로 필터링 되어있지않다.
.만 입력하였을 때
우리가 입력한 값 뒤에 .php가 붙어서 파일을 여는 것을 알 수있다.
문제의 제목을 보면 Wrappers를 이용하여 문제를 해결해야함을 알 수 있다.
이전에 풀었던 LFI문제와 같이 php://를 사용하여 풀려고 하면 php는 필터링이 걸려 사용할 수 없고
system command를 실행 할 수 있는 expect:// 는
다음과 같이 지원하지 않음을 알 수 있다.
File upload를 할 수 있는점을 이용할 수 있는 zip:// 을 이용하여 문제를 풀 수 있다고 생각했다.
zip:// 필터는 업로드된 .zip 파일을 서버측에서 저장된 파일을 압축 해제하여 압축을 푼 파일안에 있는 파일을 실행 시켜준다.
하지만 zip파일을 바로 업로드 할 수 는 없기 때문에 압축한 파일의 확장자를 .jpg로 바꾸어준다.
파일을 업로드하고 확인해보면 tmp/upload 위치에 파일명이 바뀐 채로 저장되어 있음을 알 수 있다.
zip://zip파일이름#풀렸을 때 파일 이름 -> #은 url encoding 하여 %23
Input : page = zip://tmp/upload/(이미지파일)%23(읽을 파일)
파일명이 한 글자를 넘어가면 page name too long이 나온다.
본인은 다음과 같이 scandir을 이용하여 해당 디렉토리에 있는 파일들을 알기 위해서 사용하였다.
이 .php파일을 실행시킨 결과는
다음과 같이 flag가 들어있는 php파일을 얻을 수 있으며 해당 파일을 읽을 수 있게 php파일을 수정해주면 flag를 얻을 수 있다.
<?php eval($_GET['cmd']); ?>
'Web hacking > Root me' 카테고리의 다른 글
[Root-me] - PHP - Eval (0) | 2019.12.03 |
---|---|
[Root-me] - File upload - ZIP (0) | 2019.12.03 |
[Root-me] PHP - Serialization (0) | 2019.11.16 |
[Root-me] SQL injection - Error (0) | 2019.10.07 |
[Root-me] SQL Injection - Routed (0) | 2019.10.01 |