file()로 읽기만 하고 출력하지 않는 상황에서, php://filter와 에러 메시지를 오라클처럼 활용해 파일 내용을 유출할 수 있다는 걸 보여주는 대표적인 사례이다.
php://filter wrapper는 예상치 못한 가능성을 열고 거의 우리가 원하는대로 로컬 파일 내용을 조작할 수 있다.
The idea for this attack is the following :
iconv 함수는 전달된 문자열의 인코딩을 설정할 수 있으며, php://filter 래퍼를 통해 직접 호출할 수도 있다. 일부 인코딩은 바이트를 중복 시키는 효과를 갖는다. 예를 들어 유니코드와 ucs-4 인코딩이 그러한데, 각각 문자 하나를 표현하는 데 2바이트와 4바이트가 필요하다.
<정리 및 이해>
즉, 설명하자면 :
→ 이 성질을 이용해 파일 크기를 비정상적으로 불려서 메모리 에러를 터트리는 공격 기법이다.
ex)
$ php -r '$string = "START"; echo strlen($string)."\\n";
5
$ php -r '$string = "START"; echo strlen(iconv("UTF8", "UNICODE", $string))."\\n";'
12
$ php -r '$string = "START"; echo strlen(iconv("UTF8", "UCS-4", $string))."\\n";'
20
→ iconv 필터로 인코딩을 바꾸면 같은 문자열도 훨씬 커질 수 있다는 예시