Misc
Medium
100 points

rusty-web

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

Rusty Web

Tổng Quan

Challenge này là một ứng dụng HTTP server đơn giản được viết bằng ngôn ngữ Rust, phục vụ các file tĩnh từ thư mục public. Tuy nhiên, do thiếu sót trong việc xử lý đường dẫn, ứng dụng này chứa lỗ hổng Path Traversal (Directory Traversal) cho phép kẻ tấn công truy cập vào các file nằm ngoài thư mục được phép.

Thông Tin Challenge

  • Danh mục: Web Security
  • Độ khó: Dễ
  • Điểm: 100
  • Lỗ hổng: Path Traversal (Directory Traversal)
  • Kỹ năng: Rust, HTTP Server, File System Security, Path Manipulation

Phân Tích Lỗ Hổng

Source Code

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

use std::fs;
use std::path::{Path, PathBuf};
use warp::Filter;

#[tokio::main]
async fn main() {
    let public = warp::path("public").and(warp::fs::dir("./public"));

    let routes = public.or(warp::any().and_then(serve_file));

    warp::serve(routes)
        .run(([127, 0, 0, 1], 3030))
        .await;
}

async fn serve_file(path: warp::path::Tail) -> Result<impl warp::Reply, warp::Rejection> {
    let mut file_path = PathBuf::from("./public");
    file_path.push(path.as_str()); // ⚠️ Vấn đề ở đây!

    let contents = fs::read_to_string(file_path).unwrap();
    Ok(warp::reply::html(contents))
}

Vấn Đề

  1. Không validate đường dẫn: Input từ URL được sử dụng trực tiếp mà không kiểm tra
  2. PathBuf::push() không ngăn được ../: Hàm push() chỉ nối chuỗi, không xử lý các ký tự đặc biệt
  3. Không canonicalize đường dẫn: Không chuyển đổi đường dẫn về dạng chuẩn
  4. Không kiểm tra boundary: Không đảm bảo file nằm trong thư mục cho phép

Nguy Cơ

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

  • Đọc các file nhạy cảm (flag, file cấu hình, source code)
  • Truy cập vào các thư mục hệ thống (/etc/passwd, /proc/version)
  • Lấy thông tin về server và ứng dụng
  • Trong trường hợp nghiêm trọng hơn, có thể ghi file vào hệ thống

Khai Thác

Cách Hoạt Động

Path Traversal hoạt động bằng cách sử dụng các ký tự đặc biệt để "leo thang" thư mục:

Ký tựÝ nghĩaVí dụ
../Lên thư mục cha../../../etc/passwd
./Thư mục hiện tại./file.txt
/Root directory/etc/passwd
//Directory separator//etc//passwd

Lấy flag

curl --path-as-is 'http://HOST/../../flag.txt'

Bài Học Rút Ra

Cho Developers

  1. Luôn validate input đường dẫn

    • Kiểm tra các ký tự đặc biệt: ../, ..\\, //
    • Từ chối các ký tự nguy hiểm ngay từ đầu
  2. Sử dụng canonicalization

    • Chuyển đường dẫn về dạng chuẩn trước khi xử lý
    • So sánh với đường dẫn gốc để đảm bảo nằm trong boundary
  3. Implement proper boundary checks

    • Đảm bảo file luôn nằm trong thư mục được phép
    • Sử dụng Path::strip_prefix() để kiểm tra
  4. Sử dụng secure APIs

    • Rust có nhiều thư viện an toàn hơn cho file serving
    • Cân nhắc sử dụng std::fs::canonicalize() trước khi đọc file
  5. Principle of least privilege

    • Chạy ứng dụng với quyền tối thiểu
    • Không cho phép đọc file hệ thống không cần thiết
100
Points
Medium
Difficulty
Misc
Category