sqlmap 에서 스레드를 사용하여 스캔 성능 최적화하기

Kali LinuxBeginner
지금 연습하기

소개

sqlmap 은 SQL 인젝션 취약점을 탐지하고 악용하는 과정을 자동화하는 강력한 오픈 소스 침투 테스트 도구입니다. 기본적으로 sqlmap 은 한 번에 하나의 요청을 보내며 순차적으로 테스트를 수행합니다. 이는 안정적이지만, 특히 복잡한 웹 애플리케이션이나 시간 기반 블라인드 인젝션 테스트를 수행할 때 느릴 수 있습니다.

이 랩에서는 --threads 옵션을 사용하여 sqlmap 스캔 속도를 크게 높이는 방법을 배우게 됩니다. 이 플래그를 사용하면 sqlmap 이 여러 HTTP 요청을 동시에 수행하여 스캔 완료에 필요한 전체 시간을 대폭 단축할 수 있습니다. 다양한 스레드 수로 일련의 스캔을 수행하고 결과를 비교하여 성능 향상을 직접 확인할 것입니다.

단일 스레드로 기본 스캔 수행

이 단계에서는 기본 설정인 단일 스레드를 사용하여 기본적인 sqlmap 스캔을 수행합니다. 이는 이후 단계에서 성능 향상을 측정하기 위한 기준선 역할을 할 것입니다. 스캔 시간을 정확하게 측정하기 위해 time 명령어를 사용할 것입니다.

먼저 터미널에서 다음 명령을 실행합니다. 이 명령은 sqlmap 에게 제공된 URL(-u) 을 스캔하고, 데이터베이스를 열거하며 (--dbs), 비대화형 모드 (--batch) 로 실행하도록 지시합니다. 출력을 로그 파일로 리디렉션하고 time 명령어를 사용하여 실행 시간도 측정할 것입니다.

(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch) 2>&1 | tee baseline_scan.log

스캔이 완료되면 sqlmap 의 많은 출력과 함께 마지막에 시간 측정 결과가 표시됩니다. 다음과 유사하게 보일 것입니다.

... (sqlmap output) ...

[22:30:00] [INFO] fetching database names
[22:30:00] [INFO] the SQL query used returns 2 entries
[22:30:00] [INFO] retrieved: information_schema
[22:30:00] [INFO] retrieved: acuart
[22:30:00] [INFO] available databases [2]:
[*] acuart
[*] information_schema

