LFI2RCE via PHP_SESSION_UPLOAD_PROGRESS

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

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입니다. 즉, 세션의 업로드 진행 상황은 가능한 한 빨리 정리됩니다. 따라서 이는 경쟁 조건이 될 수 있습니다.

CTF

이 기법이 설명된 원래의 CTF에서는 경쟁 조건을 악용하는 것만으로는 충분하지 않았으며, 로드된 콘텐츠는 @<?php 문자열로 시작해야 했습니다.

session.upload_progress.prefix의 기본 설정으로 인해 세션 파일은 upload_progress_라는 귀찮은 접두사로 시작됩니다. 예를 들어 upload_progress_controlledcontentbyattacker와 같습니다.

초기 접두사를 제거하는 트릭은 페이로드를 3번 base64로 인코딩한 다음 convert.base64-decode 필터를 통해 디코딩하는 것입니다. 이는 base64 디코딩 시 PHP가 이상한 문자를 제거하기 때문에, 3번만 수행하면 공격자가 보낸 페이로드만 남게됩니다(그리고 공격자는 초기 부분을 제어할 수 있습니다).

원래의 writeup에서 자세한 정보를 확인하세요. https://blog.orange.tw/2018/10/ 및 최종 exploit https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py 다른 writeup은 https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/에서 확인할 수 있습니다.

htARTE (HackTricks AWS Red Team Expert)를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요!

HackTricks를 지원하는 다른 방법:

Last updated