rootme.org - filters
는 LFI 취약점 문제인데, 여기서 php://라는 Wrapper의 filter가 사용된다.
여기에 대한 개념이 이해가 안가서 간단히 몇 가지를 정리해본다.
말 그대로 감싼다는 추상적인 개념이다.
이런 wrapper를 이용하여 몇가지 프로토콜이 지원된다.
(또한 커스텀 wrapper도 가능하다고 한다.)
PHP document
file:// — Accessing local filesystem
http:// — Accessing HTTP(s) URLs
ftp:// — Accessing FTP(s) URLs
php:// — Accessing various I/O streams
zlib:// — Compression Streams
data:// — Data (RFC 2397)
glob:// — Find pathnames matching pattern
phar:// — PHP Archive
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — Audio streams
expect:// — Process Interaction Streams
PHP provides a number of miscellaneous I/O streams that allow access to PHP's own input and output streams,
간단히 stream을 표현하는데 사용된다고 보면 될 것 같다.
가장 중요한 filter에 해당하는 내용을 살펴보겠다.
설명이 제대로 안나와있어서 예시를 보면서 이해하자.
쓰기
<?php
/* This will filter the string "Hello World"
through the rot13 filter, then write to
example.txt in the current directory */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
읽기
<?php
/* This will output the contents of
www.example.com entirely in uppercase */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* This will do the same as above
but will also ROT13 encode it */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
string.rot13으로 된 것은 rot13 암호화로 인코딩되서 페이지에 출력된다는 점이 다르다.
필터에 관련된 옵션은 PHP page - filter에서 확인할 수 있다.