CTF/웹해킹

[EZCTF] I made a blog! - 웹해킹 / LFI / PHP wrapper

SecurityMan 2022. 5. 17. 11:00

 

LFI 취약점을 이용한 웹해킹 문제였다.

 

문제 소스는 별도로 주어지지 않고 문제페이지 주소만 주어진다.

 

반응형

 

 

문제 페이지에 접속해보면 이런 블로그가 나온다.

 

 

취약점이 발생하는 부분은 Blog 페이지이다.

 

Blog 페이지에 가보면 위에 보이는거 처럼 게시글이 3개 저장되어 있다.

 

 

첫번째 게시글을 클릭한 뒤에 URL을 확인해 본다.

 

ez.ctf.cafe:9999/blog-posts.php?file=blog1.html

 

이렇게 적혀있는데

 

URL에서 ? 뒤에오는 부분은 변수 라고 생각하면 된다.

 

blog-posts.php 페이지에서는 file이라는 변수를 선언하고, 

 

그 변수에 blog1.html 페이지를 담아서(불러와서) 사용자에게 보여주는 것이다.

 

이런식으로 웹 페이지를 구현할 경우, PHP 환경에서 include() 함수를 사용하는데,

 

적절한 필터링이 없다면 LFI(Local File Inclusion) 취약점이 발생하게 된다.

 

LFI는 말 그대로 서버 내에 있는 파일을 불러와 읽을 수 있는 취약점이다.

 

단순히 웹 페이지의 소스코드 뿐만 아니라 /etc/passwd 와 같인 비밀번호 파일들도 유출이 가능하다.

 

 

두번째 게시글로 한번 더 확인해본다.

 

이번에 URL은 ez.ctf.cafe:9999/blog-posts.php?file=blog2.html

 

이렇게 바뀐다.

 

file 변수로 불러올 파일을 지정해주는게 확실하다.

 

이제 정확히 어떤 파일을 불러올지 정하면 된다.

 

문제를 출제한 사람이 플래그를 어디에 숨겨놨을까 고민하다가

 

 

URL에 /robots.txt를 입력해보니

 

서버 내에 /flag.php 파일이 존재한다는것을 알게 되었다.

 

robots.txt는 로봇 배제 표준이라고도 하며, 검색엔진의 접근을 제어하기 위한 일종의 규약이다.

 

 

구글이나 네이버 같은 사이트들도 주소 끝에 /robots.txt 를 입력하면

 

해당 내용을 볼 수 있다.

 

 

일단은 URL을 통해서 /flag.php 페이지로 접근을 해보았다.

 

접근하면 How do you filter your coffee? 라는 문장이 출력되고,

 

그 외에 다른 아무것도 없다.

 

여기서 filter가 힌트가 된다고 생각했는데

 

보통 LFI 공격을 수행할 때 PHP wrapper 라고 불리는 기능을 사용하기 때문이다.

 

 

다시 한번 blog-post.php 페이지로 가서

 

이번에 file 변수에

 

php://filter/convert.base64-encode/resource=flag.php 라고 입력해준다.

 

php:// 를 PHP wrapper 라고 하는데 이걸 사용하면

 

filter 기능을 이용해서 인코딩을 할 수 있다.

 

flag.php 파일을 읽어와서 base64로 인코딩한 뒤에 출력해라 정도로 해석하면 된다.

 

위 캡쳐처럼 base64로 인코딩된 내용이 브라우저에 출력되는걸 볼 수 있다.

 

 

CyberChef(https://gchq.github.io/CyberChef/) 에서 해당 내용을 base64 디코딩 해준다.

 

그럼 주석 처리된 플래그를 찾을 수 있다.

 

?file=flag.php 가 아니라

 

?file=php://filter/convert.base64-encode/resource=flag.php 를 쓰는 이유가 여기에 있다.

 

?file=flag.php 로 페이지를 불러오게 되면 브라우저에서 해석된 페이지를 불러오기 때문에

 

맨 처음 그냥 /flag.php 로 접근했을 때처럼 How do you filter your coffee?라는 글자만 보이게 된다.

 

그런데 PHP warpper를 사용해서 base64인코딩한 값을 가져오게 되면

 

flag.php 파일 전체를 base64 인코딩을 하기 때문에

 

위처럼 소스코드가 날 것 그대로 보이게 되는것이다.

반응형