LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS
기본 정보
로컬 파일 포함을 발견했지만 세션이 없는 경우이며 session.auto_start
가 Off
인 경우에도 **session.upload_progress.enabled
**가 **On
**이고 **PHP_SESSION_UPLOAD_PROGRESS
**를 multipart POST 데이터에 제공하면 PHP가 세션을 활성화합니다.
**PHP_SESSION_UPLOAD_PROGRESS
**를 사용하면 세션 내부 데이터를 제어할 수 있으므로 세션 파일을 포함하면 제어할 수 있는 부분(예: PHP 쉘코드)을 포함할 수 있습니다.
인터넷의 대부분의 자습서는 디버깅 목적으로 session.upload_progress.cleanup
을 Off
로 설정하도록 권장하지만 PHP의 기본 session.upload_progress.cleanup
은 여전히 On
입니다. 이는 세션의 업로드 진행 상황이 가능한 한 빨리 정리된다는 것을 의미합니다. 따라서 이것은 **경쟁 조건(Race Condition)**이 될 것입니다.
CTF
이 기술이 주석 처리된 원본 CTF에서는 경쟁 조건을 악용하는 것만으로는 충분하지 않았으며 로드된 콘텐츠는 @<?php
문자열로 시작해야 했습니다.
session.upload_progress.prefix
의 기본 설정으로 인해 세션 파일은 귀찮은 접두사 upload_progress_
로 시작합니다. 예를 들어 upload_progress_controlledcontentbyattacker
와 같이 시작합니다.
초기 접두사를 제거하는 꼼수는 페이로드를 3번 base64로 인코딩한 다음 convert.base64-decode
필터를 통해 디코딩하는 것이었습니다. 이는 base64 디코딩 시 PHP가 이상한 문자를 제거하기 때문에, 3번 후에는 공격자가 보낸 페이로드만 남게 됩니다(그리고 공격자는 초기 부분을 제어할 수 있게 됩니다).
원본 글에서 자세한 정보 확인 https://blog.orange.tw/2018/10/ 및 최종 악용 https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py 다른 글은 https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/
Last updated