Tự động hóa kiểm thử an toàn ứng dụng với cURL và Python
Sử dụng cURL dòng lệnh và thư viện Python requests để tái hiện request, quản lý session cookies và tự động hóa kiểm thử an toàn ứng dụng.
TL;DR: Thao tác thủ công trên Burp Suite rất trực quan, nhưng để kiểm thử diện rộng hoặc tích hợp vào pipeline, bạn cần kỹ năng tự động hóa bằng script độc lập. Tiện ích dòng lệnh cURL cho phép gửi bất kỳ HTTP request nào chỉ với một lệnh ngắn gọn trong terminal. Khi kết hợp cùng thư viện requests của Python, bạn có thể dễ dàng duy trì session đăng nhập, tự động trích xuất token CSRF và phát lại hàng loạt payload có cấu trúc. Đây là kỹ năng cốt lõi giúp biến một phát hiện thủ công thành kịch bản PoC tin cậy, có thể tái hiện chính xác bất cứ lúc nào mà không cần phụ thuộc vào trình duyệt.
Trong một báo cáo bảo mật gửi cho chương trình Bug Bounty, một pentester mô tả rằng endpoint cập nhật thông tin cá nhân bị lỗi IDOR. Tuy nhiên, đội ngũ phát triển đóng báo cáo với lý do "Không thể tái hiện" vì họ thử thao tác trên trình duyệt thì giao diện vẫn chặn. Pentester đó gửi lại một script Python chỉ vỏn vẹn 15 dòng: tự đăng nhập tài khoản A, lấy session cookie, gửi request PUT sửa dữ liệu của tài khoản B kèm HTTP response in mã 200 OK. Báo cáo lập tức được chấp nhận và trả thưởng. Khả năng tự động hóa bằng code là thước đo sự chuyên nghiệp của một chuyên gia bảo mật.
1. Xuất request từ Burp Suite sang cURL như thế nào?
Thay vì phải tự tay gõ lại từng header dài dòng trong terminal, bạn có thể tận dụng khả năng xuất lệnh của Burp Suite:
- Trong tab Proxy -> HTTP history hoặc Repeater, nhấp chuột phải vào request mục tiêu.
- Chọn Copy as cURL command (hoặc chọn phiên bản cURL bash phù hợp với hệ điều hành).
- Dán trực tiếp vào terminal của bạn.
Lệnh cURL được sinh ra sẽ tự động điền đầy đủ Method, URL, toàn bộ Headers và Body của request:
curl -i -s -k -X POST 'https://api.example.com/v1/auth/login' \
-H 'Host: api.example.com' \
-H 'Content-Type: application/json' \
-H 'User-Agent: SecurityAudit/1.0' \
--data-raw '{"username":"admin","password":"password123"}'

