LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

HackTricks 지원

기본 정보

로컬 파일 포함을 발견했지만 세션이 없는 경우이며 session.auto_startOff인 경우에도 **session.upload_progress.enabled**가 **On**이고 **PHP_SESSION_UPLOAD_PROGRESS**를 multipart POST 데이터에 제공하면 PHP가 세션을 활성화합니다.

$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -d 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'
$ ls -a /var/lib/php/sessions/
. ..
$ curl http://127.0.0.1/ -H 'Cookie: PHPSESSID=iamorange' -F 'PHP_SESSION_UPLOAD_PROGRESS=blahblahblah'  -F 'file=@/etc/passwd'
$ ls -a /var/lib/php/sessions/
. .. sess_iamorange

In the last example the session will contain the string blahblahblah

**PHP_SESSION_UPLOAD_PROGRESS**를 사용하면 세션 내부 데이터를 제어할 수 있으므로 세션 파일을 포함하면 제어할 수 있는 부분(예: PHP 쉘코드)을 포함할 수 있습니다.

인터넷의 대부분의 자습서는 디버깅 목적으로 session.upload_progress.cleanupOff로 설정하도록 권장하지만 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/

HackTricks 지원

Last updated