[22:30:00] [INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/testphp.vulnweb.com'

[*] ending @ 22:30:00 /2023-10-27/


real    0m45.123s
user    0m5.456s
sys     0m0.789s

우리에게 가장 중요한 값은 총 경과 시간 (real) 을 나타내는 real입니다. 이제 이 결과를 비교 파일인 scan_times.log에 저장합니다.

echo "Baseline (1 Thread): $(grep real baseline_scan.log | awk '{print $2}')" >> scan_times.log

마지막으로 로그 파일의 내용을 확인하여 기준 시간이 기록되었는지 확인합니다.

cat scan_times.log

출력에는 기록된 시간이 표시되어야 합니다.

Baseline (1 Thread): 0m45.123s

--threads 플래그의 목적 이해

이 단계에서는 이 랩의 핵심 기능인 sqlmap 의 --threads 플래그에 대해 이해하는 시간을 갖겠습니다. 이 단계에서는 실행할 명령이 없으며, 개념을 적용하기 전에 이해하는 것이 목표입니다.

--threads 옵션은 스캔 중에 sqlmap 이 수행할 동시 HTTP(s) 요청 수를 설정하는 데 사용됩니다. 기본값은 1 입니다.

작동 방식:
sqlmap 은 하나의 요청을 보내고 다음 요청을 보내기 전에 응답을 기다리는 대신, 여러 "스레드"를 열어 여러 요청을 동시에 보낼 수 있습니다. 이러한 병렬 처리는 다음과 같은 여러 요청이 포함된 작업에 특히 효과적입니다.

  • 취약점 퍼징 (Fuzzing).
  • 데이터베이스 이름의 문자를 무차별 대입 (Brute-forcing) (블라인드 SQL 인젝션).
  • 대량의 데이터 추출.

이점:

  • 속도: 주요 이점은 스캔 시간의 상당한 단축입니다.
  • 효율성: 네트워크 연결 및 시스템 리소스를 더 잘 활용합니다.

고려 사항:

  • 리소스 사용량: 스레드 수를 늘리면 CPU 및 메모리 사용량이 증가합니다.
  • 대상 안정성: 매우 높은 스레드 수는 취약하거나 잘못 구성된 웹 서버를 압도하여 서비스 거부 (Denial of Service) 를 유발할 수 있습니다.
  • 탐지: 공격적인 다중 스레드 스캔은 웹 애플리케이션 방화벽 (WAF) 또는 침입 탐지/방지 시스템 (IDS/IPS) 에 의해 탐지 및 차단될 가능성이 높습니다.

sqlmap 을 사용하면 스레드 수를 1 부터 최대 10 까지 설정할 수 있습니다. 다음 단계에서는 이 값을 조정하는 것이 스캔 성능에 어떤 영향을 미치는지 확인할 것입니다.

증가된 스레드 수 (--threads=5) 로 스캔 다시 실행

이 단계에서는 --threads 플래그에 대한 지식을 적용합니다. 이전과 동일한 스캔을 다시 실행하되, 이번에는 동시 요청 수를 5 로 늘립니다.

터미널에서 다음 명령을 실행합니다. 이는 첫 번째 명령과 동일하며 --threads=5가 추가되었습니다.

(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch --threads=5) 2>&1 | tee 5_threads_scan.log

스캔이 완료되면 real 시간이 기본 스캔보다 상당히 짧아진 것을 알 수 있습니다.

이제 비교를 위해 이 새로운 결과를 scan_times.log 파일에 추가합니다.

echo "5 Threads: $(grep real 5_threads_scan.log | awk '{print $2}')" >> scan_times.log

결과를 모두 확인하기 위해 로그 파일의 내용을 다시 확인해 보겠습니다.

cat scan_times.log

출력에는 이제 기본 스캔 시간과 5 스레드 스캔 시간이 모두 표시됩니다.

Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s

(참고: 실제 시간은 달라질 수 있지만, 눈에 띄는 감소를 확인할 수 있어야 합니다.)

최대 스레드 수 (--threads=10) 로 스캔 다시 실행

이 단계에서는 sqlmap 에서 허용하는 최대 스레드 수인 10 을 사용하여 성능을 한계까지 끌어올립니다. 이를 통해 일반적인 조건에서 이 옵션으로 달성할 수 있는 최대 성능 향상을 보여줄 것입니다.

마지막으로 스레드 수를 10 으로 설정하여 스캔 명령을 실행합니다.

(time sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch --threads=10) 2>&1 | tee 10_threads_scan.log

이 스캔은 이전 스캔보다 더 빨라야 합니다. 완료 후 결과를 로그 파일에 기록합니다.

echo "10 Threads: $(grep real 10_threads_scan.log | awk '{print $2}')" >> scan_times.log

이제 scan_times.log 파일을 보고 세 가지 결과 모두를 컴파일된 상태로 확인합니다.

cat scan_times.log

출력에는 이제 세 가지 항목이 모두 포함되어 다음 단계에서 쉽게 비교할 수 있습니다.

Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
10 Threads: 0m9.789s

(참고: 실제 시간은 달라질 수 있습니다.)

스캔 시간 비교 및 성능 변화 기록

이 마지막 단계에서는 수집한 데이터를 분석하여 sqlmap 에서 멀티스레딩의 효과에 대한 결론을 도출합니다.

scan_times.log에 저장된 최종 결과를 표시해 보겠습니다.

cat scan_times.log

다음과 유사한 출력이 표시되며 각 스캔의 지속 시간을 명확하게 보여줍니다.

Baseline (1 Thread): 0m45.123s
5 Threads: 0m15.456s
10 Threads: 0m9.789s

(참고: 정확한 시간은 네트워크 상태 및 시스템 부하에 따라 달라지지만, 추세는 명확해야 합니다.)

분석:
결과에서 볼 수 있듯이 스레드 수를 늘림에 따라 스캔 시간이 극적으로 감소했습니다.

  • 1 개에서 5 개 스레드로 증가할 때 가장 큰 성능 향상이 있었을 가능성이 높습니다.
  • 5 개에서 10 개 스레드로 증가할 때도 여전히 개선이 보이지만, 그 정도는 덜 두드러질 수 있습니다. 이는 네트워크 지연 시간이나 서버가 동시 요청을 처리하는 능력과 같이 스레드 수 이외의 다른 요인이 병목 현상을 일으키기 시작하기 때문입니다.

이 실험은 --threads 플래그를 사용하는 것이 sqlmap 스캔을 최적화하는 간단하면서도 매우 효과적인 방법임을 명확하게 보여줍니다.

요약

이 실습을 완료하신 것을 축하드립니다! sqlmap 스캔 성능을 동시 요청을 사용하여 최적화하는 방법을 성공적으로 배우셨습니다.

이 실습에서는 다음을 수행했습니다.

  • 성능 벤치마크를 설정하기 위해 단일 스레드로 기본 스캔을 수행했습니다.
  • --threads 플래그의 목적과 그 이점 및 고려 사항을 배웠습니다.
  • 스캔 시간에 미치는 영향을 관찰하기 위해 5 개 및 10 개 스레드로 스캔을 실행했습니다.
  • 결과를 비교하고 스레드 수를 늘리면 스캔 시간이 크게 단축된다는 것을 확인했습니다.

--threads와 같은 옵션을 숙달하는 것은 효율적이고 시기적절한 침투 테스트를 수행하는 데 중요합니다. 공격적인 스캔은 대상 시스템에 부정적인 영향을 미칠 수 있으므로 이 기능을 책임감 있게 사용하십시오.