2. Những tham số cURL nào thường dùng nhất trong kiểm thử bảo mật?
Để sử dụng cURL hiệu quả như một công cụ kiểm thử an toàn, bạn cần nắm vững các cờ tham số quan trọng:
-i(Include headers): Hiển thị toàn bộ HTTP response headers cùng với body. Đây là cờ bắt buộc phải có khi kiểm thử bảo mật để soi status code và cookies.-s(Silent mode): Tắt thanh tiến trình tải dữ liệu, giúp output màn hình gọn gàng khi kết hợp với các công cụ nhưgrephayjq.-khoặc--insecure: Bỏ qua kiểm tra tính hợp lệ của chứng chỉ SSL. Cực kỳ hữu ích khi bạn trỏ cURL qua Burp Proxy mà chưa thêm Burp CA vào kho chứng chỉ của hệ thống.-x http://127.0.0.1:8080: Ép cURL chuyển tiếp toàn bộ lưu lượng qua Burp Proxy để bạn có thể xem lại request trong HTTP history.-b "session=xyz"và-c cookies.txt: Đọc và lưu trữ cookie vào một file văn bản thô.
Thử ngẫmKhi gửi request POST qua cURL với cờ -d "param=value", cURL sẽ tự động thêm header Content-Type: application/x-www-form-urlencoded. Nếu bạn muốn gửi JSON, bạn phải làm gì?
3. Quản lý phiên làm việc tự động với Python requests.Session ra sao?
Khi kịch bản kiểm thử đòi hỏi chuỗi nhiều bước (ví dụ: Đăng nhập $\to$ Lấy token CSRF $\to$ Gửi form chuyển tiền), việc dùng cURL sẽ trở nên cồng kềnh. Thư viện requests của Python cung cấp abstraction hoàn hảo thông qua lớp requests.Session():
import requests
# Initialize session to retain cookies across requests
session = requests.Session()
BASE_URL = "http://localhost:8000"
# Step 1: Send login request
login_payload = {"user": "alice", "pass": "secret"}
res_login = session.post(f"{BASE_URL}/api/login", json=login_payload)
print(f"[*] Login Status: {res_login.status_code}")
# Session cookie is automatically attached to subsequent requests
res_profile = session.get(f"{BASE_URL}/api/user/profile")
print(f"[*] Profile data: {res_profile.json()}")
Dưới đây là một bài tập dự đoán phản xạ nhanh về cách requests.Session xử lý chuyển hướng (redirect) HTTP:
Server trả về status code 302 Found kèm header 'Location: /dashboard' và set-cookie phiên mới. Mặc định, hàm session.post() trong Python requests sẽ làm gì?
4. Xử lý chứng chỉ tự ký và trỏ proxy debug qua Burp thế nào?
Khi viết script Python kiểm thử một API chạy nội bộ với Burp Suite, bạn sẽ gặp lỗi SSLError: CERTIFICATE_VERIFY_FAILED. Để gỡ lỗi script qua Burp Proxy, bạn cấu hình tham số proxies và verify.
Trước khi xem lời giải đầy đủ, hãy thử điền các dòng # TODO để hoàn thiện cấu hình gửi request qua Burp:
import requests
import urllib3
# TODO: Disable InsecureRequestWarning for internal testing
# urllib3.disable_warnings(...)
proxies = {
# TODO: Configure proxy pointing to Burp Suite default port (127.0.0.1:8080)
"http": "...",
"https": "...",
}
# TODO: Send GET request to https://example.com/api/check via proxy and disable SSL verify
# response = requests.get(..., proxies=..., verify=...)
Dưới đây là mã nguồn chuẩn hoàn chỉnh:
import requests
import urllib3
# Disable insecure request warning for internal testing
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
# Send request via Burp Proxy and bypass CA verification
response = requests.get(
"https://example.com/api/check",
proxies=proxies,
verify=False
)
print(response.status_code)
Mọi request từ script Python này sẽ xuất hiện ngay trong tab HTTP history của Burp, giúp bạn so sánh chính xác từng byte giữa script và trình duyệt thật.
# Automated API testing script
import requests
def test_idor(target_id):
# Security bug: hardcoded sensitive token
headers = {"Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
url = f"https://api.corp.internal/v1/users/{target_id}"
return requests.get(url, headers=headers).json()5. Xây dựng PoC script độc lập có thể tái hiện 100% ra sao?
Một kịch bản Proof-of-Concept (PoC) đạt chuẩn kỹ thuật phải đáp ứng 4 tiêu chí:
- Không phụ thuộc thư viện lạ: Chỉ sử dụng
requestshoặc thư viện chuẩnurllibcủa Python. - Tham số hóa mục tiêu: Nhận URL và tài khoản qua đối số dòng lệnh (
sys.argvhoặcargparse) thay vì hardcode IP cục bộ. - Độc lập trạng thái: Tự động tạo dữ liệu thử nghiệm và dọn dẹp sau khi kiểm thử xong.
- Bằng chứng rõ ràng: In ra status code và đoạn trích phản hồi chứng minh lỗi đã được kích hoạt thành công.
6. Tổng kết & Kỷ luật tự động hóa kiểm thử
Làm chủ tự động hóa là cầu nối đưa bạn từ kiểm thử thủ công sang tự động hóa chuyên nghiệp:
- Dùng cURL cho các thử nghiệm đơn lẻ, bắn nhanh và quan sát raw response.
- Dùng Python
requests.Session()cho các chuỗi tấn công phức tạp đòi hỏi duy trì phiên và bóc tách dữ liệu JSON. - Kết hợp script với Burp Proxy để kiểm tra đối chiếu luồng dữ liệu khi gặp sự cố không thể tái hiện.
7. Tự kiểm tra (Self-check)
Hãy kiểm tra năng lực lập trình kịch bản kiểm thử bảo mật của bạn qua các câu hỏi dưới đây:
- Q1Cờ -k (--insecure) trong cURL giải quyết vấn đề gì khi kiểm thử qua Burp Proxy?
- Q2Vì sao nên dùng requests.Session() thay vì các hàm rời rạc requests.get() hay requests.post()?
- Q3Làm thế nào để bắt buộc cURL hiển thị cả response status code và response headers?
- Q4Khi trỏ script Python qua Burp Proxy, tham số proxies trong thư viện requests được cấu hình như thế nào?
- Q5Tại sao việc hardcode token xác thực trong script PoC lại là một thói quen xấu?
- Q6Lệnh Copy as cURL trong Burp Suite giúp ích gì cho kỹ sư bảo mật?
Bài tiếp theo: Mini-challenge: Bắt và sửa gói tin giải mã luồng API
Bài này có giúp bạn hiểu bản chất không?
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Thiết lập môi trường thực nghiệm với Burp Suite Community
Bài tiếpMini-challenge: Bắt và sửa gói tin giải mã luồng API
Thảo luận & góp ý
Hỏi đáp về bài này