Nmap 을 이용한 SQL 인젝션 취약점 공격

Beginner

소개

이 대화형 랩에 오신 것을 환영합니다! 저희는 웹 애플리케이션에 만연하고 심각한 위험인 SQL 인젝션 취약점에 초점을 맞추고 있습니다. 간단히 말해서, SQL 인젝션 공격은 애플리케이션이 제대로 확인되거나 코딩되지 않은 데이터를 수신하고, 이 데이터가 SQL 쿼리에 포함될 때 발생합니다. 이 허점을 통해 사이버 공격자는 유해한 SQL 명령을 실행할 수 있으며, 이는 기밀 데이터에 대한 무단 액세스를 허용하거나 다른 유해한 작업을 수행할 수 있게 합니다.

이 랩의 목표는 두 가지입니다. 첫째, SQL 인젝션 취약점의 핵심 개념을 이해하기 쉬운 부분으로 나누어 설명하는 것입니다. 둘째, 이러한 취약점을 악용하는 방법을 실습하여 악의적인 의도가 아닌, 이를 더 잘 이해하고 예방할 수 있도록 돕는 것입니다. 이러한 실용적인 접근 방식은 이러한 위협으로부터 애플리케이션을 보호할 수 있는 지식과 기술을 제공할 것입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 75%입니다.학습자들로부터 97%의 긍정적인 리뷰율을 받았습니다.

랩 환경 설정

이 섹션에서는 SQL 인젝션 공격을 연습할 수 있는 랩 환경을 설정하는 과정을 안내해 드리겠습니다.

  1. DVWA Docker 이미지 가져오기 (Pull the DVWA Docker Image):
    DVWA Docker 이미지는 Docker Hub 에서 사용할 수 있습니다. 다음 명령을 사용하여 가져올 수 있습니다.

    docker pull vulnerables/web-dvwa
  2. DVWA Docker 컨테이너 실행 (Run the DVWA Docker Container):
    이미지를 가져온 후, 다음 명령으로 실행할 수 있습니다.

    docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

    이 명령은 새 컨테이너를 시작하고 컨테이너의 포트 80 을 호스트 머신의 포트 80 에 매핑합니다.

위 단계는 랩에 필요한 환경을 준비합니다. 설정이 완료되면 데스크톱에서 Firefox 브라우저를 실행하고 다음 URL 을 입력하십시오: http://localhost.

잠시 후 로그인 페이지가 나타납니다. 기본 자격 증명은 다음과 같습니다: 사용자 이름 - "admin" 및 비밀번호 - "password".

DVWA (Damn Vulnerable Web Application) 웹 페이지가 표시됩니다. "Create/Reset Database" 버튼을 클릭하여 애플리케이션에 대한 새 데이터베이스를 생성합니다.

중요 사항: 이 랩의 목적을 위해 보안 수준을 "low"로 설정합니다. 이 조정은 SQL 인젝션 취약점을 더 명확하게 보여줍니다. 이렇게 하려면 "Security Level" 드롭다운 메뉴에서 "low"를 선택한 다음 "Submit" 버튼을 누르십시오.

SQL 인젝션 지점 식별

이 모듈에서는 애플리케이션에서 SQL 인젝션 취약점의 존재를 밝혀낼 것입니다.

단계 1: SQL 인젝션 페이지로 이동

애플리케이션의 왼쪽 메뉴에서 "SQL Injection"이라는 링크를 찾을 수 있습니다. 이 링크를 클릭하여 SQL 인젝션 페이지로 이동합니다. 여기에서 사용자 ID 를 묻는 양식을 보게 됩니다.

단계 2: 예시 사용자 ID 입력

무슨 일이 일어나는지 확인하기 위해 사용자 ID 를 입력해 보겠습니다.

예시 입력:

1

양식에 "1"을 입력하고 "Submit" 버튼을 클릭합니다. 출력 결과는 ID 가 1 인 사용자에 대한 세부 정보를 표시해야 합니다.

단계 3: 소스 코드 검사

"View Source" 버튼을 클릭하면 페이지의 소스 코드를 검사할 수 있습니다. 다음과 유사한 PHP 코드를 볼 수 있습니다.

$id = $_GET['id'];
$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($conn, $sql);

