sqlmap 태퍼 스크립트로 기본 필터 우회하기

Kali LinuxBeginner
지금 연습하기

소개

이 랩에서는 sqlmap의 강력한 태퍼 (tamper) 스크립트를 사용하여 일반적인 웹 애플리케이션 필터를 우회하는 방법을 탐구합니다. 많은 웹 애플리케이션은 SQL 인젝션 공격을 방지하기 위해 기본적인 입력 유효성 검사 및 필터링을 구현합니다. 이러한 필터는 일반적인 SQL 키워드, 공백 또는 기타 문자를 차단할 수 있습니다. sqlmap의 태퍼 스크립트는 SQL 인젝션 페이로드 (payload) 를 자동으로 수정하여 이러한 필터를 회피할 수 있도록 하여 공격 효과를 높입니다. 이 랩에서는 회피가 필요한 시나리오를 식별하고, 사용 가능한 태퍼 스크립트를 나열하고, 특정 스크립트를 적용하고, 생성된 페이로드에 미치는 영향을 관찰하는 방법을 배우게 됩니다.

회피가 필요한 시나리오 식별

이 단계에서는 태퍼 스크립트가 왜 필요한지 이해하게 됩니다. 웹 애플리케이션은 일반적인 SQL 인젝션 패턴을 방지하기 위해 기본적인 필터를 사용하는 경우가 많습니다. 예를 들어, 필터는 공백을 차단하거나 다른 문자로 대체하거나, UNION 또는 SELECT와 같은 키워드를 차단할 수 있습니다. sqlmap의 기본 페이로드가 차단될 때, 이러한 필터를 우회하기 위해 페이로드를 수정해야 합니다.

사용자 입력에서 공백을 필터링하는 웹 애플리케이션의 가상 시나리오를 고려해 보세요. 만약 sqlmap' OR 1=1--와 같은 페이로드를 주입하려고 하면, 필터는 이를 'OR1=1--로 변환하여 페이로드를 무효화할 수 있습니다. 태퍼 스크립트는 sqlmap이 이러한 제한을 우회할 수 있는 대체 페이로드를 생성하도록 돕습니다.

회피 기법 없이 기본적인 sqlmap 스캔을 시뮬레이션하기 위해 더미 URL 을 사용할 것입니다. 이는 나중에 태퍼 스크립트 사용 시와 사용하지 않을 때 생성되는 페이로드를 비교하는 데 도움이 될 것입니다.

기본 스캔을 더미 대상에 시작하려면 다음 sqlmap 명령을 실행하세요. 이 대상은 실제로 취약하지 않지만, sqlmap의 동작과 생성된 페이로드를 관찰할 수 있게 해줍니다.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dump --batch --forms --level 1 --risk 1 --parse-errors --technique=U --eta --output-dir=/tmp/sqlmap_output_no_tamper

이 명령은 기본적인 SQL 인젝션 스캔을 시도합니다. --dump 옵션은 데이터를 덤프하는 데 사용되고, --batch는 비대화형 모드로 실행되며, --forms는 폼을 확인하고, --level 1 --risk 1은 탐지 수준과 위험도를 설정하며, --parse-errors는 오류 메시지를 파싱하고, --technique=U는 UNION 쿼리 SQL 인젝션을 지정하며, --eta는 예상 도착 시간을 표시하고, --output-dir은 출력 디렉토리를 지정합니다.

출력을 관찰하세요. 이 특정 명령이 제공된 URL 에서 취약점을 찾지 못할 수도 있지만 (이것은 일반적인 테스트 사이트이며 이 랩의 목적에 특별히 구성되지 않았기 때문입니다), 목표는 sqlmap의 초기 시도를 보고 이러한 시도가 때때로 필터에 의해 차단될 수 있음을 이해하는 것입니다.

--list-tampers로 사용 가능한 태퍼 스크립트 나열

이 단계에서는 sqlmap에서 사용 가능한 모든 태퍼 스크립트를 나열하는 방법을 배우게 됩니다. sqlmap은 다양한 태퍼 스크립트를 제공하며, 각 스크립트는 특정 유형의 필터 또는 WAF(웹 애플리케이션 방화벽) 를 우회하도록 설계되었습니다. 어떤 스크립트를 사용할 수 있는지 아는 것은 회피 요구 사항에 맞는 스크립트를 선택하는 데 중요합니다.

사용 가능한 모든 태퍼 스크립트를 나열하려면 sqlmap과 함께 --list-tampers 옵션을 사용하세요.

sqlmap --list-tampers

이 명령은 sqlmaptamper 디렉토리에 있는 모든 .py 파일 목록을 출력합니다. 각 파일은 다른 태퍼 스크립트를 나타냅니다. 예를 들어, space2comment.py, unionalltostring.py, apostrophemask.py와 같은 스크립트를 볼 수 있습니다. 각 스크립트는 공백을 주석으로 바꾸거나, UNION ALL을 문자열 연결로 변환하거나, 아포스트로피를 마스킹하는 등 특정 목적을 가지고 있습니다.

목록을 검토하고 이름에 따라 몇 가지 스크립트의 목적을 이해해 보세요. 예를 들어, space2comment.py는 공백을 차단하는 필터를 우회할 수 있는 SQL 주석으로 공백을 바꾸도록 설계되었습니다.

--tamper=space2comment로 태퍼 스크립트 선택 및 적용

이 단계에서는 sqlmap 스캔에 특정 태퍼 스크립트를 선택하고 적용하게 됩니다. 이 실습에서는 space2comment 태퍼 스크립트를 사용할 것입니다. 이 스크립트는 SQL 인젝션 페이로드의 공백을 /**/(여러 줄 주석) 시퀀스로 바꿉니다. 이 기법은 공백을 차단하거나 제거하지만 SQL 주석은 허용하는 필터에 효과적입니다.

