Tấn Công Path Traversal: Cách Hacker Vượt Qua Giới Hạn Thư Mục

Mở Đầu: Chiếc Chìa Khóa Vạn Năng Trong Thế Giới Web

Hãy tưởng tượng bạn là khách lưu trú tại một khách sạn cao cấp. Bạn được cấp chìa khóa phòng 305 — và chỉ phòng đó mà thôi. Nhưng nếu bạn tìm ra cách biến chiếc chìa khóa đó thành chìa khóa vạn năng, bạn có thể mở bất kỳ phòng nào trong tòa nhà: phòng kho, phòng quản lý, thậm chí két sắt của khách sạn. Đó chính xác là những gì tấn công path traversal thực hiện trên một máy chủ web.

Path traversal — còn gọi là directory traversal hay dot-dot-slash attack — là một lớp lỗ hổng cho phép kẻ tấn công vượt ra ngoài thư mục gốc của ứng dụng web và truy cập các tệp tùy ý trên hệ thống. Dù đã được biết đến từ lâu, lỗ hổng này vẫn liên tục xuất hiện trong OWASP Top 10 (nằm dưới danh mục A01:2021 – Broken Access Control) và tiếp tục bị khai thác ở quy mô lớn trong các năm 2023–2024, từ các cuộc tấn công của nhóm APT cấp quốc gia cho đến các chiến dịch ransomware nhắm vào hàng trăm tổ chức.

Bài viết này sẽ đưa bạn đi từ khái niệm cơ bản đến các CVE thực tế, từ các công cụ tấn công đến chiến lược phòng thủ — tất cả trong một tài liệu tham khảo có cấu trúc dành cho developer, kỹ sư backend và các chuyên gia DevSecOps.


Path Traversal Là Gì? Khái Niệm Cốt Lõi

Về bản chất, path traversal khai thác việc ứng dụng web sử dụng dữ liệu do người dùng kiểm soát để xây dựng đường dẫn tệp mà không thực hiện kiểm tra đầu vào đầy đủ. Kết quả là kẻ tấn công có thể “trèo” qua cấu trúc thư mục của máy chủ.

Ví dụ kinh điển nhất:


URL hợp lệ:   https://example.com/loadFile?filename=report.pdf
URL tấn công: https://example.com/loadFile?filename=../../../etc/passwd

Mỗi chuỗi ../ di chuyển lên một cấp thư mục. Sau ba lần “leo thang”, kẻ tấn công thoát khỏi thư mục web root và truy cập /etc/passwd — tệp chứa thông tin tài khoản người dùng trên hệ thống Linux.

Có ba biến thể chính cần nắm rõ:

  • Relative Path Traversal: Sử dụng ../ hoặc ..\ (trên Windows) để điều hướng lên các cấp thư mục cha.
  • Absolute Path Traversal: Chỉ định trực tiếp đường dẫn tuyệt đối như /etc/passwd hoặc C:\Windows\win.ini.
  • Encoded Variants: Sử dụng URL encoding (%2e%2e%2f), double encoding (%252e%252e%252f), Unicode encoding, hoặc null byte injection (%00) để vượt qua các bộ lọc đơn giản.

Cơ Chế Hoạt Động: Các Biến Thể Tấn Công

Luồng tấn công cơ bản diễn ra theo ba bước: đầu vào do người dùng kiểm soát → xây dựng đường dẫn tệp → truy cập filesystem mà không có kiểm tra đầy đủ.

Kẻ tấn công thường thử nhiều biến thể để vượt qua các bộ lọc thô sơ:

  • URL Encoding: %2e%2e%2f tương đương ../
  • Double Encoding: %252e%252e%252f — khi máy chủ decode hai lần
  • Unicode/UTF-8: ..%c0%af hoặc ..%ef%bc%8f
  • Null Byte Injection: ../../../etc/passwd%00.jpg — lịch sử được dùng để qua mặt kiểm tra phần mở rộng tệp

Một biến thể hiện đại đáng chú ý là Zip Slip. Khi ứng dụng giải nén file ZIP, TAR hay JAR mà không kiểm tra đường dẫn bên trong archive, kẻ tấn công có thể nhúng các entry có tên như ../../etc/cron.d/malicious vào archive. Quá trình giải nén sẽ ghi tệp độc hại ra ngoài thư mục đích, thậm chí ghi đè lên các tệp hệ thống quan trọng. Lỗ hổng này từng ảnh hưởng đến hàng nghìn dự án trên nhiều ngôn ngữ lập trình.


