Nmap 을 이용한 SQL 인젝션 실험 수행

Beginner

소개

SQL 인젝션은 공격자가 악성 입력을 조작하고 백엔드 데이터베이스에서 임의의 SQL 문을 실행하여 웹 애플리케이션을 악용하는 데 사용되는 널리 사용되는 기술입니다. 이 랩에서는 sqli-labs 를 Docker 와 함께 사용하여 SQL 인젝션 환경을 설정하고, SQL 인젝션 취약점의 원리와 악용 방법을 이해하기 위한 실습 실험을 수행합니다.

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

인젝션 지점 식별

웹 보안 테스트에 대한 소개 과정에 오신 것을 환영합니다. 특히 잠재적인 SQL 인젝션 취약점을 식별하는 데 중점을 둡니다. SQL 인젝션은 웹 애플리케이션에서 흔히 발생하는 잠재적으로 치명적인 보안 결함이지만, 올바른 지식을 갖추면 이를 식별하고 예방하는 방법을 배울 수 있습니다.

SQL 인젝션이란 무엇인가?

SQL 인젝션은 공격자가 악성 SQL 코드를 웹 애플리케이션의 데이터베이스 쿼리에 삽입하는 기술입니다. 웹 애플리케이션이 사용자 입력을 제대로 sanitization 하지 않으면 데이터 유출, 데이터 손실 또는 기타 심각한 문제로 이어질 수 있습니다.

잠재적인 SQL 인젝션 포인트 식별

데이터베이스와 상호 작용하는 웹 애플리케이션은 종종 매개변수를 포함하는 URL 을 갖습니다. 이러한 매개변수는 제대로 sanitization 되지 않은 경우 악용될 수 있습니다. 예를 들어 다음과 같은 URL 을 볼 수 있습니다.

http://some-website.com/page.php?id=XX

이 URL 에서 id는 데이터베이스와 상호 작용하는 매개변수입니다. 이러한 매개변수를 사용하는 모든 웹 페이지는 입력이 제대로 sanitization 되지 않은 경우 SQL 인젝션에 취약할 수 있습니다.

SQL 인젝션 테스트: 작은따옴표 기술

