· 8 years ago · Jan 27, 2018, 02:44 PM
1<?php
2///////////////////////////////////////////////////////////////////////////
3// Created and developed by Greg Zemskov, Revisium Company
4// Email: audit@revisium.com, http://revisium.com/ai/
5
6// Commercial usage is not allowed without a license purchase or written permission of the author
7// Source code and signatures usage is not allowed
8
9// Certificated in Federal Institute of Industrial Property in 2012
10// http://revisium.com/ai/i/mini_aibolit.jpg
11
12////////////////////////////////////////////////////////////////////////////
13// Запрещено иÑпользование Ñкрипта в коммерчеÑких целÑÑ… без Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¸.
14// Запрещено иÑпользование иÑходного кода Ñкрипта и Ñигнатур.
15//
16// По вопроÑам Ð¿Ñ€Ð¸Ð¾Ð±Ñ€ÐµÑ‚ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ†ÐµÐ½Ð·Ð¸Ð¸ обращайтеÑÑŒ в компанию "Ревизиум": http://www.revisium.com
17// audit@revisium.com
18// Ðа Ñкрипт получено авторÑкое ÑвидетельÑтво в РоÑпатенте
19// http://revisium.com/ai/i/mini_aibolit.jpg
20///////////////////////////////////////////////////////////////////////////
21ini_set('memory_limit', '1G');
22ini_set('xdebug.max_nesting_level', 500);
23
24$int_enc = @ini_get('mbstring.internal_encoding');
25
26define('SHORT_PHP_TAG', strtolower(ini_get('short_open_tag')) == 'on' || strtolower(ini_get('short_open_tag')) == 1 ? true : false);
27
28// Put any strong password to open the script from web
29// Впишите вмеÑто put_any_strong_password_here Ñложный пароль
30
31define('PASS', '????????????????');
32
33//////////////////////////////////////////////////////////////////////////
34
35if (isCli()) {
36 if (strpos('--eng', $argv[$argc - 1]) !== false) {
37 define('LANG', 'EN');
38 }
39} else {
40 define('NEED_REPORT', true);
41}
42
43if (!defined('LANG')) {
44 define('LANG', 'RU');
45}
46
47// put 1 for expert mode, 0 for basic check and 2 for paranoic mode
48// уÑтановите 1 Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° "ÐкÑперта", 0 Ð´Ð»Ñ Ð±Ñ‹Ñтрой проверки и 2 Ð´Ð»Ñ Ð¿Ð°Ñ€Ð°Ð½Ð¾Ð¸Ð´Ð°Ð»ÑŒÐ½Ð¾Ð¹ проверки (Ð´Ð»Ñ Ð»ÐµÑ‡ÐµÐ½Ð¸Ñ Ñайта)
49define('AI_EXPERT_MODE', 1);
50
51define('REPORT_MASK_PHPSIGN', 1);
52define('REPORT_MASK_SPAMLINKS', 2);
53define('REPORT_MASK_DOORWAYS', 4);
54define('REPORT_MASK_SUSP', 8);
55define('REPORT_MASK_CANDI', 16);
56define('REPORT_MASK_WRIT', 32);
57define('REPORT_MASK_FULL', REPORT_MASK_PHPSIGN | REPORT_MASK_DOORWAYS | REPORT_MASK_SUSP
58/* <-- remove this line to enable "recommendations"
59
60| REPORT_MASK_SPAMLINKS
61
62 remove this line to enable "recommendations" --> */
63);
64
65define('AI_HOSTER', 0);
66
67define('AI_EXTRA_WARN', 0);
68
69$defaults = array(
70 'path' => dirname(__FILE__),
71 'scan_all_files' => 0, // full scan (rather than just a .js, .php, .html, .htaccess)
72 'scan_delay' => 0, // delay in file scanning to reduce system load
73 'max_size_to_scan' => '600K',
74 'site_url' => '', // website url
75 'no_rw_dir' => 0,
76 'skip_ext' => '',
77 'skip_cache' => false,
78 'report_mask' => REPORT_MASK_FULL
79);
80
81
82define('DEBUG_MODE', 0);
83define('DEBUG_PERFORMANCE', 0);
84
85define('AIBOLIT_START_TIME', time());
86define('START_TIME', microtime(true));
87
88define('DIR_SEPARATOR', '/');
89
90define('AIBOLIT_MAX_NUMBER', 200);
91
92define('DOUBLECHECK_FILE', 'AI-BOLIT-DOUBLECHECK.php');
93
94if ((isset($_SERVER['OS']) && stripos('Win', $_SERVER['OS']) !== false)/* && stripos('CygWin', $_SERVER['OS']) === false)*/) {
95 define('DIR_SEPARATOR', '\\');
96}
97
98$g_SuspiciousFiles = array('cgi', 'pl', 'o', 'so', 'py', 'sh', 'phtml', 'php3', 'php4', 'php5', 'php6', 'php7', 'pht', 'shtml', 'susp', 'suspected');
99$g_SensitiveFiles = array_merge(array('php', 'js', 'htaccess', 'html', 'htm', 'tpl', 'inc', 'css', 'txt', 'sql', 'ico', ''), $g_SuspiciousFiles);
100$g_CriticalFiles = array('php', 'htaccess', 'cgi', 'pl', 'o', 'so', 'py', 'sh', 'phtml', 'php3', 'php4', 'php5', 'php6', 'php7', 'pht', 'shtml', 'susp', 'suspected', 'infected', 'vir', 'ico', '');
101$g_CriticalEntries = '<\?php|<\?=|#!/usr|#!/bin|eval|assert|base64_decode|system|create_function|exec|popen|fwrite|fputs|file_get_|call_user_func|file_put_|\$_REQUEST|ob_start|\$_GET|\$_POST|\$_SERVER|\$_FILES|move|copy|array_|reg_replace|mysql_|chr|fsockopen|\$GLOBALS|sqliteCreateFunction';
102$g_VirusFiles = array('js', 'html', 'htm', 'suspicious');
103$g_VirusEntries = '<\s*script|<\s*iframe|<\s*object|<\s*embed|fromCharCode|setTimeout|setInterval|location\.|document\.|window\.|navigator\.|\$(this)\.';
104$g_PhishFiles = array('js', 'html', 'htm', 'suspected', 'php', 'pht', 'php7');
105$g_PhishEntries = '<\s*title|<\s*html|<\s*form|<\s*body|bank|account';
106$g_ShortListExt = array('php', 'php3', 'php4', 'php5', 'php6', 'php7', 'pht', 'html', 'htm', 'phtml', 'shtml', 'khtml', '', 'ico', 'txt');
107
108if (LANG == 'RU') {
109///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
110// RUSSIAN INTERFACE
111///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
112$msg1 = "\"Отображать по _MENU_ запиÑей\"";
113$msg2 = "\"Ðичего не найдено\"";
114$msg3 = "\"ОтображаетÑÑ c _START_ по _END_ из _TOTAL_ файлов\"";
115$msg4 = "\"Ðет файлов\"";
116$msg5 = "\"(вÑего запиÑей _MAX_)\"";
117$msg6 = "\"ПоиÑк:\"";
118$msg7 = "\"ПерваÑ\"";
119$msg8 = "\"ПредыдущаÑ\"";
120$msg9 = "\"СледующаÑ\"";
121$msg10 = "\"ПоÑледнÑÑ\"";
122$msg11 = "\": активировать Ð´Ð»Ñ Ñортировки Ñтолбца по возраÑтанию\"";
123$msg12 = "\": активировать Ð´Ð»Ñ Ñортировки Ñтолбцов по убыванию\"";
124
125define('AI_STR_001', 'Отчет Ñканера <a href="https://revisium.com/ai/">AI-Bolit</a> v@@VERSION@@:');
126define('AI_STR_002', 'Обращаем внимание на то, что большинÑтво CMS <b>без дополнительной защиты</b> рано или поздно <b>взламывают</b>.<p> ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ <a href="https://revisium.com/">"Ревизиум"</a> предлагает уÑлугу превентивной защиты Ñайта от взлома Ñ Ð¸Ñпользованием уникальной <b>процедуры "Ñ†ÐµÐ¼ÐµÐ½Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайта"</b>. Подробно на <a href="https://revisium.com/ru/client_protect/">Ñтранице уÑлуги</a>. <p>Лучшее лечение — Ñто профилактика.');
127define('AI_STR_003', 'Ðе оÑтавлÑйте файл отчета на Ñервере, и не давайте на него прÑмых ÑÑылок Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… Ñайтов. Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸Ð· отчета может быть иÑпользована злоумышленниками Ð´Ð»Ñ Ð²Ð·Ð»Ð¾Ð¼Ð° Ñайта, так как Ñодержит информацию о наÑтройках Ñервера, файлах и каталогах.');
128define('AI_STR_004', 'Путь');
129define('AI_STR_005', 'Изменение ÑвойÑтв');
130define('AI_STR_006', 'Изменение Ñодержимого');
131define('AI_STR_007', 'Размер');
132define('AI_STR_008', 'ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ PHP');
133define('AI_STR_009', "Ð’Ñ‹ уÑтановили Ñлабый пароль на Ñкрипт AI-BOLIT. Укажите пароль не менее 8 Ñимволов, Ñодержащий латинÑкие буквы в верхнем и нижнем региÑтре, а также цифры. Ðапример, такой <b>%s</b>");
134define('AI_STR_010', "Сканер AI-Bolit запуÑкаетÑÑ Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼. ЕÑли Ñто первый запуÑк Ñканера, вам нужно придумать Ñложный пароль и впиÑать его в файле ai-bolit.php в Ñтроке â„–34. <p>Ðапример, <b>define('PASS', '%s');</b><p>
135ПоÑле Ñтого откройте Ñканер в браузере, указав пароль в параметре \"p\". <p>Ðапример, так <b>http://mysite.ru/ai-bolit.php?p=%s</b>. ");
136define('AI_STR_011', 'Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð´Ð¸Ñ€ÐµÐºÑ‚Ð¾Ñ€Ð¸Ñ Ð½Ðµ доÑтупна Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñкрипту. ПожалуйÑта, укажите права на доÑтуп <b>rwxr-xr-x</b> или Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ командной Ñтроки <b>chmod +r имÑ_директории</b>');
137define('AI_STR_012', "Затрачено времени: <b>%s</b>. Сканирование начато %s, Ñканирование завершено %s");
138define('AI_STR_013', 'Ð’Ñего проверено %s директорий и %s файлов.');
139define('AI_STR_014', '<div class="rep" style="color: #0000A0">Внимание, Ñкрипт выполнил быÑтрую проверку Ñайта. ПроверÑÑŽÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ наиболее критичеÑкие файлы, но чаÑть вредоноÑных Ñкриптов может быть не обнаружена. ПожалуйÑта, запуÑтите Ñкрипт из командной Ñтроки Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ теÑтированиÑ. Подробнее Ñмотрите в <a href="https://revisium.com/ai/faq.php">FAQ Ð²Ð¾Ð¿Ñ€Ð¾Ñ â„–10</a>.</div>');
140define('AI_STR_015', '<div class="title">КритичеÑкие замечаниÑ</div>');
141define('AI_STR_016', 'Ðти файлы могут быть вредоноÑными или хакерÑкими Ñкриптами');
142define('AI_STR_017', 'ВируÑÑ‹ и вредоноÑные Ñкрипты не обнаружены.');
143define('AI_STR_018', 'Ðти файлы могут быть javascript вируÑами');
144define('AI_STR_019', 'Обнаружены Ñигнатуры иÑполнÑемых файлов unix и нехарактерных Ñкриптов. Они могут быть вредоноÑными файлами');
145define('AI_STR_020', 'Двойное раÑширение, зашифрованный контент или подозрение на вредоноÑный Ñкрипт. ТребуетÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ð¹ анализ');
146define('AI_STR_021', 'Подозрение на вредоноÑный Ñкрипт');
147define('AI_STR_022', 'СимволичеÑкие ÑÑылки (symlinks)');
148define('AI_STR_023', 'Скрытые файлы');
149define('AI_STR_024', 'Возможно, каталог Ñ Ð´Ð¾Ñ€Ð²ÐµÐµÐ¼');
150define('AI_STR_025', 'Ðе найдено директорий c дорвеÑми');
151define('AI_STR_026', 'ПредупреждениÑ');
152define('AI_STR_027', 'Подозрение на мобильный редирект, подмену раÑширений или автовнедрение кода');
153define('AI_STR_028', 'Ð’ не .php файле ÑодержитÑÑ ÑÑ‚Ð°Ñ€Ñ‚Ð¾Ð²Ð°Ñ Ñигнатура PHP кода. Возможно, там вредоноÑный код');
154define('AI_STR_029', 'Дорвеи, реклама, Ñпам-ÑÑылки, редиректы');
155define('AI_STR_030', 'Ðепроверенные файлы - ошибка чтениÑ');
156define('AI_STR_031', 'Ðевидимые ÑÑылки. Подозрение на ÑÑылочный Ñпам');
157define('AI_STR_032', 'Ðевидимые ÑÑылки');
158define('AI_STR_033', 'Отображены только первые ');
159define('AI_STR_034', 'Подозрение на дорвей');
160define('AI_STR_035', 'Скрипт иÑпользует код, который чаÑто вÑтречаетÑÑ Ð²Ð¾ вредоноÑных Ñкриптах');
161define('AI_STR_036', 'Директории из файла .adirignore были пропущены при Ñканировании');
162define('AI_STR_037', 'ВерÑии найденных CMS');
163define('AI_STR_038', 'Большие файлы (больше чем %s). Пропущено');
164define('AI_STR_039', 'Ðе найдено файлов больше чем %s');
165define('AI_STR_040', 'Временные файлы или файлы(каталоги) - кандидаты на удаление по Ñ€Ñду причин');
166define('AI_STR_041', 'Потенциально небезопаÑно! Директории, доÑтупные Ñкрипту на запиÑÑŒ');
167define('AI_STR_042', 'Ðе найдено директорий, доÑтупных на запиÑÑŒ Ñкриптом');
168define('AI_STR_043', 'ИÑпользовано памÑти при Ñканировании: ');
169define('AI_STR_044', 'ПроÑканированы только файлы, перечиÑленные в ' . DOUBLECHECK_FILE . '. Ð”Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð³Ð¾ ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÑƒÐ´Ð°Ð»Ð¸Ñ‚Ðµ файл ' . DOUBLECHECK_FILE . ' и запуÑтите Ñканер повторно.');
170define('AI_STR_045', '<div class="rep">Внимание! Выполнена ÑкÑпреÑÑ-проверка Ñайта. ПроÑканированы только файлы Ñ Ñ€Ð°Ñширением .php, .js, .html, .htaccess. Ð’ Ñтом режиме могут быть пропущены вируÑÑ‹ и хакерÑкие Ñкрипты в файлах Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ раÑширениÑми. Чтобы выполнить более тщательное Ñканирование, поменÑйте значение наÑтройки на <b>\'scan_all_files\' => 1</b> в Ñтроке 50 или откройте Ñканер в браузере Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð¾Ð¼ full: <b><a href="ai-bolit.php?p=' . PASS . '&full">ai-bolit.php?p=' . PASS . '&full</a></b>. <p>Ðе забудьте перед повторным запуÑком удалить файл ' . DOUBLECHECK_FILE . '</div>');
171define('AI_STR_050', 'Ð—Ð°Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¸ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ работе Ñкрипта и не обнаруженные вредоноÑные Ñкрипты приÑылайте на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<p>Также будем чрезвычайно благодарны за любые ÑƒÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ñкрипта AI-Bolit на вашем Ñайте, в блоге, Ñреди друзей, знакомых и клиентов. СÑылочку можно поÑтавить на <a href="https://revisium.com/ai/">https://revisium.com/ai/</a>. <p>ЕÑли будут вопроÑÑ‹ - пишите <a href="mailto:ai@revisium.com">ai@revisium.com</a>. ');
172define('AI_STR_051', 'Отчет по ');
173define('AI_STR_052', 'ÐвриÑтичеÑкий анализ обнаружил подозрительные файлы. Проверьте их на наличие вредоноÑного кода.');
174define('AI_STR_053', 'Много коÑвенных вызовов функции');
175define('AI_STR_054', 'Подозрение на обфуÑцированные переменные');
176define('AI_STR_055', 'Подозрительное иÑпользование маÑÑива глобальных переменных');
177define('AI_STR_056', 'Дробление Ñтроки на Ñимволы');
178define('AI_STR_057', 'Сканирование выполнено в ÑкÑпреÑÑ-режиме. Многие вредоноÑные Ñкрипты могут быть не обнаружены.<br> Рекомендуем проверить Ñайт в режиме "ÐкÑперт" или "Параноидальный". Подробно опиÑано в <a href="https://revisium.com/ai/faq.php">FAQ</a> и инÑтрукции к Ñкрипту.');
179define('AI_STR_058', 'Обнаружены фишинговые Ñтраницы');
180
181define('AI_STR_059', 'Мобильных редиректов');
182define('AI_STR_060', 'ВредоноÑных Ñкриптов');
183define('AI_STR_061', 'JS ВируÑов');
184define('AI_STR_062', 'Фишинговых Ñтраниц');
185define('AI_STR_063', 'ИÑполнÑемых файлов');
186define('AI_STR_064', 'IFRAME вÑтавок');
187define('AI_STR_065', 'Пропущенных больших файлов');
188define('AI_STR_066', 'Ошибок Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²');
189define('AI_STR_067', 'Зашифрованных файлов');
190define('AI_STR_068', 'Подозрительных (ÑвриÑтика)');
191define('AI_STR_069', 'СимволичеÑких ÑÑылок');
192define('AI_STR_070', 'Скрытых файлов');
193define('AI_STR_072', 'Рекламных ÑÑылок и кодов');
194define('AI_STR_073', 'ПуÑтых ÑÑылок');
195define('AI_STR_074', 'Сводный отчет');
196define('AI_STR_075', 'Сканер беÑплатный только Ð´Ð»Ñ Ð»Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ некоммерчеÑкого иÑпользованиÑ. Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¿Ð¾ <a href="https://revisium.com/ai/faq.php#faq11" target=_blank>коммерчеÑкой лицензии</a> (пункт â„–11). <a href="https://revisium.com/images/mini_aibolit.jpg">ÐвторÑкое ÑвидетельÑтво</a> о гоÑ. региÑтрации в РоÑПатенте â„–2012619254 от 12 октÑÐ±Ñ€Ñ 2012 г.');
197
198$tmp_str = <<<HTML_FOOTER
199 <div class="disclaimer"><span class="vir">[!]</span> Отказ от гарантий: невозможно гарантировать обнаружение вÑех вредоноÑных Ñкриптов. ПоÑтому разработчик Ñканера не неÑет ответÑтвенноÑти за возможные поÑледÑÑ‚Ð²Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñканера AI-Bolit или неоправданные Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹ отноÑительно функциональноÑти и возможноÑтей.
200 </div>
201 <div class="thanx">
202 Ð—Ð°Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¸ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾ работе Ñкрипта, а также не обнаруженные вредоноÑные Ñкрипты вы можете приÑылать на <a href="mailto:ai@revisium.com">ai@revisium.com</a>.<br/>
203 Также будем чрезвычайно благодарны за любые ÑƒÐ¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ñканера AI-Bolit на вашем Ñайте, в блоге, Ñреди друзей, знакомых и клиентов. <br/>СÑылку можно поÑтавить на Ñтраницу <a href="https://revisium.com/ai/">https://revisium.com/ai/</a>.<br/>
204 <p>Получить конÑультацию или задать вопроÑÑ‹ можно по email <a href="mailto:ai@revisium.com">ai@revisium.com</a>.</p>
205 </div>
206HTML_FOOTER;
207
208define('AI_STR_076', $tmp_str);
209define('AI_STR_077', "Подозрительные параметры времени Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°");
210define('AI_STR_078', "Подозрительные атрибуты файла");
211define('AI_STR_079', "Подозрительное меÑтоположение файла");
212define('AI_STR_080', "Обращаем внимание, что обнаруженные файлы не вÑегда ÑвлÑÑŽÑ‚ÑÑ Ð²Ð¸Ñ€ÑƒÑами и хакерÑкими Ñкриптами. Сканер минимизирует чиÑло ложных обнаружений, но Ñто не вÑегда возможно, так как найденный фрагмент может вÑтречатьÑÑ ÐºÐ°Ðº во вредоноÑных Ñкриптах, так и в обычных.<p>Ð”Ð»Ñ Ð´Ð¸Ð°Ð³Ð½Ð¾ÑтичеÑкого ÑÐºÐ°Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±ÐµÐ· ложных Ñрабатываний мы разработали Ñпециальную верÑию <u><a href=\"https://revisium.com/ru/blog/ai-bolit-4-ISP.html\" target=_blank style=\"background: none; color: #303030\">Ñканера Ð´Ð»Ñ Ñ…Ð¾Ñтинг-компаний</a></u>.");
213define('AI_STR_081', "УÑзвимоÑти в Ñкриптах");
214define('AI_STR_082', "Добавленные файлы");
215define('AI_STR_083', "Измененные файлы");
216define('AI_STR_084', "Удаленные файлы");
217define('AI_STR_085', "Добавленные каталоги");
218define('AI_STR_086', "Удаленные каталоги");
219define('AI_STR_087', "Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² файловой Ñтруктуре");
220
221$l_Offer =<<<OFFER
222 <div>
223 <div class="crit" style="font-size: 17px; margin-bottom: 20px"><b>Внимание! Ðаш Ñканер обнаружил подозрительный или вредоноÑный код</b>.</div>
224 <p>Возможно, ваш Ñайт был взломан. Рекомендуем Ñрочно <a href="https://revisium.com/ru/order/" target=_blank>проконÑультироватьÑÑ Ñо ÑпециалиÑтами</a> по данному отчету.</p>
225 <p>Отправьте отчет в запароленном архиве .zip в компанию "Ревизиум" на <b><a href="mailto:ai@revisium.com">ai@revisium.com</a></b> Ð´Ð»Ñ Ð±ÐµÑплатной конÑультации.</p>
226 <p>ÐšÐ¾Ð¼Ð¿Ð°Ð½Ð¸Ñ "<a href="https://revisium.com/">Ревизиум</a>" более 7 лет ÑпециализируетÑÑ Ð½Ð° лечении и защите Ñайтов от взлома.</p>
227 <p><hr size=1></p>
228 <p>Дополнительную проверку вируÑов на Ñтраницах необходимо выполнить беÑплатным <b><a href="http://rescan.pro/?utm=aibolit" target=_blank>веб-Ñканером ReScan.Pro</a></b>.</p>
229 <p><hr size=1></p>
230 <div class="caution">@@CAUTION@@</div>
231 </div>
232OFFER;
233
234$l_Offer2 =<<<OFFER2
235 <b>Ðаши новые продукты:</b><br/>
236 <ul>
237 <li style="margin-top: 10px">облачный <a href="https://cloudscan.pro/ru/" target=_blank>Ð°Ð½Ñ‚Ð¸Ð²Ð¸Ñ€ÑƒÑ CloudScan.Pro</a> Ð´Ð»Ñ Ð²ÐµÐ±-ÑпециалиÑтов</li>
238 <li style="margin-top: 10px"><a href="https://revisium.com/ru/blog/ai-bolit-4-ISP.html" target=_blank>Ð°Ð½Ñ‚Ð¸Ð²Ð¸Ñ€ÑƒÑ Ð´Ð»Ñ Ñ…Ð¾Ñтинг-компаний</a></li>
239 </ul>
240 </div>
241OFFER2;
242
243} else {
244///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
245// ENGLISH INTERFACE
246///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
247$msg1 = "\"Display _MENU_ records\"";
248$msg2 = "\"Not found\"";
249$msg3 = "\"Display from _START_ to _END_ of _TOTAL_ files\"";
250$msg4 = "\"No files\"";
251$msg5 = "\"(total _MAX_)\"";
252$msg6 = "\"Filter/Search:\"";
253$msg7 = "\"First\"";
254$msg8 = "\"Previous\"";
255$msg9 = "\"Next\"";
256$msg10 = "\"Last\"";
257$msg11 = "\": activate to sort row ascending order\"";
258$msg12 = "\": activate to sort row descending order\"";
259
260define('AI_STR_001', 'AI-Bolit v@@VERSION@@ Scan Report:');
261define('AI_STR_002', '');
262define('AI_STR_003', 'Caution! Do not leave either ai-bolit.php or report file on server and do not provide direct links to the report file. Report file contains sensitive information about your website which could be used by hackers. So keep it in safe place and don\'t leave on website!');
263define('AI_STR_004', 'Path');
264define('AI_STR_005', 'iNode Changed');
265define('AI_STR_006', 'Modified');
266define('AI_STR_007', 'Size');
267define('AI_STR_008', 'PHP Info');
268define('AI_STR_009', "Your password for AI-BOLIT is too weak. Password must be more than 8 character length, contain both latin letters in upper and lower case, and digits. E.g. <b>%s</b>");
269define('AI_STR_010', "Open AI-BOLIT with password specified in the beggining of file in PASS variable. <br/>E.g. http://you_website.com/ai-bolit.php?p=<b>%s</b>");
270define('AI_STR_011', 'Current folder is not readable. Please change permission for <b>rwxr-xr-x</b> or using command line <b>chmod +r folder_name</b>');
271define('AI_STR_012', "<div class=\"rep\">%s malicious signatures known, %s virus signatures and other malicious code. Elapsed: <b>%s</b
272>.<br/>Started: %s. Stopped: %s</div> ");
273define('AI_STR_013', 'Scanned %s folders and %s files.');
274define('AI_STR_014', '<div class="rep" style="color: #0000A0">Attention! Script has performed quick scan. It scans only .html/.js/.php files in quick scan mode so some of malicious scripts might not be detected. <br>Please launch script from a command line thru SSH to perform full scan.');
275define('AI_STR_015', '<div class="title">Critical</div>');
276define('AI_STR_016', 'Shell script signatures detected. Might be a malicious or hacker\'s scripts');
277define('AI_STR_017', 'Shell scripts signatures not detected.');
278define('AI_STR_018', 'Javascript virus signatures detected:');
279define('AI_STR_019', 'Unix executables signatures and odd scripts detected. They might be a malicious binaries or rootkits:');
280define('AI_STR_020', 'Suspicious encoded strings, extra .php extention or external includes detected in PHP files. Might be a malicious or hacker\'s script:');
281define('AI_STR_021', 'Might be a malicious or hacker\'s script:');
282define('AI_STR_022', 'Symlinks:');
283define('AI_STR_023', 'Hidden files:');
284define('AI_STR_024', 'Files might be a part of doorway:');
285define('AI_STR_025', 'Doorway folders not detected');
286define('AI_STR_026', 'Warnings');
287define('AI_STR_027', 'Malicious code in .htaccess (redirect to external server, extention handler replacement or malicious code auto-append):');
288define('AI_STR_028', 'Non-PHP file has PHP signature. Check for malicious code:');
289define('AI_STR_029', 'This script has black-SEO links or linkfarm. Check if it was installed by yourself:');
290define('AI_STR_030', 'Reading error. Skipped.');
291define('AI_STR_031', 'These files have invisible links, might be black-seo stuff:');
292define('AI_STR_032', 'List of invisible links:');
293define('AI_STR_033', 'Displayed first ');
294define('AI_STR_034', 'Folders contained too many .php or .html files. Might be a doorway:');
295define('AI_STR_035', 'Suspicious code detected. It\'s usually used in malicious scrips:');
296define('AI_STR_036', 'The following list of files specified in .adirignore has been skipped:');
297define('AI_STR_037', 'CMS found:');
298define('AI_STR_038', 'Large files (greater than %s! Skipped:');
299define('AI_STR_039', 'Files greater than %s not found');
300define('AI_STR_040', 'Files recommended to be remove due to security reason:');
301define('AI_STR_041', 'Potentially unsafe! Folders which are writable for scripts:');
302define('AI_STR_042', 'Writable folders not found');
303define('AI_STR_043', 'Memory used: ');
304define('AI_STR_044', 'Quick scan through the files from ' . DOUBLECHECK_FILE . '. For full scan remove ' . DOUBLECHECK_FILE . ' and launch scanner once again.');
305define('AI_STR_045', '<div class="notice"><span class="vir">[!]</span> Ai-BOLIT is working in quick scan mode, only .php, .html, .htaccess files will be checked. Change the following setting \'scan_all_files\' => 1 to perform full scanning.</b>. </div>');
306define('AI_STR_050', "I'm sincerely appreciate reports for any bugs you may found in the script. Please email me: <a href=\"mailto:audit@revisium.com\">audit@revisium.com</a>.<p> Also I appriciate any reference to the script in your blog or forum posts. Thank you for the link to download page: <a href=\"https://revisium.com/aibo/\">https://revisium.com/aibo/</a>");
307define('AI_STR_051', 'Report for ');
308define('AI_STR_052', 'Heuristic Analyzer has detected suspicious files. Check if they are malware.');
309define('AI_STR_053', 'Function called by reference');
310define('AI_STR_054', 'Suspected for obfuscated variables');
311define('AI_STR_055', 'Suspected for $GLOBAL array usage');
312define('AI_STR_056', 'Abnormal split of string');
313define('AI_STR_057', 'Scanning has been done in simple mode. It is strongly recommended to perform scanning in "Expert" mode. See readme.txt for details.');
314define('AI_STR_058', 'Phishing pages detected:');
315
316define('AI_STR_059', 'Mobile redirects');
317define('AI_STR_060', 'Malware');
318define('AI_STR_061', 'JS viruses');
319define('AI_STR_062', 'Phishing pages');
320define('AI_STR_063', 'Unix executables');
321define('AI_STR_064', 'IFRAME injections');
322define('AI_STR_065', 'Skipped big files');
323define('AI_STR_066', 'Reading errors');
324define('AI_STR_067', 'Encrypted files');
325define('AI_STR_068', 'Suspicious (heuristics)');
326define('AI_STR_069', 'Symbolic links');
327define('AI_STR_070', 'Hidden files');
328define('AI_STR_072', 'Adware and spam links');
329define('AI_STR_073', 'Empty links');
330define('AI_STR_074', 'Summary');
331define('AI_STR_075', 'For non-commercial use only. In order to purchase the commercial license of the scanner contact us at ai@revisium.com');
332
333$tmp_str =<<<HTML_FOOTER
334 <div class="disclaimer"><span class="vir">[!]</span> Disclaimer: We're not liable to you for any damages, including general, special, incidental or consequential damages arising out of the use or inability to use the script (including but not limited to loss of data or report being rendered inaccurate or failure of the script). There's no warranty for the program. Use at your own risk.
335 </div>
336 <div class="thanx">
337 We're greatly appreciate for any references in the social medias, forums or blogs to our scanner AI-BOLIT <a href="https://revisium.com/aibo/">https://revisium.com/aibo/</a>.<br/>
338 <p>Contact us via email if you have any questions regarding the scanner or need report analysis: <a href="mailto:ai@revisium.com">ai@revisium.com</a>.</p>
339 </div>
340HTML_FOOTER;
341define('AI_STR_076', $tmp_str);
342define('AI_STR_077', "Suspicious file mtime and ctime");
343define('AI_STR_078', "Suspicious file permissions");
344define('AI_STR_079', "Suspicious file location");
345define('AI_STR_081', "Vulnerable Scripts");
346define('AI_STR_082', "Added files");
347define('AI_STR_083', "Modified files");
348define('AI_STR_084', "Deleted files");
349define('AI_STR_085', "Added directories");
350define('AI_STR_086', "Deleted directories");
351define('AI_STR_087', "Integrity Check Report");
352
353$l_Offer =<<<HTML_OFFER_EN
354<div>
355 <div class="crit" style="font-size: 17px;"><b>Attention! The scanner has detected suspicious or malicious files.</b></div>
356 <br/>Most likely the website has been compromised. Please, <a href="https://revisium.com/en/contacts/" target=_blank>contact website security experts</a> from Revisium to check the report or clean the malware.
357 <p><hr size=1></p>
358 Also check your website for viruses in our free <b><a href="http://rescan.pro/?en&utm=aibo" target=_blank>online scanner ReScan.Pro</a></b>.
359</div>
360<br/>
361<div>
362 Revisium contacts: <a href="mailto:ai@revisium.com">ai@revisium.com</a>, <a href="https://revisium.com/en/contacts/">https://revisium.com/en/home/</a>
363</div>
364<div class="caution">@@CAUTION@@</div>
365HTML_OFFER_EN;
366
367$l_Offer2 = 'Professional virus/malware clean up and website protection service with 6 month support for only $99 (one-time payment): <a href="https://revisium.com/en/home/#order_form">https://revisium.com/en/home/</a>.';
368
369define('AI_STR_080', "Notice! Some of detected files may not contain malicious code. Scanner tries to minimize a number of false positives, but sometimes it's impossible, because same piece of code may be used either in malware or in normal scripts.");
370}
371
372///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
373
374$l_Template =<<<MAIN_PAGE
375<html>
376<head>
377<!-- revisium.com/ai/ -->
378<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
379<META NAME="ROBOTS" CONTENT="NOINDEX,NOFOLLOW">
380<title>@@HEAD_TITLE@@</title>
381<style type="text/css" title="currentStyle">
382 @import "https://cdn.revisium.com/ai/media/css/demo_page2.css";
383 @import "https://cdn.revisium.com/ai/media/css/jquery.dataTables2.css";
384</style>
385
386<script type="text/javascript" language="javascript" src="https://cdn.revisium.com/ai/jquery.js"></script>
387<script type="text/javascript" language="javascript" src="https://cdn.revisium.com/ai/datatables.min.js"></script>
388
389<style type="text/css">
390 body
391 {
392 font-family: Tahoma;
393 color: #5a5a5a;
394 background: #FFFFFF;
395 font-size: 14px;
396 margin: 20px;
397 padding: 0;
398 }
399
400.header
401 {
402 font-size: 34px;
403 margin: 0 0 10px 0;
404 }
405
406 .hidd
407 {
408 display: none;
409 }
410
411 .ok
412 {
413 color: green;
414 }
415
416 .line_no
417 {
418 -webkit-border-radius: 4px;
419 -moz-border-radius: 4px;
420 border-radius: 4px;
421
422 background: #DAF2C1;
423 padding: 2px 5px 2px 5px;
424 margin: 0 5px 0 5px;
425 }
426
427 .credits_header
428 {
429 -webkit-border-radius: 4px;
430 -moz-border-radius: 4px;
431 border-radius: 4px;
432
433 background: #F2F2F2;
434 padding: 10px;
435 font-size: 11px;
436 margin: 0 0 10px 0;
437 }
438
439 .marker
440 {
441 color: #FF0090;
442 font-weight: 100;
443 background: #FF0090;
444 padding: 2px 0px 2px 0px;
445 width: 2px;
446 }
447
448 .title
449 {
450 font-size: 24px;
451 margin: 20px 0 10px 0;
452 color: #9CA9D1;
453}
454
455.summary
456{
457 float: left;
458 width: 500px;
459}
460
461.summary TD
462{
463 font-size: 12px;
464 border-bottom: 1px solid #F0F0F0;
465 font-weight: 700;
466 padding: 10px 0 10px 0;
467}
468
469.crit, .vir
470{
471 color: #D84B55;
472}
473
474.intitem
475{
476 color:#4a6975;
477}
478
479.spacer
480{
481 margin: 0 0 50px 0;
482 clear:both;
483}
484
485.warn
486{
487 color: #F6B700;
488}
489
490.clear
491{
492 clear: both;
493}
494
495.offer
496{
497 -webkit-border-radius: 4px;
498 -moz-border-radius: 4px;
499 border-radius: 4px;
500
501 width: 500px;
502 background: #F2F2F2;
503 color: #747474;
504 font-family: Helvetica, Arial;
505 padding: 30px;
506 margin: 20px 0 0 550px;
507 font-size: 14px;
508}
509
510.offer2
511{
512 -webkit-border-radius: 4px;
513 -moz-border-radius: 4px;
514 border-radius: 4px;
515
516 width: 500px;
517 background: #f6f5e0;
518 color: #747474;
519 font-family: Helvetica, Arial;
520 padding: 30px;
521 margin: 20px 0 0 550px;
522 font-size: 14px;
523}
524
525
526HR {
527 margin-top: 15px;
528 margin-bottom: 15px;
529 opacity: .2;
530}
531
532.flist
533{
534 font-family: Henvetica, Arial;
535}
536
537.flist TD
538{
539 font-size: 11px;
540 padding: 5px;
541}
542
543.flist TH
544{
545 font-size: 12px;
546 height: 30px;
547 padding: 5px;
548 background: #CEE9EF;
549}
550
551
552.it
553{
554 font-size: 14px;
555 font-weight: 100;
556 margin-top: 10px;
557}
558
559.crit .it A {
560 color: #E50931;
561 line-height: 25px;
562 text-decoration: none;
563}
564
565.warn .it A {
566 color: #F2C900;
567 line-height: 25px;
568 text-decoration: none;
569}
570
571
572
573.details
574{
575 font-family: Calibri;
576 font-size: 12px;
577 margin: 10px 10px 10px 0px;
578}
579
580.crit .details
581{
582 color: #A08080;
583}
584
585.warn .details
586{
587 color: #808080;
588}
589
590.details A
591{
592 color: #FFF;
593 font-weight: 700;
594 text-decoration: none;
595 padding: 2px;
596 background: #E5CEDE;
597 -webkit-border-radius: 7px;
598 -moz-border-radius: 7px;
599 border-radius: 7px;
600}
601
602.details A:hover
603{
604 background: #A0909B;
605}
606
607.ctd
608{
609 margin: 10px 0px 10px 0;
610 align:center;
611}
612
613.ctd A
614{
615 color: #0D9922;
616}
617
618.disclaimer
619{
620 color: darkgreen;
621 margin: 10px 10px 10px 0;
622}
623
624.note_vir
625{
626 margin: 10px 0 10px 0;
627 //padding: 10px;
628 color: #FF4F4F;
629 font-size: 15px;
630 font-weight: 700;
631 clear:both;
632
633}
634
635.note_warn
636{
637 margin: 10px 0 10px 0;
638 color: #F6B700;
639 font-size: 15px;
640 font-weight: 700;
641 clear:both;
642}
643
644.note_int
645{
646 margin: 10px 0 10px 0;
647 color: #60b5d6;
648 font-size: 15px;
649 font-weight: 700;
650 clear:both;
651}
652
653.updateinfo
654{
655 color: #FFF;
656 text-decoration: none;
657 background: #E5CEDE;
658 -webkit-border-radius: 7px;
659 -moz-border-radius: 7px;
660 border-radius: 7px;
661
662 margin: 10px 0 10px 0px;
663 padding: 10px;
664}
665
666
667.caution
668{
669 color: #EF7B75;
670 text-decoration: none;
671 margin: 20px 0 0px 0px;
672 font-size: 12px;
673}
674
675.footer
676{
677 color: #303030;
678 text-decoration: none;
679 background: #F4F4F4;
680 -webkit-border-radius: 7px;
681 -moz-border-radius: 7px;
682 border-radius: 7px;
683
684 margin: 80px 0 10px 0px;
685 padding: 10px;
686}
687
688.rep
689{
690 color: #303030;
691 text-decoration: none;
692 background: #94DDDB;
693 -webkit-border-radius: 7px;
694 -moz-border-radius: 7px;
695 border-radius: 7px;
696
697 margin: 10px 0 10px 0px;
698 padding: 10px;
699 font-size: 12px;
700}
701
702</style>
703
704</head>
705<body>
706
707<div class="header">@@MAIN_TITLE@@ @@PATH_URL@@ (@@MODE@@)</div>
708<div class="credits_header">@@CREDITS@@</div>
709<div class="details_header">
710 @@STAT@@<br/>
711 @@SCANNED@@ @@MEMORY@@.
712 </div>
713
714 @@WARN_QUICK@@
715
716 <div class="summary">
717@@SUMMARY@@
718 </div>
719
720 <div class="offer">
721@@OFFER@@
722 </div>
723
724 <div class="offer2">
725@@OFFER2@@
726 </div>
727
728 <div class="clear"></div>
729
730 @@MAIN_CONTENT@@
731
732 <div class="footer">
733 @@FOOTER@@
734 </div>
735
736<script language="javascript">
737
738function hsig(id) {
739 var divs = document.getElementsByTagName("tr");
740 for(var i = 0; i < divs.length; i++){
741
742 if (divs[i].getAttribute('o') == id) {
743 divs[i].innerHTML = '';
744 }
745 }
746
747 return false;
748}
749
750
751$(document).ready(function(){
752 $('#table_crit').dataTable({
753 "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
754 "aoColumns": [
755 {"iDataSort": 7, "width":"70%"},
756 {"iDataSort": 5},
757 {"iDataSort": 6},
758 {"bSortable": true},
759 {"bVisible": false},
760 {"bVisible": false},
761 {"bVisible": false},
762 {"bVisible": false}
763 ],
764 "paging": true,
765 "iDisplayLength": 500,
766 "oLanguage": {
767 "sLengthMenu": $msg1,
768 "sZeroRecords": $msg2,
769 "sInfo": $msg3,
770 "sInfoEmpty": $msg4,
771 "sInfoFiltered": $msg5,
772 "sSearch": $msg6,
773 "sUrl": "",
774 "oPaginate": {
775 "sFirst": $msg7,
776 "sPrevious": $msg8,
777 "sNext": $msg9,
778 "sLast": $msg10
779 },
780 "oAria": {
781 "sSortAscending": $msg11,
782 "sSortDescending": $msg12
783 }
784 }
785
786 } );
787
788});
789
790$(document).ready(function(){
791 $('#table_vir').dataTable({
792 "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
793 "paging": true,
794 "aoColumns": [
795 {"iDataSort": 7, "width":"70%"},
796 {"iDataSort": 5},
797 {"iDataSort": 6},
798 {"bSortable": true},
799 {"bVisible": false},
800 {"bVisible": false},
801 {"bVisible": false},
802 {"bVisible": false}
803 ],
804 "iDisplayLength": 500,
805 "oLanguage": {
806 "sLengthMenu": $msg1,
807 "sZeroRecords": $msg2,
808 "sInfo": $msg3,
809 "sInfoEmpty": $msg4,
810 "sInfoFiltered": $msg5,
811 "sSearch": $msg6,
812 "sUrl": "",
813 "oPaginate": {
814 "sFirst": $msg7,
815 "sPrevious": $msg8,
816 "sNext": $msg9,
817 "sLast": $msg10
818 },
819 "oAria": {
820 "sSortAscending": $msg11,
821 "sSortDescending": $msg12
822 }
823 },
824
825 } );
826
827});
828
829if ($('#table_warn0')) {
830 $('#table_warn0').dataTable({
831 "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
832 "paging": true,
833 "aoColumns": [
834 {"iDataSort": 7, "width":"70%"},
835 {"iDataSort": 5},
836 {"iDataSort": 6},
837 {"bSortable": true},
838 {"bVisible": false},
839 {"bVisible": false},
840 {"bVisible": false},
841 {"bVisible": false}
842 ],
843 "iDisplayLength": 500,
844 "oLanguage": {
845 "sLengthMenu": $msg1,
846 "sZeroRecords": $msg2,
847 "sInfo": $msg3,
848 "sInfoEmpty": $msg4,
849 "sInfoFiltered": $msg5,
850 "sSearch": $msg6,
851 "sUrl": "",
852 "oPaginate": {
853 "sFirst": $msg7,
854 "sPrevious": $msg8,
855 "sNext": $msg9,
856 "sLast": $msg10
857 },
858 "oAria": {
859 "sSortAscending": $msg11,
860 "sSortDescending": $msg12
861 }
862 }
863
864 } );
865}
866
867if ($('#table_warn1')) {
868 $('#table_warn1').dataTable({
869 "aLengthMenu": [[100 , 500, -1], [100, 500, "All"]],
870 "paging": true,
871 "aoColumns": [
872 {"iDataSort": 7, "width":"70%"},
873 {"iDataSort": 5},
874 {"iDataSort": 6},
875 {"bSortable": true},
876 {"bVisible": false},
877 {"bVisible": false},
878 {"bVisible": false},
879 {"bVisible": false}
880 ],
881 "iDisplayLength": 500,
882 "oLanguage": {
883 "sLengthMenu": $msg1,
884 "sZeroRecords": $msg2,
885 "sInfo": $msg3,
886 "sInfoEmpty": $msg4,
887 "sInfoFiltered": $msg5,
888 "sSearch": $msg6,
889 "sUrl": "",
890 "oPaginate": {
891 "sFirst": $msg7,
892 "sPrevious": $msg8,
893 "sNext": $msg9,
894 "sLast": $msg10
895 },
896 "oAria": {
897 "sSortAscending": $msg11,
898 "sSortDescending": $msg12
899 }
900 }
901
902 } );
903}
904
905
906</script>
907<!-- @@SERVICE_INFO@@ -->
908 </body>
909</html>
910MAIN_PAGE;
911
912$g_AiBolitAbsolutePath = dirname(__FILE__);
913
914if (file_exists($g_AiBolitAbsolutePath . '/ai-design.html')) {
915 $l_Template = file_get_contents($g_AiBolitAbsolutePath . '/ai-design.html');
916}
917
918$l_Template = str_replace('@@MAIN_TITLE@@', AI_STR_001, $l_Template);
919
920///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
921
922//BEGIN_SIG 11/12/2017 02:18:47
923$g_DBShe = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
924$gX_DBShe = unserialize(gzinflate(/*1512991127*/base64_decode("bVVrb+I4FP0rniyzUKmUPKHQabUUOu1unyrM7IyqKjKJCVacx9gOLYx2f/va14ZWo+ULyfH18b3nXN/gUd8f/aQj90SMBiMnJUucEO6c0JGnED8cOd+rBiW4RHUjEUZFGiEhOS0zHeOrmOORU69qsSKMaShQkKJ0PqV0jRKGhTh1FqxKcrSQm5p4ztn7lVRW9S/IQhbOmWYKDXkyHO7JIwPxaLCH+ibxu/kUp+lGIwO7j672Qccm6PMrkGlkqBBPpfk3WaCZDkML2OxpITxPK7GmbDvbMXggRzRyrnCSk1RFozFb4gWR1VfKZYNNlBXkLpD7s73AMs5kxYvBG2No8ZsqacQ7PLKp7ao8UvLCgi51OHJwKekb+8CAvKreHXlsqYsNYOSVJIAPTXqm4PscLISClc86qOPwAnU56i5hSdfs6XIIalLMKoG2OOPNlkpY1sVG6pRWQYTAGUGniHCSxZzUTHVRx/kYTT76vnOIHPO3Czw4gf0gjMq9Vu0kkTOrcUHS9tmnBQf/fS1Q6I4cQWRSVTklHaQr+sHiF7KIcVrQMm4E4aXa5yBLqtULlNeECUKXnWVTJpJWZUxeqZCi44AgMShycAA7tKyRSoMuUYeKOMGM4QVT6ZsghMsUfVBHYc7xxqKHrZQKHaX5LY92IggNT6dVE14I9DtyXyeu6x6g09P9408IB49UdSnlqHd/iXrfANYWBX3FUiasSUmnFc8uHr9ePD61r+bzh/iLeovHlxd38/YzHBvYm7vg7osI4OYG2rdQVdReSVmnR0lVLtuH7fWqUgrs3pJlphtLPymAmhfY7ds6ejWvkp7YiF6uNCast8EF7tWSK29jkVQ1gXDtoh8owdeYdZaUkTgjMlakkpRacB0T2kZS8r5wKo28vTXmPViObAu2Lm/uz8c3s6d2rH6wBOZEsHNvTFtb0P7VGIOqJnvnjAAObYxSNHeVFHAPAq29r6CswJR1RSHrLi2P2FFWVRkjSqICwoZGWtVt3HWh58PdeJjq8QCzACQPPRM6fZufoW9Dn9DDSkn5ukHPgAfmEj4lVUr41mBaoEBPzQ/d7m+6EJQU6anTAs/Hk8nFw9xB3a6Zi7sB8fzEq6ZMO+7BM8gc9neThhZjKd+S0wJ4SsQp5vmEk5fPnJIyBXFCOxpzn7EgSAGyZV/n114QDGDuupbhajy5vpii8+9oNr9/vIU1z7p3q66Y+lAYUYA88u22W340W6mOXuHymzfsw1pgBteU0BRz/C90fxTaS/EXLWs156piC3BkYr1yECTSc0sA+/bca/UxmuW8qdXFrsy5g/+nOTY0E1JmdHuFDc3QDtBgHZRZWAJB3zXg+Y2q98vdn5Bc37Pzl0ua5Iz84Zz88x8=")));
925$g_FlexDBShe = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
926$gX_FlexDBShe = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
927$gXX_FlexDBShe = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
928$g_ExceptFlex = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
929$g_AdwareSig = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
930$g_PhishingSig = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
931$g_JSVirSig = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
932$gX_JSVirSig = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
933$g_SusDB = unserialize(gzinflate(/*1512991127*/base64_decode("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")));
934$g_SusDBPrio = unserialize(gzinflate(/*1512991127*/base64_decode("RdPLccMwDEXRloQvAaWaLFNDxr1nZOMiCw8wFHX4BFnft6jcvz/39fX5yVSdalN9akzNqWdqzb09VRZEFEjBFFBBFVjBlaJpkiHrZkVWZEVWZEVWZEVWMhsDMGTbMSAbsiEbsiEbspHZyezIjuw7YWRHdmRHdmRHDuRADuRAjn15yJHzpIEcyNHz9pNpJHIiJ3I6m/d/QeZEzmIPcz5kPshHuYR8nJWgyXHOYeWRnxsOmQu5hBUyF3KRuchcZK79NzONInMzjRYaMjdyI3fQkLkPDdPo/y/l2k7mgeTS7Wyv+q7Fdhwg134xV+3VPUP2DNkzZM94f5GfzndfbJfbPWe8d0jtWnPvfJivPw==")));
935$g_DeMapper = unserialize(base64_decode("YTo1OntzOjEwOiJ3aXphcmQucGhwIjtzOjM3OiJjbGFzcyBXZWxjb21lU3RlcCBleHRlbmRzIENXaXphcmRTdGVwIjtzOjE3OiJ1cGRhdGVfY2xpZW50LnBocCI7czozNzoieyBDVXBkYXRlQ2xpZW50OjpBZGRNZXNzYWdlMkxvZygiZXhlYyI7czoxMToiaW5jbHVkZS5waHAiO3M6NDg6IkdMT0JBTFNbIlVTRVIiXS0+SXNBdXRob3JpemVkKCkgJiYgJGFyQXV0aFJlc3VsdCI7czo5OiJzdGFydC5waHAiO3M6NjA6IkJYX1JPT1QuJy9tb2R1bGVzL21haW4vY2xhc3Nlcy9nZW5lcmFsL3VwZGF0ZV9kYl91cGRhdGVyLnBocCI7czoxMDoiaGVscGVyLnBocCI7czo1ODoiSlBsdWdpbkhlbHBlcjo6Z2V0UGx1Z2luKCJzeXN0ZW0iLCJvbmVjbGlja2NoZWNrb3V0X3ZtMyIpOyI7fQ=="));
936
937//END_SIG
938////////////////////////////////////////////////////////////////////////////
939if (!isCli() && !isset($_SERVER['HTTP_USER_AGENT'])) {
940 echo "#####################################################\n";
941 echo "# Error: cannot run on php-cgi. Requires php as cli #\n";
942 echo "# #\n";
943 echo "# See FAQ: http://revisium.com/ai/faq.php #\n";
944 echo "#####################################################\n";
945 exit;
946}
947
948
949if (version_compare(phpversion(), '5.3.1', '<')) {
950 echo "#####################################################\n";
951 echo "# Warning: PHP Version < 5.3.1 #\n";
952 echo "# Some function might not work properly #\n";
953 echo "# See FAQ: http://revisium.com/ai/faq.php #\n";
954 echo "#####################################################\n";
955 exit;
956}
957
958if (!(function_exists("file_put_contents") && is_callable("file_put_contents"))) {
959 echo "#####################################################\n";
960 echo "file_put_contents() is disabled. Cannot proceed.\n";
961 echo "#####################################################\n";
962 exit;
963}
964
965define('AI_VERSION', '20171210');
966
967////////////////////////////////////////////////////////////////////////////
968
969$l_Res = '';
970
971$g_Structure = array();
972$g_Counter = 0;
973$g_SpecificExt = false;
974
975$g_UpdatedJsonLog = 0;
976$g_NotRead = array();
977$g_FileInfo = array();
978$g_Iframer = array();
979$g_PHPCodeInside = array();
980$g_CriticalJS = array();
981$g_Phishing = array();
982$g_Base64 = array();
983$g_HeuristicDetected = array();
984$g_HeuristicType = array();
985$g_UnixExec = array();
986$g_SkippedFolders = array();
987$g_UnsafeFilesFound = array();
988$g_CMS = array();
989$g_SymLinks = array();
990$g_HiddenFiles = array();
991$g_Vulnerable = array();
992
993$g_RegExpStat = array();
994
995$g_TotalFolder = 0;
996$g_TotalFiles = 0;
997
998$g_FoundTotalDirs = 0;
999$g_FoundTotalFiles = 0;
1000
1001if (!isCli()) {
1002 $defaults['site_url'] = 'http://' . $_SERVER['HTTP_HOST'] . '/';
1003}
1004
1005define('CRC32_LIMIT', pow(2, 31) - 1);
1006define('CRC32_DIFF', CRC32_LIMIT * 2 -2);
1007
1008error_reporting(E_ALL ^ E_NOTICE ^ E_WARNING);
1009srand(time());
1010
1011set_time_limit(0);
1012ini_set('max_execution_time', '900000');
1013ini_set('realpath_cache_size','16M');
1014ini_set('realpath_cache_ttl','1200');
1015ini_set('pcre.backtrack_limit','1000000');
1016ini_set('pcre.recursion_limit','200000');
1017ini_set('pcre.jit','1');
1018
1019if (!function_exists('stripos')) {
1020 function stripos($par_Str, $par_Entry, $Offset = 0) {
1021 return strpos(strtolower($par_Str), strtolower($par_Entry), $Offset);
1022 }
1023}
1024
1025define('CMS_BITRIX', 'Bitrix');
1026define('CMS_WORDPRESS', 'Wordpress');
1027define('CMS_JOOMLA', 'Joomla');
1028define('CMS_DLE', 'Data Life Engine');
1029define('CMS_IPB', 'Invision Power Board');
1030define('CMS_WEBASYST', 'WebAsyst');
1031define('CMS_OSCOMMERCE', 'OsCommerce');
1032define('CMS_DRUPAL', 'Drupal');
1033define('CMS_MODX', 'MODX');
1034define('CMS_INSTANTCMS', 'Instant CMS');
1035define('CMS_PHPBB', 'PhpBB');
1036define('CMS_VBULLETIN', 'vBulletin');
1037define('CMS_SHOPSCRIPT', 'PHP ShopScript Premium');
1038
1039define('CMS_VERSION_UNDEFINED', '0.0');
1040
1041class CmsVersionDetector {
1042 private $root_path;
1043 private $versions;
1044 private $types;
1045
1046 public function __construct($root_path = '.') {
1047 $this->root_path = $root_path;
1048 $this->versions = array();
1049 $this->types = array();
1050
1051 $version = '';
1052
1053 $dir_list = $this->getDirList($root_path);
1054 $dir_list[] = $root_path;
1055
1056 foreach ($dir_list as $dir) {
1057 if ($this->checkBitrix($dir, $version)) {
1058 $this->addCms(CMS_BITRIX, $version);
1059 }
1060
1061 if ($this->checkWordpress($dir, $version)) {
1062 $this->addCms(CMS_WORDPRESS, $version);
1063 }
1064
1065 if ($this->checkJoomla($dir, $version)) {
1066 $this->addCms(CMS_JOOMLA, $version);
1067 }
1068
1069 if ($this->checkDle($dir, $version)) {
1070 $this->addCms(CMS_DLE, $version);
1071 }
1072
1073 if ($this->checkIpb($dir, $version)) {
1074 $this->addCms(CMS_IPB, $version);
1075 }
1076
1077 if ($this->checkWebAsyst($dir, $version)) {
1078 $this->addCms(CMS_WEBASYST, $version);
1079 }
1080
1081 if ($this->checkOsCommerce($dir, $version)) {
1082 $this->addCms(CMS_OSCOMMERCE, $version);
1083 }
1084
1085 if ($this->checkDrupal($dir, $version)) {
1086 $this->addCms(CMS_DRUPAL, $version);
1087 }
1088
1089 if ($this->checkMODX($dir, $version)) {
1090 $this->addCms(CMS_MODX, $version);
1091 }
1092
1093 if ($this->checkInstantCms($dir, $version)) {
1094 $this->addCms(CMS_INSTANTCMS, $version);
1095 }
1096
1097 if ($this->checkPhpBb($dir, $version)) {
1098 $this->addCms(CMS_PHPBB, $version);
1099 }
1100
1101 if ($this->checkVBulletin($dir, $version)) {
1102 $this->addCms(CMS_VBULLETIN, $version);
1103 }
1104
1105 if ($this->checkPhpShopScript($dir, $version)) {
1106 $this->addCms(CMS_SHOPSCRIPT, $version);
1107 }
1108
1109 }
1110 }
1111
1112 function getDirList($target) {
1113 $remove = array('.', '..');
1114 $directories = array_diff(scandir($target), $remove);
1115
1116 $res = array();
1117
1118 foreach($directories as $value)
1119 {
1120 if(is_dir($target . '/' . $value))
1121 {
1122 $res[] = $target . '/' . $value;
1123 }
1124 }
1125
1126 return $res;
1127 }
1128
1129 function isCms($name, $version) {
1130 for ($i = 0; $i < count($this->types); $i++) {
1131 if ((strpos($this->types[$i], $name) !== false)
1132 &&
1133 (strpos($this->versions[$i], $version) !== false)) {
1134 return true;
1135 }
1136 }
1137
1138 return false;
1139 }
1140
1141 function getCmsList() {
1142 return $this->types;
1143 }
1144
1145 function getCmsVersions() {
1146 return $this->versions;
1147 }
1148
1149 function getCmsNumber() {
1150 return count($this->types);
1151 }
1152
1153 function getCmsName($index = 0) {
1154 return $this->types[$index];
1155 }
1156
1157 function getCmsVersion($index = 0) {
1158 return $this->versions[$index];
1159 }
1160
1161 private function addCms($type, $version) {
1162 $this->types[] = $type;
1163 $this->versions[] = $version;
1164 }
1165
1166 private function checkBitrix($dir, &$version) {
1167 $version = CMS_VERSION_UNDEFINED;
1168 $res = false;
1169
1170 if (file_exists($dir .'/bitrix')) {
1171 $res = true;
1172
1173 $tmp_content = @file_get_contents($this->root_path .'/bitrix/modules/main/classes/general/version.php');
1174 if (preg_match('|define\("SM_VERSION","(.+?)"\)|smi', $tmp_content, $tmp_ver)) {
1175 $version = $tmp_ver[1];
1176 }
1177
1178 }
1179
1180 return $res;
1181 }
1182
1183 private function checkWordpress($dir, &$version) {
1184 $version = CMS_VERSION_UNDEFINED;
1185 $res = false;
1186
1187 if (file_exists($dir .'/wp-admin')) {
1188 $res = true;
1189
1190 $tmp_content = @file_get_contents($dir .'/wp-includes/version.php');
1191 if (preg_match('|\$wp_version\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1192 $version = $tmp_ver[1];
1193 }
1194 }
1195
1196 return $res;
1197 }
1198
1199 private function checkJoomla($dir, &$version) {
1200 $version = CMS_VERSION_UNDEFINED;
1201 $res = false;
1202
1203 if (file_exists($dir .'/libraries/joomla')) {
1204 $res = true;
1205
1206 // for 1.5.x
1207 $tmp_content = @file_get_contents($dir .'/libraries/joomla/version.php');
1208 if (preg_match('|var\s+\$RELEASE\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1209 $version = $tmp_ver[1];
1210
1211 if (preg_match('|var\s+\$DEV_LEVEL\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1212 $version .= '.' . $tmp_ver[1];
1213 }
1214 }
1215
1216 // for 1.7.x
1217 $tmp_content = @file_get_contents($dir .'/includes/version.php');
1218 if (preg_match('|public\s+\$RELEASE\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1219 $version = $tmp_ver[1];
1220
1221 if (preg_match('|public\s+\$DEV_LEVEL\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1222 $version .= '.' . $tmp_ver[1];
1223 }
1224 }
1225
1226
1227 // for 2.5.x and 3.x
1228 $tmp_content = @file_get_contents($dir . '/libraries/cms/version/version.php');
1229
1230 if (preg_match('|const\s+RELEASE\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1231 $version = $tmp_ver[1];
1232
1233 if (preg_match('|const\s+DEV_LEVEL\s*=\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1234 $version .= '.' . $tmp_ver[1];
1235 }
1236 }
1237
1238 }
1239
1240 return $res;
1241 }
1242
1243 private function checkDle($dir, &$version) {
1244 $version = CMS_VERSION_UNDEFINED;
1245 $res = false;
1246
1247 if (file_exists($dir .'/engine/engine.php')) {
1248 $res = true;
1249
1250 $tmp_content = @file_get_contents($dir . '/engine/data/config.php');
1251 if (preg_match('|\'version_id\'\s*=>\s*"(.+?)"|smi', $tmp_content, $tmp_ver)) {
1252 $version = $tmp_ver[1];
1253 }
1254
1255 $tmp_content = @file_get_contents($dir . '/install.php');
1256 if (preg_match('|\'version_id\'\s*=>\s*"(.+?)"|smi', $tmp_content, $tmp_ver)) {
1257 $version = $tmp_ver[1];
1258 }
1259
1260 }
1261
1262 return $res;
1263 }
1264
1265 private function checkIpb($dir, &$version) {
1266 $version = CMS_VERSION_UNDEFINED;
1267 $res = false;
1268
1269 if (file_exists($dir . '/ips_kernel')) {
1270 $res = true;
1271
1272 $tmp_content = @file_get_contents($dir . '/ips_kernel/class_xml.php');
1273 if (preg_match('|IP.Board\s+v([0-9\.]+)|si', $tmp_content, $tmp_ver)) {
1274 $version = $tmp_ver[1];
1275 }
1276
1277 }
1278
1279 return $res;
1280 }
1281
1282 private function checkWebAsyst($dir, &$version) {
1283 $version = CMS_VERSION_UNDEFINED;
1284 $res = false;
1285
1286 if (file_exists($dir . '/wbs/installer')) {
1287 $res = true;
1288
1289 $tmp_content = @file_get_contents($dir . '/license.txt');
1290 if (preg_match('|v([0-9\.]+)|si', $tmp_content, $tmp_ver)) {
1291 $version = $tmp_ver[1];
1292 }
1293
1294 }
1295
1296 return $res;
1297 }
1298
1299 private function checkOsCommerce($dir, &$version) {
1300 $version = CMS_VERSION_UNDEFINED;
1301 $res = false;
1302
1303 if (file_exists($dir . '/includes/version.php')) {
1304 $res = true;
1305
1306 $tmp_content = @file_get_contents($dir . '/includes/version.php');
1307 if (preg_match('|([0-9\.]+)|smi', $tmp_content, $tmp_ver)) {
1308 $version = $tmp_ver[1];
1309 }
1310
1311 }
1312
1313 return $res;
1314 }
1315
1316 private function checkDrupal($dir, &$version) {
1317 $version = CMS_VERSION_UNDEFINED;
1318 $res = false;
1319
1320 if (file_exists($dir . '/sites/all')) {
1321 $res = true;
1322
1323 $tmp_content = @file_get_contents($dir . '/CHANGELOG.txt');
1324 if (preg_match('|Drupal\s+([0-9\.]+)|smi', $tmp_content, $tmp_ver)) {
1325 $version = $tmp_ver[1];
1326 }
1327
1328 }
1329
1330 return $res;
1331 }
1332
1333 private function checkMODX($dir, &$version) {
1334 $version = CMS_VERSION_UNDEFINED;
1335 $res = false;
1336
1337 if (file_exists($dir . '/manager/assets')) {
1338 $res = true;
1339
1340 // no way to pick up version
1341 }
1342
1343 return $res;
1344 }
1345
1346 private function checkInstantCms($dir, &$version) {
1347 $version = CMS_VERSION_UNDEFINED;
1348 $res = false;
1349
1350 if (file_exists($dir . '/plugins/p_usertab')) {
1351 $res = true;
1352
1353 $tmp_content = @file_get_contents($dir . '/index.php');
1354 if (preg_match('|InstantCMS\s+v([0-9\.]+)|smi', $tmp_content, $tmp_ver)) {
1355 $version = $tmp_ver[1];
1356 }
1357
1358 }
1359
1360 return $res;
1361 }
1362
1363 private function checkPhpBb($dir, &$version) {
1364 $version = CMS_VERSION_UNDEFINED;
1365 $res = false;
1366
1367 if (file_exists($dir . '/includes/acp')) {
1368 $res = true;
1369
1370 $tmp_content = @file_get_contents($dir . '/config.php');
1371 if (preg_match('|phpBB\s+([0-9\.x]+)|smi', $tmp_content, $tmp_ver)) {
1372 $version = $tmp_ver[1];
1373 }
1374
1375 }
1376
1377 return $res;
1378 }
1379
1380 private function checkVBulletin($dir, &$version) {
1381 $version = CMS_VERSION_UNDEFINED;
1382 $res = false;
1383 if (file_exists($dir . '/core/includes/md5_sums_vbulletin.php'))
1384 {
1385 $res = true;
1386 require_once($dir . '/core/includes/md5_sums_vbulletin.php');
1387 $version = $md5_sum_versions['vb5_connect'];
1388 }
1389 else if(file_exists($dir . '/includes/md5_sums_vbulletin.php'))
1390 {
1391 $res = true;
1392 require_once($dir . '/includes/md5_sums_vbulletin.php');
1393 $version = $md5_sum_versions['vbulletin'];
1394 }
1395 return $res;
1396 }
1397
1398 private function checkPhpShopScript($dir, &$version) {
1399 $version = CMS_VERSION_UNDEFINED;
1400 $res = false;
1401
1402 if (file_exists($dir . '/install/consts.php')) {
1403 $res = true;
1404
1405 $tmp_content = @file_get_contents($dir . '/install/consts.php');
1406 if (preg_match('|STRING_VERSION\',\s*\'(.+?)\'|smi', $tmp_content, $tmp_ver)) {
1407 $version = $tmp_ver[1];
1408 }
1409
1410 }
1411
1412 return $res;
1413 }
1414}
1415
1416/**
1417 * Print file
1418*/
1419function printFile() {
1420 $l_FileName = $_GET['fn'];
1421 $l_CRC = isset($_GET['c']) ? (int)$_GET['c'] : 0;
1422 $l_Content = file_get_contents($l_FileName);
1423 $l_FileCRC = realCRC($l_Content);
1424 if ($l_FileCRC != $l_CRC) {
1425 echo 'ДоÑтуп запрещен.';
1426 exit;
1427 }
1428
1429 echo '<pre>' . htmlspecialchars($l_Content) . '</pre>';
1430}
1431
1432/**
1433 *
1434 */
1435function realCRC($str_in, $full = false)
1436{
1437 $in = crc32( $full ? normal($str_in) : $str_in );
1438 return ($in > CRC32_LIMIT) ? ($in - CRC32_DIFF) : $in;
1439}
1440
1441
1442/**
1443 * Determine php script is called from the command line interface
1444 * @return bool
1445 */
1446function isCli()
1447{
1448 return php_sapi_name() == 'cli';
1449}
1450
1451function myCheckSum($str) {
1452 return hash('crc32b', $str);
1453}
1454
1455 function generatePassword ($length = 9)
1456 {
1457
1458 // start with a blank password
1459 $password = "";
1460
1461 // define possible characters - any character in this string can be
1462 // picked for use in the password, so if you want to put vowels back in
1463 // or add special characters such as exclamation marks, this is where
1464 // you should do it
1465 $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
1466
1467 // we refer to the length of $possible a few times, so let's grab it now
1468 $maxlength = strlen($possible);
1469
1470 // check for length overflow and truncate if necessary
1471 if ($length > $maxlength) {
1472 $length = $maxlength;
1473 }
1474
1475 // set up a counter for how many characters are in the password so far
1476 $i = 0;
1477
1478 // add random characters to $password until $length is reached
1479 while ($i < $length) {
1480
1481 // pick a random character from the possible ones
1482 $char = substr($possible, mt_rand(0, $maxlength-1), 1);
1483
1484 // have we already used this character in $password?
1485 if (!strstr($password, $char)) {
1486 // no, so it's OK to add it onto the end of whatever we've already got...
1487 $password .= $char;
1488 // ... and increase the counter by one
1489 $i++;
1490 }
1491
1492 }
1493
1494 // done!
1495 return $password;
1496
1497 }
1498
1499/**
1500 * Print to console
1501 * @param mixed $text
1502 * @param bool $add_lb Add line break
1503 * @return void
1504 */
1505function stdOut($text, $add_lb = true)
1506{
1507 if (!isCli())
1508 return;
1509
1510 if (is_bool($text))
1511 {
1512 $text = $text ? 'true' : 'false';
1513 }
1514 else if (is_null($text))
1515 {
1516 $text = 'null';
1517 }
1518 if (!is_scalar($text))
1519 {
1520 $text = print_r($text, true);
1521 }
1522
1523 if (!BOOL_RESULT)
1524 {
1525 @fwrite(STDOUT, $text . ($add_lb ? "\n" : ''));
1526 }
1527}
1528
1529/**
1530 * Print progress
1531 * @param int $num Current file
1532 */
1533function printProgress($num, &$par_File)
1534{
1535 global $g_CriticalPHP, $g_Base64, $g_Phishing, $g_CriticalJS, $g_Iframer, $g_UpdatedJsonLog,
1536 $g_AddPrefix, $g_NoPrefix;
1537
1538 $total_files = $GLOBALS['g_FoundTotalFiles'];
1539 $elapsed_time = microtime(true) - START_TIME;
1540 $percent = number_format($total_files ? $num * 100 / $total_files : 0, 1);
1541 $stat = '';
1542 if ($elapsed_time >= 1)
1543 {
1544 $elapsed_seconds = round($elapsed_time, 0);
1545 $fs = floor($num / $elapsed_seconds);
1546 $left_files = $total_files - $num;
1547 if ($fs > 0)
1548 {
1549 $left_time = ($left_files / $fs); //ceil($left_files / $fs);
1550 $stat = ' [Avg: ' . round($fs,2) . ' files/s' . ($left_time > 0 ? ' Left: ' . seconds2Human($left_time) : '') . '] [Mlw:' . (count($g_CriticalPHP) + count($g_Base64)) . '|' . (count($g_CriticalJS) + count($g_Iframer) + count($g_Phishing)) . ']';
1551 }
1552 }
1553
1554 $l_FN = $g_AddPrefix . str_replace($g_NoPrefix, '', $par_File);
1555 $l_FN = substr($par_File, -60);
1556
1557 $text = "$percent% [$l_FN] $num of {$total_files}. " . $stat;
1558 $text = str_pad($text, 160, ' ', STR_PAD_RIGHT);
1559 stdOut(str_repeat(chr(8), 160) . $text, false);
1560
1561
1562 $data = array('self' => __FILE__, 'started' => AIBOLIT_START_TIME, 'updated' => time(),
1563 'progress' => $percent, 'time_elapsed' => $elapsed_seconds,
1564 'time_left' => round($left_time), 'files_left' => $left_files,
1565 'files_total' => $total_files, 'current_file' => substr($g_AddPrefix . str_replace($g_NoPrefix, '', $par_File), -160));
1566
1567 if (function_exists('aibolit_onProgressUpdate')) { aibolit_onProgressUpdate($data); }
1568
1569 if (defined('PROGRESS_LOG_FILE') &&
1570 (time() - $g_UpdatedJsonLog > 1)) {
1571 if (function_exists('json_encode')) {
1572 file_put_contents(PROGRESS_LOG_FILE, json_encode($data));
1573 } else {
1574 file_put_contents(PROGRESS_LOG_FILE, serialize($data));
1575 }
1576
1577 $g_UpdatedJsonLog = time();
1578 }
1579}
1580
1581/**
1582 * Seconds to human readable
1583 * @param int $seconds
1584 * @return string
1585 */
1586function seconds2Human($seconds)
1587{
1588 $r = '';
1589 $_seconds = floor($seconds);
1590 $ms = $seconds - $_seconds;
1591 $seconds = $_seconds;
1592 if ($hours = floor($seconds / 3600))
1593 {
1594 $r .= $hours . (isCli() ? ' h ' : ' Ñ‡Ð°Ñ ');
1595 $seconds = $seconds % 3600;
1596 }
1597
1598 if ($minutes = floor($seconds / 60))
1599 {
1600 $r .= $minutes . (isCli() ? ' m ' : ' мин ');
1601 $seconds = $seconds % 60;
1602 }
1603
1604 if ($minutes < 3) $r .= ' ' . $seconds + ($ms > 0 ? round($ms) : 0) . (isCli() ? ' s' : ' Ñек');
1605
1606 return $r;
1607}
1608
1609if (isCli())
1610{
1611
1612 $cli_options = array(
1613 'c:' => 'avdb:',
1614 'm:' => 'memory:',
1615 's:' => 'size:',
1616 'a' => 'all',
1617 'd:' => 'delay:',
1618 'l:' => 'list:',
1619 'r:' => 'report:',
1620 'f' => 'fast',
1621 'j:' => 'file:',
1622 'p:' => 'path:',
1623 'q' => 'quite',
1624 'e:' => 'cms:',
1625 'x:' => 'mode:',
1626 'k:' => 'skip:',
1627 'i:' => 'idb:',
1628 'n' => 'sc',
1629 'o:' => 'json_report:',
1630 't:' => 'php_report:',
1631 'z:' => 'progress:',
1632 'g:' => 'handler:',
1633 'b' => 'smart',
1634 'h' => 'help',
1635 );
1636
1637 $cli_longopts = array(
1638 'avdb:',
1639 'cmd:',
1640 'noprefix:',
1641 'addprefix:',
1642 'scan:',
1643 'one-pass',
1644 'smart',
1645 'quarantine',
1646 'with-2check',
1647 'skip-cache',
1648 'imake',
1649 'icheck'
1650 );
1651
1652 $cli_longopts = array_merge($cli_longopts, array_values($cli_options));
1653
1654 $options = getopt(implode('', array_keys($cli_options)), $cli_longopts);
1655
1656 if (isset($options['h']) OR isset($options['help']))
1657 {
1658 $memory_limit = ini_get('memory_limit');
1659 echo <<<HELP
1660AI-Bolit - Professional Malware File Scanner.
1661
1662Usage: php {$_SERVER['PHP_SELF']} [OPTIONS] [PATH]
1663Current default path is: {$defaults['path']}
1664
1665 -j, --file=FILE Full path to single file to check
1666 -l, --list=FILE Full path to create plain text file with a list of found malware
1667 -o, --json_report=FILE Full path to create json-file with a list of found malware
1668 -p, --path=PATH Directory path to scan, by default the file directory is used
1669 Current path: {$defaults['path']}
1670 -m, --memory=SIZE Maximum amount of memory a script may consume. Current value: $memory_limit
1671 Can take shorthand byte values (1M, 1G...)
1672 -s, --size=SIZE Scan files are smaller than SIZE. 0 - All files. Current value: {$defaults['max_size_to_scan']}
1673 -a, --all Scan all files (by default scan. js,. php,. html,. htaccess)
1674 -d, --delay=INT Delay in milliseconds when scanning files to reduce load on the file system (Default: 1)
1675 -x, --mode=INT Set scan mode. 0 - for basic, 1 - for expert and 2 for paranoic.
1676 -k, --skip=jpg,... Skip specific extensions. E.g. --skip=jpg,gif,png,xls,pdf
1677 --scan=php,... Scan only specific extensions. E.g. --scan=php,htaccess,js
1678 -r, --report=PATH/EMAILS
1679 -z, --progress=FILE Runtime progress of scanning, saved to the file, full path required.
1680 -g, --hander=FILE External php handler for different events, full path to php file required.
1681 --cmd="command [args...]"
1682 --smart Enable smart mode (skip cache files and optimize scanning)
1683 Run command after scanning
1684 --one-pass Do not calculate remaining time
1685 --quarantine Archive all malware from report
1686 --with-2check Create or use AI-BOLIT-DOUBLECHECK.php file
1687 --imake
1688 --icheck
1689 --idb=file Integrity Check database file
1690
1691 --help Display this help and exit
1692
1693* Mandatory arguments listed below are required for both full and short way of usage.
1694
1695HELP;
1696 exit;
1697 }
1698
1699 $l_FastCli = false;
1700
1701 if (
1702 (isset($options['memory']) AND !empty($options['memory']) AND ($memory = $options['memory']))
1703 OR (isset($options['m']) AND !empty($options['m']) AND ($memory = $options['m']))
1704 )
1705 {
1706 $memory = getBytes($memory);
1707 if ($memory > 0)
1708 {
1709 $defaults['memory_limit'] = $memory;
1710 ini_set('memory_limit', $memory);
1711 }
1712 }
1713
1714
1715 $avdb = '';
1716 if (
1717 (isset($options['avdb']) AND !empty($options['avdb']) AND ($avdb = $options['avdb']))
1718 OR (isset($options['c']) AND !empty($options['c']) AND ($avdb = $options['c']))
1719 )
1720 {
1721 if (file_exists($avdb))
1722 {
1723 $defaults['avdb'] = $avdb;
1724 }
1725 }
1726
1727 if (
1728 (isset($options['file']) AND !empty($options['file']) AND ($file = $options['file']) !== false)
1729 OR (isset($options['j']) AND !empty($options['j']) AND ($file = $options['j']) !== false)
1730 )
1731 {
1732 define('SCAN_FILE', $file);
1733 }
1734
1735
1736 if (
1737 (isset($options['list']) AND !empty($options['list']) AND ($file = $options['list']) !== false)
1738 OR (isset($options['l']) AND !empty($options['l']) AND ($file = $options['l']) !== false)
1739 )
1740 {
1741
1742 define('PLAIN_FILE', $file);
1743 }
1744
1745 if (
1746 (isset($options['json_report']) AND !empty($options['json_report']) AND ($file = $options['json_report']) !== false)
1747 OR (isset($options['o']) AND !empty($options['o']) AND ($file = $options['o']) !== false)
1748 )
1749 {
1750 define('JSON_FILE', $file);
1751 }
1752
1753 if (
1754 (isset($options['php_report']) AND !empty($options['php_report']) AND ($file = $options['php_report']) !== false)
1755 OR (isset($options['t']) AND !empty($options['t']) AND ($file = $options['t']) !== false)
1756 )
1757 {
1758 define('PHP_FILE', $file);
1759 }
1760
1761 if (isset($options['smart']) OR isset($options['b']))
1762 {
1763 define('SMART_SCAN', 1);
1764 }
1765
1766 if (
1767 (isset($options['handler']) AND !empty($options['handler']) AND ($file = $options['handler']) !== false)
1768 OR (isset($options['g']) AND !empty($options['g']) AND ($file = $options['g']) !== false)
1769 )
1770 {
1771 if (file_exists($file)) {
1772 define('AIBOLIT_EXTERNAL_HANDLER', $file);
1773 }
1774 }
1775
1776 if (
1777 (isset($options['progress']) AND !empty($options['progress']) AND ($file = $options['progress']) !== false)
1778 OR (isset($options['z']) AND !empty($options['z']) AND ($file = $options['z']) !== false)
1779 )
1780 {
1781 define('PROGRESS_LOG_FILE', $file);
1782 }
1783 if (
1784 (isset($options['size']) AND !empty($options['size']) AND ($size = $options['size']) !== false)
1785 OR (isset($options['s']) AND !empty($options['s']) AND ($size = $options['s']) !== false)
1786 )
1787 {
1788 $size = getBytes($size);
1789 $defaults['max_size_to_scan'] = $size > 0 ? $size : 0;
1790 }
1791
1792 if (
1793 (isset($options['file']) AND !empty($options['file']) AND ($file = $options['file']) !== false)
1794 OR (isset($options['j']) AND !empty($options['j']) AND ($file = $options['j']) !== false)
1795 AND (isset($options['q']))
1796
1797 )
1798 {
1799 $BOOL_RESULT = true;
1800 }
1801
1802 if (isset($options['f']))
1803 {
1804 $l_FastCli = true;
1805 }
1806
1807 if (isset($options['q']) || isset($options['quite']))
1808 {
1809 $BOOL_RESULT = true;
1810 }
1811
1812 define('BOOL_RESULT', $BOOL_RESULT);
1813
1814 if (
1815 (isset($options['delay']) AND !empty($options['delay']) AND ($delay = $options['delay']) !== false)
1816 OR (isset($options['d']) AND !empty($options['d']) AND ($delay = $options['d']) !== false)
1817 )
1818 {
1819 $delay = (int) $delay;
1820 if (!($delay < 0))
1821 {
1822 $defaults['scan_delay'] = $delay;
1823 }
1824 }
1825
1826 if (
1827 (isset($options['skip']) AND !empty($options['skip']) AND ($ext_list = $options['skip']) !== false)
1828 OR (isset($options['k']) AND !empty($options['k']) AND ($ext_list = $options['k']) !== false)
1829 )
1830 {
1831 $defaults['skip_ext'] = $ext_list;
1832 }
1833
1834 if (isset($options['n']) OR isset($options['skip-cache']))
1835 {
1836 $defaults['skip_cache'] = true;
1837 }
1838
1839 if (isset($options['all']) OR isset($options['a']))
1840 {
1841 $defaults['scan_all_files'] = 1;
1842 }
1843
1844 if (isset($options['scan']))
1845 {
1846 $ext_list = strtolower(trim($options['scan'], " ,\t\n\r\0\x0B"));
1847 if ($ext_list != '')
1848 {
1849 $l_FastCli = true;
1850 $g_SensitiveFiles = explode(",", $ext_list);
1851 for ($i = 0; $i < count($g_SensitiveFiles); $i++) {
1852 if ($g_SensitiveFiles[$i] == '.') {
1853 $g_SensitiveFiles[$i] = '';
1854 }
1855 }
1856
1857 stdOut("Scan extensions: " . implode(',', $g_SensitiveFiles));
1858 $g_SpecificExt = true;
1859 }
1860 }
1861
1862
1863 if (isset($options['cms'])) {
1864 define('CMS', $options['cms']);
1865 } else if (isset($options['e'])) {
1866 define('CMS', $options['e']);
1867 }
1868
1869 if (isset($options['x'])) {
1870 define('AI_EXPERT', $options['x']);
1871 } else if (isset($options['mode'])) {
1872 define('AI_EXPERT', $options['mode']);
1873 } else {
1874 define('AI_EXPERT', AI_EXPERT_MODE);
1875 }
1876
1877 if (!defined('SMART_SCAN')) {
1878 define('SMART_SCAN', 1);
1879 }
1880
1881
1882 $l_SpecifiedPath = false;
1883 if (
1884 (isset($options['path']) AND !empty($options['path']) AND ($path = $options['path']) !== false)
1885 OR (isset($options['p']) AND !empty($options['p']) AND ($path = $options['p']) !== false)
1886 )
1887 {
1888 $defaults['path'] = $path;
1889 $l_SpecifiedPath = true;
1890 }
1891
1892 if (
1893 isset($options['noprefix']) AND !empty($options['noprefix']) AND ($g_NoPrefix = $options['noprefix']) !== false)
1894
1895 {
1896 } else {
1897 $g_NoPrefix = '';
1898 }
1899
1900 if (
1901 isset($options['addprefix']) AND !empty($options['addprefix']) AND ($g_AddPrefix = $options['addprefix']) !== false)
1902
1903 {
1904 } else {
1905 $g_AddPrefix = '';
1906 }
1907
1908
1909
1910 $l_SuffixReport = str_replace('/var/www', '', $defaults['path']);
1911 $l_SuffixReport = str_replace('/home', '', $l_SuffixReport);
1912 $l_SuffixReport = preg_replace('#[/\\\.\s]#', '_', $l_SuffixReport);
1913 $l_SuffixReport .= "-" . rand(1, 999999);
1914
1915 if (
1916 (isset($options['report']) AND ($report = $options['report']) !== false)
1917 OR (isset($options['r']) AND ($report = $options['r']) !== false)
1918 )
1919 {
1920 $report = str_replace('@PATH@', $l_SuffixReport, $report);
1921 $report = str_replace('@RND@', rand(1, 999999), $report);
1922 $report = str_replace('@DATE@', date('d-m-Y-h-i'), $report);
1923 define('REPORT', $report);
1924 define('NEED_REPORT', true);
1925 }
1926
1927 if (
1928 (isset($options['idb']) AND ($ireport = $options['idb']) !== false)
1929 )
1930 {
1931 $ireport = str_replace('@PATH@', $l_SuffixReport, $ireport);
1932 $ireport = str_replace('@RND@', rand(1, 999999), $ireport);
1933 $ireport = str_replace('@DATE@', date('d-m-Y-h-i'), $ireport);
1934 define('INTEGRITY_DB_FILE', $ireport);
1935 }
1936
1937
1938 $l_ReportDirName = dirname($report);
1939 define('QUEUE_FILENAME', ($l_ReportDirName != '' ? $l_ReportDirName . '/' : '') . 'AI-BOLIT-QUEUE-' . md5($defaults['path']) . '.txt');
1940
1941 defined('REPORT') OR define('REPORT', 'AI-BOLIT-REPORT-' . $l_SuffixReport . '-' . date('d-m-Y_H-i') . '.html');
1942
1943 defined('INTEGRITY_DB_FILE') OR define('INTEGRITY_DB_FILE', 'AINTEGRITY-' . $l_SuffixReport . '-' . date('d-m-Y_H-i'));
1944
1945 $last_arg = max(1, sizeof($_SERVER['argv']) - 1);
1946 if (isset($_SERVER['argv'][$last_arg]))
1947 {
1948 $path = $_SERVER['argv'][$last_arg];
1949 if (
1950 substr($path, 0, 1) != '-'
1951 AND (substr($_SERVER['argv'][$last_arg - 1], 0, 1) != '-' OR array_key_exists(substr($_SERVER['argv'][$last_arg - 1], -1), $cli_options)))
1952 {
1953 $defaults['path'] = $path;
1954 }
1955 }
1956
1957
1958 define('ONE_PASS', isset($options['one-pass']));
1959
1960 define('IMAKE', isset($options['imake']));
1961 define('ICHECK', isset($options['icheck']));
1962
1963 if (IMAKE && ICHECK) die('One of the following options must be used --imake or --icheck.');
1964
1965} else {
1966 define('AI_EXPERT', AI_EXPERT_MODE);
1967 define('ONE_PASS', true);
1968}
1969
1970
1971if (isset($defaults['avdb']) && file_exists($defaults['avdb'])) {
1972 $avdb = explode("\n", gzinflate(base64_decode(str_rot13(strrev(trim(file_get_contents($defaults['avdb'])))))));
1973
1974 $g_DBShe = explode("\n", base64_decode($avdb[0]));
1975 $gX_DBShe = explode("\n", base64_decode($avdb[1]));
1976 $g_FlexDBShe = explode("\n", base64_decode($avdb[2]));
1977 $gX_FlexDBShe = explode("\n", base64_decode($avdb[3]));
1978 $gXX_FlexDBShe = explode("\n", base64_decode($avdb[4]));
1979 $g_ExceptFlex = explode("\n", base64_decode($avdb[5]));
1980 $g_AdwareSig = explode("\n", base64_decode($avdb[6]));
1981 $g_PhishingSig = explode("\n", base64_decode($avdb[7]));
1982 $g_JSVirSig = explode("\n", base64_decode($avdb[8]));
1983 $gX_JSVirSig = explode("\n", base64_decode($avdb[9]));
1984 $g_SusDB = explode("\n", base64_decode($avdb[10]));
1985 $g_SusDBPrio = explode("\n", base64_decode($avdb[11]));
1986 $g_DeMapper = array_combine(explode("\n", base64_decode($avdb[12])), explode("\n", base64_decode($avdb[13])));
1987
1988 if (count($g_DBShe) <= 1) {
1989 $g_DBShe = array();
1990 }
1991
1992 if (count($gX_DBShe) <= 1) {
1993 $gX_DBShe = array();
1994 }
1995
1996 if (count($g_FlexDBShe) <= 1) {
1997 $g_FlexDBShe = array();
1998 }
1999
2000 if (count($gX_FlexDBShe) <= 1) {
2001 $gX_FlexDBShe = array();
2002 }
2003
2004 if (count($gXX_FlexDBShe) <= 1) {
2005 $gXX_FlexDBShe = array();
2006 }
2007
2008 if (count($g_ExceptFlex) <= 1) {
2009 $g_ExceptFlex = array();
2010 }
2011
2012 if (count($g_AdwareSig) <= 1) {
2013 $g_AdwareSig = array();
2014 }
2015
2016 if (count($g_PhishingSig) <= 1) {
2017 $g_PhishingSig = array();
2018 }
2019
2020 if (count($gX_JSVirSig) <= 1) {
2021 $gX_JSVirSig = array();
2022 }
2023
2024 if (count($g_JSVirSig) <= 1) {
2025 $g_JSVirSig = array();
2026 }
2027
2028 if (count($g_SusDB) <= 1) {
2029 $g_SusDB = array();
2030 }
2031
2032 if (count($g_SusDBPrio) <= 1) {
2033 $g_SusDBPrio = array();
2034 }
2035
2036 stdOut('Loaded external signatures from ' . $defaults['avdb']);
2037}
2038
2039// use only basic signature subset
2040if (AI_EXPERT < 2) {
2041 $gX_FlexDBShe = array();
2042 $gXX_FlexDBShe = array();
2043 $gX_JSVirSig = array();
2044}
2045
2046stdOut('Malware signatures: ' . (count($g_JSVirSig) + count($gX_JSVirSig) + count($g_DBShe) + count($gX_DBShe) + count($gX_DBShe) + count($g_FlexDBShe) + count($gX_FlexDBShe) + count($gXX_FlexDBShe)));
2047
2048if (!DEBUG_PERFORMANCE) {
2049 OptimizeSignatures();
2050}
2051
2052$g_DBShe = array_map('strtolower', $g_DBShe);
2053$gX_DBShe = array_map('strtolower', $gX_DBShe);
2054
2055if (!defined('PLAIN_FILE')) { define('PLAIN_FILE', ''); }
2056
2057// Init
2058define('MAX_ALLOWED_PHP_HTML_IN_DIR', 600);
2059define('BASE64_LENGTH', 69);
2060define('MAX_PREVIEW_LEN', 80);
2061define('MAX_EXT_LINKS', 1001);
2062
2063if (defined('AIBOLIT_EXTERNAL_HANDLER')) {
2064 include_once(AIBOLIT_EXTERNAL_HANDLER);
2065 stdOut("\nLoaded external handler: " . AIBOLIT_EXTERNAL_HANDLER . "\n");
2066 if (function_exists("aibolit_onStart")) { aibolit_onStart(); }
2067}
2068
2069// Perform full scan when running from command line
2070if (isCli() || isset($_GET['full'])) {
2071 $defaults['scan_all_files'] = 1;
2072}
2073
2074if ($l_FastCli) {
2075 $defaults['scan_all_files'] = 0;
2076}
2077
2078if (!isCli()) {
2079 define('ICHECK', isset($_GET['icheck']));
2080 define('IMAKE', isset($_GET['imake']));
2081
2082 define('INTEGRITY_DB_FILE', 'ai-integrity-db');
2083}
2084
2085define('SCAN_ALL_FILES', (bool) $defaults['scan_all_files']);
2086define('SCAN_DELAY', (int) $defaults['scan_delay']);
2087define('MAX_SIZE_TO_SCAN', getBytes($defaults['max_size_to_scan']));
2088
2089if ($defaults['memory_limit'] AND ($defaults['memory_limit'] = getBytes($defaults['memory_limit'])) > 0) {
2090 ini_set('memory_limit', $defaults['memory_limit']);
2091 stdOut("Changed memory limit to " . $defaults['memory_limit']);
2092}
2093
2094define('ROOT_PATH', realpath($defaults['path']));
2095
2096if (!ROOT_PATH)
2097{
2098 if (isCli()) {
2099 die(stdOut("Directory '{$defaults['path']}' not found!"));
2100 }
2101}
2102elseif(!is_readable(ROOT_PATH))
2103{
2104 if (isCli()) {
2105 die2(stdOut("Cannot read directory '" . ROOT_PATH . "'!"));
2106 }
2107}
2108
2109define('CURRENT_DIR', getcwd());
2110chdir(ROOT_PATH);
2111
2112// ПроверÑем отчет
2113if (isCli() AND REPORT !== '' AND !getEmails(REPORT))
2114{
2115 $report = str_replace('\\', '/', REPORT);
2116 $abs = strpos($report, '/') === 0 ? DIR_SEPARATOR : '';
2117 $report = array_values(array_filter(explode('/', $report)));
2118 $report_file = array_pop($report);
2119 $report_path = realpath($abs . implode(DIR_SEPARATOR, $report));
2120
2121 define('REPORT_FILE', $report_file);
2122 define('REPORT_PATH', $report_path);
2123
2124 if (REPORT_FILE AND REPORT_PATH AND is_file(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE))
2125 {
2126 @unlink(REPORT_PATH . DIR_SEPARATOR . REPORT_FILE);
2127 }
2128}
2129
2130
2131if (function_exists('phpinfo')) {
2132 ob_start();
2133 phpinfo();
2134 $l_PhpInfo = ob_get_contents();
2135 ob_end_clean();
2136
2137 $l_PhpInfo = str_replace('border: 1px', '', $l_PhpInfo);
2138 preg_match('|<body>(.*)</body>|smi', $l_PhpInfo, $l_PhpInfoBody);
2139}
2140
2141////////////////////////////////////////////////////////////////////////////
2142$l_Template = str_replace("@@MODE@@", AI_EXPERT . '/' . SMART_SCAN, $l_Template);
2143
2144if (AI_EXPERT == 0) {
2145 $l_Result .= '<div class="rep">' . AI_STR_057 . '</div>';
2146} else {
2147}
2148
2149$l_Template = str_replace('@@HEAD_TITLE@@', AI_STR_051 . $g_AddPrefix . str_replace($g_NoPrefix, '', ROOT_PATH), $l_Template);
2150
2151define('QCR_INDEX_FILENAME', 'fn');
2152define('QCR_INDEX_TYPE', 'type');
2153define('QCR_INDEX_WRITABLE', 'wr');
2154define('QCR_SVALUE_FILE', '1');
2155define('QCR_SVALUE_FOLDER', '0');
2156
2157/**
2158 * Extract emails from the string
2159 * @param string $email
2160 * @return array of strings with emails or false on error
2161 */
2162function getEmails($email)
2163{
2164 $email = preg_split('#[,\s;]#', $email, -1, PREG_SPLIT_NO_EMPTY);
2165 $r = array();
2166 for ($i = 0, $size = sizeof($email); $i < $size; $i++)
2167 {
2168 if (function_exists('filter_var')) {
2169 if (filter_var($email[$i], FILTER_VALIDATE_EMAIL))
2170 {
2171 $r[] = $email[$i];
2172 }
2173 } else {
2174 // for PHP4
2175 if (strpos($email[$i], '@') !== false) {
2176 $r[] = $email[$i];
2177 }
2178 }
2179 }
2180 return empty($r) ? false : $r;
2181}
2182
2183/**
2184 * Get bytes from shorthand byte values (1M, 1G...)
2185 * @param int|string $val
2186 * @return int
2187 */
2188function getBytes($val)
2189{
2190 $val = trim($val);
2191 $last = strtolower($val{strlen($val) - 1});
2192 switch($last) {
2193 case 't':
2194 $val *= 1024;
2195 case 'g':
2196 $val *= 1024;
2197 case 'm':
2198 $val *= 1024;
2199 case 'k':
2200 $val *= 1024;
2201 }
2202 return intval($val);
2203}
2204
2205/**
2206 * Format bytes to human readable
2207 * @param int $bites
2208 * @return string
2209 */
2210function bytes2Human($bites)
2211{
2212 if ($bites < 1024)
2213 {
2214 return $bites . ' b';
2215 }
2216 elseif (($kb = $bites / 1024) < 1024)
2217 {
2218 return number_format($kb, 2) . ' Kb';
2219 }
2220 elseif (($mb = $kb / 1024) < 1024)
2221 {
2222 return number_format($mb, 2) . ' Mb';
2223 }
2224 elseif (($gb = $mb / 1024) < 1024)
2225 {
2226 return number_format($gb, 2) . ' Gb';
2227 }
2228 else
2229 {
2230 return number_format($gb / 1024, 2) . 'Tb';
2231 }
2232}
2233
2234///////////////////////////////////////////////////////////////////////////
2235function needIgnore($par_FN, $par_CRC) {
2236 global $g_IgnoreList;
2237
2238 for ($i = 0; $i < count($g_IgnoreList); $i++) {
2239 if (strpos($par_FN, $g_IgnoreList[$i][0]) !== false) {
2240 if ($par_CRC == $g_IgnoreList[$i][1]) {
2241 return true;
2242 }
2243 }
2244 }
2245
2246 return false;
2247}
2248
2249///////////////////////////////////////////////////////////////////////////
2250function makeSafeFn($par_Str, $replace_path = false) {
2251 global $g_AddPrefix, $g_NoPrefix;
2252 if ($replace_path) {
2253 $lines = explode("\n", $par_Str);
2254 array_walk($lines, function(&$n) {
2255 global $g_AddPrefix, $g_NoPrefix;
2256 $n = $g_AddPrefix . str_replace($g_NoPrefix, '', $n);
2257 });
2258
2259 $par_Str = implode("\n", $lines);
2260 }
2261
2262 return htmlspecialchars($par_Str, ENT_SUBSTITUTE | ENT_QUOTES);
2263}
2264
2265function replacePathArray($par_Arr) {
2266 global $g_AddPrefix, $g_NoPrefix;
2267 array_walk($par_Arr, function(&$n) {
2268 global $g_AddPrefix, $g_NoPrefix;
2269 $n = $g_AddPrefix . str_replace($g_NoPrefix, '', $n);
2270 });
2271
2272 return $par_Arr;
2273}
2274
2275///////////////////////////////////////////////////////////////////////////
2276function getRawJsonVuln($par_List) {
2277 global $g_Structure, $g_NoPrefix, $g_AddPrefix;
2278 $results = array();
2279 $l_Src = array('"', '<', '>', '&', ''', '<' . '?php.');
2280 $l_Dst = array('"', '<', '>', '&', '\'', '<' . '?php ');
2281
2282 for ($i = 0; $i < count($par_List); $i++) {
2283 $l_Pos = $par_List[$i]['ndx'];
2284 $res['fn'] = $g_AddPrefix . str_replace($g_NoPrefix, '', $g_Structure['n'][$l_Pos]);
2285 $res['sig'] = $par_List[$i]['id'];
2286
2287 $res['ct'] = $g_Structure['c'][$l_Pos];
2288 $res['mt'] = $g_Structure['m'][$l_Pos];
2289 $res['sz'] = $g_Structure['s'][$l_Pos];
2290 $res['sigid'] = 'vuln_' . md5($g_Structure['n'][$l_Pos] . $par_List[$i]['id']);
2291
2292 $results[] = $res;
2293 }
2294
2295 return $results;
2296}
2297
2298///////////////////////////////////////////////////////////////////////////
2299function getRawJson($par_List, $par_Details = null, $par_SigId = null) {
2300 global $g_Structure, $g_NoPrefix, $g_AddPrefix;
2301 $results = array();
2302 $l_Src = array('"', '<', '>', '&', ''', '<' . '?php.');
2303 $l_Dst = array('"', '<', '>', '&', '\'', '<' . '?php ');
2304
2305 for ($i = 0; $i < count($par_List); $i++) {
2306 if ($par_SigId != null) {
2307 $l_SigId = 'id_' . $par_SigId[$i];
2308 } else {
2309 $l_SigId = 'id_n' . rand(1000000, 9000000);
2310 }
2311
2312
2313
2314 $l_Pos = $par_List[$i];
2315 $res['fn'] = $g_AddPrefix . str_replace($g_NoPrefix, '', $g_Structure['n'][$l_Pos]);
2316 if ($par_Details != null) {
2317 $res['sig'] = preg_replace('|(L\d+).+__AI_MARKER__|smi', '[$1]: ...', $par_Details[$i]);
2318 $res['sig'] = preg_replace('/[^\x20-\x7F]/', '.', $res['sig']);
2319 $res['sig'] = preg_replace('/__AI_LINE1__(\d+)__AI_LINE2__/', '[$1] ', $res['sig']);
2320 $res['sig'] = preg_replace('/__AI_MARKER__/', ' @!!!>', $res['sig']);
2321 $res['sig'] = str_replace($l_Src, $l_Dst, $res['sig']);
2322 }
2323
2324 $res['ct'] = $g_Structure['c'][$l_Pos];
2325 $res['mt'] = $g_Structure['m'][$l_Pos];
2326 $res['sz'] = $g_Structure['s'][$l_Pos];
2327 $res['sigid'] = $l_SigId;
2328
2329 $results[] = $res;
2330 }
2331
2332 return $results;
2333}
2334
2335///////////////////////////////////////////////////////////////////////////
2336function printList($par_List, $par_Details = null, $par_NeedIgnore = false, $par_SigId = null, $par_TableName = null) {
2337 global $g_Structure, $g_NoPrefix, $g_AddPrefix;
2338
2339 $i = 0;
2340
2341 if ($par_TableName == null) {
2342 $par_TableName = 'table_' . rand(1000000,9000000);
2343 }
2344
2345 $l_Result = '';
2346 $l_Result .= "<div class=\"flist\"><table cellspacing=1 cellpadding=4 border=0 id=\"" . $par_TableName . "\">";
2347
2348 $l_Result .= "<thead><tr class=\"tbgh" . ( $i % 2 ). "\">";
2349 $l_Result .= "<th width=70%>" . AI_STR_004 . "</th>";
2350 $l_Result .= "<th>" . AI_STR_005 . "</th>";
2351 $l_Result .= "<th>" . AI_STR_006 . "</th>";
2352 $l_Result .= "<th width=90>" . AI_STR_007 . "</th>";
2353 $l_Result .= "<th width=0 class=\"hidd\">CRC32</th>";
2354 $l_Result .= "<th width=0 class=\"hidd\"></th>";
2355 $l_Result .= "<th width=0 class=\"hidd\"></th>";
2356 $l_Result .= "<th width=0 class=\"hidd\"></th>";
2357
2358 $l_Result .= "</tr></thead><tbody>";
2359
2360 for ($i = 0; $i < count($par_List); $i++) {
2361 if ($par_SigId != null) {
2362 $l_SigId = 'id_' . $par_SigId[$i];
2363 } else {
2364 $l_SigId = 'id_z' . rand(1000000,9000000);
2365 }
2366
2367 $l_Pos = $par_List[$i];
2368 if ($par_NeedIgnore) {
2369 if (needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
2370 continue;
2371 }
2372 }
2373
2374 $l_Creat = $g_Structure['c'][$l_Pos] > 0 ? date("d/m/Y H:i:s", $g_Structure['c'][$l_Pos]) : '-';
2375 $l_Modif = $g_Structure['m'][$l_Pos] > 0 ? date("d/m/Y H:i:s", $g_Structure['m'][$l_Pos]) : '-';
2376 $l_Size = $g_Structure['s'][$l_Pos] > 0 ? bytes2Human($g_Structure['s'][$l_Pos]) : '-';
2377
2378 if ($par_Details != null) {
2379 $l_WithMarker = preg_replace('|__AI_MARKER__|smi', '<span class="marker"> </span>', $par_Details[$i]);
2380 $l_WithMarker = preg_replace('|__AI_LINE1__|smi', '<span class="line_no">', $l_WithMarker);
2381 $l_WithMarker = preg_replace('|__AI_LINE2__|smi', '</span>', $l_WithMarker);
2382
2383 $l_Body = '<div class="details">';
2384
2385 if ($par_SigId != null) {
2386 $l_Body .= '<a href="#" onclick="return hsig(\'' . $l_SigId . '\')">[x]</a> ';
2387 }
2388
2389 $l_Body .= $l_WithMarker . '</div>';
2390 } else {
2391 $l_Body = '';
2392 }
2393
2394 $l_Result .= '<tr class="tbg' . ( $i % 2 ). '" o="' . $l_SigId .'">';
2395
2396 if (is_file($g_Structure['n'][$l_Pos])) {
2397// $l_Result .= '<td><div class="it"><a class="it" target="_blank" href="'. $defaults['site_url'] . 'ai-bolit.php?fn=' .
2398// $g_Structure['n'][$l_Pos] . '&ph=' . realCRC(PASS) . '&c=' . $g_Structure['crc'][$l_Pos] . '">' . $g_Structure['n'][$l_Pos] . '</a></div>' . $l_Body . '</td>';
2399 $l_Result .= '<td><div class="it"><a class="it">' . makeSafeFn($g_AddPrefix . str_replace($g_NoPrefix, '', $g_Structure['n'][$l_Pos])) . '</a></div>' . $l_Body . '</td>';
2400 } else {
2401 $l_Result .= '<td><div class="it"><a class="it">' . makeSafeFn($g_AddPrefix . str_replace($g_NoPrefix, '', $g_Structure['n'][$par_List[$i]])) . '</a></div></td>';
2402 }
2403
2404 $l_Result .= '<td align=center><div class="ctd">' . $l_Creat . '</div></td>';
2405 $l_Result .= '<td align=center><div class="ctd">' . $l_Modif . '</div></td>';
2406 $l_Result .= '<td align=center><div class="ctd">' . $l_Size . '</div></td>';
2407 $l_Result .= '<td class="hidd"><div class="hidd">' . $g_Structure['crc'][$l_Pos] . '</div></td>';
2408 $l_Result .= '<td class="hidd"><div class="hidd">' . 'x' . '</div></td>';
2409 $l_Result .= '<td class="hidd"><div class="hidd">' . $g_Structure['m'][$l_Pos] . '</div></td>';
2410 $l_Result .= '<td class="hidd"><div class="hidd">' . $l_SigId . '</div></td>';
2411 $l_Result .= '</tr>';
2412
2413 }
2414
2415 $l_Result .= "</tbody></table></div><div class=clear style=\"margin: 20px 0 0 0\"></div>";
2416
2417 return $l_Result;
2418}
2419
2420///////////////////////////////////////////////////////////////////////////
2421function printPlainList($par_List, $par_Details = null, $par_NeedIgnore = false, $par_SigId = null, $par_TableName = null) {
2422 global $g_Structure, $g_NoPrefix, $g_AddPrefix;
2423
2424 $l_Result = "";
2425
2426 $l_Src = array('"', '<', '>', '&', ''');
2427 $l_Dst = array('"', '<', '>', '&', '\'');
2428
2429 for ($i = 0; $i < count($par_List); $i++) {
2430 $l_Pos = $par_List[$i];
2431 if ($par_NeedIgnore) {
2432 if (needIgnore($g_Structure['n'][$par_List[$i]], $g_Structure['crc'][$l_Pos])) {
2433 continue;
2434 }
2435 }
2436
2437
2438 if ($par_Details != null) {
2439
2440 $l_Body = preg_replace('|(L\d+).+__AI_MARKER__|smi', '$1: ...', $par_Details[$i]);
2441 $l_Body = preg_replace('/[^\x20-\x7F]/', '.', $l_Body);
2442 $l_Body = str_replace($l_Src, $l_Dst, $l_Body);
2443
2444 } else {
2445 $l_Body = '';
2446 }
2447
2448 if (is_file($g_Structure['n'][$l_Pos])) {
2449 $l_Result .= $g_AddPrefix . str_replace($g_NoPrefix, '', $g_Structure['n'][$l_Pos]) . "\t\t\t" . $l_Body . "\n";
2450 } else {
2451 $l_Result .= $g_AddPrefix . str_replace($g_NoPrefix, '', $g_Structure['n'][$par_List[$i]]) . "\n";
2452 }
2453
2454 }
2455
2456 return $l_Result;
2457}
2458
2459///////////////////////////////////////////////////////////////////////////
2460function extractValue(&$par_Str, $par_Name) {
2461 if (preg_match('|<tr><td class="e">\s*'.$par_Name.'\s*</td><td class="v">(.+?)</td>|sm', $par_Str, $l_Result)) {
2462 return str_replace('no value', '', strip_tags($l_Result[1]));
2463 }
2464}
2465
2466///////////////////////////////////////////////////////////////////////////
2467function QCR_ExtractInfo($par_Str) {
2468 $l_PhpInfoSystem = extractValue($par_Str, 'System');
2469 $l_PhpPHPAPI = extractValue($par_Str, 'Server API');
2470 $l_AllowUrlFOpen = extractValue($par_Str, 'allow_url_fopen');
2471 $l_AllowUrlInclude = extractValue($par_Str, 'allow_url_include');
2472 $l_DisabledFunction = extractValue($par_Str, 'disable_functions');
2473 $l_DisplayErrors = extractValue($par_Str, 'display_errors');
2474 $l_ErrorReporting = extractValue($par_Str, 'error_reporting');
2475 $l_ExposePHP = extractValue($par_Str, 'expose_php');
2476 $l_LogErrors = extractValue($par_Str, 'log_errors');
2477 $l_MQGPC = extractValue($par_Str, 'magic_quotes_gpc');
2478 $l_MQRT = extractValue($par_Str, 'magic_quotes_runtime');
2479 $l_OpenBaseDir = extractValue($par_Str, 'open_basedir');
2480 $l_RegisterGlobals = extractValue($par_Str, 'register_globals');
2481 $l_SafeMode = extractValue($par_Str, 'safe_mode');
2482
2483
2484 $l_DisabledFunction = ($l_DisabledFunction == '' ? '-?-' : $l_DisabledFunction);
2485 $l_OpenBaseDir = ($l_OpenBaseDir == '' ? '-?-' : $l_OpenBaseDir);
2486
2487 $l_Result = '<div class="title">' . AI_STR_008 . ': ' . phpversion() . '</div>';
2488 $l_Result .= 'System Version: <span class="php_ok">' . $l_PhpInfoSystem . '</span><br/>';
2489 $l_Result .= 'PHP API: <span class="php_ok">' . $l_PhpPHPAPI. '</span><br/>';
2490 $l_Result .= 'allow_url_fopen: <span class="php_' . ($l_AllowUrlFOpen == 'On' ? 'bad' : 'ok') . '">' . $l_AllowUrlFOpen. '</span><br/>';
2491 $l_Result .= 'allow_url_include: <span class="php_' . ($l_AllowUrlInclude == 'On' ? 'bad' : 'ok') . '">' . $l_AllowUrlInclude. '</span><br/>';
2492 $l_Result .= 'disable_functions: <span class="php_' . ($l_DisabledFunction == '-?-' ? 'bad' : 'ok') . '">' . $l_DisabledFunction. '</span><br/>';
2493 $l_Result .= 'display_errors: <span class="php_' . ($l_DisplayErrors == 'On' ? 'ok' : 'bad') . '">' . $l_DisplayErrors. '</span><br/>';
2494 $l_Result .= 'error_reporting: <span class="php_ok">' . $l_ErrorReporting. '</span><br/>';
2495 $l_Result .= 'expose_php: <span class="php_' . ($l_ExposePHP == 'On' ? 'bad' : 'ok') . '">' . $l_ExposePHP. '</span><br/>';
2496 $l_Result .= 'log_errors: <span class="php_' . ($l_LogErrors == 'On' ? 'ok' : 'bad') . '">' . $l_LogErrors . '</span><br/>';
2497 $l_Result .= 'magic_quotes_gpc: <span class="php_' . ($l_MQGPC == 'On' ? 'ok' : 'bad') . '">' . $l_MQGPC. '</span><br/>';
2498 $l_Result .= 'magic_quotes_runtime: <span class="php_' . ($l_MQRT == 'On' ? 'bad' : 'ok') . '">' . $l_MQRT. '</span><br/>';
2499 $l_Result .= 'register_globals: <span class="php_' . ($l_RegisterGlobals == 'On' ? 'bad' : 'ok') . '">' . $l_RegisterGlobals . '</span><br/>';
2500 $l_Result .= 'open_basedir: <span class="php_' . ($l_OpenBaseDir == '-?-' ? 'bad' : 'ok') . '">' . $l_OpenBaseDir . '</span><br/>';
2501
2502 if (phpversion() < '5.3.0') {
2503 $l_Result .= 'safe_mode (PHP < 5.3.0): <span class="php_' . ($l_SafeMode == 'On' ? 'ok' : 'bad') . '">' . $l_SafeMode. '</span><br/>';
2504 }
2505
2506 return $l_Result . '<p>';
2507}
2508
2509///////////////////////////////////////////////////////////////////////////
2510 function addSlash($dir) {
2511 return rtrim($dir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
2512 }
2513
2514///////////////////////////////////////////////////////////////////////////
2515function QCR_Debug($par_Str = "") {
2516 if (!DEBUG_MODE) {
2517 return;
2518 }
2519
2520 $l_MemInfo = ' ';
2521 if (function_exists('memory_get_usage')) {
2522 $l_MemInfo .= ' curmem=' . bytes2Human(memory_get_usage());
2523 }
2524
2525 if (function_exists('memory_get_peak_usage')) {
2526 $l_MemInfo .= ' maxmem=' . bytes2Human(memory_get_peak_usage());
2527 }
2528
2529 stdOut("\n" . date('H:i:s') . ': ' . $par_Str . $l_MemInfo . "\n");
2530}
2531
2532
2533///////////////////////////////////////////////////////////////////////////
2534function QCR_ScanDirectories($l_RootDir)
2535{
2536 global $g_Structure, $g_Counter, $g_Doorway, $g_FoundTotalFiles, $g_FoundTotalDirs,
2537 $defaults, $g_SkippedFolders, $g_UrlIgnoreList, $g_DirIgnoreList, $g_UnsafeDirArray,
2538 $g_UnsafeFilesFound, $g_SymLinks, $g_HiddenFiles, $g_UnixExec, $g_IgnoredExt, $g_SensitiveFiles,
2539 $g_SuspiciousFiles, $g_ShortListExt, $l_SkipSample;
2540
2541 static $l_Buffer = '';
2542
2543 $l_DirCounter = 0;
2544 $l_DoorwayFilesCounter = 0;
2545 $l_SourceDirIndex = $g_Counter - 1;
2546
2547 $l_SkipSample = array();
2548
2549 QCR_Debug('Scan ' . $l_RootDir);
2550
2551 $l_QuotedSeparator = quotemeta(DIR_SEPARATOR);
2552 if ($l_DIRH = @opendir($l_RootDir))
2553 {
2554 while (($l_FileName = readdir($l_DIRH)) !== false)
2555 {
2556 if ($l_FileName == '.' || $l_FileName == '..') continue;
2557
2558 $l_FileName = $l_RootDir . DIR_SEPARATOR . $l_FileName;
2559
2560 $l_Type = filetype($l_FileName);
2561 if ($l_Type == "link")
2562 {
2563 $g_SymLinks[] = $l_FileName;
2564 continue;
2565 } else
2566 if ($l_Type != "file" && $l_Type != "dir" ) {
2567 if (!in_array($l_FileName, $g_UnixExec)) {
2568 $g_UnixExec[] = $l_FileName;
2569 }
2570
2571 continue;
2572 }
2573
2574 $l_Ext = strtolower(pathinfo($l_FileName, PATHINFO_EXTENSION));
2575 $l_IsDir = is_dir($l_FileName);
2576
2577 if (in_array($l_Ext, $g_SuspiciousFiles))
2578 {
2579 if (!in_array($l_FileName, $g_UnixExec)) {
2580 $g_UnixExec[] = $l_FileName;
2581 }
2582 }
2583
2584 // which files should be scanned
2585 $l_NeedToScan = SCAN_ALL_FILES || (in_array($l_Ext, $g_SensitiveFiles));
2586
2587 if (in_array(strtolower($l_Ext), $g_IgnoredExt)) {
2588 $l_NeedToScan = false;
2589 }
2590
2591 // if folder in ignore list
2592 $l_Skip = false;
2593 for ($dr = 0; $dr < count($g_DirIgnoreList); $dr++) {
2594 if (($g_DirIgnoreList[$dr] != '') &&
2595 preg_match('#' . $g_DirIgnoreList[$dr] . '#', $l_FileName, $l_Found)) {
2596 if (!in_array($g_DirIgnoreList[$dr], $l_SkipSample)) {
2597 $l_SkipSample[] = $g_DirIgnoreList[$dr];
2598 } else {
2599 $l_Skip = true;
2600 $l_NeedToScan = false;
2601 }
2602 }
2603 }
2604
2605
2606 if ($l_IsDir)
2607 {
2608 // skip on ignore
2609 if ($l_Skip) {
2610 $g_SkippedFolders[] = $l_FileName;
2611 continue;
2612 }
2613
2614 $l_BaseName = basename($l_FileName);
2615
2616 if ((strpos($l_BaseName, '.') === 0) && ($l_BaseName != '.htaccess')) {
2617 $g_HiddenFiles[] = $l_FileName;
2618 }
2619
2620// $g_Structure['d'][$g_Counter] = $l_IsDir;
2621// $g_Structure['n'][$g_Counter] = $l_FileName;
2622 if (ONE_PASS) {
2623 $g_Structure['n'][$g_Counter] = $l_FileName . DIR_SEPARATOR;
2624 } else {
2625 $l_Buffer .= $l_FileName . DIR_SEPARATOR . "\n";
2626 }
2627
2628 $l_DirCounter++;
2629
2630 if ($l_DirCounter > MAX_ALLOWED_PHP_HTML_IN_DIR)
2631 {
2632 $g_Doorway[] = $l_SourceDirIndex;
2633 $l_DirCounter = -655360;
2634 }
2635
2636 $g_Counter++;
2637 $g_FoundTotalDirs++;
2638
2639 QCR_ScanDirectories($l_FileName);
2640 } else
2641 {
2642 if ($l_NeedToScan)
2643 {
2644 $g_FoundTotalFiles++;
2645 if (in_array($l_Ext, $g_ShortListExt))
2646 {
2647 $l_DoorwayFilesCounter++;
2648
2649 if ($l_DoorwayFilesCounter > MAX_ALLOWED_PHP_HTML_IN_DIR)
2650 {
2651 $g_Doorway[] = $l_SourceDirIndex;
2652 $l_DoorwayFilesCounter = -655360;
2653 }
2654 }
2655
2656 if (ONE_PASS) {
2657 QCR_ScanFile($l_FileName, $g_Counter++);
2658 } else {
2659 $l_Buffer .= $l_FileName."\n";
2660 }
2661
2662 $g_Counter++;
2663 }
2664 }
2665
2666 if (strlen($l_Buffer) > 32000)
2667 {
2668 file_put_contents(QUEUE_FILENAME, $l_Buffer, FILE_APPEND) or die2("Cannot write to file ".QUEUE_FILENAME);
2669 $l_Buffer = '';
2670 }
2671
2672 }
2673
2674 closedir($l_DIRH);
2675 }
2676
2677 if (($l_RootDir == ROOT_PATH) && !empty($l_Buffer)) {
2678 file_put_contents(QUEUE_FILENAME, $l_Buffer, FILE_APPEND) or die2("Cannot write to file " . QUEUE_FILENAME);
2679 $l_Buffer = '';
2680 }
2681
2682}
2683
2684
2685///////////////////////////////////////////////////////////////////////////
2686function getFragment($par_Content, $par_Pos) {
2687 $l_MaxChars = MAX_PREVIEW_LEN;
2688 $l_MaxLen = strlen($par_Content);
2689 $l_RightPos = min($par_Pos + $l_MaxChars, $l_MaxLen);
2690 $l_MinPos = max(0, $par_Pos - $l_MaxChars);
2691
2692 $l_FoundStart = substr($par_Content, 0, $par_Pos);
2693 $l_FoundStart = str_replace("\r", '', $l_FoundStart);
2694 $l_LineNo = strlen($l_FoundStart) - strlen(str_replace("\n", '', $l_FoundStart)) + 1;
2695
2696 $par_Content = preg_replace('/[\x00-\x1F\x80-\xFF]/', '~', $par_Content);
2697
2698 $l_Res = '__AI_LINE1__' . $l_LineNo . "__AI_LINE2__ " . ($l_MinPos > 0 ? '…' : '') . substr($par_Content, $l_MinPos, $par_Pos - $l_MinPos) .
2699 '__AI_MARKER__' . substr($par_Content, $par_Pos, $l_RightPos - $par_Pos - 1);
2700
2701 $l_Res = makeSafeFn(UnwrapObfu($l_Res));
2702 $l_Res = str_replace('~', '·', $l_Res);
2703 $l_Res = preg_replace('/\s+/smi', ' ', $l_Res);
2704 $l_Res = str_replace('' . '?php', '' . '?php ', $l_Res);
2705
2706 return $l_Res;
2707}
2708
2709///////////////////////////////////////////////////////////////////////////
2710function escapedHexToHex($escaped)
2711{ $GLOBALS['g_EncObfu']++; return chr(hexdec($escaped[1])); }
2712function escapedOctDec($escaped)
2713{ $GLOBALS['g_EncObfu']++; return chr(octdec($escaped[1])); }
2714function escapedDec($escaped)
2715{ $GLOBALS['g_EncObfu']++; return chr($escaped[1]); }
2716
2717///////////////////////////////////////////////////////////////////////////
2718if (!defined('T_ML_COMMENT')) {
2719 define('T_ML_COMMENT', T_COMMENT);
2720} else {
2721 define('T_DOC_COMMENT', T_ML_COMMENT);
2722}
2723
2724function UnwrapObfu($par_Content) {
2725 $GLOBALS['g_EncObfu'] = 0;
2726
2727 $search = array( ' ;', ' =', ' ,', ' .', ' (', ' )', ' {', ' }', '; ', '= ', ', ', '. ', '( ', '( ', '{ ', '} ', ' !', ' >', ' <', ' _', '_ ', '< ', '> ', ' $', ' %', '% ', '# ', ' #', '^ ', ' ^', ' &', '& ', ' ?', '? ');
2728 $replace = array( ';', '=', ',', '.', '(', ')', '{', '}', ';', '=', ',', '.', '(', ')', '{', '}', '!', '>', '<', '_', '_', '<', '>', '$', '%', '%', '#', '#', '^', '^', '&', '&', '?', '?');
2729 $par_Content = str_replace('@', '', $par_Content);
2730 $par_Content = preg_replace('~(\(\s*)+~', '(', $par_Content);
2731 $par_Content = preg_replace('~\s+~', ' ', $par_Content);
2732 $par_Content = str_replace($search, $replace, $par_Content);
2733 $par_Content = preg_replace_callback('~\bchr\(\s*([0-9a-fA-FxX]+)\s*\)~', function ($m) { return "'".chr(intval($m[1], 0))."'"; }, $par_Content );
2734
2735 $par_Content = preg_replace_callback('/\\\\x([a-fA-F0-9]{1,2})/i','escapedHexToHex', $par_Content);
2736 $par_Content = preg_replace_callback('/\\\\([0-9]{1,3})/i','escapedOctDec', $par_Content);
2737
2738 $par_Content = preg_replace('/[\'"]\s*?\.+\s*?[\'"]/smi', '', $par_Content);
2739 $par_Content = preg_replace('/[\'"]\s*?\++\s*?[\'"]/smi', '', $par_Content);
2740
2741 return $par_Content;
2742}
2743
2744///////////////////////////////////////////////////////////////////////////
2745// Unicode BOM is U+FEFF, but after encoded, it will look like this.
2746define ('UTF32_BIG_ENDIAN_BOM' , chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
2747define ('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
2748define ('UTF16_BIG_ENDIAN_BOM' , chr(0xFE) . chr(0xFF));
2749define ('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
2750define ('UTF8_BOM' , chr(0xEF) . chr(0xBB) . chr(0xBF));
2751
2752function detect_utf_encoding($text) {
2753 $first2 = substr($text, 0, 2);
2754 $first3 = substr($text, 0, 3);
2755 $first4 = substr($text, 0, 3);
2756
2757 if ($first3 == UTF8_BOM) return 'UTF-8';
2758 elseif ($first4 == UTF32_BIG_ENDIAN_BOM) return 'UTF-32BE';
2759 elseif ($first4 == UTF32_LITTLE_ENDIAN_BOM) return 'UTF-32LE';
2760 elseif ($first2 == UTF16_BIG_ENDIAN_BOM) return 'UTF-16BE';
2761 elseif ($first2 == UTF16_LITTLE_ENDIAN_BOM) return 'UTF-16LE';
2762
2763 return false;
2764}
2765
2766///////////////////////////////////////////////////////////////////////////
2767function QCR_SearchPHP($src)
2768{
2769 if (preg_match("/(<\?php[\w\s]{5,})/smi", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
2770 return $l_Found[0][1];
2771 }
2772
2773 if (preg_match("/(<script[^>]*language\s*=\s*)('|\"|)php('|\"|)([^>]*>)/i", $src, $l_Found, PREG_OFFSET_CAPTURE)) {
2774 return $l_Found[0][1];
2775 }
2776
2777 return false;
2778}
2779
2780
2781///////////////////////////////////////////////////////////////////////////
2782function knowUrl($par_URL) {
2783 global $g_UrlIgnoreList;
2784
2785 for ($jk = 0; $jk < count($g_UrlIgnoreList); $jk++) {
2786 if (stripos($par_URL, $g_UrlIgnoreList[$jk]) !== false) {
2787 return true;
2788 }
2789 }
2790
2791 return false;
2792}
2793
2794///////////////////////////////////////////////////////////////////////////
2795
2796function makeSummary($par_Str, $par_Number, $par_Style) {
2797 return '<tr><td class="' . $par_Style . '" width=400>' . $par_Str . '</td><td class="' . $par_Style . '">' . $par_Number . '</td></tr>';
2798}
2799
2800///////////////////////////////////////////////////////////////////////////
2801
2802function CheckVulnerability($par_Filename, $par_Index, $par_Content) {
2803 global $g_Vulnerable, $g_CmsListDetector;
2804
2805 $l_Vuln = array();
2806
2807 $par_Filename = strtolower($par_Filename);
2808
2809
2810 if (
2811 (strpos($par_Filename, 'libraries/joomla/session/session.php') !== false) &&
2812 (strpos($par_Content, '&& filter_var($_SERVER[\'HTTP_X_FORWARDED_FOR') === false)
2813 )
2814 {
2815 $l_Vuln['id'] = 'RCE : https://docs.joomla.org/Security_hotfixes_for_Joomla_EOL_versions';
2816 $l_Vuln['ndx'] = $par_Index;
2817 $g_Vulnerable[] = $l_Vuln;
2818 return true;
2819 }
2820
2821 if (
2822 (strpos($par_Filename, 'administrator/components/com_media/helpers/media.php') !== false) &&
2823 (strpos($par_Content, '$format == \'\' || $format == false ||') === false)
2824 )
2825 {
2826 if ($g_CmsListDetector->isCms(CMS_JOOMLA, '1.5')) {
2827 $l_Vuln['id'] = 'AFU : https://docs.joomla.org/Security_hotfixes_for_Joomla_EOL_versions';
2828 $l_Vuln['ndx'] = $par_Index;
2829 $g_Vulnerable[] = $l_Vuln;
2830 return true;
2831 }
2832
2833 return false;
2834 }
2835
2836 if (
2837 (strpos($par_Filename, 'joomla/filesystem/file.php') !== false) &&
2838 (strpos($par_Content, '$file = rtrim($file, \'.\');') === false)
2839 )
2840 {
2841 if ($g_CmsListDetector->isCms(CMS_JOOMLA, '1.5')) {
2842 $l_Vuln['id'] = 'AFU : https://docs.joomla.org/Security_hotfixes_for_Joomla_EOL_versions';
2843 $l_Vuln['ndx'] = $par_Index;
2844 $g_Vulnerable[] = $l_Vuln;
2845 return true;
2846 }
2847
2848 return false;
2849 }
2850
2851 if ((strpos($par_Filename, 'editor/filemanager/upload/test.html') !== false) ||
2852 (stripos($par_Filename, 'editor/filemanager/browser/default/connectors/php/') !== false) ||
2853 (stripos($par_Filename, 'editor/filemanager/connectors/uploadtest.html') !== false) ||
2854 (strpos($par_Filename, 'editor/filemanager/browser/default/connectors/test.html') !== false)) {
2855 $l_Vuln['id'] = 'AFU : FCKEDITOR : http://www.exploit-db.com/exploits/17644/ & /exploit/249';
2856 $l_Vuln['ndx'] = $par_Index;
2857 $g_Vulnerable[] = $l_Vuln;
2858 return true;
2859 }
2860
2861 if ((strpos($par_Filename, 'inc_php/image_view.class.php') !== false) ||
2862 (strpos($par_Filename, '/inc_php/framework/image_view.class.php') !== false)) {
2863 if (strpos($par_Content, 'showImageByID') === false) {
2864 $l_Vuln['id'] = 'AFU : REVSLIDER : http://www.exploit-db.com/exploits/35385/';
2865 $l_Vuln['ndx'] = $par_Index;
2866 $g_Vulnerable[] = $l_Vuln;
2867 return true;
2868 }
2869
2870 return false;
2871 }
2872
2873 if ((strpos($par_Filename, 'elfinder/php/connector.php') !== false) ||
2874 (strpos($par_Filename, 'elfinder/elfinder.') !== false)) {
2875 $l_Vuln['id'] = 'AFU : elFinder';
2876 $l_Vuln['ndx'] = $par_Index;
2877 $g_Vulnerable[] = $l_Vuln;
2878 return true;
2879 }
2880
2881 if (strpos($par_Filename, 'includes/database/database.inc') !== false) {
2882 if (strpos($par_Content, 'foreach ($data as $i => $value)') !== false) {
2883 $l_Vuln['id'] = 'SQLI : DRUPAL : CVE-2014-3704';
2884 $l_Vuln['ndx'] = $par_Index;
2885 $g_Vulnerable[] = $l_Vuln;
2886 return true;
2887 }
2888
2889 return false;
2890 }
2891
2892 if (strpos($par_Filename, 'engine/classes/min/index.php') !== false) {
2893 if (strpos($par_Content, 'tr_replace(chr(0)') === false) {
2894 $l_Vuln['id'] = 'AFD : MINIFY : CVE-2013-6619';
2895 $l_Vuln['ndx'] = $par_Index;
2896 $g_Vulnerable[] = $l_Vuln;
2897 return true;
2898 }
2899
2900 return false;
2901 }
2902
2903 if (( strpos($par_Filename, 'timthumb.php') !== false ) ||
2904 ( strpos($par_Filename, 'thumb.php') !== false ) ||
2905 ( strpos($par_Filename, 'cache.php') !== false ) ||
2906 ( strpos($par_Filename, '_img.php') !== false )) {
2907 if (strpos($par_Content, 'code.google.com/p/timthumb') !== false && strpos($par_Content, '2.8.14') === false ) {
2908 $l_Vuln['id'] = 'RCE : TIMTHUMB : CVE-2011-4106,CVE-2014-4663';
2909 $l_Vuln['ndx'] = $par_Index;
2910 $g_Vulnerable[] = $l_Vuln;
2911 return true;
2912 }
2913
2914 return false;
2915 }
2916
2917 if (strpos($par_Filename, 'components/com_rsform/helpers/rsform.php') !== false) {
2918 if (strpos($par_Content, 'eval($form->ScriptDisplay);') !== false) {
2919 $l_Vuln['id'] = 'RCE : RSFORM : rsform.php, LINE 1605';
2920 $l_Vuln['ndx'] = $par_Index;
2921 $g_Vulnerable[] = $l_Vuln;
2922 return true;
2923 }
2924
2925 return false;
2926 }
2927
2928 if (strpos($par_Filename, 'fancybox-for-wordpress/fancybox.php') !== false) {
2929 if (strpos($par_Content, '\'reset\' == $_REQUEST[\'action\']') !== false) {
2930 $l_Vuln['id'] = 'CODE INJECTION : FANCYBOX';
2931 $l_Vuln['ndx'] = $par_Index;
2932 $g_Vulnerable[] = $l_Vuln;
2933 return true;
2934 }
2935
2936 return false;
2937 }
2938
2939
2940 if (strpos($par_Filename, 'cherry-plugin/admin/import-export/upload.php') !== false) {
2941 if (strpos($par_Content, 'verify nonce') === false) {
2942 $l_Vuln['id'] = 'AFU : Cherry Plugin';
2943 $l_Vuln['ndx'] = $par_Index;
2944 $g_Vulnerable[] = $l_Vuln;
2945 return true;
2946 }
2947
2948 return false;
2949 }
2950
2951
2952 if (strpos($par_Filename, 'tiny_mce/plugins/tinybrowser/tinybrowser.php') !== false) {
2953 $l_Vuln['id'] = 'AFU : TINYMCE : http://www.exploit-db.com/exploits/9296/';
2954 $l_Vuln['ndx'] = $par_Index;
2955 $g_Vulnerable[] = $l_Vuln;
2956
2957 return true;
2958 }
2959
2960 if (strpos($par_Filename, '/bx_1c_import.php') !== false) {
2961 if (strpos($par_Content, '$_GET[\'action\']=="getfiles"') !== false) {
2962 $l_Vuln['id'] = 'AFD : https://habrahabr.ru/company/dsec/blog/326166/';
2963 $l_Vuln['ndx'] = $par_Index;
2964 $g_Vulnerable[] = $l_Vuln;
2965
2966 return true;
2967 }
2968 }
2969
2970 if (strpos($par_Filename, 'scripts/setup.php') !== false) {
2971 if (strpos($par_Content, 'PMA_Config') !== false) {
2972 $l_Vuln['id'] = 'CODE INJECTION : PHPMYADMIN : http://1337day.com/exploit/5334';
2973 $l_Vuln['ndx'] = $par_Index;
2974 $g_Vulnerable[] = $l_Vuln;
2975 return true;
2976 }
2977
2978 return false;
2979 }
2980
2981 if (strpos($par_Filename, '/uploadify.php') !== false) {
2982 if (strpos($par_Content, 'move_uploaded_file($tempFile,$targetFile') !== false) {
2983 $l_Vuln['id'] = 'AFU : UPLOADIFY : CVE: 2012-1153';
2984 $l_Vuln['ndx'] = $par_Index;
2985 $g_Vulnerable[] = $l_Vuln;
2986 return true;
2987 }
2988
2989 return false;
2990 }
2991
2992 if (strpos($par_Filename, 'com_adsmanager/controller.php') !== false) {
2993 if (strpos($par_Content, 'move_uploaded_file($file[\'tmp_name\'], $tempPath.\'/\'.basename($file[') !== false) {
2994 $l_Vuln['id'] = 'AFU : https://revisium.com/ru/blog/adsmanager_afu.html';
2995 $l_Vuln['ndx'] = $par_Index;
2996 $g_Vulnerable[] = $l_Vuln;
2997 return true;
2998 }
2999
3000 return false;
3001 }
3002
3003 if (strpos($par_Filename, 'wp-content/plugins/wp-mobile-detector/resize.php') !== false) {
3004 if (strpos($par_Content, 'file_put_contents($path, file_get_contents($_REQUEST[\'src\']));') !== false) {
3005 $l_Vuln['id'] = 'AFU : https://www.pluginvulnerabilities.com/2016/05/31/aribitrary-file-upload-vulnerability-in-wp-mobile-detector/';
3006 $l_Vuln['ndx'] = $par_Index;
3007 $g_Vulnerable[] = $l_Vuln;
3008 return true;
3009 }
3010
3011 return false;
3012 }
3013
3014 if (strpos($par_Filename, 'phpmailer.php') !== false) {
3015 if (strpos($par_Content, 'PHPMailer') !== false) {
3016 $l_Found = preg_match('~Version:\s*(\d+)\.(\d+)\.(\d+)~', $par_Content, $l_Match);
3017
3018 if ($l_Found) {
3019 $l_Version = $l_Match[1] * 1000 + $l_Match[2] * 100 + $l_Match[3];
3020
3021 if ($l_Version < 2520) {
3022 $l_Found = false;
3023 }
3024 }
3025
3026 if (!$l_Found) {
3027
3028 $l_Found = preg_match('~Version\s*=\s*\'(\d+)\.*(\d+)\.(\d+)~', $par_Content, $l_Match);
3029 if ($l_Found) {
3030 $l_Version = $l_Match[1] * 1000 + $l_Match[2] * 100 + $l_Match[3];
3031 if ($l_Version < 5220) {
3032 $l_Found = false;
3033 }
3034 }
3035 }
3036
3037
3038 if (!$l_Found) {
3039 $l_Vuln['id'] = 'RCE : CVE-2016-10045, CVE-2016-10031';
3040 $l_Vuln['ndx'] = $par_Index;
3041 $g_Vulnerable[] = $l_Vuln;
3042 return true;
3043 }
3044 }
3045
3046 return false;
3047 }
3048
3049
3050
3051
3052}
3053
3054///////////////////////////////////////////////////////////////////////////
3055function QCR_GoScan($par_Offset)
3056{
3057 global $g_IframerFragment, $g_Iframer, $g_Redirect, $g_Doorway, $g_EmptyLink, $g_Structure, $g_Counter,
3058 $g_HeuristicType, $g_HeuristicDetected, $g_TotalFolder, $g_TotalFiles, $g_WarningPHP, $g_AdwareList,
3059 $g_CriticalPHP, $g_Phishing, $g_CriticalJS, $g_UrlIgnoreList, $g_CriticalJSFragment, $g_PHPCodeInside, $g_PHPCodeInsideFragment,
3060 $g_NotRead, $g_WarningPHPFragment, $g_WarningPHPSig, $g_BigFiles, $g_RedirectPHPFragment, $g_EmptyLinkSrc, $g_CriticalPHPSig, $g_CriticalPHPFragment,
3061 $g_Base64Fragment, $g_UnixExec, $g_PhishingSigFragment, $g_PhishingFragment, $g_PhishingSig, $g_CriticalJSSig, $g_IframerFragment, $g_CMS, $defaults, $g_AdwareListFragment, $g_KnownList,$g_Vulnerable;
3062
3063 QCR_Debug('QCR_GoScan ' . $par_Offset);
3064
3065 $i = 0;
3066
3067 try {
3068 $s_file = new SplFileObject(QUEUE_FILENAME);
3069 $s_file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
3070
3071 foreach ($s_file as $l_Filename) {
3072 QCR_ScanFile($l_Filename, $i++);
3073 }
3074
3075 unset($s_file);
3076 }
3077 catch (Exception $e) { QCR_Debug( $e->getMessage() ); }
3078}
3079
3080///////////////////////////////////////////////////////////////////////////
3081function QCR_ScanFile($l_Filename, $i = 0)
3082{
3083 global $g_IframerFragment, $g_Iframer, $g_Redirect, $g_Doorway, $g_EmptyLink, $g_Structure, $g_Counter,
3084 $g_HeuristicType, $g_HeuristicDetected, $g_TotalFolder, $g_TotalFiles, $g_WarningPHP, $g_AdwareList,
3085 $g_CriticalPHP, $g_Phishing, $g_CriticalJS, $g_UrlIgnoreList, $g_CriticalJSFragment, $g_PHPCodeInside, $g_PHPCodeInsideFragment,
3086 $g_NotRead, $g_WarningPHPFragment, $g_WarningPHPSig, $g_BigFiles, $g_RedirectPHPFragment, $g_EmptyLinkSrc, $g_CriticalPHPSig, $g_CriticalPHPFragment,
3087 $g_Base64Fragment, $g_UnixExec, $g_PhishingSigFragment, $g_PhishingFragment, $g_PhishingSig, $g_CriticalJSSig, $g_IframerFragment, $g_CMS, $defaults, $g_AdwareListFragment,
3088 $g_KnownList,$g_Vulnerable, $g_CriticalFiles, $g_DeMapper;
3089
3090 global $g_CRC;
3091 static $_files_and_ignored = 0;
3092
3093 $l_CriticalDetected = false;
3094 $l_Stat = stat($l_Filename);
3095
3096 if (substr($l_Filename, -1) == DIR_SEPARATOR) {
3097 // FOLDER
3098 $g_Structure['n'][$i] = $l_Filename;
3099 $g_TotalFolder++;
3100 printProgress($_files_and_ignored, $l_Filename);
3101 return;
3102 }
3103
3104 QCR_Debug('Scan file ' . $l_Filename);
3105 printProgress(++$_files_and_ignored, $l_Filename);
3106
3107 // ignore itself
3108 if ($l_Filename == __FILE__) {
3109 return;
3110 }
3111
3112 // FILE
3113 if ((MAX_SIZE_TO_SCAN > 0 AND $l_Stat['size'] > MAX_SIZE_TO_SCAN) || ($l_Stat['size'] < 0))
3114 {
3115 $g_BigFiles[] = $i;
3116
3117 if (function_exists('aibolit_onBigFile')) { aibolit_onBigFile($l_Filename); }
3118
3119 AddResult($l_Filename, $i);
3120
3121 $l_Ext = strtolower(pathinfo($l_Filename, PATHINFO_EXTENSION));
3122 if ((!AI_HOSTER) && in_array($l_Ext, $g_CriticalFiles)) {
3123 $g_CriticalPHP[] = $i;
3124 $g_CriticalPHPFragment[] = "BIG FILE. SKIPPED.";
3125 $g_CriticalPHPSig[] = "big_1";
3126 }
3127 }
3128 else
3129 {
3130 $g_TotalFiles++;
3131
3132 $l_TSStartScan = microtime(true);
3133
3134 $l_Ext = strtolower(pathinfo($l_Filename, PATHINFO_EXTENSION));
3135 if (filetype($l_Filename) == 'file') {
3136 $l_Content = @file_get_contents($l_Filename);
3137 if (SHORT_PHP_TAG) {
3138// $l_Content = preg_replace('|<\?\s|smiS', '<?php ', $l_Content);
3139 }
3140
3141 $l_Unwrapped = @php_strip_whitespace($l_Filename);
3142 }
3143
3144
3145 if ((($l_Content == '') || ($l_Unwrapped == '')) && ($l_Stat['size'] > 0)) {
3146 $g_NotRead[] = $i;
3147 if (function_exists('aibolit_onReadError')) { aibolit_onReadError($l_Filename, 'io'); }
3148 AddResult('[io] ' . $l_Filename, $i);
3149 return;
3150 }
3151
3152 // unix executables
3153 if (strpos($l_Content, chr(127) . 'ELF') !== false)
3154 {
3155 if (!in_array($l_Filename, $g_UnixExec)) {
3156 $g_UnixExec[] = $l_Filename;
3157 }
3158
3159 return;
3160 }
3161
3162 $g_CRC = _hash_($l_Unwrapped);
3163
3164 $l_UnicodeContent = detect_utf_encoding($l_Content);
3165 //$l_Unwrapped = $l_Content;
3166
3167 // check vulnerability in files
3168 $l_CriticalDetected = CheckVulnerability($l_Filename, $i, $l_Content);
3169
3170 if ($l_UnicodeContent !== false) {
3171 if (function_exists('iconv')) {
3172 $l_Unwrapped = iconv($l_UnicodeContent, "CP1251//IGNORE", $l_Unwrapped);
3173// if (function_exists('mb_convert_encoding')) {
3174// $l_Unwrapped = mb_convert_encoding($l_Unwrapped, $l_UnicodeContent, "CP1251");
3175 } else {
3176 $g_NotRead[] = $i;
3177 if (function_exists('aibolit_onReadError')) { aibolit_onReadError($l_Filename, 'ec'); }
3178 AddResult('[ec] ' . $l_Filename, $i);
3179 }
3180 }
3181
3182 // critical
3183 $g_SkipNextCheck = false;
3184
3185 $l_DeobfType = '';
3186 if (!AI_HOSTER) {
3187 $l_DeobfType = getObfuscateType($l_Unwrapped);
3188 }
3189
3190 if ($l_DeobfType != '') {
3191 $l_Unwrapped = deobfuscate($l_Unwrapped);
3192 $g_SkipNextCheck = checkFalsePositives($l_Filename, $l_Unwrapped, $l_DeobfType);
3193 } else {
3194 if (DEBUG_MODE) {
3195 stdOut("\n...... NOT OBFUSCATED\n");
3196 }
3197 }
3198
3199 $l_Unwrapped = UnwrapObfu($l_Unwrapped);
3200
3201 if ((!$g_SkipNextCheck) && CriticalPHP($l_Filename, $i, $l_Unwrapped, $l_Pos, $l_SigId))
3202 {
3203 if ($l_Ext == 'js') {
3204 $g_CriticalJS[] = $i;
3205 $g_CriticalJSFragment[] = getFragment($l_Unwrapped, $l_Pos);
3206 $g_CriticalJSSig[] = $l_SigId;
3207 } else {
3208 $g_CriticalPHP[] = $i;
3209 $g_CriticalPHPFragment[] = getFragment($l_Unwrapped, $l_Pos);
3210 $g_CriticalPHPSig[] = $l_SigId;
3211 }
3212
3213 $g_SkipNextCheck = true;
3214 } else {
3215 if ((!$g_SkipNextCheck) && CriticalPHP($l_Filename, $i, $l_Content, $l_Pos, $l_SigId))
3216 {
3217 if ($l_Ext == 'js') {
3218 $g_CriticalJS[] = $i;
3219 $g_CriticalJSFragment[] = getFragment($l_Content, $l_Pos);
3220 $g_CriticalJSSig[] = $l_SigId;
3221 } else {
3222 $g_CriticalPHP[] = $i;
3223 $g_CriticalPHPFragment[] = getFragment($l_Content, $l_Pos);
3224 $g_CriticalPHPSig[] = $l_SigId;
3225 }
3226
3227 $g_SkipNextCheck = true;
3228 }
3229 }
3230
3231 $l_TypeDe = 0;
3232 if ((!$g_SkipNextCheck) && HeuristicChecker($l_Content, $l_TypeDe, $l_Filename)) {
3233 $g_HeuristicDetected[] = $i;
3234 $g_HeuristicType[] = $l_TypeDe;
3235 $l_CriticalDetected = true;
3236 }
3237
3238 // critical JS
3239 if (!$g_SkipNextCheck) {
3240 $l_Pos = CriticalJS($l_Filename, $i, $l_Unwrapped, $l_SigId);
3241 if ($l_Pos !== false)
3242 {
3243 if ($l_Ext == 'js') {
3244 $g_CriticalJS[] = $i;
3245 $g_CriticalJSFragment[] = getFragment($l_Unwrapped, $l_Pos);
3246 $g_CriticalJSSig[] = $l_SigId;
3247 } else {
3248 $g_CriticalPHP[] = $i;
3249 $g_CriticalPHPFragment[] = getFragment($l_Unwrapped, $l_Pos);
3250 $g_CriticalPHPSig[] = $l_SigId;
3251 }
3252
3253 $g_SkipNextCheck = true;
3254 }
3255 }
3256
3257 // phishing
3258 if (!$g_SkipNextCheck) {
3259 $l_Pos = Phishing($l_Filename, $i, $l_Unwrapped, $l_SigId);
3260 if ($l_Pos === false) {
3261 $l_Pos = Phishing($l_Filename, $i, $l_Content, $l_SigId);
3262 }
3263
3264 if ($l_Pos !== false)
3265 {
3266 $g_Phishing[] = $i;
3267 $g_PhishingFragment[] = getFragment($l_Unwrapped, $l_Pos);
3268 $g_PhishingSigFragment[] = $l_SigId;
3269 $g_SkipNextCheck = true;
3270 }
3271 }
3272
3273
3274 if (!$g_SkipNextCheck) {
3275 if (SCAN_ALL_FILES || stripos($l_Filename, 'index.'))
3276 {
3277 // check iframes
3278 if (preg_match_all('|<iframe[^>]+src.+?>|smi', $l_Unwrapped, $l_Found, PREG_SET_ORDER))
3279 {
3280 for ($kk = 0; $kk < count($l_Found); $kk++) {
3281 $l_Pos = stripos($l_Found[$kk][0], 'http://');
3282 $l_Pos = $l_Pos || stripos($l_Found[$kk][0], 'https://');
3283 $l_Pos = $l_Pos || stripos($l_Found[$kk][0], 'ftp://');
3284 if (($l_Pos !== false ) && (!knowUrl($l_Found[$kk][0]))) {
3285 $g_Iframer[] = $i;
3286 $g_IframerFragment[] = getFragment($l_Found[$kk][0], $l_Pos);
3287 $l_CriticalDetected = true;
3288 }
3289 }
3290 }
3291
3292 // check empty links
3293 if ((($defaults['report_mask'] & REPORT_MASK_SPAMLINKS) == REPORT_MASK_SPAMLINKS) &&
3294 (preg_match_all('|<a[^>]+href([^>]+?)>(.*?)</a>|smi', $l_Unwrapped, $l_Found, PREG_SET_ORDER)))
3295 {
3296 for ($kk = 0; $kk < count($l_Found); $kk++) {
3297 if ((stripos($l_Found[$kk][1], 'http://') !== false) &&
3298 (trim(strip_tags($l_Found[$kk][2])) == '')) {
3299
3300 $l_NeedToAdd = true;
3301
3302 if ((stripos($l_Found[$kk][1], $defaults['site_url']) !== false)
3303 || knowUrl($l_Found[$kk][1])) {
3304 $l_NeedToAdd = false;
3305 }
3306
3307 if ($l_NeedToAdd && (count($g_EmptyLink) < MAX_EXT_LINKS)) {
3308 $g_EmptyLink[] = $i;
3309 $g_EmptyLinkSrc[$i][] = substr($l_Found[$kk][0], 0, MAX_PREVIEW_LEN);
3310 $l_CriticalDetected = true;
3311 }
3312 }
3313 }
3314 }
3315 }
3316
3317 // check for PHP code inside any type of file
3318 if (stripos($l_Ext, 'ph') === false)
3319 {
3320 $l_Pos = QCR_SearchPHP($l_Content);
3321 if ($l_Pos !== false)
3322 {
3323 $g_PHPCodeInside[] = $i;
3324 $g_PHPCodeInsideFragment[] = getFragment($l_Unwrapped, $l_Pos);
3325 $l_CriticalDetected = true;
3326 }
3327 }
3328
3329 // htaccess
3330 if (stripos($l_Filename, '.htaccess'))
3331 {
3332
3333 if (stripos($l_Content, 'index.php?name=$1') !== false ||
3334 stripos($l_Content, 'index.php?m=1') !== false
3335 )
3336 {
3337 $g_SuspDir[] = $i;
3338 }
3339
3340 $l_HTAContent = preg_replace('|^\s*#.+$|m', '', $l_Content);
3341
3342 $l_Pos = stripos($l_Content, 'auto_prepend_file');
3343 if ($l_Pos !== false) {
3344 $g_Redirect[] = $i;
3345 $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
3346 $l_CriticalDetected = true;
3347 }
3348
3349 $l_Pos = stripos($l_Content, 'auto_append_file');
3350 if ($l_Pos !== false) {
3351 $g_Redirect[] = $i;
3352 $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
3353 $l_CriticalDetected = true;
3354 }
3355
3356 $l_Pos = stripos($l_Content, '^(%2d|-)[^=]+$');
3357 if ($l_Pos !== false)
3358 {
3359 $g_Redirect[] = $i;
3360 $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
3361 $l_CriticalDetected = true;
3362 }
3363
3364 if (!$l_CriticalDetected) {
3365 $l_Pos = stripos($l_Content, '%{HTTP_USER_AGENT}');
3366 if ($l_Pos !== false)
3367 {
3368 $g_Redirect[] = $i;
3369 $g_RedirectPHPFragment[] = getFragment($l_Content, $l_Pos);
3370 $l_CriticalDetected = true;
3371 }
3372 }
3373
3374 if (!$l_CriticalDetected) {
3375 if (
3376 preg_match_all("|RewriteRule\s+.+?\s+http://(.+?)/.+\s+\[.*R=\d+.*\]|smi", $l_HTAContent, $l_Found, PREG_SET_ORDER)
3377 )
3378 {
3379 $l_Host = str_replace('www.', '', $_SERVER['HTTP_HOST']);
3380 for ($j = 0; $j < sizeof($l_Found); $j++)
3381 {
3382 $l_Found[$j][1] = str_replace('www.', '', $l_Found[$j][1]);
3383 if ($l_Found[$j][1] != $l_Host)
3384 {
3385 $g_Redirect[] = $i;
3386 $l_CriticalDetected = true;
3387 break;
3388 }
3389 }
3390 }
3391 }
3392
3393 unset($l_HTAContent);
3394 }
3395
3396
3397 // warnings
3398 $l_Pos = '';
3399
3400 if (WarningPHP($l_Filename, $l_Unwrapped, $l_Pos, $l_SigId))
3401 {
3402 $l_Prio = 1;
3403 if (strpos($l_Filename, '.ph') !== false) {
3404 $l_Prio = 0;
3405 }
3406
3407 $g_WarningPHP[$l_Prio][] = $i;
3408 $g_WarningPHPFragment[$l_Prio][] = getFragment($l_Unwrapped, $l_Pos);
3409 $g_WarningPHPSig[] = $l_SigId;
3410
3411 $l_CriticalDetected = true;
3412 }
3413
3414
3415 // adware
3416 if (Adware($l_Filename, $l_Unwrapped, $l_Pos))
3417 {
3418 $g_AdwareList[] = $i;
3419 $g_AdwareListFragment[] = getFragment($l_Unwrapped, $l_Pos);
3420 $l_CriticalDetected = true;
3421 }
3422
3423 // articles
3424 if (stripos($l_Filename, 'article_index'))
3425 {
3426 $g_AdwareList[] = $i;
3427 $l_CriticalDetected = true;
3428 }
3429 }
3430 } // end of if (!$g_SkipNextCheck) {
3431
3432 unset($l_Unwrapped);
3433 unset($l_Content);
3434
3435 //printProgress(++$_files_and_ignored, $l_Filename);
3436
3437 $l_TSEndScan = microtime(true);
3438 if ($l_TSEndScan - $l_TSStartScan >= 0.5) {
3439 usleep(SCAN_DELAY * 1000);
3440 }
3441
3442 if ($g_SkipNextCheck || $l_CriticalDetected) {
3443 AddResult($l_Filename, $i);
3444 }
3445}
3446
3447function AddResult($l_Filename, $i)
3448{
3449 global $g_Structure, $g_CRC;
3450
3451 $l_Stat = stat($l_Filename);
3452 $g_Structure['n'][$i] = $l_Filename;
3453 $g_Structure['s'][$i] = $l_Stat['size'];
3454 $g_Structure['c'][$i] = $l_Stat['ctime'];
3455 $g_Structure['m'][$i] = $l_Stat['mtime'];
3456 $g_Structure['crc'][$i] = $g_CRC;
3457}
3458
3459///////////////////////////////////////////////////////////////////////////
3460function WarningPHP($l_FN, $l_Content, &$l_Pos, &$l_SigId)
3461{
3462 global $g_SusDB,$g_ExceptFlex, $gXX_FlexDBShe, $gX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment;
3463
3464 $l_Res = false;
3465
3466 if (AI_EXTRA_WARN) {
3467 foreach ($g_SusDB as $l_Item) {
3468 if (preg_match('#' . $l_Item . '#smiS', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
3469 if (!CheckException($l_Content, $l_Found)) {
3470 $l_Pos = $l_Found[0][1];
3471 //$l_SigId = myCheckSum($l_Item);
3472 $l_SigId = getSigId($l_Found);
3473 return true;
3474 }
3475 }
3476 }
3477 }
3478
3479 if (AI_EXPERT < 2) {
3480 foreach ($gXX_FlexDBShe as $l_Item) {
3481 if (preg_match('#' . $l_Item . '#smiS', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
3482 $l_Pos = $l_Found[0][1];
3483 //$l_SigId = myCheckSum($l_Item);
3484 $l_SigId = getSigId($l_Found);
3485 return true;
3486 }
3487 }
3488
3489 }
3490
3491 if (AI_EXPERT < 1) {
3492 foreach ($gX_FlexDBShe as $l_Item) {
3493 if (preg_match('#' . $l_Item . '#smiS', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
3494 $l_Pos = $l_Found[0][1];
3495 //$l_SigId = myCheckSum($l_Item);
3496 $l_SigId = getSigId($l_Found);
3497 return true;
3498 }
3499 }
3500
3501 $l_Content_lo = strtolower($l_Content);
3502
3503 foreach ($gX_DBShe as $l_Item) {
3504 $l_Pos = strpos($l_Content_lo, $l_Item);
3505 if ($l_Pos !== false) {
3506 $l_SigId = myCheckSum($l_Item);
3507 return true;
3508 }
3509 }
3510 }
3511
3512}
3513
3514///////////////////////////////////////////////////////////////////////////
3515function Adware($l_FN, $l_Content, &$l_Pos)
3516{
3517 global $g_AdwareSig;
3518
3519 $l_Res = false;
3520
3521foreach ($g_AdwareSig as $l_Item) {
3522 $offset = 0;
3523 while (preg_match('#' . $l_Item . '#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE, $offset)) {
3524 if (!CheckException($l_Content, $l_Found)) {
3525 $l_Pos = $l_Found[0][1];
3526 return true;
3527 }
3528
3529 $offset = $l_Found[0][1] + 1;
3530 }
3531 }
3532
3533 return $l_Res;
3534}
3535
3536///////////////////////////////////////////////////////////////////////////
3537function CheckException(&$l_Content, &$l_Found) {
3538 global $g_ExceptFlex, $gX_FlexDBShe, $gXX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment;
3539 $l_FoundStrPlus = substr($l_Content, max($l_Found[0][1] - 10, 0), 70);
3540
3541 foreach ($g_ExceptFlex as $l_ExceptItem) {
3542 if (@preg_match('#' . $l_ExceptItem . '#smi', $l_FoundStrPlus, $l_Detected)) {
3543// print("\n\nEXCEPTION FOUND\n[" . $l_ExceptItem . "]\n" . $l_Content . "\n\n----------\n\n");
3544 return true;
3545 }
3546 }
3547
3548 return false;
3549}
3550
3551///////////////////////////////////////////////////////////////////////////
3552function Phishing($l_FN, $l_Index, $l_Content, &$l_SigId)
3553{
3554 global $g_PhishingSig, $g_PhishFiles, $g_PhishEntries;
3555
3556 $l_Res = false;
3557
3558 // need check file (by extension) ?
3559 $l_SkipCheck = SMART_SCAN;
3560
3561if ($l_SkipCheck) {
3562 foreach($g_PhishFiles as $l_Ext) {
3563 if (strpos($l_FN, $l_Ext) !== false) {
3564 $l_SkipCheck = false;
3565 break;
3566 }
3567 }
3568 }
3569
3570 // need check file (by signatures) ?
3571 if ($l_SkipCheck && preg_match('~' . $g_PhishEntries . '~smiS', $l_Content, $l_Found)) {
3572 $l_SkipCheck = false;
3573 }
3574
3575 if ($l_SkipCheck && SMART_SCAN) {
3576 if (DEBUG_MODE) {
3577 echo "Skipped phs file, not critical.\n";
3578 }
3579
3580 return false;
3581 }
3582
3583
3584 foreach ($g_PhishingSig as $l_Item) {
3585 $offset = 0;
3586 while (preg_match('#' . $l_Item . '#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE, $offset)) {
3587 if (!CheckException($l_Content, $l_Found)) {
3588 $l_Pos = $l_Found[0][1];
3589// $l_SigId = myCheckSum($l_Item);
3590 $l_SigId = getSigId($l_Found);
3591
3592 if (DEBUG_MODE) {
3593 echo "Phis: $l_FN matched [$l_Item] in $l_Pos\n";
3594 }
3595
3596 return $l_Pos;
3597 }
3598 $offset = $l_Found[0][1] + 1;
3599
3600 }
3601 }
3602
3603 return $l_Res;
3604}
3605
3606///////////////////////////////////////////////////////////////////////////
3607function CriticalJS($l_FN, $l_Index, $l_Content, &$l_SigId)
3608{
3609 global $g_JSVirSig, $gX_JSVirSig, $g_VirusFiles, $g_VirusEntries, $g_RegExpStat;
3610
3611 $l_Res = false;
3612
3613 // need check file (by extension) ?
3614 $l_SkipCheck = SMART_SCAN;
3615
3616 if ($l_SkipCheck) {
3617 foreach($g_VirusFiles as $l_Ext) {
3618 if (strpos($l_FN, $l_Ext) !== false) {
3619 $l_SkipCheck = false;
3620 break;
3621 }
3622 }
3623 }
3624
3625 // need check file (by signatures) ?
3626 if ($l_SkipCheck && preg_match('~' . $g_VirusEntries . '~smiS', $l_Content, $l_Found)) {
3627 $l_SkipCheck = false;
3628 }
3629
3630 if ($l_SkipCheck && SMART_SCAN) {
3631 if (DEBUG_MODE) {
3632 echo "Skipped js file, not critical.\n";
3633 }
3634
3635 return false;
3636 }
3637
3638
3639 foreach ($g_JSVirSig as $l_Item) {
3640 $offset = 0;
3641 if (DEBUG_PERFORMANCE) {
3642 $stat_start = microtime(true);
3643 }
3644
3645 while (preg_match('#' . $l_Item . '#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE, $offset)) {
3646
3647 if (!CheckException($l_Content, $l_Found)) {
3648 $l_Pos = $l_Found[0][1];
3649// $l_SigId = myCheckSum($l_Item);
3650 $l_SigId = getSigId($l_Found);
3651
3652 if (DEBUG_MODE) {
3653 echo "JS: $l_FN matched [$l_Item] in $l_Pos\n";
3654 }
3655
3656 return $l_Pos;
3657 }
3658
3659 $offset = $l_Found[0][1] + 1;
3660
3661 }
3662
3663 if (DEBUG_PERFORMANCE) {
3664 $stat_stop = microtime(true);
3665 $g_RegExpStat[$l_Item] += $stat_stop - $stat_start;
3666 }
3667// if (pcre_error($l_FN, $l_Index)) { }
3668
3669 }
3670
3671if (AI_EXPERT > 1) {
3672 foreach ($gX_JSVirSig as $l_Item) {
3673 if (DEBUG_PERFORMANCE) {
3674 $stat_start = microtime(true);
3675 }
3676
3677 if (preg_match('#' . $l_Item . '#smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
3678 if (!CheckException($l_Content, $l_Found)) {
3679 $l_Pos = $l_Found[0][1];
3680 //$l_SigId = myCheckSum($l_Item);
3681 $l_SigId = getSigId($l_Found);
3682
3683 if (DEBUG_MODE) {
3684 echo "JS PARA: $l_FN matched [$l_Item] in $l_Pos\n";
3685 }
3686
3687 return $l_Pos;
3688 }
3689 }
3690
3691 if (DEBUG_PERFORMANCE) {
3692 $stat_stop = microtime(true);
3693 $g_RegExpStat[$l_Item] += $stat_stop - $stat_start;
3694 }
3695
3696// if (pcre_error($l_FN, $l_Index)) { }
3697
3698 }
3699}
3700
3701 return $l_Res;
3702}
3703
3704////////////////////////////////////////////////////////////////////////////
3705function pcre_error($par_FN, $par_Index) {
3706 global $g_NotRead, $g_Structure;
3707
3708 $err = preg_last_error();
3709 if (($err == PREG_BACKTRACK_LIMIT_ERROR) || ($err == PREG_RECURSION_LIMIT_ERROR)) {
3710 if (!in_array($par_Index, $g_NotRead)) {
3711 if (function_exists('aibolit_onReadError')) { aibolit_onReadError($l_Filename, 're'); }
3712 $g_NotRead[] = $par_Index;
3713 AddResult('[re] ' . $par_FN, $par_Index);
3714 }
3715
3716 return true;
3717 }
3718
3719 return false;
3720}
3721
3722
3723
3724////////////////////////////////////////////////////////////////////////////
3725define('SUSP_MTIME', 1); // suspicious mtime (greater than ctime)
3726define('SUSP_PERM', 2); // suspicious permissions
3727define('SUSP_PHP_IN_UPLOAD', 3); // suspicious .php file in upload or image folder
3728
3729 function get_descr_heur($type) {
3730 switch ($type) {
3731 case SUSP_MTIME: return AI_STR_077;
3732 case SUSP_PERM: return AI_STR_078;
3733 case SUSP_PHP_IN_UPLOAD: return AI_STR_079;
3734 }
3735
3736 return "---";
3737 }
3738
3739 ///////////////////////////////////////////////////////////////////////////
3740 function HeuristicChecker($l_Content, &$l_Type, $l_Filename) {
3741 $res = false;
3742
3743 $l_Stat = stat($l_Filename);
3744 // most likely changed by touch
3745 if ($l_Stat['ctime'] < $l_Stat['mtime']) {
3746 $l_Type = SUSP_MTIME;
3747 return true;
3748 }
3749
3750
3751 $l_Perm = fileperms($l_Filename) & 0777;
3752 if (($l_Perm & 0400 != 0400) || // not readable by owner
3753 ($l_Perm == 0000) ||
3754 ($l_Perm == 0404) ||
3755 ($l_Perm == 0505))
3756 {
3757 $l_Type = SUSP_PERM;
3758 return true;
3759 }
3760
3761
3762 if ((strpos($l_Filename, '.ph')) && (
3763 strpos($l_Filename, '/images/stories/') ||
3764 //strpos($l_Filename, '/img/') ||
3765 //strpos($l_Filename, '/images/') ||
3766 //strpos($l_Filename, '/uploads/') ||
3767 strpos($l_Filename, '/wp-content/upload/')
3768 )
3769 ) {
3770 $l_Type = SUSP_PHP_IN_UPLOAD;
3771 return true;
3772 }
3773
3774 return false;
3775 }
3776
3777///////////////////////////////////////////////////////////////////////////
3778function CriticalPHP($l_FN, $l_Index, $l_Content, &$l_Pos, &$l_SigId)
3779{
3780 global $g_ExceptFlex, $gXX_FlexDBShe, $gX_FlexDBShe, $g_FlexDBShe, $gX_DBShe, $g_DBShe, $g_Base64, $g_Base64Fragment,
3781 $g_CriticalFiles, $g_CriticalEntries, $g_RegExpStat;
3782
3783 // need check file (by extension) ?
3784 $l_SkipCheck = SMART_SCAN;
3785
3786 if ($l_SkipCheck) {
3787 foreach($g_CriticalFiles as $l_Ext) {
3788 if ((strpos($l_FN, $l_Ext) !== false) && (strpos($l_FN, '.js') === false)) {
3789 $l_SkipCheck = false;
3790 break;
3791 }
3792 }
3793 }
3794
3795 // need check file (by signatures) ?
3796 if ($l_SkipCheck && preg_match('~' . $g_CriticalEntries . '~smiS', $l_Content, $l_Found)) {
3797 $l_SkipCheck = false;
3798 }
3799
3800
3801 // if not critical - skip it
3802 if ($l_SkipCheck && SMART_SCAN) {
3803 if (DEBUG_MODE) {
3804 echo "Skipped file, not critical.\n";
3805 }
3806
3807 return false;
3808 }
3809
3810 foreach ($g_FlexDBShe as $l_Item) {
3811 $offset = 0;
3812
3813 if (DEBUG_PERFORMANCE) {
3814 $stat_start = microtime(true);
3815 }
3816
3817 while (preg_match('#' . $l_Item . '#smiS', $l_Content, $l_Found, PREG_OFFSET_CAPTURE, $offset)) {
3818 if (!CheckException($l_Content, $l_Found)) {
3819 $l_Pos = $l_Found[0][1];
3820 //$l_SigId = myCheckSum($l_Item);
3821 $l_SigId = getSigId($l_Found);
3822
3823 if (DEBUG_MODE) {
3824 echo "CRIT 1: $l_FN matched [$l_Item] in $l_Pos\n";
3825 }
3826
3827 return true;
3828 }
3829
3830 $offset = $l_Found[0][1] + 1;
3831
3832 }
3833
3834 if (DEBUG_PERFORMANCE) {
3835 $stat_stop = microtime(true);
3836 $g_RegExpStat[$l_Item] += $stat_stop - $stat_start;
3837 }
3838
3839// if (pcre_error($l_FN, $l_Index)) { }
3840
3841 }
3842
3843if (AI_EXPERT > 0) {
3844 foreach ($gX_FlexDBShe as $l_Item) {
3845 if (DEBUG_PERFORMANCE) {
3846 $stat_start = microtime(true);
3847 }
3848
3849 if (preg_match('#' . $l_Item . '#smiS', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
3850 if (!CheckException($l_Content, $l_Found)) {
3851 $l_Pos = $l_Found[0][1];
3852 //$l_SigId = myCheckSum($l_Item);
3853 $l_SigId = getSigId($l_Found);
3854
3855 if (DEBUG_MODE) {
3856 echo "CRIT 3: $l_FN matched [$l_Item] in $l_Pos\n";
3857 }
3858
3859 return true;
3860 }
3861 }
3862
3863 if (DEBUG_PERFORMANCE) {
3864 $stat_stop = microtime(true);
3865 $g_RegExpStat[$l_Item] += $stat_stop - $stat_start;
3866 }
3867
3868// if (pcre_error($l_FN, $l_Index)) { }
3869 }
3870}
3871
3872if (AI_EXPERT > 1) {
3873 foreach ($gXX_FlexDBShe as $l_Item) {
3874 if (DEBUG_PERFORMANCE) {
3875 $stat_start = microtime(true);
3876 }
3877
3878 if (preg_match('#' . $l_Item . '#smiS', $l_Content, $l_Found, PREG_OFFSET_CAPTURE)) {
3879 if (!CheckException($l_Content, $l_Found)) {
3880 $l_Pos = $l_Found[0][1];
3881 //$l_SigId = myCheckSum($l_Item);
3882 $l_SigId = getSigId($l_Found);
3883
3884 if (DEBUG_MODE) {
3885 echo "CRIT 2: $l_FN matched [$l_Item] in $l_Pos\n";
3886 }
3887
3888 return true;
3889 }
3890 }
3891
3892 if (DEBUG_PERFORMANCE) {
3893 $stat_stop = microtime(true);
3894 $g_RegExpStat[$l_Item] += $stat_stop - $stat_start;
3895 }
3896
3897// if (pcre_error($l_FN, $l_Index)) { }
3898 }
3899}
3900
3901 $l_Content_lo = strtolower($l_Content);
3902
3903 foreach ($g_DBShe as $l_Item) {
3904 $l_Pos = strpos($l_Content_lo, $l_Item);
3905 if ($l_Pos !== false) {
3906 $l_SigId = myCheckSum($l_Item);
3907
3908 if (DEBUG_MODE) {
3909 echo "CRIT 4: $l_FN matched [$l_Item] in $l_Pos\n";
3910 }
3911
3912 return true;
3913 }
3914 }
3915
3916if (AI_EXPERT > 0) {
3917 foreach ($gX_DBShe as $l_Item) {
3918 $l_Pos = strpos($l_Content_lo, $l_Item);
3919 if ($l_Pos !== false) {
3920 $l_SigId = myCheckSum($l_Item);
3921
3922 if (DEBUG_MODE) {
3923 echo "CRIT 5: $l_FN matched [$l_Item] in $l_Pos\n";
3924 }
3925
3926 return true;
3927 }
3928 }
3929}
3930
3931if (AI_HOSTER) return false;
3932
3933if (AI_EXPERT > 0) {
3934 if ((strpos($l_Content, 'GIF89') === 0) && (strpos($l_FN, '.php') !== false )) {
3935 $l_Pos = 0;
3936
3937 if (DEBUG_MODE) {
3938 echo "CRIT 6: $l_FN matched [$l_Item] in $l_Pos\n";
3939 }
3940
3941 return true;
3942 }
3943}
3944
3945 // detect uploaders / droppers
3946if (AI_EXPERT > 1) {
3947 $l_Found = null;
3948 if (
3949 (filesize($l_FN) < 1024) &&
3950 (strpos($l_FN, '.ph') !== false) &&
3951 (
3952 (($l_Pos = strpos($l_Content, 'multipart/form-data')) > 0) ||
3953 (($l_Pos = strpos($l_Content, '$_FILE[') > 0)) ||
3954 (($l_Pos = strpos($l_Content, 'move_uploaded_file')) > 0) ||
3955 (preg_match('|\bcopy\s*\(|smi', $l_Content, $l_Found, PREG_OFFSET_CAPTURE))
3956 )
3957 ) {
3958 if ($l_Found != null) {
3959 $l_Pos = $l_Found[0][1];
3960 }
3961 if (DEBUG_MODE) {
3962 echo "CRIT 7: $l_FN matched [$l_Item] in $l_Pos\n";
3963 }
3964
3965 return true;
3966 }
3967}
3968
3969 return false;
3970}
3971
3972///////////////////////////////////////////////////////////////////////////
3973if (!isCli()) {
3974 header('Content-type: text/html; charset=utf-8');
3975}
3976
3977if (!isCli()) {
3978
3979 $l_PassOK = false;
3980 if (strlen(PASS) > 8) {
3981 $l_PassOK = true;
3982 }
3983
3984 if ($l_PassOK && preg_match('|[0-9]|', PASS, $l_Found) && preg_match('|[A-Z]|', PASS, $l_Found) && preg_match('|[a-z]|', PASS, $l_Found) ) {
3985 $l_PassOK = true;
3986 }
3987
3988 if (!$l_PassOK) {
3989 echo sprintf(AI_STR_009, generatePassword());
3990 exit;
3991 }
3992
3993 if (isset($_GET['fn']) && ($_GET['ph'] == crc32(PASS))) {
3994 printFile();
3995 exit;
3996 }
3997
3998 if ($_GET['p'] != PASS) {
3999 $generated_pass = generatePassword();
4000 echo sprintf(AI_STR_010, $generated_pass, $generated_pass);
4001 exit;
4002 }
4003}
4004
4005if (!is_readable(ROOT_PATH)) {
4006 echo AI_STR_011;
4007 exit;
4008}
4009
4010if (isCli()) {
4011 if (defined('REPORT_PATH') AND REPORT_PATH)
4012 {
4013 if (!is_writable(REPORT_PATH))
4014 {
4015 die2("\nCannot write report. Report dir " . REPORT_PATH . " is not writable.");
4016 }
4017
4018 else if (!REPORT_FILE)
4019 {
4020 die2("\nCannot write report. Report filename is empty.");
4021 }
4022
4023 else if (($file = REPORT_PATH . DIR_SEPARATOR . REPORT_FILE) AND is_file($file) AND !is_writable($file))
4024 {
4025 die2("\nCannot write report. Report file '$file' exists but is not writable.");
4026 }
4027 }
4028}
4029
4030
4031// detect version CMS
4032$g_KnownCMS = array();
4033$tmp_cms = array();
4034$g_CmsListDetector = new CmsVersionDetector(ROOT_PATH);
4035$l_CmsDetectedNum = $g_CmsListDetector->getCmsNumber();
4036for ($tt = 0; $tt < $l_CmsDetectedNum; $tt++) {
4037 $g_CMS[] = $g_CmsListDetector->getCmsName($tt) . ' v' . makeSafeFn($g_CmsListDetector->getCmsVersion($tt));
4038 $tmp_cms[strtolower($g_CmsListDetector->getCmsName($tt))] = 1;
4039}
4040
4041if (count($tmp_cms) > 0) {
4042 $g_KnownCMS = array_keys($tmp_cms);
4043 $len = count($g_KnownCMS);
4044 for ($i = 0; $i < $len; $i++) {
4045 if ($g_KnownCMS[$i] == strtolower(CMS_WORDPRESS)) $g_KnownCMS[] = 'wp';
4046 if ($g_KnownCMS[$i] == strtolower(CMS_WEBASYST)) $g_KnownCMS[] = 'shopscript';
4047 if ($g_KnownCMS[$i] == strtolower(CMS_IPB)) $g_KnownCMS[] = 'ipb';
4048 if ($g_KnownCMS[$i] == strtolower(CMS_DLE)) $g_KnownCMS[] = 'dle';
4049 if ($g_KnownCMS[$i] == strtolower(CMS_INSTANTCMS)) $g_KnownCMS[] = 'instantcms';
4050 if ($g_KnownCMS[$i] == strtolower(CMS_SHOPSCRIPT)) $g_KnownCMS[] = 'shopscript';
4051 }
4052}
4053
4054
4055$g_DirIgnoreList = array();
4056$g_IgnoreList = array();
4057$g_UrlIgnoreList = array();
4058$g_KnownList = array();
4059
4060$l_IgnoreFilename = $g_AiBolitAbsolutePath . '/.aignore';
4061$l_DirIgnoreFilename = $g_AiBolitAbsolutePath . '/.adirignore';
4062$l_UrlIgnoreFilename = $g_AiBolitAbsolutePath . '/.aurlignore';
4063
4064if (file_exists($l_IgnoreFilename)) {
4065 $l_IgnoreListRaw = file($l_IgnoreFilename);
4066 for ($i = 0; $i < count($l_IgnoreListRaw); $i++)
4067 {
4068 $g_IgnoreList[] = explode("\t", trim($l_IgnoreListRaw[$i]));
4069 }
4070 unset($l_IgnoreListRaw);
4071}
4072
4073if (file_exists($l_DirIgnoreFilename)) {
4074 $g_DirIgnoreList = file($l_DirIgnoreFilename);
4075
4076 for ($i = 0; $i < count($g_DirIgnoreList); $i++) {
4077 $g_DirIgnoreList[$i] = trim($g_DirIgnoreList[$i]);
4078 }
4079}
4080
4081if (file_exists($l_UrlIgnoreFilename)) {
4082 $g_UrlIgnoreList = file($l_UrlIgnoreFilename);
4083
4084 for ($i = 0; $i < count($g_UrlIgnoreList); $i++) {
4085 $g_UrlIgnoreList[$i] = trim($g_UrlIgnoreList[$i]);
4086 }
4087}
4088
4089
4090$l_SkipMask = array(
4091 '/template_\w{32}.css',
4092 '/cache/templates/.{1,150}\.tpl\.php',
4093 '/system/cache/templates_c/\w{1,40}\.php',
4094 '/assets/cache/rss/\w{1,60}',
4095 '/cache/minify/minify_\w{32}',
4096 '/cache/page/\w{32}\.php',
4097 '/cache/object/\w{1,10}/\w{1,10}/\w{1,10}/\w{32}\.php',
4098 '/cache/wp-cache-\d{32}\.php',
4099 '/cache/page/\w{32}\.php_expire',
4100 '/cache/page/\w{32}-cache-page-\w{32}\.php',
4101 '\w{32}-cache-com_content-\w{32}\.php',
4102 '\w{32}-cache-mod_custom-\w{32}\.php',
4103 '\w{32}-cache-mod_templates-\w{32}\.php',
4104 '\w{32}-cache-_system-\w{32}\.php',
4105 '/cache/twig/\w{1,32}/\d+/\w{1,100}\.php',
4106 '/autoptimize/js/autoptimize_\w{32}\.js',
4107 '/bitrix/cache/\w{32}\.php',
4108 '/bitrix/cache/.+/\w{32}\.php',
4109 '/bitrix/cache/iblock_find/',
4110 '/bitrix/managed_cache/MYSQL/user_option/[^/]+/',
4111 '/bitrix/cache/s1/bitrix/catalog\.section/',
4112 '/bitrix/cache/s1/bitrix/catalog\.element/',
4113 '/bitrix/cache/s1/bitrix/menu/',
4114 '/catalog.element/[^/]+/[^/]+/\w{32}\.php',
4115 '/bitrix/managed\_cache/.*/\.\w{32}\.php',
4116 '/core/cache/mgr/smarty/default/.{1,100}\.tpl\.php',
4117 '/core/cache/resource/web/resources/[0-9]{1,50}\.cache\.php',
4118 '/smarty/compiled/SC/.*/%%.*\.php',
4119 '/smarty/.{1,150}\.tpl\.php',
4120 '/smarty/compile/.{1,150}\.tpl\.cache\.php',
4121 '/files/templates_c/.{1,150}\.html\.php',
4122 '/uploads/javascript_global/.{1,150}\.js',
4123 '/assets/cache/rss/\w{32}',
4124 '/assets/cache/docid_\d+_\w{32}\.pageCache\.php',
4125 '/t3-assets/dev/t3/.*-cache-\w{1,20}-.{1,150}\.php',
4126 '/t3-assets/js/js-\w{1,30}\.js',
4127 '/temp/cache/SC/.*/\.cache\..*\.php',
4128 '/tmp/sess\_\w{32}$',
4129 '/assets/cache/docid\_.*\.pageCache\.php',
4130 '/stat/usage\_\w+\.html',
4131 '/stat/site\_\w+\.html',
4132 '/gallery/item/list/\w+\.cache\.php',
4133 '/core/cache/registry/.*/ext-.*\.php',
4134 '/core/cache/resource/shk\_/\w+\.cache\.php',
4135 '/webstat/awstats.*\.txt',
4136 '/awstats/awstats.*\.txt',
4137 '/awstats/.{1,80}\.pl',
4138 '/awstats/.{1,80}\.html',
4139 '/inc/min/styles_\w+\.min\.css',
4140 '/inc/min/styles_\w+\.min\.js',
4141 '/logs/error\_log\..*',
4142 '/logs/xferlog\..*',
4143 '/logs/access_log\..*',
4144 '/logs/cron\..*',
4145 '/logs/exceptions/.+\.log$',
4146 '/hyper-cache/[^/]+/[^/]+/[^/]+/index\.html',
4147 '/mail/new/[^,]+,S=[^,]+,W=.+',
4148 '/mail/new/[^,]=,S=.+',
4149 '/application/logs/\d+/\d+/\d+\.php',
4150 '/sites/default/files/js/js_\w{32}\.js',
4151 '/yt-assets/\w{32}\.css',
4152);
4153
4154$l_SkipSample = array();
4155
4156if (SMART_SCAN) {
4157 $g_DirIgnoreList = array_merge($g_DirIgnoreList, $l_SkipMask);
4158}
4159
4160QCR_Debug();
4161
4162// Load custom signatures
4163
4164try {
4165 $s_file = new SplFileObject($g_AiBolitAbsolutePath."/ai-bolit.sig");
4166 $s_file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
4167 foreach ($s_file as $line) {
4168 $g_FlexDBShe[] = preg_replace('~\G(?:[^#\\\\]+|\\\\.)*+\K#~', '\\#', $line); // escaping #
4169 }
4170 stdOut("Loaded " . $s_file->key() . " signatures from ai-bolit.sig");
4171 $s_file = null; // file handler is closed
4172} catch (Exception $e) { QCR_Debug( "Import ai-bolit.sig " . $e->getMessage() ); }
4173
4174QCR_Debug();
4175
4176 $defaults['skip_ext'] = strtolower(trim($defaults['skip_ext']));
4177 if ($defaults['skip_ext'] != '') {
4178 $g_IgnoredExt = explode(',', $defaults['skip_ext']);
4179 for ($i = 0; $i < count($g_IgnoredExt); $i++) {
4180 $g_IgnoredExt[$i] = trim($g_IgnoredExt[$i]);
4181 }
4182
4183 QCR_Debug('Skip files with extensions: ' . implode(',', $g_IgnoredExt));
4184 stdOut('Skip extensions: ' . implode(',', $g_IgnoredExt));
4185 }
4186
4187// scan single file
4188if (defined('SCAN_FILE')) {
4189 if (file_exists(SCAN_FILE) && is_file(SCAN_FILE) && is_readable(SCAN_FILE)) {
4190 stdOut("Start scanning file '" . SCAN_FILE . "'.");
4191 QCR_ScanFile(SCAN_FILE);
4192 } else {
4193 stdOut("Error:" . SCAN_FILE . " either is not a file or readable");
4194 }
4195} else {
4196 if (isset($_GET['2check'])) {
4197 $options['with-2check'] = 1;
4198 }
4199
4200 // scan list of files from file
4201 if (!(ICHECK || IMAKE) && isset($options['with-2check']) && file_exists(DOUBLECHECK_FILE)) {
4202 stdOut("Start scanning the list from '" . DOUBLECHECK_FILE . "'.\n");
4203 $lines = file(DOUBLECHECK_FILE);
4204 for ($i = 0, $size = count($lines); $i < $size; $i++) {
4205 $lines[$i] = trim($lines[$i]);
4206 if (empty($lines[$i])) unset($lines[$i]);
4207 }
4208 /* skip first line with <?php die("Forbidden"); ?> */
4209 unset($lines[0]);
4210 $g_FoundTotalFiles = count($lines);
4211 $i = 1;
4212 foreach ($lines as $l_FN) {
4213 is_dir($l_FN) && $g_TotalFolder++;
4214 printProgress( $i++, $l_FN);
4215 $BOOL_RESULT = true; // display disable
4216 is_file($l_FN) && QCR_ScanFile($l_FN, $i);
4217 $BOOL_RESULT = false; // display enable
4218 }
4219
4220 $g_FoundTotalDirs = $g_TotalFolder;
4221 $g_FoundTotalFiles = $g_TotalFiles;
4222
4223 } else {
4224 // scan whole file system
4225 stdOut("Start scanning '" . ROOT_PATH . "'.\n");
4226
4227 file_exists(QUEUE_FILENAME) && unlink(QUEUE_FILENAME);
4228 if (ICHECK || IMAKE) {
4229 // INTEGRITY CHECK
4230 IMAKE and unlink(INTEGRITY_DB_FILE);
4231 ICHECK and load_integrity_db();
4232 QCR_IntegrityCheck(ROOT_PATH);
4233 stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
4234 if (IMAKE) exit(0);
4235 if (ICHECK) {
4236 $i = $g_Counter;
4237 $g_CRC = 0;
4238 $changes = array();
4239 $ref =& $g_IntegrityDB;
4240 foreach ($g_IntegrityDB as $l_FileName => $type) {
4241 unset($g_IntegrityDB[$l_FileName]);
4242 $l_Ext2 = substr(strstr(basename($l_FileName), '.'), 1);
4243 if (in_array(strtolower($l_Ext2), $g_IgnoredExt)) {
4244 continue;
4245 }
4246 for ($dr = 0; $dr < count($g_DirIgnoreList); $dr++) {
4247 if (($g_DirIgnoreList[$dr] != '') && preg_match('#' . $g_DirIgnoreList[$dr] . '#', $l_FileName, $l_Found)) {
4248 continue 2;
4249 }
4250 }
4251 $type = in_array($type, array('added', 'modified')) ? $type : 'deleted';
4252 $type .= substr($l_FileName, -1) == '/' ? 'Dirs' : 'Files';
4253 $changes[$type][] = ++$i;
4254 AddResult($l_FileName, $i);
4255 }
4256 $g_FoundTotalFiles = count($changes['addedFiles']) + count($changes['modifiedFiles']);
4257 stdOut("Found changes " . count($changes['modifiedFiles']) . " files and added " . count($changes['addedFiles']) . " files.");
4258 }
4259
4260 } else {
4261 QCR_ScanDirectories(ROOT_PATH);
4262 stdOut("Found $g_FoundTotalFiles files in $g_FoundTotalDirs directories.");
4263 }
4264
4265 QCR_Debug();
4266 stdOut(str_repeat(' ', 160),false);
4267 QCR_GoScan(0);
4268 unlink(QUEUE_FILENAME);
4269 if (defined('PROGRESS_LOG_FILE') && file_exists(PROGRESS_LOG_FILE)) @unlink(PROGRESS_LOG_FILE);
4270 }
4271}
4272
4273QCR_Debug();
4274
4275if (true) {
4276 $g_HeuristicDetected = array();
4277 $g_Iframer = array();
4278 $g_Base64 = array();
4279}
4280
4281
4282// whitelist
4283
4284$snum = 0;
4285$list = check_whitelist($g_Structure['crc'], $snum);
4286
4287foreach (array('g_CriticalPHP', 'g_CriticalJS', 'g_Iframer', 'g_Base64', 'g_Phishing', 'g_AdwareList', 'g_Redirect') as $p) {
4288 if (empty($$p)) continue;
4289
4290 $p_Fragment = $p . "Fragment";
4291 $p_Sig = $p . "Sig";
4292 if ($p == 'g_Redirect') $p_Fragment = $p . "PHPFragment";
4293 if ($p == 'g_Phishing') $p_Sig = $p . "SigFragment";
4294
4295 $count = count($$p);
4296 for ($i = 0; $i < $count; $i++) {
4297 $id = "{${$p}[$i]}";
4298 if (in_array($g_Structure['crc'][$id], $list)) {
4299 unset($GLOBALS[$p][$i]);
4300 unset($GLOBALS[$p_Sig][$i]);
4301 unset($GLOBALS[$p_Fragment][$i]);
4302 }
4303 }
4304
4305 $$p = array_values($$p);
4306 $$p_Fragment = array_values($$p_Fragment);
4307 if (!empty($$p_Sig)) $$p_Sig = array_values($$p_Sig);
4308}
4309
4310
4311////////////////////////////////////////////////////////////////////////////
4312if (AI_HOSTER) {
4313 $g_IframerFragment = array();
4314 $g_Iframer = array();
4315 $g_Redirect = array();
4316 $g_Doorway = array();
4317 $g_EmptyLink = array();
4318 $g_HeuristicType = array();
4319 $g_HeuristicDetected = array();
4320 $g_WarningPHP = array();
4321 $g_AdwareList = array();
4322 $g_Phishing = array();
4323 $g_PHPCodeInside = array();
4324 $g_PHPCodeInsideFragment = array();
4325 $g_NotRead = array();
4326 $g_WarningPHPFragment = array();
4327 $g_WarningPHPSig = array();
4328 $g_BigFiles = array();
4329 $g_RedirectPHPFragment = array();
4330 $g_EmptyLinkSrc = array();
4331 $g_Base64Fragment = array();
4332 $g_UnixExec = array();
4333 $g_PhishingSigFragment = array();
4334 $g_PhishingFragment = array();
4335 $g_PhishingSig = array();
4336 $g_IframerFragment = array();
4337 $g_CMS = array();
4338 $g_AdwareListFragment = array();
4339 $g_Vulnerable = array();
4340}
4341
4342 if (BOOL_RESULT && (!defined('NEED_REPORT'))) {
4343 if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR (count($g_Iframer) > 0) OR (count($g_UnixExec) > 0))
4344 {
4345 echo "1\n";
4346 exit(0);
4347 }
4348 }
4349////////////////////////////////////////////////////////////////////////////
4350$l_Template = str_replace("@@SERVICE_INFO@@", htmlspecialchars("[" . $int_enc . "][" . $snum . "]"), $l_Template);
4351
4352$l_Template = str_replace("@@PATH_URL@@", (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : $g_AddPrefix . str_replace($g_NoPrefix, '', addSlash(ROOT_PATH))), $l_Template);
4353
4354$time_taken = seconds2Human(microtime(true) - START_TIME);
4355
4356$l_Template = str_replace("@@SCANNED@@", sprintf(AI_STR_013, $g_TotalFolder, $g_TotalFiles), $l_Template);
4357
4358$l_ShowOffer = false;
4359
4360stdOut("\nBuilding report [ mode = " . AI_EXPERT . " ]\n");
4361
4362//stdOut("\nLoaded signatures: " . count($g_FlexDBShe) . " / " . count($g_JSVirSig) . "\n");
4363
4364////////////////////////////////////////////////////////////////////////////
4365// save
4366if (!(ICHECK || IMAKE))
4367if (isset($options['with-2check']) || isset($options['quarantine']))
4368if ((count($g_CriticalPHP) > 0) OR (count($g_CriticalJS) > 0) OR (count($g_Base64) > 0) OR
4369 (count($g_Iframer) > 0) OR (count($g_UnixExec)))
4370{
4371 if (!file_exists(DOUBLECHECK_FILE)) {
4372 if ($l_FH = fopen(DOUBLECHECK_FILE, 'w')) {
4373 fputs($l_FH, '<?php die("Forbidden"); ?>' . "\n");
4374
4375 $l_CurrPath = dirname(__FILE__);
4376
4377 if (!isset($g_CriticalPHP)) { $g_CriticalPHP = array(); }
4378 if (!isset($g_CriticalJS)) { $g_CriticalJS = array(); }
4379 if (!isset($g_Iframer)) { $g_Iframer = array(); }
4380 if (!isset($g_Base64)) { $g_Base64 = array(); }
4381 if (!isset($g_Phishing)) { $g_Phishing = array(); }
4382 if (!isset($g_AdwareList)) { $g_AdwareList = array(); }
4383 if (!isset($g_Redirect)) { $g_Redirect = array(); }
4384
4385 $tmpIndex = array_merge($g_CriticalPHP, $g_CriticalJS, $g_Phishing, $g_Base64, $g_Iframer, $g_AdwareList, $g_Redirect);
4386 $tmpIndex = array_values(array_unique($tmpIndex));
4387
4388 for ($i = 0; $i < count($tmpIndex); $i++) {
4389 $tmpIndex[$i] = str_replace($l_CurrPath, '.', $g_Structure['n'][$tmpIndex[$i]]);
4390 }
4391
4392 for ($i = 0; $i < count($g_UnixExec); $i++) {
4393 $tmpIndex[] = str_replace($l_CurrPath, '.', $g_UnixExec[$i]);
4394 }
4395
4396 $tmpIndex = array_values(array_unique($tmpIndex));
4397
4398 for ($i = 0; $i < count($tmpIndex); $i++) {
4399 fputs($l_FH, $tmpIndex[$i] . "\n");
4400 }
4401
4402 fclose($l_FH);
4403 } else {
4404 stdOut("Error! Cannot create " . DOUBLECHECK_FILE);
4405 }
4406 } else {
4407 stdOut(DOUBLECHECK_FILE . ' already exists.');
4408 if (AI_STR_044 != '') $l_Result .= '<div class="rep">' . AI_STR_044 . '</div>';
4409 }
4410
4411}
4412
4413////////////////////////////////////////////////////////////////////////////
4414
4415$l_Summary = '<div class="title">' . AI_STR_074 . '</div>';
4416$l_Summary .= '<table cellspacing=0 border=0>';
4417
4418if (count($g_Redirect) > 0) {
4419 $l_Summary .= makeSummary(AI_STR_059, count($g_Redirect), "crit");
4420}
4421
4422if (count($g_CriticalPHP) > 0) {
4423 $l_Summary .= makeSummary(AI_STR_060, count($g_CriticalPHP), "crit");
4424}
4425
4426if (count($g_CriticalJS) > 0) {
4427 $l_Summary .= makeSummary(AI_STR_061, count($g_CriticalJS), "crit");
4428}
4429
4430if (count($g_Phishing) > 0) {
4431 $l_Summary .= makeSummary(AI_STR_062, count($g_Phishing), "crit");
4432}
4433
4434if (count($g_UnixExec) > 0) {
4435 $l_Summary .= makeSummary(AI_STR_063, count($g_UnixExec), (AI_EXPERT > 1 ? 'crit' : 'warn'));
4436}
4437
4438if (count($g_Iframer) > 0) {
4439 $l_Summary .= makeSummary(AI_STR_064, count($g_Iframer), "crit");
4440}
4441
4442if (count($g_NotRead) > 0) {
4443 $l_Summary .= makeSummary(AI_STR_066, count($g_NotRead), "crit");
4444}
4445
4446if (count($g_Base64) > 0) {
4447 $l_Summary .= makeSummary(AI_STR_067, count($g_Base64), (AI_EXPERT > 1 ? 'crit' : 'warn'));
4448}
4449
4450if (count($g_BigFiles) > 0) {
4451 $l_Summary .= makeSummary(AI_STR_065, count($g_BigFiles), "warn");
4452}
4453
4454if (count($g_HeuristicDetected) > 0) {
4455 $l_Summary .= makeSummary(AI_STR_068, count($g_HeuristicDetected), "warn");
4456}
4457
4458if (count($g_SymLinks) > 0) {
4459 $l_Summary .= makeSummary(AI_STR_069, count($g_SymLinks), "warn");
4460}
4461
4462if (count($g_HiddenFiles) > 0) {
4463 $l_Summary .= makeSummary(AI_STR_070, count($g_HiddenFiles), "warn");
4464}
4465
4466if (count($g_AdwareList) > 0) {
4467 $l_Summary .= makeSummary(AI_STR_072, count($g_AdwareList), "warn");
4468}
4469
4470if (count($g_EmptyLink) > 0) {
4471 $l_Summary .= makeSummary(AI_STR_073, count($g_EmptyLink), "warn");
4472}
4473
4474 $l_Summary .= "</table>";
4475
4476$l_ArraySummary = array();
4477$l_ArraySummary["redirect"] = count($g_Redirect);
4478$l_ArraySummary["critical_php"] = count($g_CriticalPHP);
4479$l_ArraySummary["critical_js"] = count($g_CriticalJS);
4480$l_ArraySummary["phishing"] = count($g_Phishing);
4481$l_ArraySummary["unix_exec"] = count($g_UnixExec);
4482$l_ArraySummary["iframes"] = count($g_Iframer);
4483$l_ArraySummary["not_read"] = count($g_NotRead);
4484$l_ArraySummary["base64"] = count($g_Base64);
4485$l_ArraySummary["heuristics"] = count($g_HeuristicDetected);
4486$l_ArraySummary["symlinks"] = count($g_SymLinks);
4487$l_ArraySummary["big_files_skipped"] = count($g_BigFiles);
4488
4489 if (function_exists('json_encode')) { $l_Summary .= "<!--[json]" . json_encode($l_ArraySummary) . "[/json]-->"; }
4490
4491 $l_Summary .= "<div class=details style=\"margin: 20px 20px 20px 0\">" . AI_STR_080 . "</div>\n";
4492
4493 $l_Template = str_replace("@@SUMMARY@@", $l_Summary, $l_Template);
4494
4495
4496 $l_Result .= AI_STR_015;
4497
4498 $l_Template = str_replace("@@VERSION@@", AI_VERSION, $l_Template);
4499
4500////////////////////////////////////////////////////////////////////////////
4501
4502
4503
4504if (function_exists("gethostname") && is_callable("gethostname")) {
4505 $l_HostName = gethostname();
4506} else {
4507 $l_HostName = '???';
4508}
4509
4510$l_PlainResult = "# Malware list detected by AI-Bolit (https://revisium.com/ai/) on " . date("d/m/Y H:i:s", time()) . " " . $l_HostName . "\n\n";
4511
4512$l_RawReport = array();
4513
4514if (!AI_HOSTER) {
4515 stdOut("Building list of vulnerable scripts " . count($g_Vulnerable));
4516
4517 if (count($g_Vulnerable) > 0) {
4518 $l_Result .= '<div class="note_vir">' . AI_STR_081 . ' (' . count($g_Vulnerable) . ')</div><div class="crit">';
4519 foreach ($g_Vulnerable as $l_Item) {
4520 $l_Result .= '<li>' . makeSafeFn($g_Structure['n'][$l_Item['ndx']], true) . ' - ' . $l_Item['id'] . '</li>';
4521 $l_PlainResult .= '[VULNERABILITY] ' . replacePathArray($g_Structure['n'][$l_Item['ndx']]) . ' - ' . $l_Item['id'] . "\n";
4522 }
4523
4524 $l_Result .= '</div><p>' . PHP_EOL;
4525 $l_PlainResult .= "\n";
4526 }
4527}
4528
4529
4530stdOut("Building list of shells " . count($g_CriticalPHP));
4531
4532$l_RawReport['vulners'] = getRawJsonVuln($g_Vulnerable);
4533
4534if (count($g_CriticalPHP) > 0) {
4535 $g_CriticalPHP = array_slice($g_CriticalPHP, 0, 15000);
4536 $l_RawReport['php_malware'] = getRawJson($g_CriticalPHP, $g_CriticalPHPFragment, $g_CriticalPHPSig);
4537 $l_Result .= '<div class="note_vir">' . AI_STR_016 . ' (' . count($g_CriticalPHP) . ')</div><div class="crit">';
4538 $l_Result .= printList($g_CriticalPHP, $g_CriticalPHPFragment, true, $g_CriticalPHPSig, 'table_crit');
4539 $l_PlainResult .= '[SERVER MALWARE]' . "\n" . printPlainList($g_CriticalPHP, $g_CriticalPHPFragment, true, $g_CriticalPHPSig, 'table_crit') . "\n";
4540 $l_Result .= '</div>' . PHP_EOL;
4541
4542 $l_ShowOffer = true;
4543} else {
4544 $l_Result .= '<div class="ok"><b>' . AI_STR_017. '</b></div>';
4545}
4546
4547stdOut("Building list of js " . count($g_CriticalJS));
4548
4549if (count($g_CriticalJS) > 0) {
4550 $g_CriticalJS = array_slice($g_CriticalJS, 0, 15000);
4551 $l_RawReport['js_malware'] = getRawJson($g_CriticalJS, $g_CriticalJSFragment, $g_CriticalJSSig);
4552 $l_Result .= '<div class="note_vir">' . AI_STR_018 . ' (' . count($g_CriticalJS) . ')</div><div class="crit">';
4553 $l_Result .= printList($g_CriticalJS, $g_CriticalJSFragment, true, $g_CriticalJSSig, 'table_vir');
4554 $l_PlainResult .= '[CLIENT MALWARE / JS]' . "\n" . printPlainList($g_CriticalJS, $g_CriticalJSFragment, true, $g_CriticalJSSig, 'table_vir') . "\n";
4555 $l_Result .= "</div>" . PHP_EOL;
4556
4557 $l_ShowOffer = true;
4558}
4559
4560if (!AI_HOSTER) {
4561 stdOut("Building phishing pages " . count($g_Phishing));
4562
4563 if (count($g_Phishing) > 0) {
4564 $l_RawReport['phishing'] = getRawJson($g_Phishing, $g_PhishingFragment, $g_PhishingSigFragment);
4565 $l_Result .= '<div class="note_vir">' . AI_STR_058 . ' (' . count($g_Phishing) . ')</div><div class="crit">';
4566 $l_Result .= printList($g_Phishing, $g_PhishingFragment, true, $g_PhishingSigFragment, 'table_vir');
4567 $l_PlainResult .= '[PHISHING]' . "\n" . printPlainList($g_Phishing, $g_PhishingFragment, true, $g_PhishingSigFragment, 'table_vir') . "\n";
4568 $l_Result .= "</div>". PHP_EOL;
4569
4570 $l_ShowOffer = true;
4571 }
4572
4573 stdOut("Building list of iframes " . count($g_Iframer));
4574
4575 if (count($g_Iframer) > 0) {
4576 $l_RawReport['iframer'] = getRawJson($g_Iframer, $g_IframerFragment);
4577 $l_ShowOffer = true;
4578 $l_Result .= '<div class="note_vir">' . AI_STR_021 . ' (' . count($g_Iframer) . ')</div><div class="crit">';
4579 $l_Result .= printList($g_Iframer, $g_IframerFragment, true);
4580 $l_Result .= "</div>" . PHP_EOL;
4581
4582 }
4583
4584 stdOut("Building list of base64s " . count($g_Base64));
4585
4586 if (count($g_Base64) > 0) {
4587 $l_RawReport['warn_enc'] = getRawJson($g_Base64, $g_Base64Fragment);
4588 if (AI_EXPERT > 1) $l_ShowOffer = true;
4589
4590 $l_Result .= '<div class="note_' . (AI_EXPERT > 1 ? 'vir' : 'warn') . '">' . AI_STR_020 . ' (' . count($g_Base64) . ')</div><div class="' . (AI_EXPERT > 1 ? 'crit' : 'warn') . '">';
4591 $l_Result .= printList($g_Base64, $g_Base64Fragment, true);
4592 $l_PlainResult .= '[ENCODED / SUSP_EXT]' . "\n" . printPlainList($g_Base64, $g_Base64Fragment, true) . "\n";
4593 $l_Result .= "</div>" . PHP_EOL;
4594
4595 }
4596
4597 stdOut("Building list of redirects " . count($g_Redirect));
4598 if (count($g_Redirect) > 0) {
4599 $l_RawReport['redirect'] = getRawJson($g_Redirect, $g_RedirectPHPFragment);
4600 $l_ShowOffer = true;
4601 $l_Result .= '<div class="note_vir">' . AI_STR_027 . ' (' . count($g_Redirect) . ')</div><div class="crit">';
4602 $l_Result .= printList($g_Redirect, $g_RedirectPHPFragment, true);
4603 $l_Result .= "</div>" . PHP_EOL;
4604 }
4605
4606
4607 stdOut("Building list of unread files " . count($g_NotRead));
4608
4609 if (count($g_NotRead) > 0) {
4610 $g_NotRead = array_slice($g_NotRead, 0, AIBOLIT_MAX_NUMBER);
4611 $l_RawReport['not_read'] = $g_NotRead;
4612 $l_Result .= '<div class="note_vir">' . AI_STR_030 . ' (' . count($g_NotRead) . ')</div><div class="crit">';
4613 $l_Result .= printList($g_NotRead);
4614 $l_Result .= "</div><div class=\"spacer\"></div>" . PHP_EOL;
4615 $l_PlainResult .= '[SCAN ERROR / SKIPPED]' . "\n" . printPlainList($g_NotRead) . "\n\n";
4616 }
4617
4618 stdOut("Building list of symlinks " . count($g_SymLinks));
4619
4620 if (count($g_SymLinks) > 0) {
4621 $g_SymLinks = array_slice($g_SymLinks, 0, AIBOLIT_MAX_NUMBER);
4622 $l_RawReport['sym_links'] = $g_SymLinks;
4623 $l_Result .= '<div class="note_vir">' . AI_STR_022 . ' (' . count($g_SymLinks) . ')</div><div class="crit">';
4624 $l_Result .= nl2br(makeSafeFn(implode("\n", $g_SymLinks), true));
4625 $l_Result .= "</div><div class=\"spacer\"></div>";
4626 }
4627
4628 stdOut("Building list of unix executables and odd scripts " . count($g_UnixExec));
4629
4630 if (count($g_UnixExec) > 0) {
4631 $g_UnixExec = array_slice($g_UnixExec, 0, AIBOLIT_MAX_NUMBER);
4632 $l_RawReport['unix_exec'] = $g_UnixExec;
4633 $l_Result .= '<div class="note_' . (AI_EXPERT > 1 ? 'vir' : 'warn') . '">' . AI_STR_019 . ' (' . count($g_UnixExec) . ')</div><div class="' . (AI_EXPERT > 1 ? 'crit' : 'warn') . '">';
4634 $l_Result .= nl2br(makeSafeFn(implode("\n", $g_UnixExec), true));
4635 $l_PlainResult .= '[UNIX EXEC]' . "\n" . implode("\n", replacePathArray($g_UnixExec)) . "\n\n";
4636 $l_Result .= "</div>" . PHP_EOL;
4637
4638 if (AI_EXPERT > 1) $l_ShowOffer = true;
4639 }
4640}
4641////////////////////////////////////
4642if (!AI_HOSTER) {
4643 $l_WarningsNum = count($g_HeuristicDetected) + count($g_HiddenFiles) + count($g_BigFiles) + count($g_PHPCodeInside) + count($g_AdwareList) + count($g_EmptyLink) + count($g_Doorway) + (count($g_WarningPHP[0]) + count($g_WarningPHP[1]) + count($g_SkippedFolders));
4644
4645 if ($l_WarningsNum > 0) {
4646 $l_Result .= "<div style=\"margin-top: 20px\" class=\"title\">" . AI_STR_026 . "</div>";
4647 }
4648
4649 stdOut("Building list of links/adware " . count($g_AdwareList));
4650
4651 if (count($g_AdwareList) > 0) {
4652 $l_RawReport['adware'] = getRawJson($g_AdwareList, $g_AdwareListFragment);
4653 $l_Result .= '<div class="note_warn">' . AI_STR_029 . '</div><div class="warn">';
4654 $l_Result .= printList($g_AdwareList, $g_AdwareListFragment, true);
4655 $l_PlainResult .= '[ADWARE]' . "\n" . printPlainList($g_AdwareList, $g_AdwareListFragment, true) . "\n";
4656 $l_Result .= "</div>" . PHP_EOL;
4657
4658 }
4659
4660 stdOut("Building list of heuristics " . count($g_HeuristicDetected));
4661
4662 if (count($g_HeuristicDetected) > 0) {
4663 $l_RawReport['heuristic'] = $g_HeuristicDetected;
4664 $l_Result .= '<div class="note_warn">' . AI_STR_052 . ' (' . count($g_HeuristicDetected) . ')</div><div class="warn">';
4665 for ($i = 0; $i < count($g_HeuristicDetected); $i++) {
4666 $l_Result .= '<li>' . makeSafeFn($g_Structure['n'][$g_HeuristicDetected[$i]], true) . ' (' . get_descr_heur($g_HeuristicType[$i]) . ')</li>';
4667 }
4668
4669 $l_Result .= '</ul></div><div class=\"spacer\"></div>' . PHP_EOL;
4670 }
4671
4672 stdOut("Building list of hidden files " . count($g_HiddenFiles));
4673 if (count($g_HiddenFiles) > 0) {
4674 $g_HiddenFiles = array_slice($g_HiddenFiles, 0, AIBOLIT_MAX_NUMBER);
4675 $l_RawReport['hidden'] = $g_HiddenFiles;
4676 $l_Result .= '<div class="note_warn">' . AI_STR_023 . ' (' . count($g_HiddenFiles) . ')</div><div class="warn">';
4677 $l_Result .= nl2br(makeSafeFn(implode("\n", $g_HiddenFiles), true));
4678 $l_Result .= "</div><div class=\"spacer\"></div>" . PHP_EOL;
4679 $l_PlainResult .= '[HIDDEN]' . "\n" . implode("\n", replacePathArray($g_HiddenFiles)) . "\n\n";
4680 }
4681
4682 stdOut("Building list of bigfiles " . count($g_BigFiles));
4683 $max_size_to_scan = getBytes(MAX_SIZE_TO_SCAN);
4684 $max_size_to_scan = $max_size_to_scan > 0 ? $max_size_to_scan : getBytes('1m');
4685
4686 if (count($g_BigFiles) > 0) {
4687 $g_BigFiles = array_slice($g_BigFiles, 0, AIBOLIT_MAX_NUMBER);
4688 $l_RawReport['big_files'] = getRawJson($g_BigFiles);
4689 $l_Result .= "<div class=\"note_warn\">" . sprintf(AI_STR_038, bytes2Human($max_size_to_scan)) . '</div><div class="warn">';
4690 $l_Result .= printList($g_BigFiles);
4691 $l_Result .= "</div>";
4692 $l_PlainResult .= '[BIG FILES / SKIPPED]' . "\n" . printPlainList($g_BigFiles) . "\n\n";
4693 }
4694
4695 stdOut("Building list of php inj " . count($g_PHPCodeInside));
4696
4697 if ((count($g_PHPCodeInside) > 0) && (($defaults['report_mask'] & REPORT_MASK_PHPSIGN) == REPORT_MASK_PHPSIGN)) {
4698 $l_Result .= '<div class="note_warn">' . AI_STR_028 . '</div><div class="warn">';
4699 $l_Result .= printList($g_PHPCodeInside, $g_PHPCodeInsideFragment, true);
4700 $l_Result .= "</div>" . PHP_EOL;
4701
4702 }
4703
4704 stdOut("Building list of empty links " . count($g_EmptyLink));
4705 if (count($g_EmptyLink) > 0) {
4706 $g_EmptyLink = array_slice($g_EmptyLink, 0, AIBOLIT_MAX_NUMBER);
4707 $l_Result .= '<div class="note_warn">' . AI_STR_031 . '</div><div class="warn">';
4708 $l_Result .= printList($g_EmptyLink, '', true);
4709
4710 $l_Result .= AI_STR_032 . '<br/>';
4711
4712 if (count($g_EmptyLink) == MAX_EXT_LINKS) {
4713 $l_Result .= '(' . AI_STR_033 . MAX_EXT_LINKS . ')<br/>';
4714 }
4715
4716 for ($i = 0; $i < count($g_EmptyLink); $i++) {
4717 $l_Idx = $g_EmptyLink[$i];
4718 for ($j = 0; $j < count($g_EmptyLinkSrc[$l_Idx]); $j++) {
4719 $l_Result .= '<span class="details">' . makeSafeFn($g_Structure['n'][$g_EmptyLink[$i]], true) . ' → ' . htmlspecialchars($g_EmptyLinkSrc[$l_Idx][$j]) . '</span><br/>';
4720 }
4721 }
4722
4723 $l_Result .= "</div>";
4724
4725 }
4726
4727 stdOut("Building list of doorways " . count($g_Doorway));
4728
4729 if ((count($g_Doorway) > 0) && (($defaults['report_mask'] & REPORT_MASK_DOORWAYS) == REPORT_MASK_DOORWAYS)) {
4730 $g_Doorway = array_slice($g_Doorway, 0, AIBOLIT_MAX_NUMBER);
4731 $l_RawReport['doorway'] = getRawJson($g_Doorway);
4732 $l_Result .= '<div class="note_warn">' . AI_STR_034 . '</div><div class="warn">';
4733 $l_Result .= printList($g_Doorway);
4734 $l_Result .= "</div>" . PHP_EOL;
4735
4736 }
4737
4738 stdOut("Building list of php warnings " . (count($g_WarningPHP[0]) + count($g_WarningPHP[1])));
4739
4740 if (($defaults['report_mask'] & REPORT_MASK_SUSP) == REPORT_MASK_SUSP) {
4741 if ((count($g_WarningPHP[0]) + count($g_WarningPHP[1])) > 0) {
4742 $g_WarningPHP[0] = array_slice($g_WarningPHP[0], 0, AIBOLIT_MAX_NUMBER);
4743 $g_WarningPHP[1] = array_slice($g_WarningPHP[1], 0, AIBOLIT_MAX_NUMBER);
4744 $l_Result .= '<div class="note_warn">' . AI_STR_035 . '</div><div class="warn">';
4745
4746 for ($i = 0; $i < count($g_WarningPHP); $i++) {
4747 if (count($g_WarningPHP[$i]) > 0)
4748 $l_Result .= printList($g_WarningPHP[$i], $g_WarningPHPFragment[$i], true, $g_WarningPHPSig, 'table_warn' . $i);
4749 }
4750 $l_Result .= "</div>" . PHP_EOL;
4751
4752 }
4753 }
4754
4755 stdOut("Building list of skipped dirs " . count($g_SkippedFolders));
4756 if (count($g_SkippedFolders) > 0) {
4757 $l_Result .= '<div class="note_warn">' . AI_STR_036 . '</div><div class="warn">';
4758 $l_Result .= nl2br(makeSafeFn(implode("\n", $g_SkippedFolders), true));
4759 $l_Result .= "</div>" . PHP_EOL;
4760 }
4761
4762 if (count($g_CMS) > 0) {
4763 $l_RawReport['cms'] = $g_CMS;
4764 $l_Result .= "<div class=\"note_warn\">" . AI_STR_037 . "<br/>";
4765 $l_Result .= nl2br(makeSafeFn(implode("\n", $g_CMS)));
4766 $l_Result .= "</div>";
4767 }
4768}
4769
4770if (ICHECK) {
4771 $l_Result .= "<div style=\"margin-top: 20px\" class=\"title\">" . AI_STR_087 . "</div>";
4772
4773 stdOut("Building list of added files " . count($changes['addedFiles']));
4774 if (count($changes['addedFiles']) > 0) {
4775 $l_Result .= '<div class="note_int">' . AI_STR_082 . ' (' . count($changes['addedFiles']) . ')</div><div class="intitem">';
4776 $l_Result .= printList($changes['addedFiles']);
4777 $l_Result .= "</div>" . PHP_EOL;
4778 }
4779
4780 stdOut("Building list of modified files " . count($changes['modifiedFiles']));
4781 if (count($changes['modifiedFiles']) > 0) {
4782 $l_Result .= '<div class="note_int">' . AI_STR_083 . ' (' . count($changes['modifiedFiles']) . ')</div><div class="intitem">';
4783 $l_Result .= printList($changes['modifiedFiles']);
4784 $l_Result .= "</div>" . PHP_EOL;
4785 }
4786
4787 stdOut("Building list of deleted files " . count($changes['deletedFiles']));
4788 if (count($changes['deletedFiles']) > 0) {
4789 $l_Result .= '<div class="note_int">' . AI_STR_084 . ' (' . count($changes['deletedFiles']) . ')</div><div class="intitem">';
4790 $l_Result .= printList($changes['deletedFiles']);
4791 $l_Result .= "</div>" . PHP_EOL;
4792 }
4793
4794 stdOut("Building list of added dirs " . count($changes['addedDirs']));
4795 if (count($changes['addedDirs']) > 0) {
4796 $l_Result .= '<div class="note_int">' . AI_STR_085 . ' (' . count($changes['addedDirs']) . ')</div><div class="intitem">';
4797 $l_Result .= printList($changes['addedDirs']);
4798 $l_Result .= "</div>" . PHP_EOL;
4799 }
4800
4801 stdOut("Building list of deleted dirs " . count($changes['deletedDirs']));
4802 if (count($changes['deletedDirs']) > 0) {
4803 $l_Result .= '<div class="note_int">' . AI_STR_086 . ' (' . count($changes['deletedDirs']) . ')</div><div class="intitem">';
4804 $l_Result .= printList($changes['deletedDirs']);
4805 $l_Result .= "</div>" . PHP_EOL;
4806 }
4807}
4808
4809if (!isCli()) {
4810 $l_Result .= QCR_ExtractInfo($l_PhpInfoBody[1]);
4811}
4812
4813
4814if (function_exists('memory_get_peak_usage')) {
4815 $l_Template = str_replace("@@MEMORY@@", AI_STR_043 . bytes2Human(memory_get_peak_usage()), $l_Template);
4816}
4817
4818$l_Template = str_replace('@@WARN_QUICK@@', ((SCAN_ALL_FILES || $g_SpecificExt) ? '' : AI_STR_045), $l_Template);
4819
4820if ($l_ShowOffer) {
4821 $l_Template = str_replace('@@OFFER@@', $l_Offer, $l_Template);
4822} else {
4823 $l_Template = str_replace('@@OFFER@@', AI_STR_002, $l_Template);
4824}
4825
4826$l_Template = str_replace('@@OFFER2@@', $l_Offer2, $l_Template);
4827
4828$l_Template = str_replace('@@CAUTION@@', AI_STR_003, $l_Template);
4829
4830$l_Template = str_replace('@@CREDITS@@', AI_STR_075, $l_Template);
4831
4832$l_Template = str_replace('@@FOOTER@@', AI_STR_076, $l_Template);
4833
4834$l_Template = str_replace('@@STAT@@', sprintf(AI_STR_012, $time_taken, date('d-m-Y в H:i:s', floor(START_TIME)) , date('d-m-Y в H:i:s')), $l_Template);
4835
4836////////////////////////////////////////////////////////////////////////////
4837$l_Template = str_replace("@@MAIN_CONTENT@@", $l_Result, $l_Template);
4838
4839if (!isCli())
4840{
4841 echo $l_Template;
4842 exit;
4843}
4844
4845if (!defined('REPORT') OR REPORT === '')
4846{
4847 die2('Report not written.');
4848}
4849
4850// write plain text result
4851if (PLAIN_FILE != '') {
4852
4853 $l_PlainResult = preg_replace('|__AI_LINE1__|smi', '[', $l_PlainResult);
4854 $l_PlainResult = preg_replace('|__AI_LINE2__|smi', '] ', $l_PlainResult);
4855 $l_PlainResult = preg_replace('|__AI_MARKER__|smi', ' %> ', $l_PlainResult);
4856
4857 if ($l_FH = fopen(PLAIN_FILE, "w")) {
4858 fputs($l_FH, $l_PlainResult);
4859 fclose($l_FH);
4860 }
4861}
4862
4863// write json result
4864if (defined('JSON_FILE')) {
4865 if ($l_FH = fopen(JSON_FILE, "w")) {
4866 fputs($l_FH, json_encode($l_RawReport));
4867 fclose($l_FH);
4868 }
4869}
4870
4871// write serialized result
4872if (defined('PHP_FILE')) {
4873 if ($l_FH = fopen(PHP_FILE, "w")) {
4874 fputs($l_FH, serialize($l_RawReport));
4875 fclose($l_FH);
4876 }
4877}
4878
4879$emails = getEmails(REPORT);
4880
4881if (!$emails) {
4882 if ($l_FH = fopen($file, "w")) {
4883 fputs($l_FH, $l_Template);
4884 fclose($l_FH);
4885 stdOut("\nReport written to '$file'.");
4886 } else {
4887 stdOut("\nCannot create '$file'.");
4888 }
4889} else {
4890 $headers = array(
4891 'MIME-Version: 1.0',
4892 'Content-type: text/html; charset=UTF-8',
4893 'From: ' . ($defaults['email_from'] ? $defaults['email_from'] : 'AI-Bolit@myhost')
4894 );
4895
4896 for ($i = 0, $size = sizeof($emails); $i < $size; $i++)
4897 {
4898 mail($emails[$i], 'AI-Bolit Report ' . date("d/m/Y H:i", time()), $l_Result, implode("\r\n", $headers));
4899 }
4900
4901 stdOut("\nReport sended to " . implode(', ', $emails));
4902}
4903
4904
4905$time_taken = microtime(true) - START_TIME;
4906$time_taken = number_format($time_taken, 5);
4907
4908
4909stdOut("Scanning complete! Time taken: " . seconds2Human($time_taken));
4910
4911if (DEBUG_PERFORMANCE) {
4912 $keys = array_keys($g_RegExpStat);
4913 for ($i = 0; $i < count($keys); $i++) {
4914 $g_RegExpStat[$keys[$i]] = round($g_RegExpStat[$keys[$i]] * 1000000);
4915 }
4916
4917 arsort($g_RegExpStat);
4918
4919 foreach ($g_RegExpStat as $r => $v) {
4920 echo $v . "\t\t" . $r . "\n";
4921 }
4922
4923 die();
4924}
4925
4926stdOut("\n\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
4927stdOut("Attention! DO NOT LEAVE either ai-bolit.php or AI-BOLIT-REPORT-<xxxx>-<yy>.html \nfile on server. COPY it locally then REMOVE from server. ");
4928stdOut("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
4929
4930if (isset($options['quarantine'])) {
4931 Quarantine();
4932}
4933
4934if (isset($options['cmd'])) {
4935 stdOut("Run \"{$options['cmd']}\" ");
4936 system($options['cmd']);
4937}
4938
4939QCR_Debug();
4940
4941# exit with code
4942
4943$l_EC1 = count($g_CriticalPHP);
4944$l_EC2 = count($g_CriticalJS) + count($g_Phishing) + count($g_WarningPHP[0]) + count($g_WarningPHP[1]);
4945$code = 0;
4946
4947if ($l_EC1 > 0) {
4948 $code = 2;
4949} else {
4950 if ($l_EC2 > 0) {
4951 $code = 1;
4952 }
4953}
4954
4955$stat = array('php_malware' => count($g_CriticalPHP), 'js_malware' => count($g_CriticalJS), 'phishing' => count($g_Phishing));
4956
4957if (function_exists('aibolit_onComplete')) { aibolit_onComplete($code, $stat); }
4958
4959stdOut('Exit code ' . $code);
4960exit($code);
4961
4962############################################# END ###############################################
4963
4964function Quarantine()
4965{
4966 if (!file_exists(DOUBLECHECK_FILE)) {
4967 return;
4968 }
4969
4970 $g_QuarantinePass = 'aibolit';
4971
4972 $archive = "AI-QUARANTINE-" .rand(100000, 999999) . ".zip";
4973 $infoFile = substr($archive, 0, -3) . "txt";
4974 $report = REPORT_PATH . DIR_SEPARATOR . REPORT_FILE;
4975
4976
4977 foreach (file(DOUBLECHECK_FILE) as $file) {
4978 $file = trim($file);
4979 if (!is_file($file)) continue;
4980
4981 $lStat = stat($file);
4982
4983 // skip files over 300KB
4984 if ($lStat['size'] > 300*1024) continue;
4985
4986 // http://www.askapache.com/security/chmod-stat.html
4987 $p = $lStat['mode'];
4988 $perm ='-';
4989 $perm.=(($p&0x0100)?'r':'-').(($p&0x0080)?'w':'-');
4990 $perm.=(($p&0x0040)?(($p&0x0800)?'s':'x'):(($p&0x0800)?'S':'-'));
4991 $perm.=(($p&0x0020)?'r':'-').(($p&0x0010)?'w':'-');
4992 $perm.=(($p&0x0008)?(($p&0x0400)?'s':'x'):(($p&0x0400)?'S':'-'));
4993 $perm.=(($p&0x0004)?'r':'-').(($p&0x0002)?'w':'-');
4994 $perm.=(($p&0x0001)?(($p&0x0200)?'t':'x'):(($p&0x0200)?'T':'-'));
4995
4996 $owner = (function_exists('posix_getpwuid'))? @posix_getpwuid($lStat['uid']) : array('name' => $lStat['uid']);
4997 $group = (function_exists('posix_getgrgid'))? @posix_getgrgid($lStat['gid']) : array('name' => $lStat['uid']);
4998
4999 $inf['permission'][] = $perm;
5000 $inf['owner'][] = $owner['name'];
5001 $inf['group'][] = $group['name'];
5002 $inf['size'][] = $lStat['size'] > 0 ? bytes2Human($lStat['size']) : '-';
5003 $inf['ctime'][] = $lStat['ctime'] > 0 ? date("d/m/Y H:i:s", $lStat['ctime']) : '-';
5004 $inf['mtime'][] = $lStat['mtime'] > 0 ? date("d/m/Y H:i:s", $lStat['mtime']) : '-';
5005 $files[] = strpos($file, './') === 0 ? substr($file, 2) : $file;
5006 }
5007
5008 // get config files for cleaning
5009 $configFilesRegex = 'config(uration|\.in[ic])?\.php$|dbconn\.php$';
5010 $configFiles = preg_grep("~$configFilesRegex~", $files);
5011
5012 // get columns width
5013 $width = array();
5014 foreach (array_keys($inf) as $k) {
5015 $width[$k] = strlen($k);
5016 for ($i = 0; $i < count($inf[$k]); ++$i) {
5017 $len = strlen($inf[$k][$i]);
5018 if ($len > $width[$k])
5019 $width[$k] = $len;
5020 }
5021 }
5022
5023 // headings of columns
5024 $info = '';
5025 foreach (array_keys($inf) as $k) {
5026 $info .= str_pad($k, $width[$k], ' ', STR_PAD_LEFT). ' ';
5027 }
5028 $info .= "name\n";
5029
5030 for ($i = 0; $i < count($files); ++$i) {
5031 foreach (array_keys($inf) as $k) {
5032 $info .= str_pad($inf[$k][$i], $width[$k], ' ', STR_PAD_LEFT). ' ';
5033 }
5034 $info .= $files[$i]."\n";
5035 }
5036 unset($inf, $width);
5037
5038 exec("zip -v 2>&1", $output,$code);
5039
5040 if ($code == 0) {
5041 $filter = '';
5042 if ($configFiles && exec("grep -V 2>&1", $output, $code) && $code == 0) {
5043 $filter = "|grep -v -E '$configFilesRegex'";
5044 }
5045
5046 exec("cat AI-BOLIT-DOUBLECHECK.php $filter |zip -@ --password $g_QuarantinePass $archive", $output, $code);
5047 if ($code == 0) {
5048 file_put_contents($infoFile, $info);
5049 $m = array();
5050 if (!empty($filter)) {
5051 foreach ($configFiles as $file) {
5052 $tmp = file_get_contents($file);
5053 // remove passwords
5054 $tmp = preg_replace('~^.*?pass.*~im', '', $tmp);
5055 // new file name
5056 $file = preg_replace('~.*/~', '', $file) . '-' . rand(100000, 999999);
5057 file_put_contents($file, $tmp);
5058 $m[] = $file;
5059 }
5060 }
5061
5062 exec("zip -j --password $g_QuarantinePass $archive $infoFile $report " . DOUBLECHECK_FILE . ' ' . implode(' ', $m));
5063 stdOut("\nCreate archive '" . realpath($archive) . "'");
5064 stdOut("This archive have password '$g_QuarantinePass'");
5065 foreach ($m as $file) unlink($file);
5066 unlink($infoFile);
5067 return;
5068 }
5069 }
5070
5071 $zip = new ZipArchive;
5072
5073 if ($zip->open($archive, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE) === false) {
5074 stdOut("Cannot create '$archive'.");
5075 return;
5076 }
5077
5078 foreach ($files as $file) {
5079 if (in_array($file, $configFiles)) {
5080 $tmp = file_get_contents($file);
5081 // remove passwords
5082 $tmp = preg_replace('~^.*?pass.*~im', '', $tmp);
5083 $zip->addFromString($file, $tmp);
5084 } else {
5085 $zip->addFile($file);
5086 }
5087 }
5088 $zip->addFile(DOUBLECHECK_FILE, DOUBLECHECK_FILE);
5089 $zip->addFile($report, REPORT_FILE);
5090 $zip->addFromString($infoFile, $info);
5091 $zip->close();
5092
5093 stdOut("\nCreate archive '" . realpath($archive) . "'.");
5094 stdOut("This archive has no password!");
5095}
5096
5097
5098
5099///////////////////////////////////////////////////////////////////////////
5100function QCR_IntegrityCheck($l_RootDir)
5101{
5102 global $g_Structure, $g_Counter, $g_Doorway, $g_FoundTotalFiles, $g_FoundTotalDirs,
5103 $defaults, $g_SkippedFolders, $g_UrlIgnoreList, $g_DirIgnoreList, $g_UnsafeDirArray,
5104 $g_UnsafeFilesFound, $g_SymLinks, $g_HiddenFiles, $g_UnixExec, $g_IgnoredExt, $g_SuspiciousFiles, $l_SkipSample;
5105 global $g_IntegrityDB, $g_ICheck;
5106 static $l_Buffer = '';
5107
5108 $l_DirCounter = 0;
5109 $l_DoorwayFilesCounter = 0;
5110 $l_SourceDirIndex = $g_Counter - 1;
5111
5112 QCR_Debug('Check ' . $l_RootDir);
5113
5114 if ($l_DIRH = @opendir($l_RootDir))
5115 {
5116 while (($l_FileName = readdir($l_DIRH)) !== false)
5117 {
5118 if ($l_FileName == '.' || $l_FileName == '..') continue;
5119
5120 $l_FileName = $l_RootDir . DIR_SEPARATOR . $l_FileName;
5121
5122 $l_Type = filetype($l_FileName);
5123 $l_IsDir = ($l_Type == "dir");
5124 if ($l_Type == "link")
5125 {
5126 $g_SymLinks[] = $l_FileName;
5127 continue;
5128 } else
5129 if ($l_Type != "file" && (!$l_IsDir)) {
5130 $g_UnixExec[] = $l_FileName;
5131 continue;
5132 }
5133
5134 $l_Ext = substr($l_FileName, strrpos($l_FileName, '.') + 1);
5135
5136 $l_NeedToScan = true;
5137 $l_Ext2 = substr(strstr(basename($l_FileName), '.'), 1);
5138 if (in_array(strtolower($l_Ext2), $g_IgnoredExt)) {
5139 $l_NeedToScan = false;
5140 }
5141
5142 // if folder in ignore list
5143 $l_Skip = false;
5144 for ($dr = 0; $dr < count($g_DirIgnoreList); $dr++) {
5145 if (($g_DirIgnoreList[$dr] != '') &&
5146 preg_match('#' . $g_DirIgnoreList[$dr] . '#', $l_FileName, $l_Found)) {
5147 if (!in_array($g_DirIgnoreList[$dr], $l_SkipSample)) {
5148 $l_SkipSample[] = $g_DirIgnoreList[$dr];
5149 } else {
5150 $l_Skip = true;
5151 $l_NeedToScan = false;
5152 }
5153 }
5154 }
5155
5156 if (getRelativePath($l_FileName) == "./" . INTEGRITY_DB_FILE) $l_NeedToScan = false;
5157
5158 if ($l_IsDir)
5159 {
5160 // skip on ignore
5161 if ($l_Skip) {
5162 $g_SkippedFolders[] = $l_FileName;
5163 continue;
5164 }
5165
5166 $l_BaseName = basename($l_FileName);
5167
5168 $l_DirCounter++;
5169
5170 $g_Counter++;
5171 $g_FoundTotalDirs++;
5172
5173 QCR_IntegrityCheck($l_FileName);
5174
5175 } else
5176 {
5177 if ($l_NeedToScan)
5178 {
5179 $g_FoundTotalFiles++;
5180 $g_Counter++;
5181 }
5182 }
5183
5184 if (!$l_NeedToScan) continue;
5185
5186 if (IMAKE) {
5187 write_integrity_db_file($l_FileName);
5188 continue;
5189 }
5190
5191 // ICHECK
5192 // skip if known and not modified.
5193 if (icheck($l_FileName)) continue;
5194
5195 $l_Buffer .= getRelativePath($l_FileName);
5196 $l_Buffer .= $l_IsDir ? DIR_SEPARATOR . "\n" : "\n";
5197
5198 if (strlen($l_Buffer) > 32000)
5199 {
5200 file_put_contents(QUEUE_FILENAME, $l_Buffer, FILE_APPEND) or die2("Cannot write to file " . QUEUE_FILENAME);
5201 $l_Buffer = '';
5202 }
5203
5204 }
5205
5206 closedir($l_DIRH);
5207 }
5208
5209 if (($l_RootDir == ROOT_PATH) && !empty($l_Buffer)) {
5210 file_put_contents(QUEUE_FILENAME, $l_Buffer, FILE_APPEND) or die2("Cannot write to file ".QUEUE_FILENAME);
5211 $l_Buffer = '';
5212 }
5213
5214 if (($l_RootDir == ROOT_PATH)) {
5215 write_integrity_db_file();
5216 }
5217
5218}
5219
5220
5221function getRelativePath($l_FileName) {
5222 return "./" . substr($l_FileName, strlen(ROOT_PATH) + 1) . (is_dir($l_FileName) ? DIR_SEPARATOR : '');
5223}
5224/**
5225 *
5226 * @return true if known and not modified
5227 */
5228function icheck($l_FileName) {
5229 global $g_IntegrityDB, $g_ICheck;
5230 static $l_Buffer = '';
5231 static $l_status = array( 'modified' => 'modified', 'added' => 'added' );
5232
5233 $l_RelativePath = getRelativePath($l_FileName);
5234 $l_known = isset($g_IntegrityDB[$l_RelativePath]);
5235
5236 if (is_dir($l_FileName)) {
5237 if ( $l_known ) {
5238 unset($g_IntegrityDB[$l_RelativePath]);
5239 } else {
5240 $g_IntegrityDB[$l_RelativePath] =& $l_status['added'];
5241 }
5242 return $l_known;
5243 }
5244
5245 if ($l_known == false) {
5246 $g_IntegrityDB[$l_RelativePath] =& $l_status['added'];
5247 return false;
5248 }
5249
5250 $hash = is_file($l_FileName) ? hash_file('sha1', $l_FileName) : '';
5251
5252 if ($g_IntegrityDB[$l_RelativePath] != $hash) {
5253 $g_IntegrityDB[$l_RelativePath] =& $l_status['modified'];
5254 return false;
5255 }
5256
5257 unset($g_IntegrityDB[$l_RelativePath]);
5258 return true;
5259}
5260
5261function write_integrity_db_file($l_FileName = '') {
5262 static $l_Buffer = '';
5263
5264 if (empty($l_FileName)) {
5265 empty($l_Buffer) or file_put_contents('compress.zlib://' . INTEGRITY_DB_FILE, $l_Buffer, FILE_APPEND) or die2("Cannot write to file " . INTEGRITY_DB_FILE);
5266 $l_Buffer = '';
5267 return;
5268 }
5269
5270 $l_RelativePath = getRelativePath($l_FileName);
5271
5272 $hash = is_file($l_FileName) ? hash_file('sha1', $l_FileName) : '';
5273
5274 $l_Buffer .= "$l_RelativePath|$hash\n";
5275
5276 if (strlen($l_Buffer) > 32000)
5277 {
5278 file_put_contents('compress.zlib://' . INTEGRITY_DB_FILE, $l_Buffer, FILE_APPEND) or die2("Cannot write to file " . INTEGRITY_DB_FILE);
5279 $l_Buffer = '';
5280 }
5281}
5282
5283function load_integrity_db() {
5284 global $g_IntegrityDB;
5285 file_exists(INTEGRITY_DB_FILE) or die2('Not found ' . INTEGRITY_DB_FILE);
5286
5287 $s_file = new SplFileObject('compress.zlib://'.INTEGRITY_DB_FILE);
5288 $s_file->setFlags(SplFileObject::READ_AHEAD | SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE);
5289
5290 foreach ($s_file as $line) {
5291 $i = strrpos($line, '|');
5292 if (!$i) continue;
5293 $g_IntegrityDB[substr($line, 0, $i)] = substr($line, $i+1);
5294 }
5295
5296 $s_file = null;
5297}
5298
5299
5300function OptimizeSignatures()
5301{
5302 global $g_DBShe, $g_FlexDBShe, $gX_FlexDBShe, $gXX_FlexDBShe;
5303 global $g_JSVirSig, $gX_JSVirSig;
5304 global $g_AdwareSig;
5305 global $g_PhishingSig;
5306 global $g_ExceptFlex, $g_SusDBPrio, $g_SusDB;
5307
5308 (AI_EXPERT == 2) && ($g_FlexDBShe = array_merge($g_FlexDBShe, $gX_FlexDBShe, $gXX_FlexDBShe));
5309 (AI_EXPERT == 1) && ($g_FlexDBShe = array_merge($g_FlexDBShe, $gX_FlexDBShe));
5310 $gX_FlexDBShe = $gXX_FlexDBShe = array();
5311
5312 (AI_EXPERT == 2) && ($g_JSVirSig = array_merge($g_JSVirSig, $gX_JSVirSig));
5313 $gX_JSVirSig = array();
5314
5315 $count = count($g_FlexDBShe);
5316
5317 for ($i = 0; $i < $count; $i++) {
5318 if ($g_FlexDBShe[$i] == '[a-zA-Z0-9_]+?\(\s*[a-zA-Z0-9_]+?=\s*\)') $g_FlexDBShe[$i] = '\((?<=[a-zA-Z0-9_].)\s*[a-zA-Z0-9_]++=\s*\)';
5319 if ($g_FlexDBShe[$i] == '([^\?\s])\({0,1}\.[\+\*]\){0,1}\2[a-z]*e') $g_FlexDBShe[$i] = '(?J)\.[+*](?<=(?<d>[^\?\s])\(..|(?<d>[^\?\s])..)\)?\g{d}[a-z]*e';
5320 if ($g_FlexDBShe[$i] == '$[a-zA-Z0-9_]\{\d+\}\s*\.$[a-zA-Z0-9_]\{\d+\}\s*\.$[a-zA-Z0-9_]\{\d+\}\s*\.') $g_FlexDBShe[$i] = '\$[a-zA-Z0-9_]\{\d+\}\s*\.\$[a-zA-Z0-9_]\{\d+\}\s*\.\$[a-zA-Z0-9_]\{\d+\}\s*\.';
5321
5322 $g_FlexDBShe[$i] = str_replace('http://.+?/.+?\.php\?a', 'http://[^?\s]++(?<=\.php)\?a', $g_FlexDBShe[$i]);
5323 $g_FlexDBShe[$i] = preg_replace('~\[a-zA-Z0-9_\]\+\K\?~', '+', $g_FlexDBShe[$i]);
5324 $g_FlexDBShe[$i] = preg_replace('~^\\\\[d]\+&@~', '&@(?<=\d..)', $g_FlexDBShe[$i]);
5325 $g_FlexDBShe[$i] = str_replace('\s*[\'"]{0,1}.+?[\'"]{0,1}\s*', '.+?', $g_FlexDBShe[$i]);
5326 $g_FlexDBShe[$i] = str_replace('[\'"]{0,1}.+?[\'"]{0,1}', '.+?', $g_FlexDBShe[$i]);
5327
5328 $g_FlexDBShe[$i] = preg_replace('~^\[\'"\]\{0,1\}\.?|^@\*|^\\\\s\*~', '', $g_FlexDBShe[$i]);
5329 $g_FlexDBShe[$i] = preg_replace('~^\[\'"\]\{0,1\}\.?|^@\*|^\\\\s\*~', '', $g_FlexDBShe[$i]);
5330 }
5331
5332 optSig($g_FlexDBShe);
5333
5334 optSig($g_JSVirSig);
5335 optSig($g_AdwareSig);
5336 optSig($g_PhishingSig);
5337 optSig($g_SusDB);
5338 //optSig($g_SusDBPrio);
5339 //optSig($g_ExceptFlex);
5340
5341 // convert exception rules
5342 $cnt = count($g_ExceptFlex);
5343 for ($i = 0; $i < $cnt; $i++) {
5344 $g_ExceptFlex[$i] = trim(UnwrapObfu($g_ExceptFlex[$i]));
5345 if (!strlen($g_ExceptFlex[$i])) unset($g_ExceptFlex[$i]);
5346 }
5347
5348 $g_ExceptFlex = array_values($g_ExceptFlex);
5349}
5350
5351function optSig(&$sigs)
5352{
5353 $sigs = array_unique($sigs);
5354
5355 // Add SigId
5356 foreach ($sigs as &$s) {
5357 $s .= '(?<X' . myCheckSum($s) . '>)';
5358 }
5359 unset($s);
5360
5361 $fix = array(
5362 '([^\?\s])\({0,1}\.[\+\*]\){0,1}\2[a-z]*e' => '(?J)\.[+*](?<=(?<d>[^\?\s])\(..|(?<d>[^\?\s])..)\)?\g{d}[a-z]*e',
5363 'http://.+?/.+?\.php\?a' => 'http://[^?\s]++(?<=\.php)\?a',
5364 '\s*[\'"]{0,1}.+?[\'"]{0,1}\s*' => '.+?',
5365 '[\'"]{0,1}.+?[\'"]{0,1}' => '.+?'
5366 );
5367
5368 $sigs = str_replace(array_keys($fix), array_values($fix), $sigs);
5369
5370 $fix = array(
5371 '~^\\\\[d]\+&@~' => '&@(?<=\d..)',
5372 '~^((\[\'"\]|\\\\s|@)(\{0,1\}\.?|[?*]))+~' => ''
5373 );
5374
5375 $sigs = preg_replace(array_keys($fix), array_values($fix), $sigs);
5376
5377 optSigCheck($sigs);
5378
5379 $tmp = array();
5380 foreach ($sigs as $i => $s) {
5381 if (!preg_match('#^(?>(?!\.[*+]|\\\\\d)(?:\\\\.|\[.+?\]|.))+$#', $s)) {
5382 unset($sigs[$i]);
5383 $tmp[] = $s;
5384 }
5385 }
5386
5387 usort($sigs, 'strcasecmp');
5388 $txt = implode("\n", $sigs);
5389
5390 for ($i = 24; $i >= 1; ($i > 4 ) ? $i -= 4 : --$i) {
5391 $txt = preg_replace_callback('#^((?>(?:\\\\.|\\[.+?\\]|[^(\n]|\((?:\\\\.|[^)(\n])++\))(?:[*?+]\+?|\{\d+(?:,\d*)?\}[+?]?|)){' . $i . ',})[^\n]*+(?:\\n\\1(?![{?*+]).+)+#im', 'optMergePrefixes', $txt);
5392 }
5393
5394 $sigs = array_merge(explode("\n", $txt), $tmp);
5395
5396 optSigCheck($sigs);
5397}
5398
5399function optMergePrefixes($m)
5400{
5401 $limit = 8000;
5402
5403 $prefix = $m[1];
5404 $prefix_len = strlen($prefix);
5405
5406 $len = $prefix_len;
5407 $r = array();
5408
5409 $suffixes = array();
5410 foreach (explode("\n", $m[0]) as $line) {
5411
5412 if (strlen($line)>$limit) {
5413 $r[] = $line;
5414 continue;
5415 }
5416
5417 $s = substr($line, $prefix_len);
5418 $len += strlen($s);
5419 if ($len > $limit) {
5420 if (count($suffixes) == 1) {
5421 $r[] = $prefix . $suffixes[0];
5422 } else {
5423 $r[] = $prefix . '(?:' . implode('|', $suffixes) . ')';
5424 }
5425 $suffixes = array();
5426 $len = $prefix_len + strlen($s);
5427 }
5428 $suffixes[] = $s;
5429 }
5430
5431 if (!empty($suffixes)) {
5432 if (count($suffixes) == 1) {
5433 $r[] = $prefix . $suffixes[0];
5434 } else {
5435 $r[] = $prefix . '(?:' . implode('|', $suffixes) . ')';
5436 }
5437 }
5438
5439 return implode("\n", $r);
5440}
5441
5442function optMergePrefixes_Old($m)
5443{
5444 $prefix = $m[1];
5445 $prefix_len = strlen($prefix);
5446
5447 $suffixes = array();
5448 foreach (explode("\n", $m[0]) as $line) {
5449 $suffixes[] = substr($line, $prefix_len);
5450 }
5451
5452 return $prefix . '(?:' . implode('|', $suffixes) . ')';
5453}
5454
5455/*
5456 * Checking errors in pattern
5457 */
5458function optSigCheck(&$sigs)
5459{
5460 $result = true;
5461
5462 foreach ($sigs as $k => $sig) {
5463 if (trim($sig) == "") {
5464 if (DEBUG_MODE) {
5465 echo("************>>>>> EMPTY\n pattern: " . $sig . "\n");
5466 }
5467 unset($sigs[$k]);
5468 $result = false;
5469 }
5470
5471 if (@preg_match('#' . $sig . '#smiS', '') === false) {
5472 $error = error_get_last();
5473 if (DEBUG_MODE) {
5474 echo("************>>>>> " . $error['message'] . "\n pattern: " . $sig . "\n");
5475 }
5476 unset($sigs[$k]);
5477 $result = false;
5478 }
5479 }
5480
5481 return $result;
5482}
5483
5484function _hash_($text)
5485{
5486 static $r;
5487
5488 if (empty($r)) {
5489 for ($i = 0; $i < 256; $i++) {
5490 if ($i < 33 OR $i > 127 ) $r[chr($i)] = '';
5491 }
5492 }
5493
5494 return sha1(strtr($text, $r));
5495}
5496
5497function check_whitelist($list, &$snum)
5498{
5499 if (empty($list)) return array();
5500
5501 $file = dirname(__FILE__) . '/AIBOLIT-WHITELIST.db';
5502
5503 $snum = max(0, @filesize($file) - 1024) / 20;
5504 stdOut("\nLoaded " . ceil($snum) . " known files\n");
5505
5506 sort($list);
5507
5508 $hash = reset($list);
5509
5510 $fp = @fopen($file, 'rb');
5511
5512 if (false === $fp) return array();
5513
5514 $header = unpack('V256', fread($fp, 1024));
5515
5516 $result = array();
5517
5518 foreach ($header as $chunk_id => $chunk_size) {
5519 if ($chunk_size > 0) {
5520 $str = fread($fp, $chunk_size);
5521
5522 do {
5523 $raw = pack("H*", $hash);
5524 $id = ord($raw[0]) + 1;
5525
5526 if ($chunk_id == $id AND binarySearch($str, $raw)) {
5527 $result[] = $hash;
5528 }
5529
5530 } while ($chunk_id >= $id AND $hash = next($list));
5531
5532 if ($hash === false) break;
5533 }
5534 }
5535
5536 fclose($fp);
5537
5538 return $result;
5539}
5540
5541
5542function binarySearch($str, $item)
5543{
5544 $item_size = strlen($item);
5545 if ( $item_size == 0 ) return false;
5546
5547 $first = 0;
5548
5549 $last = floor(strlen($str) / $item_size);
5550
5551 while ($first < $last) {
5552 $mid = $first + (($last - $first) >> 1);
5553 $b = substr($str, $mid * $item_size, $item_size);
5554 if (strcmp($item, $b) <= 0)
5555 $last = $mid;
5556 else
5557 $first = $mid + 1;
5558 }
5559
5560 $b = substr($str, $last * $item_size, $item_size);
5561 if ($b == $item) {
5562 return true;
5563 } else {
5564 return false;
5565 }
5566}
5567
5568function getSigId($l_Found)
5569{
5570 foreach ($l_Found as $key => &$v) {
5571 if (is_string($key) AND $v[1] != -1 AND strlen($key) == 9) {
5572 return substr($key, 1);
5573 }
5574 }
5575
5576 return null;
5577}
5578
5579function die2($str) {
5580 if (function_exists('aibolit_onFatalError')) { aibolit_onFatalError($str); }
5581 die($str);
5582}
5583
5584function checkFalsePositives($l_Filename, $l_Unwrapped, $l_DeobfType) {
5585 global $g_DeMapper;
5586
5587 if ($l_DeobfType != '') {
5588 if (DEBUG_MODE) {
5589 stdOut("\n-----------------------------------------------------------------------------\n");
5590 stdOut("[DEBUG]" . $l_Filename . "\n");
5591 var_dump(getFragment($l_Unwrapped, $l_Pos));
5592 stdOut("\n...... $l_DeobfType ...........\n");
5593 var_dump($l_Unwrapped);
5594 stdOut("\n");
5595 }
5596
5597 switch ($l_DeobfType) {
5598 case '_GLOBALS_':
5599 foreach ($g_DeMapper as $fkey => $fvalue) {
5600 if (DEBUG_MODE) {
5601 stdOut("[$fkey] => [$fvalue]\n");
5602 }
5603
5604 if ((strpos($l_Filename, $fkey) !== false) &&
5605 (strpos($l_Unwrapped, $fvalue) !== false)) {
5606 if (DEBUG_MODE) {
5607 stdOut("\n[DEBUG] *** SKIP: False Positive\n");
5608 }
5609
5610 return true;
5611 }
5612 }
5613 break;
5614 }
5615
5616
5617 return false;
5618 }
5619}
5620
5621function deobfuscate_bitrix($str)
5622{
5623 global $varname,$funclist,$strlist;
5624 $res = $str;
5625 $funclist = array();
5626 $strlist = array();
5627 $res = preg_replace("|'\s*\.\s*'|smi", '', $res);
5628 $res = preg_replace_callback(
5629 '|(round\((.+?)\))|smi',
5630 function ($matches) {
5631 return round($matches[2]);
5632 },
5633 $res
5634 );
5635 $res = preg_replace_callback(
5636 '|base64_decode\(\'(.*?)\'\)|smi',
5637 function ($matches) {
5638 return "'" . base64_decode($matches[1]) . "'";
5639 },
5640 $res
5641 );
5642
5643 $res = preg_replace_callback(
5644 '|\'(.*?)\'|sm',
5645 function ($matches) {
5646 $temp = base64_decode($matches[1]);
5647 if (base64_encode($temp) === $matches[1] && preg_match('#^[ -~]*$#', $temp)) {
5648 return "'" . $temp . "'";
5649 } else {
5650 return "'" . $matches[1] . "'";
5651 }
5652 },
5653 $res
5654 );
5655
5656 if (preg_match_all('|\$GLOBALS\[\'(.+?)\'\]\s*=\s*Array\((.+?)\);|smi', $res, $founds, PREG_SET_ORDER)) {
5657 foreach($founds as $found)
5658 {
5659 $varname = $found[1];
5660 $funclist[$varname] = explode(',', $found[2]);
5661 $funclist[$varname] = array_map(function($value) { return trim($value, "'"); }, $funclist[$varname]);
5662
5663 $res = preg_replace_callback(
5664 '|\$GLOBALS\[\'' . $varname . '\'\]\[(\d+)\]|smi',
5665 function ($matches) {
5666 global $varname, $funclist;
5667 return $funclist[$varname][$matches[1]];
5668 },
5669 $res
5670 );
5671
5672 $res = preg_replace('~' . quotemeta(str_replace('~', '.', $found[0])) . '~smi', '', $res);
5673 }
5674 }
5675
5676
5677 if (preg_match_all('|function _+(\d+)\(\$i\){\$a=Array\((.+?)\);[^}]+}|smi', $res, $founds, PREG_SET_ORDER)) {
5678 foreach($founds as $found)
5679 {
5680 $strlist = explode(',', $found[2]);
5681
5682 $res = preg_replace_callback(
5683 '|_' . $found[1] . '\((\d+)\)|smi',
5684 function ($matches) {
5685 global $strlist;
5686 return $strlist[$matches[1]];
5687 },
5688 $res
5689 );
5690
5691 $res = preg_replace('~' . quotemeta(str_replace('~', '\\~', $found[0])) . '~smi', '', $res);
5692 }
5693 }
5694
5695 $res = preg_replace('~<\?(php)?\s*\?>~smi', '', $res);
5696
5697 preg_match_all('~function (_+(.+?))\(\$[_0-9]+\)\{\s*static\s*\$([_0-9]+)\s*=\s*(true|false);.*?\$\3=array\((.*?)\);\s*return\s*base64_decode\(\$\3~smi', $res, $founds,PREG_SET_ORDER);
5698 foreach($founds as $found)
5699 {
5700 $strlist = explode("',",$found[5]);
5701 $res = preg_replace_callback(
5702 '|' . $found[1] . '\((\d+)\)|sm',
5703 function ($matches) {
5704 global $strlist;
5705 return $strlist[$matches[1]]."'";
5706 },
5707 $res
5708 );
5709
5710 }
5711
5712 $res = preg_replace('|;|sm', ";\n", $res);
5713
5714 return $res;
5715}
5716
5717function my_eval($matches)
5718{
5719 $string = $matches[0];
5720 $string = substr($string, 5, strlen($string) - 7);
5721 return decode($string);
5722}
5723
5724function decode($string, $level = 0)
5725{
5726 if (trim($string) == '') return '';
5727 if ($level > 100) return '';
5728
5729 if (($string[0] == '\'') || ($string[0] == '"')) {
5730 return substr($string, 1, strlen($string) - 2); //
5731 } elseif ($string[0] == '$') {
5732 return $string; //
5733 } else {
5734 $pos = strpos($string, '(');
5735 $function = substr($string, 0, $pos);
5736
5737 $arg = decode(substr($string, $pos + 1), $level + 1);
5738 if ($function == 'base64_decode') return @base64_decode($arg);
5739 else if ($function == 'gzinflate') return @gzinflate($arg);
5740 else if ($function == 'gzuncompress') return @gzuncompress($arg);
5741 else if ($function == 'strrev') return @strrev($arg);
5742 else if ($function == 'str_rot13') return @str_rot13($arg);
5743 else return $arg;
5744 }
5745}
5746
5747function deobfuscate_eval($str)
5748{
5749 $res = preg_replace_callback('~eval\((base64_decode|gzinflate|strrev|str_rot13|gzuncompress).*?\);~ms', "my_eval", $str);
5750 return $res;
5751}
5752
5753function getEvalCode($string)
5754{
5755 preg_match("/eval\((.*?)\);/", $string, $matches);
5756 return (empty($matches)) ? '' : end($matches);
5757}
5758function getTextInsideQuotes($string)
5759{
5760 preg_match('/("(.*?)")/', $string, $matches);
5761 return (empty($matches)) ? '' : end($matches);
5762}
5763
5764function deobfuscate_lockit($str)
5765{
5766 $obfPHP = $str;
5767 $phpcode = base64_decode(getTextInsideQuotes(getEvalCode($obfPHP)));
5768 $hexvalues = getHexValues($phpcode);
5769 $tmp_point = getHexValues($obfPHP);
5770 $pointer1 = hexdec($tmp_point[0]);
5771 $pointer2 = hexdec($hexvalues[0]);
5772 $pointer3 = hexdec($hexvalues[1]);
5773 $needles = getNeedles($phpcode);
5774 $needle = $needles[count($needles) - 2];
5775 $before_needle = end($needles);
5776
5777
5778 $phpcode = base64_decode(strtr(substr($obfPHP, $pointer2 + $pointer3, $pointer1), $needle, $before_needle));
5779 return "<?php {$phpcode} ?>";
5780}
5781
5782
5783 function getNeedles($string)
5784 {
5785 preg_match_all("/'(.*?)'/", $string, $matches);
5786
5787 return (empty($matches)) ? array() : $matches[1];
5788 }
5789 function getHexValues($string)
5790 {
5791 preg_match_all('/0x[a-fA-F0-9]{1,8}/', $string, $matches);
5792 return (empty($matches)) ? array() : $matches[0];
5793 }
5794
5795function deobfuscate_als($str)
5796{
5797 preg_match('~__FILE__;\$[O0]+=[0-9a-fx]+;eval\(\$[O0]+\(\'([^\']+)\'\)\);return;~msi',$str,$layer1);
5798
5799 preg_match('~\$[O0]+=(\$[O0]+\()+\$[O0]+,[0-9a-fx]+\),\'([^\']+)\',\'([^\']+)\'\)\);eval\(~msi',base64_decode($layer1[1]),$layer2);
5800 $res = explode("?>", $str);
5801 if (strlen($res[1])>0)
5802 {
5803 $res = substr($res[1], 380);
5804 $res = base64_decode(strtr($res, $layer2[2], $layer2[3]));
5805 }
5806 return "<?php {$res} ?>";
5807}
5808
5809function deobfuscate_byterun($str)
5810{
5811 preg_match('~\$_F=__FILE__;\$_X=\'([^\']+)\';eval\(~ms',$str,$matches);
5812 $res = base64_decode($matches[1]);
5813 $res = strtr($res,'123456aouie','aouie123456');
5814 return "<?php {$res} ?>";
5815}
5816
5817function deobfuscate_urldecode($str)
5818{
5819 preg_match('~(\$[O0_]+)=urldecode\("([%0-9a-f]+)"\);((\$[O0_]+=(\1\{\d+\}\.?)+;)+)~msi',$str,$matches);
5820 $alph = urldecode($matches[2]);
5821 $funcs=$matches[3];
5822 for($i = 0; $i < strlen($alph); $i++)
5823 {
5824 $funcs = str_replace($matches[1].'{'.$i.'}.',$alph[$i],$funcs);
5825 $funcs = str_replace($matches[1].'{'.$i.'}',$alph[$i],$funcs);
5826 }
5827
5828 $str = str_replace($matches[3], $funcs, $str);
5829 $funcs = explode(';', $funcs);
5830 foreach($funcs as $func)
5831 {
5832 $func_arr = explode("=", $func);
5833 if (count($func_arr) == 2)
5834 {
5835 $func_arr[0] = str_replace('$', '', $func_arr[0]);
5836 $str = str_replace('${"GLOBALS"}["' . $func_arr[0] . '"]', $func_arr[1], $str);
5837 }
5838 }
5839
5840 return $str;
5841}
5842
5843
5844function formatPHP($string)
5845{
5846 $string = str_replace('<?php', '', $string);
5847 $string = str_replace('?>', '', $string);
5848 $string = str_replace(PHP_EOL, "", $string);
5849 $string = str_replace(";", ";\n", $string);
5850 return $string;
5851}
5852
5853function deobfuscate_fopo($str)
5854{
5855 $phpcode = formatPHP($str);
5856 $phpcode = base64_decode(getTextInsideQuotes(getEvalCode($phpcode)));
5857 @$phpcode = gzinflate(base64_decode(str_rot13(getTextInsideQuotes(end(explode(':', $phpcode))))));
5858 $old = '';
5859 while (($old != $phpcode) && (strlen(strstr($phpcode, '@eval($')) > 0)) {
5860 $old = $phpcode;
5861 $funcs = explode(';', $phpcode);
5862 if (count($funcs) == 5) $phpcode = gzinflate(base64_decode(str_rot13(getTextInsideQuotes(getEvalCode($phpcode)))));
5863 else if (count($funcs) == 4) $phpcode = gzinflate(base64_decode(getTextInsideQuotes(getEvalCode($phpcode))));
5864 }
5865
5866 return substr($phpcode, 2);
5867}
5868
5869function getObfuscateType($str)
5870{
5871if (preg_match('~eval\((base64_decode|gzinflate|strrev|str_rot13|gzuncompress)~ms', $str))
5872 return "eval";
5873 if (preg_match('~\$GLOBALS\[\'_+\d+\'\]=\s*array\(base64_decode\(~msi', $str))
5874 return "_GLOBALS_";
5875 if (preg_match('~function _+\d+\(\$i\){\$a=Array~msi', $str))
5876 return "_GLOBALS_";
5877 if (preg_match('~__FILE__;\$[O0]+=[0-9a-fx]+;eval\(\$[O0]+\(\'([^\']+)\'\)\);return;~msi', $str))
5878 return "ALS-Fullsite";
5879 if (preg_match('~\$[O0]*=urldecode\(\'%66%67%36%73%62%65%68%70%72%61%34%63%6f%5f%74%6e%64\'\);\s*\$GLOBALS\[\'[O0]*\'\]=\$[O0]*~msi', $str))
5880 return "LockIt!";
5881 if (preg_match('~\$\w+="(\\\x?[0-9a-f]+){13}";@eval\(\$\w+\(~msi', $str))
5882 return "FOPO";
5883 if (preg_match('~\$_F=__FILE__;\$_X=\'([^\']+\');eval\(~ms', $str))
5884 return "ByteRun";
5885 if (preg_match('~(\$[O0_]+)=urldecode\("([%0-9a-f]+)"\);((\$[O0_]+=(\1\{\d+\}\.?)+;)+)~msi', $str))
5886 return "urldecode_globals";
5887
5888}
5889
5890function deobfuscate($str)
5891{
5892 switch (getObfuscateType($str)) {
5893 case '_GLOBALS_':
5894 $str = deobfuscate_bitrix($str);
5895 break;
5896 case 'eval':
5897 $str = deobfuscate_eval($str);
5898 break;
5899 case 'ALS-Fullsite':
5900 $str = deobfuscate_als($str);
5901 break;
5902 case 'LockIt!':
5903 $str = deobfuscate_lockit($str);
5904 break;
5905 case 'FOPO':
5906 $str = deobfuscate_fopo($str);
5907 break;
5908 case 'ByteRun':
5909 $str = deobfuscate_byterun($str);
5910 break;
5911 case 'urldecode_globals' :
5912 $str = deobfuscate_urldecode($str);
5913 break;
5914 }
5915
5916 return $str;
5917}