Поиск уязвимостей по исходному коду? Легко!

14 Июн
2012

Многие программисты мучаются во время сна — им снится, что их проект был взломан, а исходники попали в открытый доступ.
Бывало такое? Нет? Как бы не так!
Сейчас я расскажу об очень простом методе поиска уязвимостей по исходному коду.
Да, именно по исходному коду, а не через GET/POST запросы с использованием различных программ.
Интересно — читайте дальше, а если не интересно — есть куда других интересных постов.

Введение


Для начала хотелось бы ввести вас в курс дела — поведать об задумке в целом и прочих мыслях.
Что же вы предлагаете?

Я предлагаю поиск узявимостей в PHP-сценариях с помощью специального PHP-сценария.
Почему именно такой подход?

Такой подход был выбран по причине того, что данный подход даст нам удобство в поиске уязвимости — возможность запуска на сервере с работающим сайтом.
Какие же гарантии по нахождению уязвимости?

Как и многие специалисты в области поиска уязвимостей, я не даю 100 % гарантию на то, что все уязвимости будут найдены с помощью сего скрипта.
Но большинство, уж поверьте, обнаружить удастся.

Подготовимся к написанию?


Как мы знаем, то самые распостранённые уявзимости таятся в $_GET/$_POST/$_COOKIE.
Поэтому для их поиска нужно выделить общую часть кода — $_.
Анализ самых распостранённых уязвимостей

Как мы знаем, то самые распостранённые уявзимости таятся в $_GET/$_POST/$_COOKIE.
Поэтому для их поиска нужно выделить общую часть кода — $_.
Как же можно искать уязвимости?

Вспомните как вы в спешке, очень в спешке, писали код. Часто ли вы фильтровали переменные?
Уверен, что 60% вспомнят себя. Поэтому продумаем список возможных кодовых уязвимостей.
Список уязвимостей

1) Очень часто мы используем частички кода вида: «.$_», «»$_», «‘$_» при записи в БД или при прочих действиях, и в итоге получим уязвимость.
2) Мы можем присвоить новой переменной значение, которое будет равно неотфильтрованной переменной из списка «$_», и в итоге получим уязвимость.
3) Для обработки переменной функцией мы можем использовать неотфильтрованные начала: «, $_», «,$_», и в итоге получим уязвимость.
4) На всякий пожарный — поиск бэкдоров. Ищем «eval(», «exec(», «proc_open(», «system(» и прочие системные функции.
Итог подготовки

На нужно написать скрипт, который будет открывать рекурсивно дерево каталогов, отыскивать *.php, *.phtm, *.phtml файлы и сканировать их на наличие «острых» частиц кода.
А если быть точнее, то мы должны искать в коде: «.$_», «= $_», «, $_», «»$_», «‘$_», «,$_», «eval(», «exec(», «proc_open(», «system(».
Приступим?

Пишем скрипт!


Я предоставлю вам уже готовый скрипт, но не без комментариев.
Надеюсь, что вам будет понятен мой код.
<?php # На PHP пишем ведь.
#####################################
# Папка для сканирования. Жалателен полный путь.
$dir = '/var/www/b';
#####################################
#####################################
# Функция-посковик "остенького" кода.
function check($text){
# Массив с подготовленными участками для поиска.
$array = array('.$_', '= $_', ', $_', '"$_', "'\$_", ',$_', 'eval(', 'exec(', 'proc_open(', 'system(');
# Заготовка переменных
$i = 0; $bug = NULL;
# Перебор ячеек массива с целью поиска уязвимостей.
foreach($array as $search){ $i++;
# Ищем участок кода, при успешном нахождении записываем в переменную.
if(stripos($text, $search) !== false) $bug[$i] = $search; }
# А если совпадений нет, то передаём "false".
return (!empty($bug)) ? $bug : false; }
#####################################
#####################################
# Функция для рекурсивного просмотра попапок в папке.
function open_dir($name){
# Открытие папки, поготовка переменной для хранения в ней результата.
$open = opendir($name); $info = NULL;
# Чтение папки.
while($data = readdir($open)){
# Отсеиваем ссылки, которые ведут выше нашей папки.
if($data !== '.' && $data !== '..'){
# Искуственоо получаем путь к файлу.
$real_name = $name.'/'.$data;
# Если нам попался не файл, а папка, то вызываем фунцию для её чтения.
if(is_dir($real_name)){ open_dir($real_name); }
# А если же файл, то приступаем к анализу.
else if(is_file($real_name)){
# Для начала нам нужно имееть уверенность, что наш файл - php-сценарий.
$new_name = str_replace(array('.php', '.phtm'), '.iscode', $real_name);
# Если после манипуляции с именем файла у нас появились изменения - просматриваем файл.
if($real_name !== $new_name){
# Чтение файла.
$text = file_get_contents($real_name);
# Запускаем поиск "острого" кода.
$check = check($text);
# Если результат положительный, то выводим на экран.
if($check){ echo $real_name.' -> ('.count($check)." moment(s))\n";
# А ниже выводим список "острого", которое было найдено.
foreach($check as $vtag){ echo '=> => |'.$vtag.'|'; } echo "\n"; } } } } } }
#####################################
# Запуск фунции для просмотра каталогов для нашей папки.
open_dir($dir);
#####################################
?>

На этом всё

Осталось только пожелать вам успехов в нахождении уязвимостей.
По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх