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

dakata__92

Super Moderator
Здравейте колеги! Реших да си създам скенер за възможни заплахи качени в сайта. В момента следя по разширението на файла и ако файла е PHP, то да се проверява за следните tokens:
T_BAD_CHARACTER,
T_START_HEREDOC,
T_END_HEREDOC,
T_CURLY_OPEN,
T_DECLARE,
T_EVAL,
T_DOLLAR_OPEN_CURLY_BRACES,
T_ELLIPSIS,
T_GOTO,
T_HALT_COMPILER,
T_INLINE_HTML,
T_STRING_VARNAME,
T_YIELD
Какво мислите по темата?
 
Какъв е проблемът с тези?
T_START_HEREDOC,
T_END_HEREDOC,
T_CURLY_OPEN,
T_DOLLAR_OPEN_CURLY_BRACES,
T_ELLIPSIS,
T_STRING_VARNAME,
T_YIELD

Прегледах ги в документацията, не виждам каква заплаха може да предизвикат? Изглеждат си съвсем ок.
 
Принципно нищо, но съм ги поставил за да ме алармират дали се съдържат в даден код. Идеята ми е да си създам скенер да проверява дали нянам качен shell в системата. Принципно това ще е една да кажем минимална защита, която да се активира в Админ панела, но като цяло съм мераклия да я поразвия малко, като идея.
 
Ако се пазиш от шел, вместо синтактични елементи търси команди - примерно rm/mount/cp/mv/.... Това лесно ще се заобикoли с разделяне на стринга на парчета, така че може би за това ще трябва да следиш - подозрителна конкатенация на повече стрингове в един.
 
Btw:

Код:
<?${[]}.=[];${![]}.=${[]}{!![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${
![]};++${![]};${![]}.=${[]}{![]+![]+![]};++${![]};++${![]};++${![]};++${![]};${![
]}.=${![]}{![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};${
![]}.=${![]}{![]+![]}.${![]}{![]+![]};++${![]};++${![]};++${![]};${![]}.=${[]}^${
[]}{![]+![]+![]};${![]}.=${![]}{!![]};++${![]};++${![]};++${![]};++${![]};++${![]
};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]
};++${![]};${![]}.=${![]}{![]+![]+![]+![]}.${![]}{![]+![]+![]+![]};++${![]};++${!
[]};++${![]};${![]}.=${![]}{![]+![]}.${[]}{![]+![]+![]};++${![]};++${![]};++${![]
};${[]}=${[]}{!![]};++${[]};++${[]};++${[]};${![]}.=${[]}^${![]}{![]}?><?=${![]};
 
Fakeheal каза:
Btw:

Код:
<?${[]}.=[];${![]}.=${[]}{!![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${
![]};++${![]};${![]}.=${[]}{![]+![]+![]};++${![]};++${![]};++${![]};++${![]};${![
]}.=${![]}{![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};${
![]}.=${![]}{![]+![]}.${![]}{![]+![]};++${![]};++${![]};++${![]};${![]}.=${[]}^${
[]}{![]+![]+![]};${![]}.=${![]}{!![]};++${![]};++${![]};++${![]};++${![]};++${![]
};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]
};++${![]};${![]}.=${![]}{![]+![]+![]+![]}.${![]}{![]+![]+![]+![]};++${![]};++${!
[]};++${![]};${![]}.=${![]}{![]+![]}.${[]}{![]+![]+![]};++${![]};++${![]};++${![]
};${[]}=${[]}{!![]};++${[]};++${[]};++${[]};${![]}.=${[]}^${![]}{![]}?><?=${![]};

Извинявай, но нещо не схванах поста ти.
 
anonimen каза:
Ако се пазиш от шел, вместо синтактични елементи търси команди - примерно rm/mount/cp/mv/.... Това лесно ще се заобикoли с разделяне на стринга на парчета, така че може би за това ще трябва да следиш - подозрителна конкатенация на повече стрингове в един.
Добре, но как да следя за командите? Примерно да следя за функциите, като: system, exec, passthru и други ли?
 
dakata__92 каза:
Fakeheal каза:

Извинявай, но нещо не схванах поста ти.

Изпълни го, валиден (безобиден) PHP е :) т.е. помисли пак дали проверяването за "system", "exec" и т.н. е достатъчно...

Каква е целта ти? Разрешаваш на потребителите да качват файлове и да ги изпълняват, но искаш да ограничиш какво могат да правят?
 
Не. Желая да си направя скенер, който да си вграждам в приложенията и да проверява за нежелан софтуер от мен.
 
Хахах сега е време аз да те насера :) :D :D :D :D :D

