LFI2RCE za pomocą PHP_SESSION_UPLOAD_PROGRESS

Reading time: 3 minutes

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks

Podstawowe informacje

Jeśli znalazłeś Local File Inclusion, nawet jeśli nie masz sesji i session.auto_start jest Wyłączone. Jeśli session.upload_progress.enabled jest Włączone i dostarczysz PHP_SESSION_UPLOAD_PROGRESS w danych POST w formacie multipart, PHP włączy sesję dla Ciebie.

bash
$ 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

Zauważ, że z PHP_SESSION_UPLOAD_PROGRESS możesz kontrolować dane wewnątrz sesji, więc jeśli dołączysz swój plik sesji, możesz dołączyć część, którą kontrolujesz (na przykład kod powłoki PHP).

note

Chociaż większość samouczków w Internecie zaleca ustawienie session.upload_progress.cleanup na Off w celach debugowania, domyślne ustawienie session.upload_progress.cleanup w PHP wciąż wynosi On. Oznacza to, że postęp przesyłania w sesji będzie czyszczony tak szybko, jak to możliwe. Tak więc będzie to Race Condition.

CTF

W oryginalnym CTF, w którym ta technika jest komentowana, nie wystarczyło wykorzystać Race Condition, ale zawartość ładowana musiała również zaczynać się od ciągu @<?php.

Z powodu domyślnego ustawienia session.upload_progress.prefix, nasz plik SESJI zacznie się od irytującego prefiksu upload_progress_, takiego jak: upload_progress_controlledcontentbyattacker.

Sztuczka, aby usunąć początkowy prefiks, polegała na zakodowaniu ładunku w base64 3 razy i następnie dekodowaniu go za pomocą filtrów convert.base64-decode, ponieważ podczas dekodowania base64 PHP usunie dziwne znaki, więc po 3 razach tylko ładunek wysłany przez atakującego pozostanie (a następnie atakujący może kontrolować początkową część).

Więcej informacji w oryginalnym opisie https://blog.orange.tw/2018/10/ oraz końcowym exploicie https://github.com/orangetw/My-CTF-Web-Challenges/blob/master/hitcon-ctf-2018/one-line-php-challenge/exp_for_php.py
Inny opis w https://spyclub.tech/2018/12/21/one-line-and-return-of-one-line-php-writeup/

tip

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie HackTricks