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