Сега аз като c++ и python програмист и Haskell знам един метод за проверка на лоши кодове към php виж се колко разбираш ти само от php да ми се ебаваш на мен във постовете :D :D :D :D

Правиш скеннер за shell_exec,base64_decode,edoced_46esab,fopen,fclose,system,php_uname,chmod,readfile,eval,passthru!

Тоест защо не направиш проверка на strings :)

Ето ти примерен shell .sh

Код:
#! /bin/bash
# Scanner
#
exec >> scanlog.txt
echo "Mal Scan"
echo ""
read -p "Vkarai Papka(Root) " phplocation
echo "Proverka na strings v cqlata papka"
grep -Rn "eval" $phplocation
echo "Gotovo priqtelche vij si scanlog.txt."
echo ""
echo "Skaniraneto prikluchi"
echo ""
exec 2>&1



Правиш си един .sh примерно scan.sh пускаш в папката и го викаш :) и гледаш после лога!

Успех! :)

Прочем може да се напише и код за всеки 24 часа да сканира целият сайт чрез Cron Job и да ти прати на SMS или на Пощата, името на файла :) и време кога и къде е сканиран и как!
 
Fakeheal каза:
Аз много желая да отговоря на горното мнение с цитат от него.

novakabg каза:

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

Fakeheal каза:
Btw:

Код:
<?${[]}.=[];${![]}.=${[]}{!![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${
![]};++${![]};${![]}.=${[]}{![]+![]+![]};++${![]};++${![]};++${![]};++${![]};${![
]}.=${![]}{![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};${
![]}.=${![]}{![]+![]}.${![]}{![]+![]};++${![]};++${![]};++${![]};${![]}.=${[]}^${
[]}{![]+![]+![]};${![]}.=${![]}{!![]};++${![]};++${![]};++${![]};++${![]};++${![]
};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]};++${![]
};++${![]};${![]}.=${![]}{![]+![]+![]+![]}.${![]}{![]+![]+![]+![]};++${![]};++${!
[]};++${![]};${![]}.=${![]}{![]+![]}.${[]}{![]+![]+![]};++${![]};++${![]};++${![]
};${[]}=${[]}{!![]};++${[]};++${[]};++${[]};${![]}.=${[]}^${![]}{![]}?><?=${![]};

скенера ме алармира, че се съдържа константа T_INLINE_HTML. Желая да си направя маркери и да задавам нивото на опасност. Това е лесно, въпроса е сега как е най-правилно да проверявам по стринг за функциите тоест трудоемкото file_get_contents() и preg_match(регулярен израз) или stripos(). Като цяло, важното е да се алармира за даден файл, но само това ли са начините? Мисълта ми е, дали освен директното отваряне на файла и търсене на определен стринг в него е най-лесното и удобно решение по темата?
 
Относно
dakata__92 каза:
Fakeheal каза:
Btw:
Код:
(...)

скенера ме алармира, че се съдържа константа T_INLINE_HTML.

Ако си пуснал short_open_tag, няма T_INLINE_HTML.

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

скенера ме алармира, че се съдържа константа T_INLINE_HTML.

Ако си пуснал short_open_tag, няма T_INLINE_HTML.

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

Само че обфускаторът няма да може да ползва 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:
$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:
$/*каквото и да е, с равен брой (){}[]*/(

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

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

Но пък в случая ";" ще седи вътре в скобите, така че за него няма да има нужда да се притесняваш. Само гледай за четен брой скоби.
 
Токените засичат с 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");
 
anonimen каза:
А сега ми хрумна, мисля, най-простия начин да блокираш всякакво подобно поведение - изобщо да забраниш извикването на функции, чиито имена се държат в променливи.

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

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

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

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

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

Хммм много интересно! Ще помисля над думите ти, струва ми се, че има хляб в идеята и ще разграничи доста нещата.
 

Горе