1. Định nghĩa

    OS Command Injection là lỗ hổng xảy ra khi ứng dụng gửi input độc từ người dùng đến shell của hệ điều hành để thực thi

  2. Nguyên nhân

    Nhiều ngôn ngữ lập trình sử dụng các hàm cho phép thực thi lệnh shell.

    Php : system(), shell_exec(), passthru(), etc

    Python : os_system(),subprocess.Popen(shell=True), etc

    Node.js : child_process.exec()

    Khi sử dụng các hàm với shell=True(), hđh sẽ đứng ra thông dịch chuỗi ký tự đó. Nếu chuỗi chứa các ký tự nối lệnh(;, |, &&) hđh sẽ thực thi chúng.

  3. Attack Vectors

    1. Direct input parameters

      Thường xuất hiện ở các tính năng yêu cầu tương tác với môi trường bên ngoài, chẳng hạn như công cụ chẩn đoán mạng, tải tệp tin , xuất báo cáo

      Vị trí: Tham số trên URL (GET variables), dữ liệu trong Form (POST request), hoặc các trường dữ liệu trong payload của REST API (JSON/XML).

    2. Dữ liệu ẩn trong giao thức (HTTP Headers & Cookies)

      Các trường dữ liệu được sinh ra tự động bởi trình duyệt cũng có thể gây ra lỗ hổng.

      Lỗ hổng thường phát sinh khi ứng dụng backend, hoặc các tập lệnh bảo trì hệ thống (cron jobs, bash scripts), trích xuất các giá trị này để ghi log hoặc phân tích bằng các công cụ dòng lệnh.

      Vị trí: Các header như User-Agent, Referer, X-Forwarded-For, Accept-Language, hoặc các giá trị Cookie.

    3. Tên tệp tin

      Vị trí: tên tệp được gửi qua Multipart/form-data

    4. File Metadata

  4. Kỹ thuật khai thác

    1. In-band Command Injection

      Khi kết quả của lệnh được ứng dụng web bắt lại và hiển thị trực tiếp trong nội dung HTTP Response trả về cho người dùng.

    2. Blind Command Injection. Khi web chỉ trả về các thông báo chung chung như "Thao tác thành công" hoặc "Đã xảy ra lỗi", bất kể câu lệnh bên dưới có chạy ra kết quả gì. Kết quả của lệnh bị bỏ qua hoặc ghi vào các file log nội bộ. Vì không thể thấy kết quả, phải sử dụng các kỹ thuật suy luận và kênh giao tiếp phụ trợ để xác nhận lỗ hổng và đánh cắp dữ liệu.

      Có 3 kỹ thuật chính để khai thác Blind Injection:

      1. Time-based Inference

        Có thể đo lường thời gian phản hồi của http request để xác nhận lệnh đã được thực thi

        Payload: __ & ping -c 10 127.0.0.1 (Linux) hoặc timeout /t 10 (Windows).

      2. Out-of-Band / OAST

        Ép máy chủ tự động kết nối ra bên ngoài mang theo dữ liệu nhạy cảm

        Giao thức thường dùng**:** DNS

        Payload tiêu biểu (Trích xuất tên user qua DNS):

        
        
      3. Output Redirection

        Nếu không thể dùng OAST (do tường lửa chặn chiều ra - Outbound Traffic), kẻ tấn công có thể chuyển hướng kết quả của lệnh vào một tệp tin tĩnh nằm trong thư mục web công khai (Web Root) của chính ứng dụng đó, sau đó dùng trình duyệt để truy cập tệp tin này.

        Payload tiêu biểu: ; whoami > /var/www/html/assets/images/output.txt

  5. Lệnh khai thác

    Linux Windows Mục đích
    whoami whoami Xem tên user thực thi
    id whoami/ priv Xem ID user và quyền hạn
    uname -a ver Xem thông tin hđh
    sleep 10 timeout /t 10 Tạo độ trễ để xác nhận có lỗi
    ls -la dir Xem danh sách file và thư mục
    cat [file] type [file] Đọc file
    netstat -an netstat -an Xem các cổng (port) đang mở
    curl [url] nslookup [host] Gửi tín hiệu ra máy chủ của bạn
    ifconfig ipconfig //all
  6. Demo & WAF

app.py

  1. Hướng Bypass

lệnh re.search(r'[;&|`$]|sleep|whoami|cat', value, re.IGNORECASE) chặn `;` `&` `|` ``` `$` và keyword `sleep` `whoami` `cat`