file()로 읽기만 하고 출력하지 않는 상황에서, php://filter와 에러 메시지를 오라클처럼 활용해 파일 내용을 유출할 수 있다는 걸 보여주는 대표적인 사례이다.

FILE READ WITH ERROR-BASED ORACLE

php://filter wrapper는 예상치 못한 가능성을 열고 거의 우리가 원하는대로 로컬 파일 내용을 조작할 수 있다.

The idea for this attack is the following :

  1. iconv 필터를 사용해 데이터 크기를 지수적으로 증가시키는 인코딩을 적용하여 메모리 에러를 유발한다.
  2. dechunk 필터를 사용해 이전 단계에서 발생한 에러를 바탕으로 파일의 첫 번째 문자를 판별한다.
  3. 다시 iconv 필터를 사용해, 서로 다른 바이트 순서를 가지는 인코딩을 적용하여 나머지 문자들을 첫 번째 문자와 교환한다.

Overflowing the maximum file size

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 필터로 인코딩을 바꾸면 같은 문자열도 훨씬 커질 수 있다는 예시