이 코드는 애플리케이션이 사용자의 입력을 SQL 문과 직접 연결하여 SQL 쿼리를 구성한다는 것을 보여줍니다. 이는 잠재적으로 SQL 인젝션 취약점을 생성할 수 있는 일반적인 오류입니다.

단계 4: SQL 인젝션 취약점 확인

SQL 인젝션 취약점의 존재를 확인하기 위해 "1" 값 뒤에 작은 따옴표 (') 를 삽입해 보겠습니다. 다음을 양식에 입력합니다.

1'

데이터베이스 오류 메시지가 표시되면 애플리케이션이 실제로 SQL 인젝션 공격에 취약하다는 것을 의미합니다. 이는 이러한 취약점을 식별하고 그에 따라 해결하는 핵심 단계입니다.

SQL 인젝션 유형 및 데이터베이스 유형 결정

이 섹션에서는 주어진 애플리케이션에서 SQL 인젝션 취약점의 유형과 사용 중인 데이터베이스 유형을 식별하는 과정을 안내해 드리겠습니다.

우리의 첫 번째 목표는 원래 SQL 쿼리에서 반환되는 열의 수를 결정하는 것입니다. 이를 위해 ORDER BY 절을 사용합니다.

샘플 코드:

1' ORDER BY 1#
1' ORDER BY 2#
1' ORDER BY 3#

위의 SQL 문을 하나씩 양식에 입력하십시오. 애플리케이션이 예상대로 작동하는 경우 처음 두 쿼리는 오류 없이 실행되고 세 번째 쿼리는 실패합니다. 이 실패는 원래 SQL 쿼리가 두 개의 열을 반환한다는 것을 나타냅니다.

이어서 UNION 연산자를 사용하여 데이터베이스에서 추가 데이터를 추출할 수 있습니다.

샘플 코드:

1' UNION SELECT version(), @@version_compile_os#

이 SQL 문은 데이터베이스의 버전과 실행 중인 운영 체제의 버전을 가져옵니다.

이 쿼리를 실행한 후 출력 결과는 데이터베이스 버전 및 운영 체제에 대한 정보를 표시해야 합니다.

데이터베이스 이름 검색

이 레슨에서는 애플리케이션이 사용하고 있는 데이터베이스의 이름을 검색하는 과정을 안내해 드리겠습니다. 이는 특히 데이터베이스의 구조와 구성을 이해하려는 경우 필수적인 기술입니다.

예시 코드:

1' UNION SELECT database(), user()#

위의 SQL 쿼리는 "SQL 인젝션 (SQL Injection)"이라는 기술의 예입니다. 이는 공격자가 애플리케이션의 데이터베이스 계층에서 발생하는 보안 취약점을 악용하기 위해 사용하는 코드 인젝션 기술입니다. 이 특정 쿼리는 현재 데이터베이스 이름과 쿼리를 실행하는 사용자를 검색합니다.

다음은 무슨 일이 일어나는지 설명합니다.

  • 1' UNION: 이것은 SQL 인젝션의 첫 번째 부분입니다. 1' 부분은 애플리케이션이 실행할 가능성이 있는 쿼리를 완료하기 위한 것입니다. UNION 키워드는 중복 행을 반환하지 않고 두 개 이상의 SELECT 문의 결과를 결합하는 데 사용됩니다.
  • SELECT database(), user()#: 이 쿼리 부분은 주입하는 페이로드 (payload) 입니다. database() 함수는 현재 데이터베이스의 이름을 검색하고, user() 함수는 쿼리를 실행하는 사용자의 이름을 검색합니다.

쿼리를 제출한 후 출력 결과에서 데이터베이스 이름과 사용자 정보를 확인할 수 있습니다. 이 정보는 데이터베이스 구조와 애플리케이션 컨텍스트에서 사용자의 권한을 더 잘 이해하는 데 필수적일 수 있습니다.

이러한 기술을 이해하는 것은 취약점을 악용하는 데 도움이 될 뿐만 아니라 무엇을 방어해야 하는지 알으로써 안전한 애플리케이션을 만드는 데에도 도움이 된다는 것을 기억하십시오.

테이블 이름 검색

이 레슨에서는 데이터베이스의 테이블 이름을 검색하여 데이터베이스 구조에 대해 더 자세히 알아보겠습니다. 데이터베이스에서 데이터를 추출하거나 조작하려는 경우 테이블 구조를 이해하는 것이 중요합니다.

예시 코드:

1' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa'#

위의 SQL 쿼리는 SQL 인젝션 기술을 계속 사용합니다. 이번에는 데이터베이스의 테이블 이름과 해당 데이터베이스 스키마를 검색하는 데 사용됩니다.

다음은 세부 설명입니다.

  • 1' UNION: 앞서 설명했듯이, 이 부분은 애플리케이션의 쿼리를 완성하고 주입된 페이로드와 결합하기 위한 것입니다.
  • SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa': 이 쿼리 부분은 주입된 페이로드입니다. information_schema.tables 시스템 테이블에서 테이블 이름과 해당 데이터베이스 스키마를 검색하며, 특히 'dvwa' 스키마에 대한 정보를 가져옵니다.

information_schema.tables는 데이터베이스의 모든 테이블에 대한 정보를 담고 있는 시스템 테이블입니다. table_schema는 테이블이 속한 데이터베이스의 이름을 나타내고, table_name은 테이블의 이름입니다.

쿼리를 제출한 후 출력 결과에서 테이블 이름과 해당 데이터베이스 스키마를 확인할 수 있습니다. 이 정보는 데이터베이스를 추가로 탐색하거나 악용하기 위한 로드맵을 제공할 수 있습니다.

언제나 그렇듯이, 이러한 기술을 이해하는 것은 취약점을 악용하는 데뿐만 아니라 무엇을 방어해야 하는지 이해함으로써 안전한 애플리케이션을 만드는 데에도 필수적입니다.

컬럼 이름 및 데이터 검색

이 레슨에서는 특정 테이블의 열 이름을 검색하여 데이터베이스 구조를 더 깊이 파고들 것입니다. 이 지식을 통해 테이블에서 잠재적으로 민감한 데이터를 추출할 수 있습니다.

예시 코드:

1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users'#

위의 SQL 쿼리는 SQL 인젝션을 사용하여 'users' 테이블의 열 이름을 검색합니다. 이러한 열 이름을 보기 쉽게 하나의 문자열로 연결합니다.

다음은 세부 설명입니다.

  • 1' UNION: 앞서 설명했듯이, 이 부분은 애플리케이션의 쿼리를 완성하고 주입된 페이로드와 결합하기 위한 것입니다.
  • SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users': 이 쿼리 부분은 주입된 페이로드입니다. 'users' 테이블에서 열 이름을 검색하고 group_concat 함수를 사용하여 단일 문자열로 연결합니다.

쿼리를 제출한 후 출력 결과에서 열 이름을 확인할 수 있습니다.

이제 열 이름을 얻었으므로 'users' 테이블에서 민감한 데이터를 검색할 수 있습니다.

예시 코드:

1' UNION SELECT user, password FROM users#

이 SQL 쿼리는 SQL 인젝션을 사용하여 'users' 테이블에서 'user' 및 'password' 열을 검색합니다.

쿼리를 제출한 후 출력 결과에서 사용자 이름과 해시된 비밀번호를 확인할 수 있습니다. 이 정보는 매우 민감할 수 있으며, 이를 추출하는 방법을 이해하는 것은 취약점을 악용하고 이러한 공격으로부터 방어하는 데 필수적입니다.

이러한 기술을 이해하는 목표는 두 가지입니다. 잠재적인 취약점을 식별하고 더 안전한 애플리케이션을 구축하는 것입니다.

요약

이 랩에서는 SQL 인젝션 취약점에 대해 배우고 실습을 통해 이를 악용하는 방법을 익혔습니다. 취약한 웹 애플리케이션을 설정하고, SQL 인젝션 지점을 식별하고, SQL 인젝션 유형 및 데이터베이스 유형을 결정했으며, SQL 인젝션 취약점을 악용하여 데이터베이스에서 민감한 정보를 검색했습니다.

이 랩을 완료함으로써 가장 일반적이고 위험한 웹 애플리케이션 취약점 중 하나인 SQL 인젝션 취약점을 이해하고 악용하는 데 대한 실질적인 경험을 얻었습니다. 이 지식은 실제 시나리오에서 이러한 취약점을 식별하고 완화하는 데 도움이 되며, 웹 애플리케이션 보안 기술을 향상시킬 것입니다.