2011-03-18:

Just another PHP LFI exploitation method

php:lfi:temporary files
Parę dni temu, podczas dyskusji ze znajomym (hi Felix ;>) o metodach exploitacji Local File Inclusion w PHP, wpadł mi do głowy pomysł, żeby użyć w tym celu tymczasowych plików tworzonych przez engine PHP podczas uploadu plików (to nie jest tożsame z include'owaniem uploadowanych plików ofc). Przerzuciłem pomysł na papier (w postaci artykułu), po czym okazało się, że w zasadzie ta metoda jest znana w niektórych kręgach. Niemniej jednak, ponieważ nie jest to "common knowledge" (w przeciwieństwie do np. include'owania logów apache czy /proc/self/environ), zdecydowałem się i tak opublikować owy art.

PHP LFI to arbitratry code execution via rfc1867 file upload temporary files (EN)
PHP_LFI_rfc1867_temporary_files.pdf (169KB)

W skrócie:
- metoda działa ślicznie na Windowsie (http://site/?page=C:\Windows\Temp\php<<)
- trik z << w FindFirstFile ftw!
- metoda działa w bardzo specyficznych przypadkach na Linux-based OS'ach (w innych nie działa wcale)
- GetTempFileName w WinAPI jest zaskakująco słabe
- natomiast mkstemp z GNU lib C jest zaskakująco dobre

Notka o komunikacji:
2011-03-16 - team PHP dostaje "heads up", następuje wymiana kilku mejli; nie otrzymuje prośby o zmianę terminu publikacji
2011-03-18 - publikacja

Podziękowania dla:
Felix Gröbert za interesującą dyskusję, która doprowadziła do powstania tego artykułu :)
phunk za info, że ta metoda jest znana w pewnych kręgach

I tyle,

UPDATE 1 (2011-03-19, 7am)
EdiStrosar tweetnął o DoS'ie związanym z przetwarzaniem uploadowanych plików, spatchowanym w PHP 5.3.1. Interesujące :)

Comments:

2011-03-18 22:47:46 = Dab
{
Mały bug: link z publikacji prowadzi do polskiej wersji strony :)
}
2011-03-19 06:21:23 = Gynvael Coldwind
{
@Dab
Mówisz o linku z samej góry? Jeśli tak, to wersja językowa włączy się wg ustawień języka, więc Ty zobaczysz polską, ale reszta świata angielską :)
}
2011-03-20 16:05:30 = Dab
{
Faktycznie, sprytne :)
}

Add a comment:

Nick:
URL (optional):
Math captcha: 9 ∗ 4 + 3 =