Menganalisa XSS (Cross Site Scripting) Di Tingkatan Lebih Lanjut


Hello guys, selamat siang nih..
Sebelumnya saya ingin perkenalkan diri saya dulu, saya admin Yus dan sebenarnya saya sudah disuruh sama si cakil buat bantu diblognya sejak lama cuman baru sempat ada idenya sekarang :v

Dan sebelum saya menulis artikel ini, mari kita mendoakan segala yang terbaik untuk mr.cakil ini.

Nah, di malam yang dingin dan sepi kayak hati ini saya akan memberikan pembelajaran XSS yang sebelumnya udah diposting sama admin faisyal tampan sangat ini..

Bagi anda yang memiliki situs tentunya sangat risih dengan adanya bug XSS ini kan. Bagaimanapun juga XSS ini nantinya akan menjadi keluh kesah para visitor situs web kita. Maka dari itu pembahasan ini pun dimulai dengan pengenalan ulang pada XSS ini.

Seperti yang telah di jelaskan pada postingan sebelumnya (lihat disini) bahwa XSS  (Cross Site Scripting) merupakan salah satu jenis serangan injeksi kode (code injection attack) yang penyerangannya dengan cara memasukkan kode HTML (Hyper Text Markup Language). XSS ini sendiri terbagi menjadi dua yakni Reflected (hanya terjadi pada sisi klien / client side) dan Stored (ini terjadi pada sisi server / server side yang nantinya kode HTML ini dikirim dan disimpan ke database situs anda). Dan karena sebelumnya yang dijelaskan lebih mengarah kepada Reflected. Maka disini saya akan membahas Stored XSS namun dengan cara yang unik yaitu pada penggunaan fitur upload file..

Baiklah saya akan memulai langkah-langkahnya..

1. Saya telah menyediakan fitur upload file gambar yang nantinya akan disimpan ke database localhost saya..

2. Langkah selanjutnya adalah rename file gambar anda. Di sini saya akan merename file gambar vanesha dan merubahnya menjadi


Menjadi seperti berikut.




3. Lalu saya membuka halaman upload pada localhost saya. (Disini saya menggunakan fitur update dari CMS yang saya kembangkan sendiri karna kelamaan untuk bikin awal yang polos jadi yaudah sikat aja :v). Untuk kode sederhananya kurang lebih seperti ini

  1. <?php
  2.     include "../../config/connect.php";
  3.     $id = abs((int) $_GET['id']);
  4.     $query = mysqli_query($connect, "SELECT * FROM article WHERE id='$id'");
  5.     $data = mysqli_fetch_array($query);
  6. ?>
  7.         <form class="form-inline my-2 my-lg-0" method="POST" enctype="multipart/form-data">
  8.             <table width="100%" cellpadding="0" cellspacing="0">
  9.                     <tr>
  10.                         <td width="30%">Title of Article</td>
  11.                         <td width="1%">:</td>
  12.                         <td width="800"><input class="form-control mr-sm-2" type="text" value="<?php echo htmlspecialchars($data['title']);?>" name="title"></td>
  13.                     </tr>
  14.              <tr>
  15.                         <td width="30%">Content</td>
  16.                         <td width="1%">:</td>
  17.                         <td width="800"><textarea cols="100" type="text" name="content"><?php echo htmlspecialchars($data['content']);?></textarea></td>
  18.                     </tr>
  19.              <tr>
  20.                         <td width="20%">Preview image</td>
  21.                         <td width="1%">:</td>
  22.                         <td><img src="<?php echo "../../images/".$data['nama_file']; ?>" width="15%" height="15%"></td>
  23.                     </tr>
  24.             <tr>
  25.                         <td width="30%">New image</td>
  26.                         <td width="1%">:</td>
  27.                         <td width="800"><input class="form-control mr-sm-2" type="file" name="file"></td>
  28.                     </tr>
  29.             </table>
  30.     </form>
  31. <br/>
  32. <?php
  33. if(isset($_POST['submit'])){
  34.     $title = $_POST['title'];
  35.     $content = $_POST['content'];
  36.     $allow_ext = array('png', 'jpg');
  37.     $disable_name = array('"', ">", "alert", "script", "<");
  38.     $name = $_FILES['file']['name'];
  39.     $old_name = $data['nama_file'];
  40.     $explode = explode('.', $name);
  41.     $ext = strtolower(end($explode));
  42.     $size = $_FILES['file']['size'];
  43.     $tmp = $_FILES['file']['tmp_name'];
  44.     if(empty($name)){
  45.         $name = $old_name;
  46.     } else if(!empty($name)) {
  47.         if($ext != 'png'){
  48.             $extfile = '.jpg';
  49.         } else if($ext != 'jpg'){
  50.             $extfile = '.png';
  51.         }
  52.         $name = $id."-img".$extfile;
  53.     }
  54.     $query = mysqli_query($connect, "UPDATE article SET title = '$title', content = '$content', nama_file = '$name' WHERE id = '$id'");
  55.     if(in_array($ext, $allow_ext) === true){
  56.     if($size <1044070){
  57.     move_uploaded_file($tmp, "../../images/".$id."-img".$extfile);
  58.     if($query) {
  59.         echo 'Success updating your article!';
  60.     }
  61.     else {
  62.         echo 'Failed updating your article!';
  63.     }
  64.     }
  65.     } else {
  66.         echo 'Failed updating your article!';
  67.     }
  68. }
  69. ?>


4. Setelah itu kita akan mengunggah/mengupload gambar vanesha yang telah kita rename tersebut. Lalu kita akan memeriksanya dan boom, kode pun tereksekusi :)


Dan setelah kita klik akan memunculkan popup dialog berikut.


Muncul kata localhost karena saya menguji ini di localhost saya :v.

Terus bagaimana cara agar kita dapat mengatasi itu? Sama seperti sebelumnya kita hanya perlu menambahkan htmlentities dan trim pada $_FILES['file']['name'] di kode yang sebelumnya saya bagikan. Dan setelah kita menambahkan kode tersebut maka langkah selanjutnya adalah mengujinya kembali..


File gambar setelah kita klik tidak akan mengeluarkan popup apapun deh.. (itu terlihat seperti error tetapi sebenarnya saya menuliskan nama file yang disimpan disitu).

Untuk payload lainnya anda bisa menggunakan kode
"><svg onload=alert(document.domain)>.jpg
x" onerror=alert(document.domain)>.jpg
dan silahkan dikembangkan lagi

Jadi sekian dulu dari saya, kalau ada yang salah silahkan dibenarkan dan dikembangkan lagi kedepannya..

Terima kasih..

More information?
Facebook : yus
Instagram : @yusferdi_
:v ikutan si lucifer a.k.a faisyal

0 Comments