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

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

Post by Fakeheal » Thu Jan 18, 2018 4:04 pm

Аз много желая да отговоря на горното мнение с цитат от него.
novakabg wrote: :D :D :D :D :D
PS: Сега ми стана тъжно. :(

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

Post by dakata__92 » Thu Jan 18, 2018 4:25 pm

Fakeheal wrote:Аз много желая да отговоря на горното мнение с цитат от него.
novakabg wrote: :D :D :D :D :D
PS: Сега ми стана тъжно. :(
Не си заслужава! Ако си беше направил малко трудът да прочете темата, щеше да е по-ориентиран. Първо проверявам за определени token константи. Както виждам, той НЕ ЗНАЕ какво изразяват те. По-нагоре попитах дали ако проверявам стрингово и за определени функции е достатъчно за да ме алармира, че в даден php файл се съдържа по-опасно съдържание. Качвайки кода в определена неизвестна по структура система, искам директно да сканирам и изведа по-опасните файлове. Това са файлове с определени разширения. В момента питам само за PHP и то по простата причина, че тук има много по-запознати с езика хора от мен. Поставяйки в отделен php файл кода от цитата:
Fakeheal wrote:Btw:

Code: Select all

<?$&#123;&#91;&#93;&#125;.=&#91;&#93;;$&#123;!&#91;&#93;&#125;.=$&#123;&#91;&#93;&#125;&#123;!!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;
!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;$&#123;!&#91;&#93;&#125;.=$&#123;&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;+!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;$&#123;!&#91;
&#93;&#125;.=$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;$&#123;
!&#91;&#93;&#125;.=$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;&#125;.$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;$&#123;!&#91;&#93;&#125;.=$&#123;&#91;&#93;&#125;^$&#123;
&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;+!&#91;&#93;&#125;;$&#123;!&#91;&#93;&#125;.=$&#123;!&#91;&#93;&#125;&#123;!!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;
&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;
&#125;;++$&#123;!&#91;&#93;&#125;;$&#123;!&#91;&#93;&#125;.=$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;+!&#91;&#93;+!&#91;&#93;&#125;.$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;+!&#91;&#93;+!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!
&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;$&#123;!&#91;&#93;&#125;.=$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;&#125;.$&#123;&#91;&#93;&#125;&#123;!&#91;&#93;+!&#91;&#93;+!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;&#125;;++$&#123;!&#91;&#93;
&#125;;$&#123;&#91;&#93;&#125;=$&#123;&#91;&#93;&#125;&#123;!!&#91;&#93;&#125;;++$&#123;&#91;&#93;&#125;;++$&#123;&#91;&#93;&#125;;++$&#123;&#91;&#93;&#125;;$&#123;!&#91;&#93;&#125;.=$&#123;&#91;&#93;&#125;^$&#123;!&#91;&#93;&#125;&#123;!&#91;&#93;&#125;?><?=$&#123;!&#91;&#93;&#125;;
скенера ме алармира, че се съдържа константа T_INLINE_HTML. Желая да си направя маркери и да задавам нивото на опасност. Това е лесно, въпроса е сега как е най-правилно да проверявам по стринг за функциите тоест трудоемкото file_get_contents() и preg_match(регулярен израз) или stripos(). Като цяло, важното е да се алармира за даден файл, но само това ли са начините? Мисълта ми е, дали освен директното отваряне на файла и търсене на определен стринг в него е най-лесното и удобно решение по темата?

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

&#40;...&#41;
скенера ме алармира, че се съдържа константа 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

&#40;...&#41;
скенера ме алармира, че се съдържа константа 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]

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

Post Reply