이번 시간에는 php wrapper를 사용한 lfi에 대해 알아보도록 하겠습니다.
우선 wrapper란 실제 데이터의 앞에서 어떤 틀을 잡아 주는 데이터 또는 다른 프로그램이 성공적으로 실행되도록 설정하는 프로그램입니다. 원래 php wrapper는 개발자들의 개발을 돕기 위해서 만들어진 기능이지만 우리는 이 기능을 사용한 lfi에 대해 알아보도록 하겠습니다.
우리가 php wrapper를 사용한 lfi공격에 대해 알아야 하는 이유는 앞에서 배운 기본적인 lfi공격은 다음과 같은 형식으로 구성되어 있었습니다.
www.[우리가 공격할 웹 사이트의 주소].index.php?page=../../../../../../../../etc/passwd/(널바이트)
여기서 널바이트는 주소 뒤에 붙을 확장자(.php, .txt)등을 떼어내 주는 역할을 수행합니다.
그러나 php가 버전 5 이상이 되면서 path 중간에 널바이트가 오면 주소 더 이상 읽지 않는 취약점이 사라졌습니다.
이 때문에 우리가 php wrapper를 사용하여 lfi공격을 수행해야 하는 것입니다.
php wrapper에는 수많은 종류들이 존재하지만 그 중에서 우리가 유용하게 사용할 수 있는 wrapper를 세 가지 소개하도록 하겠습니다.
1. expect://
expect wrapper는 우리에게 system command를 실행시켜 줍니다.
예를 들어 expect wrapper 가 필터링 당하지 않았다면
www.[우리가 공격할 웹 사이트의 주소].index.php?page=expect://ls
와 같은 방식으로 활용할 수 있습니다.
위의 예시에서는 system command로 ls를 보냈기 때문에 우리에게 디렉토리들을 보여줄 것입니다.
2. php://filter
php://filer wrapper는 다양한 I/O스트림을 다루는데 사용하는 wrapper입니다.
이 wrapper를 사용할 때 우리는 encode/decode 옵션을 사용하여 서버 안에 존재하는 문서들을 열람 할 수 있습니다.
예를 들어
www.[우리가 공격할 웹 사이트의 주소].index.php?page=php://filter/convert.base64-encode/resource=/etc/passwd
처럼 활용할 수 있습니다.
위의 방식으로 공격을 진행하게 되면 우리는 base64 방식으로 인코딩 된 etc/passwd의 값을 얻을 수 있을 것 입니다.
3. zip://
zip:// wrapper는 zip파일의 압축을 풀고 압축을 푼 파일안에 있는 코드를 실행시켜 주는 기능을 합니다.
예를 들어
www.[우리가 공격할 웹 사이트의 주소].index.php?page=zip://file.zip#shell.php
와 같은 방식으로 활용하여 web shell을 실행시키는 등 다양한 기능을 수행할 수 있습니다.