Скенер за заплахи

C++ JAVA
User avatar
Fakeheal
Гуру
Гуру
Posts: 2664
Joined: Sat Apr 17, 2010 6:37 am
Answers: 350

Post by Fakeheal » Thu Jan 18, 2018 7:35 pm

Относно
dakata__92 wrote:
Fakeheal wrote:Btw:

Code: Select all

(...)
скенера ме алармира, че се съдържа константа T_INLINE_HTML.
Ако си пуснал short_open_tag, няма T_INLINE_HTML.

Като цяло идеята ми беше, че може да имаш код и после да е минат през някакъв обфускатор и да не ти работи "скенера".

User avatar
dakata__92
Шаман
Шаман
Posts: 3159
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 124

Post by dakata__92 » Thu Jan 18, 2018 8:50 pm

Fakeheal wrote:Относно
dakata__92 wrote:
Fakeheal wrote:Btw:

Code: Select all

(...)
скенера ме алармира, че се съдържа константа T_INLINE_HTML.
Ако си пуснал short_open_tag, няма T_INLINE_HTML.

Като цяло идеята ми беше, че може да имаш код и после да е минат през някакъв обфускатор и да не ти работи "скенера".
Ясно. А някакви идеи за какво да следя и най-вече как да следя? Пострингово търсене или базисно на някоя функция?

User avatar
Fakeheal
Гуру
Гуру
Posts: 2664
Joined: Sat Apr 17, 2010 6:37 am
Answers: 350

Post by Fakeheal » Thu Jan 18, 2018 9:52 pm

Ох, аз не съм много компетентна в тая сфера. Но според мен съдържанието не трябва да те притеснява на самия файл, а сетъпа на сървъра и кода за самото качване на файлове (т.е. да не качват където си искат).

User avatar
dakata__92
Шаман
Шаман
Posts: 3159
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 124

Post by dakata__92 » Thu Jan 18, 2018 9:52 pm

За момента проверявам и за следните функции:
[php]
"system" ,
"shell_exec",
"exec",
"eval",
"passthru",
"base64_encode",
"base64_decode",
"php_uname",
"phpinfo",
"fopen",
"readfile",
"chmod",
"extract"
[/php]
Други, за които да внимавам? Проверявам, чрез stripos защото е по-бърза от регулярните изрази.
[php]if (stripos($fileContents, $function."(") !== false)[/php]
Чудя се дали да структурирам и търсене на хеширано съдържание, но все още се чудя как да го засичам. Върти ми се в мозъчето да следя за непрекъснат низ с примерно по-голяма дължина от 100 символа. Просто ще ме предупреждава, че в даденият файл има непрекъснато съдържание от символи и като го проверя ръчно да реша сам дали е истинска заплаха. Все още го обмислям.

User avatar
anonimen
Много Редовен
Много Редовен
Posts: 1523
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 162
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Thu Jan 18, 2018 9:58 pm

Fakeheal wrote:Като цяло идеята ми беше, че може да имаш код и после да е минат през някакъв обфускатор и да не ти работи "скенера".
Само че обфускаторът няма да може да ползва T_DOLLAR_OPEN_CURLY_BRACES - ${dynamic_var_name}.

Което май е единствения начин да 'скриеш' отделни части от стринг в отделни 'невидими' (трудно-парсвуеми, parseable) променливи, така че да не можеш (достатъчно лесно) да хванеш, че присъства злонамерена команда.

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

[php]$first = "ev";
$last = "al";
$bad_word = $first.$last; // това bad_word да речем, че можеш ръчно да проследиш какво ще се запише в него
$bad_word("bad shell script");// ... и ще разбереш какво е това <---[/php]

И:

[php]$start = "ev";
$end = "al";
$first_var_name = 'start';
$second_var_name = 'end';
$bad_word = ${$first_var_name}.${second_var_name}; // това става вече значително по-сложно
// А сигурно може дори и така:
${
${$first_var_name}
. ${second_var_name}
}("bad shell script");[/php]

User avatar
anonimen
Много Редовен
Много Редовен
Posts: 1523
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 162
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Thu Jan 18, 2018 10:06 pm

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

