OWASP WSTG

OWASP WSTG sebagai daftar periksa disiplin pengujian keamanan aplikasi web.

Daftar isi

Pengujian manual yang bergantung pada ingatan hampir pasti melewatkan area tertentu, misalnya konfigurasi server atau logika bisnis yang jarang tersentuh. OWASP WSTG (Web Security Testing Guide) menutup kekosongan itu dengan daftar pengujian yang lengkap dan bernomor, sehingga cakupan pengujian dapat diukur. Topik ini membahas struktur WSTG, cara membaca pengenalnya, dan cara mengubahnya menjadi daftar periksa yang cakupannya dihitung dengan skrip.

Struktur WSTG dan WSTG-ID#

WSTG adalah proyek OWASP yang menyusun pengujian keamanan aplikasi web menjadi panduan sistematis. Isinya terbagi per area, mulai dari pengumpulan informasi, konfigurasi dan deployment, autentikasi, otorisasi, manajemen sesi, validasi masukan, penanganan error, kriptografi, logika bisnis, sampai pengujian sisi klien dan API. Setiap pengujian dalam satu area bernomor dan membawa pengenal berbentuk WSTG-KATEGORI-NOMOR, misalnya WSTG-ATHN-07 untuk salah satu pengujian autentikasi. Pengenal itu menjadi bahasa bersama antarpenguji karena satu pengenal menunjuk satu halaman pengujian yang sama bagi semua orang.

Satu halaman pengujian WSTG memuat tujuan, ringkasan pengujian, dan cara pelaksanaannya, sehingga halaman itu dapat langsung diikuti pada sesi pengujian. Ketika sebuah pengujian selesai, yang ditandai selesai adalah pengenal pada halamannya, bukan sekadar area besarnya. Penandaan pada tingkat pengenal inilah yang membuat kemajuan pengujian terukur dan dapat diperiksa ulang oleh penguji lain tanpa penjelasan tambahan.

Pengenal WSTG juga menjadi rujukan yang stabil di dalam laporan. Alih-alih menyalin isi halaman panduan, laporan cukup menyebut pengenalnya, misalnya WSTG-SESS-03, dan setiap pembaca dapat membuka halaman yang sama untuk memahami maksud pengujian tersebut. Pemetaan dari pengenal ke halaman bersifat tetap untuk satu versi panduan, sehingga versi WSTG yang digunakan dicatat bersama daftar periksa agar rujukan tidak bergeser ketika panduan diperbarui.

Daftar periksa sebagai disiplin#

Daftar periksa (checklist) sering dicap sebagai beban rutin, padahal fungsinya menjamin hal yang paling mudah terlewat, yaitu area yang tidak menarik. Pengujian yang menyenangkan biasanya dikerjakan dua kali, sedangkan pengujian yang melelahkan seperti pemeriksaan konfigurasi justru tertunda tanpa daftar periksa. Disiplin berarti setiap pengenal diputuskan statusnya secara sadar, yaitu teruji, belum diuji, atau tidak berlaku untuk aplikasi yang bersangkutan, lengkap dengan alasannya.

Keputusan tidak berlaku perlu diberi alasan karena nilainya sama dengan temuan. Sebuah aplikasi tanpa fitur unggah berkas, misalnya, membuat sebagian pengujian validasi masukan tidak relevan, dan alasan itu harus tercatat agar penguji berikutnya tidak membuka perdebatan yang sama. Daftar periksa juga menjadi alat komunikasi dengan pemilik aplikasi, karena status setiap pengenal menjelaskan apa yang sudah dan belum dikerjakan tanpa harus membaca seluruh laporan.

WSTG menjawab cara menguji, sedangkan OWASP ASVS (Application Security Verification Standard) menjawab tingkat ketelitian yang dituntut pada setiap persyaratan keamanan. Keduanya saling melengkapi dan sama-sama berbentuk daftar yang dapat diperiksa, sehingga lazim digunakan berdampingan pada satu proyek pengujian.

Menghitung cakupan pengujian#

Cakupan (coverage) menjadi nyata ketika daftar periksa disimpan sebagai data dan dihitung dengan skrip. Berkas JSON berikut memuat contoh dua belas item bergaya WSTG yang terdiri atas pengenal, kategori, dan status, sedangkan skrip di bawahnya menghitung persentase item teruji dan mencetak item yang belum dikerjakan. Jalankan skrip dengan perintah python3 cakupan-wstg.py.