SQL 인젝션 취약점을 테스트하는 간단한 방법 중 하나는 작은따옴표 기술을 사용하는 것입니다. 방법은 다음과 같습니다.

  1. URL 의 매개변수 값에 작은따옴표 (') 를 추가합니다. 예를 들어 URL 을 다음과 같이 변경할 수 있습니다: http://some-website.com/page.php?id=1'
  2. Enter 키를 누른 후 웹 페이지에서 오류가 반환되면 사이트가 SQL 인젝션에 취약할 수 있음을 의미할 수 있습니다.

이것이 작동하는 이유는 SQL 에서 숫자 및 문자열 데이터 유형 모두 불균형 작은따옴표가 도입되면 구문 오류를 생성하기 때문입니다. 이 오류는 SQL 인젝션 취약점의 존재를 드러낼 수 있습니다.

중요 참고 사항

작은따옴표를 추가해도 오류가 표시되지 않는다고 해서 SQL 인젝션 취약점이 없다는 의미는 아닙니다. 애플리케이션이 작은따옴표를 필터링하고 있을 수 있으며, 이 경우 취약점을 테스트하기 위해 다른 기술을 사용해야 합니다. 걱정하지 마세요. 이러한 고급 기술은 향후 강의에서 다룰 것입니다.

윤리적 해킹은 보안을 개선하는 것입니다. 테스트 노력에서 항상 개인 정보 보호 및 합법성을 존중하십시오. 즐거운 학습 되세요!

SQL 인젝션 유형 결정

잠재적인 SQL 인젝션 포인트를 식별하신 것을 축하드립니다! 이제 다음 단계로 넘어가 SQL 인젝션 취약점의 유형을 결정해 보겠습니다. 여기서는 두 가지 주요 유형, 즉 숫자 기반 및 문자열 기반 SQL 인젝션에 중점을 둡니다.

숫자 기반 SQL 인젝션

입력 매개변수 (이하 x라고 함) 가 웹 애플리케이션에 의해 정수로 처리될 때 SQL 쿼리는 다음과 같을 수 있습니다.

select * from <table_name> where id = x

숫자 기반 SQL 인젝션을 식별하기 위해 and 1=1and 1=2의 두 가지 간단한 논리 조건을 사용합니다. 방법은 다음과 같습니다.

  1. 브라우저에 http://some-website.com/page.php?id=x and 1=1을 입력합니다. 페이지가 예상대로 로드되면 다음 단계로 진행합니다.
  2. 이제 http://some-website.com/page.php?id=x and 1=2를 시도해 봅니다. 페이지에서 오류가 반환되거나 다르게 동작하면 숫자 기반 SQL 인젝션 취약점을 나타낼 수 있습니다.

이것이 왜 작동할까요?

and 1=1을 입력하면 결과 SQL 쿼리는 다음과 같습니다.

select * from <table_name> where id = x and 1=1

조건 1=1은 항상 참이므로 페이지가 정상적으로 로드되면 입력이 SQL 쿼리에 직접 삽입되고 있음을 시사합니다.

and 1=2를 입력하면 결과 SQL 쿼리는 다음과 같습니다.

select * from <table_name> where id = x and 1=2

조건 1=2는 항상 거짓이므로 페이지가 다르게 동작하면 (예: 오류 반환) 입력이 SQL 쿼리에 영향을 미치고 있음을 시사하며 잠재적인 SQL 인젝션 취약점을 나타냅니다.

문자열 기반 SQL 인젝션

경우에 따라 입력 매개변수 x는 문자열로 처리됩니다. SQL 쿼리는 다음과 같을 수 있습니다.

select * from <table_name> where id = 'x'

문자열 기반 인젝션을 식별하기 위해 숫자 인젝션과 유사한 접근 방식을 사용하지만 문자열 조건 and '1'='1'and '1'='2'를 사용합니다. 방법은 다음과 같습니다.

  1. 브라우저에 http://some-website.com/page.php?id=x' and '1'='1을 입력합니다. 페이지가 예상대로 로드되면 다음 단계로 진행합니다.
  2. 이제 http://some-website.com/page.php?id=x' and '1'='2를 시도해 봅니다. 페이지에서 오류가 반환되거나 다르게 동작하면 문자열 기반 SQL 인젝션 취약점을 나타낼 수 있습니다.

이것이 왜 작동할까요?

and '1'='1'을 입력하면 결과 SQL 쿼리는 다음과 같습니다.

select * from <table_name> where id = 'x' and '1'='1'

조건 '1'='1'은 항상 참이므로 페이지가 정상적으로 로드되면 입력이 SQL 쿼리에 직접 삽입되고 있음을 시사합니다.

and '1'='2'를 입력하면 결과 SQL 쿼리는 다음과 같습니다.

select * from <table_name> where id = 'x' and '1'='2'

조건 '1'='2'는 항상 거짓이므로 페이지가 다르게 동작하면 (예: 오류 반환) 입력이 SQL 쿼리에 영향을 미치고 있음을 시사하며 잠재적인 SQL 인젝션 취약점을 나타냅니다.

두 경우 모두 웹 애플리케이션에서 예상치 못한 응답이 나타나면 SQL 인젝션 포인트를 찾았을 수 있다는 힌트임을 기억하십시오. 그러나 이러한 테스트를 수행할 권한이 있는지 항상 확인하고 기술을 책임감 있게 사용하십시오. 즐거운 학습 되세요!

SQL 인젝션을 이용한 인증 우회

이 랩에서는 SQL 인젝션 취약점에 대해 더 자세히 알아보겠습니다. 우리의 초점은 이러한 취약점을 악용하여 로그인 인증을 우회하는 방법, 즉 "유니버설 비밀번호" 공격이라고도 하는 기술에 맞춰질 것입니다.

랩 환경 준비

시작하기 위해 랩 환경을 준비해야 합니다. 의도적으로 안전하지 않도록 설계된 PHP/MySQL 웹 애플리케이션인 Damn Vulnerable Web Application (DVWA) 를 사용하여 웹 애플리케이션 보안을 이해하는 데 이상적인 학습 도구로 만들 것입니다.

  1. sqli-labs Docker 이미지 다운로드: sqli-labs Docker 이미지는 Docker Hub 에서 다운로드할 수 있습니다. 터미널에서 다음 명령을 사용하여 이미지를 가져옵니다.

    docker pull acgpiano/sqli-labs
  2. sqli-labs Docker 컨테이너 실행: 이미지를 다운로드한 후 아래 명령을 사용하여 실행합니다.

    docker run -it -d --name sqli-labs -p 80:80 -p 13306:3306 acgpiano/sqli-labs

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

이러한 단계를 따르면 필요한 랩 환경을 성공적으로 설정했습니다.

설정이 완료되면 Firefox 를 열고 주소 표시줄에 http://localhost를 입력합니다.

http://localhost를 처음 방문하는 경우 랩을 준비하고 웹 페이지를 새로 고치려면 Setup/reset Database for lab을 클릭하십시오.

SQL 인젝션 식별

이제 Less-11 을 클릭하면 간단한 로그인 페이지가 표시됩니다. 임의의 사용자 이름 123과 비밀번호 123을 입력해 보십시오.

오류 페이지에 "Invalid username or password."가 표시됩니다.

백엔드 코드 해독

인증 프로세스를 담당하는 백엔드 코드를 살펴보겠습니다.

// take the variables
if(isset($_POST['uname']) && isset($_POST['passwd']))
{
 $uname=$_POST['uname'];
 $passwd=$_POST['passwd'];

 //logging the connection parameters to a file for analysis.
 $fp=fopen('result.txt','a');
 fwrite($fp,'User Name:'.$uname);
 fwrite($fp,'Password:'.$passwd."\n");
 fclose($fp);

 // connectivity
 @$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";
 $result=mysql_query($sql);
 $row = mysql_fetch_array($result);
....
}

실행되는 실제 SQL 쿼리는 다음과 같습니다.

SELECT * FROM users WHERE username='123' AND password='123' LIMIT 0,1

이 쿼리는 이해하기 쉽습니다. usernamepassword가 모두 일치하는 행을 반환하면 로그인이 성공합니다.

취약점 악용

이전 랩의 지식을 바탕으로 다음 페이로드를 입력해 보겠습니다.

사용자 이름: 123' or 1=1 #
비밀번호: 123' or 1=1 #

흥미롭게도 이를 통해 성공적으로 로그인할 수 있습니다! 그 이유는 실행되는 실제 SQL 쿼리가 다음과 같기 때문입니다.

SELECT * FROM users WHERE username='123' or 1=1 #' AND password='123' or 1=1 #'

MySQL 에서 # 기호는 나머지 줄을 주석 처리하는 데 사용되므로 쿼리는 효과적으로 다음과 같습니다.

SELECT * FROM users WHERE username='123' or 1=1

조건 or 1=1이 항상 참이므로 쿼리는 항상 결과를 반환하여 성공적인 로그인을 유도합니다.

주석 기호를 사용하지 않는 변형도 실험할 수 있습니다.

사용자 이름: 123' or '1'='1
비밀번호: 123' or '1'='1

실행되는 SQL 쿼리는 다음과 같습니다.

SELECT * FROM users WHERE username='123' or '1'='1' AND password='123' or '1'='1'

이 경우 두 개의 or 조건은 그 사이의 and 조건이 항상 참이 되도록 하여 성공적인 로그인을 유도합니다.

결론

위에서 설명한 바와 같이 SQL 인젝션 취약점을 악용하고 인증을 우회하는 데 사용할 수 있는 다양한 기술이 있습니다. 다양한 페이로드를 자유롭게 탐색하고 실험해 보십시오. 여기의 목표는 이러한 취약점을 이해하여 자체 애플리케이션을 이러한 취약점으로부터 더 잘 보호할 수 있도록 하는 것입니다. 즐거운 윤리적 해킹 되세요!

요약

이 랩에서는 단일 인용 부호 기술을 사용하여 SQL 인젝션 취약점을 식별하는 방법과 특정 페이로드를 사용하여 SQL 인젝션 유형 (숫자 기반 또는 문자열 기반) 을 결정하는 방법을 배웠습니다. 또한 "유니버설 비밀번호" 공격으로 알려진 일반적인 시나리오인 로그인 인증을 우회하기 위해 SQL 인젝션 취약점을 악용하는 방법을 탐구했습니다. 실습을 통해 입력 위생 처리가 제대로 구현되지 않은 경우 웹 애플리케이션에서 널리 사용되는 SQL 인젝션 취약점을 이해하고 악용하는 실질적인 경험을 얻었습니다.