티스토리 뷰
사용된 공격기법 : LFI(Local File Inclusion)
25번 문제를 실행했다.
문제를 보면 여러가지 파일 및 디렉토리의 권한 및 정보가 나와있다.
url을 확인해 보니 file=hello라고 되어 있는 것을 확인할 수 있다. url 에 파일명을 입력하기 때문에 GET방식으로 파일을 받아오는 것을 알 수 있다.
file=flag를 입력해보니 밑의 그림과 같이 다른 내용이 뜨는 것을 확인 할 수 있다.
flag.php파일의 내용이 textarea부분에 출력되고, .php가 생략되어서 실행되는 것으로 추측할 수 있다. 실제로 hello.php와 flag.php 를 실행했을때도 textarea에 출력되는 동일한 값이 출력되는것을 확인할 수 있다.
여기서 주어진 힌트는 FLAG is in the code 뿐이다. F12를 이용해서 스크립트를 살펴보기도 했지만 다른 정보는 찾을 수 없었다.
FLAG is in the code로 추측해보면 flag.php에 문제를 해결할 수 있는 힌트가 있다는 것으로 추측가능하다. 따라서 php 파일을 확인할 수 있는 방법을 찾아 보았다.
> LFI(Local File Inclusion)
이 문제의 공격 기법은 LFI(Local File Inclusion) 취약점을 이용한 것이다. LFI(Local File Inclusion)는 파일이 공격대상의 서버에 위치할때 사용할 수 있는 방법이다. 쉽게 설명하자면, 공격 대상 서버에 있는 디렉토리로 공격자가 접근하여 원하는 값을 열어보게 하는 행동이다. 이와 반대 개념으로는 RFI(Remote File Inclusion)가 있고 RFI는 공격대상이 서버가 아니라 원격지(remote)에 있다.
LFI(Local File Inclusion) 취약점은 PHP 코드에서 php코드에서 include() 부분에 적절한 보호장치나 필터링이 없을 때 주로 발생한다. 예를 들어 /test.php? page=index.html와 같은 정상적인 형태가 아닌 /script.php? page=../../../../../../../etc/passwd\x00와 같은 형식으로 요청을 하게 되면 서버에서는 /etc/passwd 파일을 포함시켜 사용자에게 보여 준다. 여기서 널바이트(\x00)는 주소 뒤에 붙을 확장자(.php, .txt)등을 떼어내 주는 역할을 수행한다.
이를 이용하여 웹사이트의 소스코드를 획득하여 다른 취약점을 찾아 공격을 하거나 서버 내부의 주요 정보를 탈취하는 공격 등이 가능하게 된다. 하지만 php가 버전 5 이상이 되면서 path 중간에 널바이트가 오면 주소를 더 이상 읽지 않게 되었다.
따라서 서버 내의 php파일을 읽기 위해 php wrapper을 사용하여 LFI(Local File Inclusion) 수행할 수 있다.
wrapper란 실제 데이터의 앞에서 틀을 잡아 주는 데이터 또는 다른 프로그램이 성공적으로 실행되도록 설정하는 프로그램이다.
php에 존재하는 wrapper를 사용해 개발자의 의도와 다른 행위를 발생시킬 수 있다.
php wrapper의 종류는 여러가지가 있지만 주로 사용하는 3개만 정리해보았다.
(1) expect://
: system command 실행 가능하다.
ex) [주소]?page=expect://[command]
(2) php://filter
: I/O 스트림을 다루는데 사용하며 encode/decode를 이용하여 서버 내 파일을 읽을 수 있다. 대표적으로 base64를 이용한다.
ex) [주소]?page=php://filter/convert.base64-encode/resource=[파일]
(3) zip://
: 압축을 풀고 그 안에 있는 파일의 코드를 실행시켜준다.
ex)[주소]?file=zip://[파일]
이 세가지의 php wrapper중에 이 문제를 해결하기 위해서는 서버 내 파일을읽을 수 있는 php://filter 를 사용하도록 한다. php://filter는 php://filter/convert.base64-encode/resource='파일명' 으로 사용한다. 이는 '파일명'의 소스코드를 base64로 인코딩한 것을 출력한다.
webhacking.kr:10001/?file=php://filter/convert.base64-encode/resource=flag 를 입력한 결과는 밑의 그림과 같다.
base64 encode로 출력된 값을 base64 decode로 디코딩 해주면
<?php
echo "FLAG is in the code";
$flag = "FLAG{this_is_your_first_flag}";
?>
와 같은 출력값을 얻을 수 있다.
따라서 아래와 같이 인증페이지에 flag 값을 입력하면 문제가 해결되는 것을 확인할 수 있다.
'Web Security > Webhacking.kr' 카테고리의 다른 글
old 19-150 (0) | 2021.03.04 |
---|---|
old 38 (0) | 2021.03.03 |
old 24 (0) | 2021.03.03 |
old 26 (0) | 2021.03.03 |
old. 016 (0) | 2021.03.02 |