json wstg-checklist.json
{
  "proyek": "OWASP Web Security Testing Guide",
  "versi": "v4.2",
  "item": [
    {"id": "WSTG-INFO-01", "kategori": "Pengumpulan informasi", "status": "teruji"},
    {"id": "WSTG-INFO-04", "kategori": "Pengumpulan informasi", "status": "belum"},
    {"id": "WSTG-CONF-02", "kategori": "Konfigurasi dan deployment", "status": "belum"},
    {"id": "WSTG-ATHN-02", "kategori": "Autentikasi", "status": "teruji"},
    {"id": "WSTG-ATHN-07", "kategori": "Autentikasi", "status": "teruji"},
    {"id": "WSTG-AUTHZ-02", "kategori": "Otorisasi", "status": "belum"},
    {"id": "WSTG-SESS-03", "kategori": "Manajemen sesi", "status": "teruji"},
    {"id": "WSTG-INPV-01", "kategori": "Validasi masukan", "status": "teruji"},
    {"id": "WSTG-INPV-05", "kategori": "Validasi masukan", "status": "belum"},
    {"id": "WSTG-ERRH-02", "kategori": "Penanganan error", "status": "belum"},
    {"id": "WSTG-BUSL-04", "kategori": "Logika bisnis", "status": "belum"},
    {"id": "WSTG-CLNT-03", "kategori": "Sisi klien", "status": "belum"}
  ]
}
python cakupan-wstg.py
"""Menghitung cakupan daftar periksa pengujian ala WSTG.

Skrip membaca berkas wstg-checklist.json yang berada di folder yang
sama, lalu menghitung berapa persen item yang berstatus teruji dan
mencetak item yang belum dikerjakan agar sesi pengujian berikutnya
langsung terarah."""

import json
from pathlib import Path

BERKAS_DATA = Path(__file__).with_name("wstg-checklist.json")
if not BERKAS_DATA.is_file():
    # salinan skrip tanpa berkas data di sebelahnya membaca folder kerja
    BERKAS_DATA = Path("wstg-checklist.json").resolve()

data = json.loads(BERKAS_DATA.read_text(encoding="utf-8"))
item = data["item"]
teruji = [i for i in item if i["status"] == "teruji"]
belum = [i for i in item if i["status"] != "teruji"]
persen = round(100 * len(teruji) / len(item))

print(f"{data['proyek']} ({data['versi']})")
print(f"Cakupan: {len(teruji)} dari {len(item)} item teruji ({persen}%)")
print()
print("Item yang belum diuji:")
for i in belum:
    print(f"  {i['id']}  {i['kategori']}")
text Keluaran
OWASP Web Security Testing Guide (v4.2)
Cakupan: 5 dari 12 item teruji (42%)

Item yang belum diuji:
  WSTG-INFO-04  Pengumpulan informasi
  WSTG-CONF-02  Konfigurasi dan deployment
  WSTG-AUTHZ-02  Otorisasi
  WSTG-INPV-05  Validasi masukan
  WSTG-ERRH-02  Penanganan error
  WSTG-BUSL-04  Logika bisnis
  WSTG-CLNT-03  Sisi klien

Keluaran menyatakan cakupan lima dari dua belas item, atau 42 persen, beserta daftar yang belum diuji. Angka semacam itu mengubah pertanyaan samar “sudah cukup atau belum” menjadi jawaban yang terukur, dan daftar di bawahnya langsung menjadi rencana kerja sesi berikutnya. Pada proyek sungguhan, item berstatus tidak berlaku dikeluarkan dari perhitungan agar penyebutnya hanya berisi pengujian yang relevan.

Bentuk data semacam ini juga menjadi titik sambung dengan alat lain. Skrip pemindai dapat menandai item yang pemeriksaannya dijalankan otomatis, sedangkan item yang memerlukan penilaian manual tetap ditandai oleh penguji. Ketika dua orang membagi satu proyek, berkas yang sama menyatukan status kerja keduanya tanpa perlu rapat tambahan.

Kesalahan umum#

Empat pola berikut membuat daftar periksa kehilangan fungsi disiplinnya.

  • Menandai item teruji tanpa benar-benar melaksanakan pengujian. Status daftar periksa menjadi tidak dapat dipercaya, dan perbaikannya adalah menandai berdasarkan bukti yang tersimpan, bukan ingatan.
  • Membaca WSTG sebagai bacaan lurus dari awal sampai akhir. Panduan itu dirancang untuk dirujuk per pengenal, sehingga urutan kerjanya mengikuti peta aplikasi, bukan urutan halaman.
  • Menganggap semua item wajib dikerjakan dengan kedalaman sama. Item pada area yang relevan diutamakan, sedangkan item yang tidak berlaku ditandai disertai alasan.
  • Mencantumkan status tanpa alasan pada item yang tidak berlaku. Penguji berikutnya akan membuka kembali perdebatan yang seharusnya sudah selesai.

Pola-pola tersebut berpangkal pada perlakuan yang sama, yaitu daftar periksa diperlakukan sebagai dokumen administratif yang dicocokkan belakangan. Daftar periksa bekerja sebaliknya, yaitu menjadi catatan keputusan yang diperbarui selama pengujian berlangsung.

Ringkasan#

  • WSTG menyusun pengujian keamanan aplikasi web per area, dan setiap pengujian membawa pengenal berbentuk WSTG-KATEGORI-NOMOR.
  • Daftar periksa menegakkan disiplin dengan memaksa setiap pengenal diputuskan statusnya secara sadar, lengkap dengan alasan pada item yang tidak berlaku.
  • Cakupan dihitung dari data status, sehingga kemajuan pengujian berupa angka beserta daftar kerja berikutnya yang eksplisit.

Referensi#