Нещо подобно:

[php]$/*каквото и да е, с равен брой (){}[]*/([/php]

Като също внимаваш с ";", да не би да се окаже валиден код (тук пък ще трябва да провериш и дали има анонимна функция, в която може да има легално ";"):

[php]${
(function () { return 'ev'; })() // да не би скриптът да пропадне, ако ";" го обърка
. (function () { return 'al'; })()
}("bad command");[/php]

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

User avatar
dakata__92
Шаман
Шаман
Posts: 3159
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 124

Post by dakata__92 » Thu Jan 18, 2018 10:10 pm

Токените засичат с T_INLINE_HTML. Това ще е с доста както се казва фалшиви показания, но пак си е някаква доза предизвестие.
[php]<?php
$start = "ev";
$end = "al";
$first_var_name = 'start';
$second_var_name = 'end';
$bad_word = ${$first_var_name}.${second_var_name}; // това става вече значително по-сложно
// А сигурно може дори и така:
${
${$first_var_name}
. ${second_var_name}
}("bad shell script");
[/php]

User avatar
dakata__92
Шаман
Шаман
Posts: 3159
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 124

Post by dakata__92 » Thu Jan 18, 2018 10:12 pm

anonimen wrote:А сега ми хрумна, мисля, най-простия начин да блокираш всякакво подобно поведение - изобщо да забраниш извикването на функции, чиито имена се държат в променливи.

Нещо подобно:

[php]$/*каквото и да е, с равен брой (){}[]*/([/php]

Като също внимаваш с ";", да не би да се окаже валиден код (тук пък ще трябва да провериш и дали има анонимна функция, в която може да има легално ";"):

[php]${
(function () { return 'ev'; })() // да не би скриптът да пропадне, ако ";" го обърка
. (function () { return 'al'; })()
}("bad command");[/php]

Но пък в случая ";" ще седи вътре в скобите, така че за него няма да има нужда да се притесняваш. Само гледай за четен брой скоби.
Хммм много интересно! Ще помисля над думите ти, струва ми се, че има хляб в идеята и ще разграничи доста нещата.

User avatar
anonimen
Много Редовен
Много Редовен
Posts: 1523
Joined: Mon Jun 11, 2012 6:07 pm
Answers: 162
Location: Parse error: unexpected "}" in /home/index.php on line 26

Post by anonimen » Thu Jan 18, 2018 10:15 pm

.... още една, може би малко безумна идея, но защо не?

Да си направиш карта на цялата структура от директории, която да "заключиш" в immutable файл.

Може също да добавиш някакъв хеш, за да си сигурен че файлът не е променян (immutable може да се премахне от root-а).

A после към проверките ще правиш и сравнение на картата с реалността. Така ще си сигурен, че никой не е пипал нищо. (че не е добавял/триел файлове/директории. Можеш да си направиш и хеш на файловете ако искаш и съдържанието им да се проверява)

User avatar
dakata__92
Шаман
Шаман
Posts: 3159
Joined: Tue Aug 02, 2011 7:24 pm
Answers: 124

Post by dakata__92 » Thu Jan 18, 2018 10:20 pm

anonimen wrote:.... още една, може би малко безумна идея, но защо не?

Да си направиш карта на цялата структура от директории, която да "заключиш" в immutable файл.

Може също да добавиш някакъв хеш, за да си сигурен че файлът не е променян (immutable може да се премахне от root-а).

A после към проверките ще правиш и сравнение на картата с реалността. Така ще си сигурен, че никой не е пипал нищо. (че не е добавял/триел файлове/директории. Можеш да си направиш и хеш на файловете ако искаш и съдържанието им да се проверява)
Това го размишлявах доста, но да кажем, че вероятно повече ще ползвам кода в чужди проекти за бърз анализ на непозната за мен система. Искам да ме ориентира къде може да има възможен проблем по темата пък вече аз ще следя за другите неща. Така, че при мен отпада като варянт просто заради целите за, които ще ползвам кода. Като цяло това си е фрактално сравняване на директориите извеждане на разликите спрямо запаметеното във файла.

Post Reply