Web Security · 35–50 phút · Web

: dữ liệu vs câu lệnh

Hiểu SQLi xuất hiện khi input không tin cậy thay đổi cấu trúc query, và parameterized query tách code khỏi data.

SAU BÀI NÀY ÔNG SẼ
  • Giải thích : dữ liệu vs câu lệnh bằng ngôn ngữ của chính mình
  • Dùng để tách quan sát khỏi kết luận
  • Hoàn thành lab : dữ liệu vs câu lệnh an toàn và nêu được /
LÀM CÙNG NHAU · SAFE LAB

Làm cùng nhau: tách câu lệnh khỏi dữ liệu

Nhìn thấy ranh giới phòng thủ trong code server synthetic.

  1. Bước 1: Đọc phần SQL cố định trong `db.prepare(...)` của ví dụ.

    Kết quả cần thấy: Cấu trúc SELECT và dấu `?` được quyết định bởi developer, không phải người dùng.

    Vì sao: Đây là : code định nghĩa ý nghĩa query trước khi dữ liệu được đưa vào.

    Đừng nhầm: Đừng nghĩ dấu `?` là một ký tự thay thế thủ công; driver database xử lý parameter theo .

  2. Bước 2: Theo dõi biến `email` đi vào `statement.get(email)`.

    Kết quả cần thấy: Giá trị email được truyền ở vị trí data riêng, không nối vào chuỗi SQL.

    Vì sao: Parameterization giữ ranh giới giữa code và data ngay cả khi input chứa ký tự lạ.

    Đừng nhầm: Không tự viết payload để kiểm tra database thật; bài học chỉ dùng đoạn code và lab synthetic.

  3. Bước 3: Nêu một control bổ sung ngoài parameterized query.

    Kết quả cần thấy: Bạn có thể nêu cho tài khoản database và lỗi trả về chung chung.

    Vì sao: giảm tác động khi một lớp kiểm soát bị cấu hình sai.

    Đừng nhầm: Không coi generic error là bản vá SQLi; root cause vẫn là cách query được xây dựng.

01

Bức tranh lớn

Hiểu SQLi xuất hiện khi input không tin cậy thay đổi cấu trúc query, và parameterized query tách code khỏi data. Chủ đề này quan trọng vì Database parser phải phân biệt syntax SQL và value. String concatenation có thể làm input trở thành syntax; prepared statement gửi structure và parameter tách biệt. Khi đi , hoặc , phần khó thường không phải nhớ tên công cụ mà là nhận ra mô hình này trong một biến thể mới. Ở Web Security Core, dùng bộ ba subject → action → object cộng với . Tạo hợp lệ, đổi đúng một biến rồi so sánh response, state và side effect; tránh săn payload trước khi hiểu decision mà server phải thực hiện. Luôn giữ một request và đánh dấu method, path, query, , , body, status, redirect và side effect. Đừng chỉ nhìn cuối cùng. Trước khi sang phần tiếp theo, hãy tự nói lại chủ đề “: dữ liệu vs câu lệnh” bằng hai câu: hệ thống đang cố làm gì, và quyết định nào có thể tạo ra rủi ro nếu sai.

02

Mental model & từ khóa

Database parser phải phân biệt syntax SQL và value. String concatenation có thể làm input trở thành syntax; prepared statement gửi structure và parameter tách biệt. Các thuật ngữ trọng tâm của bài là: SQLi, parameterized query, prepared statement. Hãy liên kết chúng với luồng dữ liệu và quyết định bảo mật thay vì học định nghĩa rời rạc. Các từ khóa cần nối thành một mô hình duy nhất gồm: SQLi, parameterized query, prepared statement. Đừng học chúng như flashcard rời rạc. Hãy chỉ ra dữ liệu đi từ đâu tới đâu, thành phần nào giữ state, thành phần nào ra quyết định và đâu là . Khi mô hình đúng, bạn có thể dự đoán một thay đổi nhỏ sẽ làm output thay đổi thế nào. Database parser phải phân biệt syntax SQL và value.

const statement = db.prepare("SELECT * FROM users WHERE email = ?");
const row = statement.get(email); // email luôn là data, không phải SQL syntax
03

Quy trình quan sát có kiểm chứng

Trong lab, so với input edge-case và error behavior; mục tiêu là chứng minh query handling sai trên dữ liệu tổng hợp, không trích xuất dữ liệu thật. Luôn bắt đầu bằng expected behavior rồi mới tìm deviation; như vậy bạn biết mình đang chứng minh điều gì. Trong lab, so với input edge-case và error behavior; mục tiêu là chứng minh query handling sai trên dữ liệu tổng hợp, không trích xuất dữ liệu thật. Bắt đầu bằng expected behavior và một sạch. Sau đó chỉ thay một biến, ghi input/output, timestamp hoặc state cần thiết rồi lặp lại để loại trừ ngẫu nhiên. Nếu tool đưa ra một nhãn như “open”, “vulnerable”, “failed” hay “suspicious”, quay về field thô tạo ra nhãn đó và xác minh bằng cách thứ hai. Đây là thói quen giúp tránh và cũng giúp report tái hiện được.