Các CVE Thực Tế: Khi Path Traversal Trở Thành Thảm Họa

Lý thuyết là một chuyện — nhưng những con số sau đây mới thực sự cho thấy mức độ nguy hiểm của lỗ hổng này.

CVE-2024-3400 — Palo Alto PAN-OS (CVSS 10.0)

Đây là một trong những CVE nghiêm trọng nhất năm 2024. Lỗ hổng kết hợp path traversal và command injection trong tính năng GlobalProtect của PAN-OS. Với điểm CVSS tối đa là 10.0, nó bị khai thác tích cực bởi nhóm đe dọa UTA0218 — được cho là có liên quan đến các tác nhân nhà nước. Hàng chục nghìn tường lửa trên toàn cầu bị ảnh hưởng trước khi bản vá được phát hành.

CVE-2021-41773 và CVE-2021-42013 — Apache HTTP Server

Hai CVE này trong Apache 2.4.49 và 2.4.50 trở thành bài học đắt giá về tốc độ khai thác. Chỉ trong vài ngày sau khi công bố, các exploit đã xuất hiện rộng rãi, cho phép kẻ tấn công không chỉ đọc tệp tùy ý mà còn thực thi mã từ xa (RCE) nếu module mod_cgi được bật.

MOVEit Transfer — CVE-2023-34362

Đây có lẽ là ví dụ rõ ràng nhất về sức tàn phá khi path traversal được kết hợp với SQL injection. Nhóm ransomware Cl0p đã vũ khí hóa lỗ hổng này để tấn công hàng trăm tổ chức, bao gồm các cơ quan chính phủ, bệnh viện và tập đoàn tài chính. Hàng triệu hồ sơ cá nhân bị đánh cắp trong chiến dịch này.

CVE-2023-4966 (Citrix Bleed) và CVE-2023-27350 (PaperCut)

Hai CVE này minh họa độ rộng của bề mặt tấn công. Citrix Bleed ảnh hưởng đến NetScaler ADC và Gateway, dẫn đến rò rỉ session token và bị các nhóm ransomware khai thác mạnh. PaperCut cho phép RCE không cần xác thực và nhanh chóng bị đưa vào các chiến dịch tấn công có chủ đích. Cả hai đều nhắc nhở rằng path traversal không chỉ giới hạn ở các ứng dụng web tự phát triển — các sản phẩm thương mại lớn cũng không miễn nhiễm.


Mối Đe Dọa Mới Nổi: Path Traversal Trong Kiến Trúc Hiện Đại

Nếu bạn nghĩ path traversal chỉ là vấn đề của các ứng dụng web truyền thống, hãy nghĩ lại.

  • Cloud-native và container: Các ứng dụng chạy trên Kubernetes thường mount volume và đọc ConfigMap từ filesystem. Nếu đường dẫn không được kiểm soát, kẻ tấn công có thể thoát khỏi container hoặc truy cập các secret được mount vào pod.
  • API-first attacks: Các REST và GraphQL endpoint xử lý tải lên tệp, phục vụ tài liệu, hoặc tham chiếu đến tài nguyên theo đường dẫn là mục tiêu giá trị cao. API thường thiếu lớp bảo vệ WAF mà các ứng dụng web truyền thống có.
  • CI/CD pipelines: Các công cụ build như Maven, npm, pip và các runner CI/CD đọc tệp cấu hình từ repository. Một package độc hại hoặc tệp cấu hình được craft cẩn thận có thể khai thác path traversal để thoát khỏi sandbox build và ghi tệp lên hệ thống host.
  • AI/ML pipelines: Đây là bề mặt tấn công mới nổi. Các hệ thống tải model từ đường dẫn cấu hình, đọc dataset từ tệp, hoặc lưu checkpoint có thể bị khai thác để đánh cắp model độc quyền, đầu độc dữ liệu huấn luyện, hoặc ghi đè tệp cấu hình ML.

Công Cụ Tấn Công và Phòng Thủ

