403Webshell
Server IP : 188.114.96.3  /  Your IP : 216.73.216.143
Web Server : Apache
System : Linux sv058.home.net.pl 6.8.2 husak_dirty_pages_fix #1 SMP PREEMPT_DYNAMIC Tue Apr 2 22:06:51 CEST 2024 x86_64
User :  ( 3194769)
PHP Version : 8.5.12
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : OFF
Directory :  /polana/admin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /polana/admin/polana-v184-audyt-calosc.php
<?php
declare(strict_types=1);
/**
 * POLANA V18.4 — read-only, authenticated inventory and code health audit.
 * No writes, SQL modifications, external telemetry, cookie injection or cleanup.
 * Requires the existing site's includes/functions.php for admin authentication.
 */
require_once dirname(__DIR__) . '/includes/functions.php';
require_admin_role();
header('Cache-Control: private, no-store, max-age=0');
header('Pragma: no-cache');
header('X-Robots-Tag: noindex, nofollow', true);
header('Referrer-Policy: no-referrer');

function p184_esc($s): string { return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); }
function p184_stamp(): string { return date('Y-m-d H:i:s T'); }
function p184_inventory(string $root): array {
    $data = ['created' => p184_stamp(), 'version' => '18.4-readonly', 'limits' => [], 'modules' => [], 'legacy_candidates' => [], 'sensitive_candidates' => [], 'analytics_code' => [], 'errors' => [], 'file_counts' => ['files' => 0, 'directories' => 0, 'read_code_files' => 0]];
    $expected = [
        'Centrum zarządzania' => 'admin/polana-zarzadzanie.php',
        'Rezerwacje' => 'admin/reservations.php',
        'Godziny rezerwacji' => 'admin/polana-godziny-rezerwacji.php',
        'Menu — centrum' => 'admin/polana-menu-centrum.php',
        'Menu — edytor' => 'admin/menus.php',
        'SEO / Google' => 'admin/polana-seo-centrum.php',
        'Analityka' => 'admin/polana-analityka.php',
        'Kalendarz' => 'admin/polana-kalendarz.php',
        'Newsletter' => 'admin/polana-newsletter.php',
        'Backup ręczny SQL' => 'admin/database-backup.php',
        'Backup automatyczny V18.2' => 'admin/polana-backup-automat.php',
        'Naprawa backupu V18.3' => 'admin/polana-v183-naprawa.php',
        'Audyt V18.3' => 'admin/polana-v183-audyt.php',
        'CRON backupu' => 'cron/polana-backup-v182.php',
        'Biblioteka backupu' => 'includes/polana_backup_v182.php',
    ];
    foreach ($expected as $name => $file) $data['modules'][] = ['name' => $name, 'path' => $file, 'exists' => is_file($root . '/' . $file)];
    $ignore = ['.git', '.svn', 'node_modules', 'vendor', 'sessions', 'cache', 'tmp', '.well-known', 'logs'];
    $patterns = [
        'Microsoft Clarity — instalacja' => '~(?:clarity\\.ms/tag/|clarity\\s*\\(\\s*[\'\"]set)~i',
        'Microsoft Clarity — consentv2' => '~consentv2~i',
        'GTM — kod kontenera' => '~(?:googletagmanager\\.com/gtm\\.js|GTM-[A-Z0-9]{4,})~i',
        'GA4 — gtag' => '~(?:googletagmanager\\.com/gtag/js|gtag\\s*\\(\\s*[\'\"]config)~i',
        'Consent Mode v2' => '~(?:analytics_storage|ad_storage|ad_Storage|analytics_Storage)~',
        'Baner zgód / cookies' => '~(?:cookie[_-]?consent|consent[_-]?banner|cookie[_-]?banner)~i',
    ];
    $dir = new RecursiveDirectoryIterator($root, FilesystemIterator::SKIP_DOTS);
    $filter = new RecursiveCallbackFilterIterator($dir, static function(SplFileInfo $f) use ($ignore): bool {
        if ($f->isLink()) return false;
        return !$f->isDir() || !in_array(strtolower($f->getFilename()), $ignore, true);
    });
    $it = new RecursiveIteratorIterator($filter);
    $maxFiles = 12000; $maxReads = 1400; $maxLegacy = 160; $maxSensitive = 100; $maxHits = 80;
    foreach ($it as $file) {
        if ($file->isLink() || !$file->isFile()) continue;
        $data['file_counts']['files']++;
        if ($data['file_counts']['files'] > $maxFiles) { $data['limits'][] = 'Skan zatrzymany po 12 000 plików'; break; }
        $full = $file->getPathname();
        $relative = str_replace('\\', '/', substr($full, strlen($root) + 1));
        $name = basename($relative);
        if (preg_match('~(?:^|/)(?:\.env(?:\..*)?|\.htpasswd|\.user\.ini|\.git/config|backup\.key|.*\.(?:sql|sql\.gz|bak|dump|pbackup|pem|key|p12|pfx|sqlite|sqlite3|tar|tgz|zip))$~i', $relative) && count($data['sensitive_candidates']) < $maxSensitive) {
            $data['sensitive_candidates'][] = ['path' => $relative, 'reason' => 'Weryfikacja dostępu HTTP i przeznaczenia; niczego nie usuwano'];
        }
        $looksOld = preg_match('~(?:^|/)(?:[^/]*(?:instalator|installer|rollback|diagnostyk|_old|\.old|\.backup|\.orig|\.save|\.tmp|_kopi[ae]|test-|patch|fix)[^/]*|polana-v\d{1,3}[^/]*)\.(?:php|html?|js|css)$~i', $relative);
        if ($looksOld && count($data['legacy_candidates']) < $maxLegacy) {
            $data['legacy_candidates'][] = ['path' => $relative, 'reason' => 'Kandydat do przeglądu — może być nadal używany'];
        }
        $ext = strtolower(pathinfo($name, PATHINFO_EXTENSION));
        if (!in_array($ext, ['php','js','html','htm','twig'], true)) continue;
        if (($file->getSize() ?: 0) > 350000 || $data['file_counts']['read_code_files'] >= $maxReads) continue;
        $data['file_counts']['read_code_files']++;
        $content = @file_get_contents($full);
        if (!is_string($content)) continue;
        foreach ($patterns as $label => $regex) {
            if (preg_match($regex, $content) && count($data['analytics_code']) < $maxHits) {
                $data['analytics_code'][] = ['path' => $relative, 'signal' => $label];
            }
        }
    }
    if ($data['file_counts']['read_code_files'] >= $maxReads) $data['limits'][] = 'Skan kodu ograniczony do 1400 małych plików';
    if (count($data['legacy_candidates']) >= $maxLegacy) $data['limits'][] = 'Lista starszych modułów ograniczona do 160 pozycji';
    if (count($data['sensitive_candidates']) >= $maxSensitive) $data['limits'][] = 'Lista wrażliwych plików ograniczona do 100 pozycji';
    if (count($data['analytics_code']) >= $maxHits) $data['limits'][] = 'Lista śladów analityki ograniczona do 80 pozycji';
    if (is_file($root . '/includes/polana_backup_v182.php')) {
        try {
            require_once $root . '/includes/polana_backup_v182.php';
            $backupRoot = pbk_private();
            $sql = glob($backupRoot . '/daily/*.pbackup') ?: [];
            usort($sql, static fn($x,$y) => (filemtime($y) ?: 0) <=> (filemtime($x) ?: 0));
            $data['backup'] = [
                'location' => 'Prywatny katalog zgłoszony przez bibliotekę (nie pokazujemy pełnej ścieżki)',
                'private_is_outside_webroot' => !str_starts_with(realpath($backupRoot) . '/', $root . '/'),
                'daily_count' => count($sql),
                'latest_filename' => $sql ? basename($sql[0]) : null,
                'latest_older_than_48h' => $sql ? (time() - (filemtime($sql[0]) ?: 0) > 172800) : null,
                'encryption_integrity' => $sql ? (pbk_verify_encrypted($sql[0]) ? 'OK' : 'BŁĄD') : 'NIE SPRAWDZONO',
            ];
        } catch (Throwable $e) { $data['backup'] = ['error' => 'Brak poprawnej konfiguracji katalogu/klucza backupów — sprawdź panel V18.3']; }
    } else $data['backup'] = ['error' => 'Brak biblioteki automatycznych kopii'];
    return $data;
}
function p184_probe_public(): array {
    if (!extension_loaded('curl')) return [['url' => 'Test HTTP', 'status' => 'Brak rozszerzenia cURL — nie uruchomiono', 'redirect' => '']];
    $targets = [
        'https://polanasmakow.pl/',
        'https://mojapolanasmakow.pl/',
        'https://mojapolanasmakow.pl/menu',
        'https://mojapolanasmakow.pl/rezerwacja',
        'https://mojapolanasmakow.pl/robots.txt',
        'https://mojapolanasmakow.pl/sitemap.xml',
        'https://mojapolanasmakow.pl/polityka-prywatnosci',
    ];
    $rows = [];
    foreach ($targets as $url) {
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_NOBODY => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => false,
            CURLOPT_FOLLOWLOCATION => false,
            CURLOPT_TIMEOUT => 5,
            CURLOPT_CONNECTTIMEOUT => 3,
            CURLOPT_SSL_VERIFYPEER => true,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_USERAGENT => 'POLANA-V18.4-AUDIT/1.0',
        ]);
        $result = curl_exec($ch);
        $code = (int)curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
        $location = curl_getinfo($ch, CURLINFO_REDIRECT_URL);
        $err = curl_error($ch);
        curl_close($ch);
        $rows[] = ['url' => $url, 'status' => ($result === false ? 'Błąd: ' . substr($err,0,100) : ('HTTP ' . $code . ' (HEAD)')), 'redirect' => is_string($location) ? $location : ''];
    }
    return $rows;
}
$root = realpath(dirname(__DIR__));
if ($root === false) { http_response_code(500); exit('Brak katalogu witryny.'); }
$scan = p184_inventory($root);
$probes = null;
if (($_SERVER['REQUEST_METHOD'] ?? 'GET') === 'POST') {
    verify_csrf();
    $action = (string)($_POST['action'] ?? '');
    if ($action === 'http') $probes = p184_probe_public();
    if ($action === 'export') {
        header('Content-Type: application/json; charset=utf-8');
        header('Content-Disposition: attachment; filename="POLANA_V18_4_audyt_bez_sekretow.json"');
        echo json_encode($scan, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_INVALID_UTF8_SUBSTITUTE);
        exit;
    }
}
render_admin_header('POLANA V18.4 — audyt całości');
?>
<style>
.p184 {max-width:1220px; margin:24px auto 60px; padding:0 18px; color:#223528;}
.p184 * {box-sizing:border-box}
.p184 article {background:#fff;border:1px solid #dce6de;border-radius:14px;padding:18px;margin:16px 0;}
.p184 h1 {font-size:1.8rem;margin:0 0 14px}.p184 h2 {font-size:1.25rem}
.p184 table {width:100%;border-collapse:collapse}.p184 th,.p184 td {text-align:left;vertical-align:top;border-bottom:1px solid #e4ebe6;padding:9px;}
.p184 code {overflow-wrap:anywhere}.p184 button {border:0;border-radius:9px;padding:11px 15px;background:#164b30;color:white;cursor:pointer}
.p184 .scroll {overflow:auto}.p184 .muted {color:#5e7264}.p184 .ok {color:#12723f}.p184 .warn {color:#a76017}
.p184 form {display:inline-block;margin-right:9px;margin-bottom:9px}
</style>
<div class="p184">
<h1>POLANA V18.4 — audyt całości i pozostałości</h1>
<p>Tryb <b>tylko odczyt</b>: nie zmienia bazy, nie wysyła e-maili, nie modyfikuje plików, nie uruchamia instalatorów i niczego nie kasuje. Wynik ograniczono do nazw plików i wykrytych sygnałów — bez treści konfiguracji, tokenów i haseł.</p>
<article><h2>Stan skanowania</h2>
<p>Data: <b><?=p184_esc($scan['created'])?></b> | Plików: <b><?= (int)$scan['file_counts']['files'] ?></b> | Kodów przejrzanych: <b><?= (int)$scan['file_counts']['read_code_files'] ?></b></p>
<?php foreach($scan['limits'] as $x): ?><p class="warn"><?=p184_esc($x)?></p><?php endforeach; ?>
<form method="post"><?=csrf_field()?><input type="hidden" name="action" value="export"><button type="submit">Pobierz bezpieczny raport JSON</button></form>
<form method="post"><?=csrf_field()?><input type="hidden" name="action" value="http"><button type="submit">Sprawdź HTTP 7 adresów (HEAD)</button></form>
</article>
<article><h2>Moduły — pliki wejściowe</h2><p class="muted">Obecność pliku nie dowodzi, że moduł działa, a brak opcjonalnego pliku nie musi oznaczać awarii.</p><div class="scroll"><table><thead><tr><th>Moduł</th><th>Stan</th><th>Ścieżka</th></tr></thead><tbody>
<?php foreach($scan['modules'] as $m): ?><tr><td><?=p184_esc($m['name'])?></td><td class="<?= $m['exists']?'ok':'warn' ?>"><?= $m['exists'] ? 'ISTNIEJE' : 'BRAK' ?></td><td><code><?=p184_esc($m['path'])?></code></td></tr><?php endforeach; ?>
</tbody></table></div></article>
<article><h2>Backupy</h2>
<?php if(isset($scan['backup']['error'])): ?><p class="warn"><?=p184_esc($scan['backup']['error'])?></p>
<?php else: ?><p>Katalog poza WWW: <b><?=!empty($scan['backup']['private_is_outside_webroot'])?'TAK':'NIE — WYMAGA KONTROLI'?></b> · Liczba kopii SQL: <b><?= (int)$scan['backup']['daily_count'] ?></b></p>
<p>Ostatnia kopia: <code><?=p184_esc($scan['backup']['latest_filename'] ?? 'brak')?></code>; integralność: <b><?=p184_esc($scan['backup']['encryption_integrity'])?></b>; starsza niż 48 godzin: <b><?=p184_esc(var_export($scan['backup']['latest_older_than_48h'],true))?></b></p><?php endif; ?>
</article>
<article><h2>Potencjalne śmieci po aktualizacjach <small>(<?=count($scan['legacy_candidates'])?>)</small></h2>
<p class="warn"><b>Uwaga: to kandydaci, nie pliki do automatycznego usunięcia.</b> Część instalatorów pełni funkcję rollbacku albo jest nadal linkowana w panelu.</p>
<div class="scroll"><table><thead><tr><th>Plik</th><th>Ocena</th></tr></thead><tbody>
<?php foreach($scan['legacy_candidates'] as $item): ?><tr><td><code><?=p184_esc($item['path'])?></code></td><td><?=p184_esc($item['reason'])?></td></tr><?php endforeach; ?>
</tbody></table></div></article>
<article><h2>Pliki prywatne lub kopie wewnątrz WWW <small>(<?=count($scan['sensitive_candidates'])?>)</small></h2>
<p>Plik .zip/.sql/.env znaleziony w katalogu strony może wymagać pilnego przeniesienia poza WWW. Sprawdź skuteczną blokadę HTTP przed jakąkolwiek zmianą.</p>
<div class="scroll"><table><thead><tr><th>Plik</th><th>Co zrobić</th></tr></thead><tbody>
<?php foreach($scan['sensitive_candidates'] as $item): ?><tr><td><code><?=p184_esc($item['path'])?></code></td><td><?=p184_esc($item['reason'])?></td></tr><?php endforeach; ?>
</tbody></table></div></article>
<article><h2>Ślady analityki / Clarity / cookies <small>(<?=count($scan['analytics_code'])?>)</small></h2>
<p>Wykrycie w kodzie nie znaczy, że skrypt jest aktywny. W szczególności nie kopiuj Clarity drugi raz do szablonu i GTM.</p><div class="scroll"><table><thead><tr><th>Plik</th><th>Ślad</th></tr></thead><tbody>
<?php foreach($scan['analytics_code'] as $hit): ?><tr><td><code><?=p184_esc($hit['path'])?></code></td><td><?=p184_esc($hit['signal'])?></td></tr><?php endforeach; ?>
</tbody></table></div></article>
<?php if(is_array($probes)): ?><article><h2>Odpowiedzi HTTP</h2><div class="scroll"><table><thead><tr><th>URL</th><th>Status HEAD</th><th>Przekierowanie</th></tr></thead><tbody>
<?php foreach($probes as $v): ?><tr><td><code><?=p184_esc($v['url'])?></code></td><td><?=p184_esc($v['status'])?></td><td><code><?=p184_esc($v['redirect'])?></code></td></tr><?php endforeach; ?>
</tbody></table></div><p class="muted">HEAD jest wstępnym testem, bo serwer może obsługiwać HEAD i GET różnie. Status 200 nie potwierdza prawidłowej treści.</p></article><?php endif; ?>
<article><h2>Lista do domknięcia po audycie</h2><ol>
<li>Naprawa prywatnego katalogu, kopii SQL, retencji, wysyłki i odzyskiwania offline.</li>
<li>Rezerwacje: maile, numer #POLANA, godziny, duplikaty, kalendarz Google i powiadomienia.</li>
<li>Menu: PL/EN/DE/ES, wersja mobilna, drukowanie i QR.</li>
<li>SEO: 301 między domenami, canonical, robots, sitemap, IndexNow oraz widoczność stron.</li>
<li>Analityka: jedno źródło GTM/GA/Clarity, Consent Mode v2, baner zgód i polityka prywatności.</li>
<li>Bezpieczeństwo: wrażliwe pliki, stare instalatory, backupy i weryfikacja logowania.</li>
</ol><p><b>Nic z powyższej listy nie zostało samoczynnie zmienione.</b> To kolejka weryfikacji, nie lista wykonanych poprawek.</p></article>
</div>
<?php render_admin_footer(); ?>

Youez - 2016 - github.com/yon3zu
LinuXploit