태퍼 스크립트를 적용하려면 --tamper 옵션 다음에 스크립트 이름 ( .py 확장자 제외) 을 사용합니다.

이번에는 space2comment 태퍼 스크립트를 포함하여 다음 sqlmap 명령을 실행하세요.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dump --batch --forms --level 1 --risk 1 --parse-errors --technique=U --eta --tamper=space2comment --output-dir=/tmp/sqlmap_output_with_tamper

--tamper=space2comment가 추가된 것을 확인하세요. 이는 sqlmap이 생성된 모든 페이로드를 대상에 보내기 전에 이 특정 태퍼 스크립트를 통해 처리하도록 지시합니다.

출력은 이전 단계와 유사해 보일 수 있지만, 내부적으로 sqlmap은 페이로드를 수정하고 있습니다. 다음 단계에서는 생성된 페이로드의 차이를 살펴보겠습니다.

선택된 태퍼 스크립트로 스캔 실행

이 단계에서는 이전 단계에서 space2comment 태퍼 스크립트를 사용하여 sqlmap 명령을 이미 실행했습니다. 이 단계의 목적은 실행을 강화하고 페이로드 비교를 준비하는 것입니다.

실행한 명령은 다음과 같습니다.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dump --batch --forms --level 1 --risk 1 --parse-errors --technique=U --eta --tamper=space2comment --output-dir=/tmp/sqlmap_output_with_tamper

이 명령은 sqlmap에 스캔을 수행하도록 지시하지만, 이번에는 space2comment 태퍼 스크립트를 사용하여 페이로드를 수정합니다. 예를 들어, UNION SELECT와 같은 페이로드는 UNION/**/SELECT로 변환될 수 있습니다. 이러한 미묘한 변경은 종종 간단한 공백 필터링 메커니즘을 우회할 수 있습니다.

--output-dir=/tmp/sqlmap_output_with_tamper 옵션은 sqlmap의 출력 (생성된 페이로드 또는 로그 포함) 이 별도의 디렉토리에 저장되도록 합니다. 이는 다음 단계에서 페이로드를 비교하는 데 유용할 것입니다.

sqlmap 스캔이 완료될 때까지 기다리세요. 더미 대상에서 취약점을 찾지 못하더라도, 핵심은 sqlmap이 변조된 페이로드를 사용하려고 시도했다는 것입니다.

태퍼 스크립트 사용 전후 페이로드 비교

이 마지막 단계에서는 space2comment 태퍼 스크립트를 사용했을 때와 사용하지 않았을 때 sqlmap이 생성한 페이로드를 비교합니다. 이 비교를 통해 태퍼 스크립트가 필터를 우회하기 위해 인젝션 페이로드를 어떻게 수정하는지 시각적으로 확인할 수 있습니다.

sqlmap은 출력 디렉토리에 활동 (보내는 페이로드 포함) 을 기록합니다. 1 단계와 3 단계에서 스캔에 대해 서로 다른 출력 디렉토리를 지정했습니다.

먼저 페이로드를 포함할 수 있는 로그 파일을 찾아보겠습니다. sqlmap은 일반적으로 출력 디렉토리 내 파일에 HTTP 요청을 저장합니다.

출력 디렉토리로 이동하여 요청 로그를 찾으세요. 정확한 파일 이름은 다를 수 있지만 일반적으로 log/ 아래 또는 대상 디렉토리에 직접 있습니다.

일반적인 로그 파일을 찾아 요청을 확인해 보겠습니다. sqlmap은 종종 session.log 또는 유사한 파일을 생성합니다.

grep을 사용하여 두 번의 실행에서 나온 로그 파일에서 일반적인 SQL 키워드를 검색하세요.

공백이 처리되는 방식의 차이를 확인하여 페이로드를 비교하세요.

echo "--- Payloads without tamper script ---"
grep -r "UNION" /tmp/sqlmap_output_no_tamper/ | head -n 5

echo ""
echo "--- Payloads with tamper script ---"
grep -r "UNION" /tmp/sqlmap_output_with_tamper/ | head -n 5

"Payloads with tamper script" 출력에서는 SQL 키워드 (예: UNION SELECT) 내의 공백이 /**/ 주석으로 대체된 것을 볼 수 있으며, "Payloads without tamper script" 출력에서는 일반 공백이 사용됩니다. 이는 space2comment 태퍼 스크립트의 효과를 명확하게 보여줍니다.

이 비교는 태퍼 스크립트가 기본 필터링 메커니즘을 우회하기 위해 페이로드를 수정하는 데 얼마나 효과적인지를 강조하며, sqlmap을 침투 테스트를 위한 더욱 다재다능한 도구로 만듭니다.

요약

이 실습에서는 sqlmap의 태퍼 스크립트를 사용하여 기본적인 웹 애플리케이션 필터를 우회하는 방법을 성공적으로 학습했습니다. 입력 필터에 직면했을 때 회피 기법의 필요성을 이해하는 것부터 시작했습니다. 그런 다음 --list-tampers를 사용하여 사용 가능한 태퍼 스크립트를 나열하는 방법을 탐색하고 실제 시연을 위해 space2comment 스크립트를 선택했습니다. 마지막으로 태퍼 스크립트를 사용했을 때와 사용하지 않았을 때 sqlmap을 실행하고 생성된 페이로드를 비교하여 space2comment 스크립트가 공백을 /**/ 주석으로 어떻게 수정하는지 명확하게 관찰했습니다. 이러한 실습 경험을 통해 일반적인 필터링 메커니즘을 우회하여 SQL 인젝션 테스트 기능을 향상시키는 기본적인 기술을 습득했습니다.