Phía Tấn Công (Offensive)

  • Burp Suite Active Scanner: Công cụ kiểm thử bảo mật web tiêu chuẩn ngành, tự động phát hiện path traversal trong quá trình scan.
  • DotDotPwn: Fuzzer chuyên dụng cho directory traversal, hỗ trợ HTTP, FTP, TFTP. Có sẵn trong Kali Linux.
  • Nuclei: Scanner dựa trên template với hàng trăm template path traversal được cộng đồng duy trì, bao gồm các CVE cụ thể.
  • SecLists và PayloadsAllTheThings: Các thư viện payload toàn diện bao gồm mọi biến thể encoding của path traversal.
  • Metasploit: Chứa các module khai thác sẵn cho nhiều CVE path traversal đã biết, hạ thấp đáng kể ngưỡng kỹ năng cần thiết.

Phía Phòng Thủ (Defensive)

  • ModSecurity với OWASP Core Rule Set: WAF mã nguồn mở với các rule phát hiện path traversal đã được kiểm chứng.
  • AWS WAF Managed Rules: Bộ rule được quản lý cho môi trường cloud, phát hiện các pattern traversal phổ biến.
  • Cloudflare WAF: Managed ruleset bao gồm phát hiện path traversal cho các ứng dụng đứng sau Cloudflare.

Lưu ý quan trọng: WAF là lớp phòng thủ theo chiều sâu (defense-in-depth), không phải giải pháp duy nhất. Các kỹ thuật encoding tinh vi vẫn có thể vượt qua WAF nếu không có validation ở tầng ứng dụng.


Cách Phòng Thủ Hiệu Quả Chống Path Traversal

Tin tốt là: cách fix rất rõ ràng. Tin không tốt là: nhiều ứng dụng vẫn chưa áp dụng đúng cách.

  • Whitelist đầu vào: Chỉ cho phép các ký tự hợp lệ trong tên tệp (ví dụ: chữ cái, số, dấu gạch ngang, dấu chấm). Từ chối mọi đầu vào chứa ../, ..\, hay các ký tự đặc biệt.
  • Canonicalization + kiểm tra base directory: Luôn resolve đường dẫn tuyệt đối trước, sau đó kiểm tra xem nó có bắt đầu bằng thư mục gốc mong đợi không.
  • Dùng indirect references: Thay vì truyền tên tệp trực tiếp, hãy dùng ID số được map server-side sang tệp thực tế.
  • Least privilege: Tiến trình web server chỉ nên có quyền đọc các tệp cần thiết — không hơn.
  • Kiểm thử định kỳ: Đưa path traversal vào scope của penetration test và DAST scan thường xuyên.

Ví Dụ Code: Dễ Bị Tấn Công vs. An Toàn

Python/Flask — Vulnerable vs. Secure


# ❌ DỄ BỊ TẤN CÔNG
@app.route('/file')
def get_file():
    filename = request.args.get('filename')
    filepath = os.path.join('/var/www/files', filename)
    return open(filepath).read()  # Không kiểm tra gì cả!

# ✅ AN TOÀN
BASE_DIR = '/var/www/files'

@app.route('/file')
def get_file():
    filename = request.args.get('filename')
    filepath = os.path.realpath(os.path.join(BASE_DIR, filename))
    if not filepath.startswith(BASE_DIR + os.sep):
        abort(403)  # Từ chối nếu nằm ngoài thư mục cho phép
    return open(filepath).read()

PHP — Vulnerable vs. Secure


// ❌ DỄ BỊ TẤN CÔNG
$file = $_GET['page'];
include('/var/www/pages/' . $file . '.php');

// ✅ AN TOÀN
$allowed = ['home', 'about', 'contact'];
$page = basename($_GET['page']);
if (!in_array($page, $allowed)) {
    die('Trang không hợp lệ');
}
include('/var/www/pages/' . $page . '.php');

Zip Slip — Phát Hiện và Vá Lỗi


# ❌ DỄ BỊ TẤN CÔNG (Python)
import zipfile
with zipfile.ZipFile('upload.zip') as zf:
zf.extractall('/var/www/uploads') # Không kiểm tra entry path!

# ✅ AN TOÀN
import zipfile, os
EXTRACT_DIR = '/var/www/uploads'
with zipfile.ZipFile('

Lê Hoàng Tâm (Tom Le) is a Software Engineer and Cloud Architect with over 10 years of experience. AWS Certified. Specializes in distributed systems, DevOps, and AI/ML integration. Founder of Th?nk And Grow — a platform sharing practical technology insights in Vietnamese. Passionate about building scalable systems and helping developers grow through real-world knowledge.