소개
이 대화형 랩에 오신 것을 환영합니다! 저희는 웹 애플리케이션에 만연하고 심각한 위험인 SQL 인젝션 취약점에 초점을 맞추고 있습니다. 간단히 말해서, SQL 인젝션 공격은 애플리케이션이 제대로 확인되거나 코딩되지 않은 데이터를 수신하고, 이 데이터가 SQL 쿼리에 포함될 때 발생합니다. 이 허점을 통해 사이버 공격자는 유해한 SQL 명령을 실행할 수 있으며, 이는 기밀 데이터에 대한 무단 액세스를 허용하거나 다른 유해한 작업을 수행할 수 있게 합니다.
이 랩의 목표는 두 가지입니다. 첫째, SQL 인젝션 취약점의 핵심 개념을 이해하기 쉬운 부분으로 나누어 설명하는 것입니다. 둘째, 이러한 취약점을 악용하는 방법을 실습하여 악의적인 의도가 아닌, 이를 더 잘 이해하고 예방할 수 있도록 돕는 것입니다. 이러한 실용적인 접근 방식은 이러한 위협으로부터 애플리케이션을 보호할 수 있는 지식과 기술을 제공할 것입니다.
랩 환경 설정
이 섹션에서는 SQL 인젝션 공격을 연습할 수 있는 랩 환경을 설정하는 과정을 안내해 드리겠습니다.
DVWA Docker 이미지 가져오기 (Pull the DVWA Docker Image): DVWA Docker 이미지는 Docker Hub 에서 사용할 수 있습니다. 다음 명령을 사용하여 가져올 수 있습니다.
docker pull vulnerables/web-dvwaDVWA 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 인젝션 취약점을 이해하고 악용하는 데 대한 실질적인 경험을 얻었습니다. 이 지식은 실제 시나리오에서 이러한 취약점을 식별하고 완화하는 데 도움이 되며, 웹 애플리케이션 보안 기술을 향상시킬 것입니다.