04

Case lab: từ dữ kiện tới kết luận

Đọc ba đoạn code server giả lập, chọn đoạn vulnerable và rewrite thành parameterized query; giải challenge SQLi mô phỏng bằng logic chứ không gửi DB thật. Đây là tình huống tổng hợp trong lab của khóa học, không dùng target thật. Bài thực hành trọng tâm là: Đọc ba đoạn code server giả lập, chọn đoạn vulnerable và rewrite thành parameterized query; giải challenge SQLi mô phỏng bằng logic chứ không gửi DB thật. Khi làm, chia note thành bốn cột: FACT (thấy trực tiếp), HYPOTHESIS (giả thuyết), TEST (thay đổi nào sẽ phân biệt các giả thuyết) và RESULT (kết quả). Sau khi có đáp án, tạo ít nhất hai biến thể: đổi identity/context và đổi input/state. Nếu kết luận vẫn đứng vững qua các biến thể, bạn mới có confidence cao hơn.

05

Bẫy tư duy & cách tự debug

Lỗi hay gặp là nhìn thấy một tín hiệu rồi gắn ngay nhãn vulnerability hoặc dùng công cụ trước khi hiểu hệ thống. Với chủ đề này, hãy nhớ: Parameterized query giữ input ở vai trò data thay vì syntax SQL. Với bài này, mệnh đề phải giữ là: Parameterized query giữ input ở vai trò data thay vì syntax SQL. Nếu bị kẹt, đừng tăng số lượng command/payload một cách mù quáng. Quay lại , thu hẹp câu hỏi, kiểm tra assumptions và đọc error/output theo từng lớp. Trong lab hoặc , đặt rồi đổi hướng khi không có mới; trong /, luôn kiểm tra trước khi mở rộng bề mặt thử nghiệm.

06

Phòng thủ, & tiêu chí qua bài

Parameterized queries, allowlist cho identifier không parameterize được, DB và generic errors. Khi review fix, kiểm tra cả positive case, negative case và một biến thể gần kề để tránh vá đúng một chuỗi kiểm thử. Một tốt phải chỉ ra root cause, control đặt ở đúng và cách . Hãy kiểm tra positive case hợp lệ, negative case bị từ chối và ít nhất một biến thể gần kề để tránh “vá đúng payload”. Bạn có thể coi mình qua bài khi: (1) giải thích : dữ liệu vs câu lệnh không nhìn tài liệu; (2) dự đoán được một output mới; (3) hoàn thành lab bằng ; (4) nêu được cách phòng thủ; và (5) phân biệt được observation với conclusion.

THỰC HÀNH AN TOÀN · GUIDED

Bài tập

Đọc ba đoạn code server giả lập, chọn đoạn vulnerable và rewrite thành parameterized query; giải challenge SQLi mô phỏng bằng logic chứ không gửi DB thật. Deliverable: lưu request/response, đánh dấu chính xác field bạn thay đổi, ghi response/status/state sau thay đổi và kết luận server đã ra quyết định ở đâu. Sau đó mô tả một control phía server và một negative test dùng để control đó.

Gợi ý: Đừng tìm đáp án ngay. Với : dữ liệu vs câu lệnh, ghi trước, thay đúng một biến rồi giải thích vì sao output đổi hoặc không đổi.
safe-terminal · /home/student/lab
MEMORY ONLY
WhiteHat Safe Terminal v2 · MEMORY-ONLY SIMULATOR · gõ help để bắt đầu.
$
KNOWLEDGE CHECK · CẦN 80%

5 câu kiểm tra

Không trừ điểm. Mục tiêu là giải thích được lý do, không phải đoán đúng.

Câu 1/5

Phát biểu nào đúng nhất về : dữ liệu vs câu lệnh?

Câu 2/5

Trong một lab về “: dữ liệu vs câu lệnh”, nào phù hợp nhất để bắt đầu kiểm chứng?

Câu 3/5

Control/ nào bám sát chủ đề “: dữ liệu vs câu lệnh” nhất?

Câu 4/5

Mental model nào nên giữ khi gặp một biến thể mới của “: dữ liệu vs câu lệnh”?

Câu 5/5

Nếu bài “: dữ liệu vs câu lệnh” cần thao tác có tính offensive, môi trường nào phù hợp?

PROGRESS

Đánh dấu hoàn thành

Cần đạt ít nhất 80% quiz trước khi chốt bài.