소개
SQL 인젝션은 공격자가 악성 입력을 조작하고 백엔드 데이터베이스에서 임의의 SQL 문을 실행하여 웹 애플리케이션을 악용하는 데 사용되는 널리 사용되는 기술입니다. 이 랩에서는 sqli-labs 를 Docker 와 함께 사용하여 SQL 인젝션 환경을 설정하고, SQL 인젝션 취약점의 원리와 악용 방법을 이해하기 위한 실습 실험을 수행합니다.
SQL 인젝션은 공격자가 악성 입력을 조작하고 백엔드 데이터베이스에서 임의의 SQL 문을 실행하여 웹 애플리케이션을 악용하는 데 사용되는 널리 사용되는 기술입니다. 이 랩에서는 sqli-labs 를 Docker 와 함께 사용하여 SQL 인젝션 환경을 설정하고, SQL 인젝션 취약점의 원리와 악용 방법을 이해하기 위한 실습 실험을 수행합니다.
웹 보안 테스트에 대한 소개 과정에 오신 것을 환영합니다. 특히 잠재적인 SQL 인젝션 취약점을 식별하는 데 중점을 둡니다. SQL 인젝션은 웹 애플리케이션에서 흔히 발생하는 잠재적으로 치명적인 보안 결함이지만, 올바른 지식을 갖추면 이를 식별하고 예방하는 방법을 배울 수 있습니다.
SQL 인젝션은 공격자가 악성 SQL 코드를 웹 애플리케이션의 데이터베이스 쿼리에 삽입하는 기술입니다. 웹 애플리케이션이 사용자 입력을 제대로 sanitization 하지 않으면 데이터 유출, 데이터 손실 또는 기타 심각한 문제로 이어질 수 있습니다.
데이터베이스와 상호 작용하는 웹 애플리케이션은 종종 매개변수를 포함하는 URL 을 갖습니다. 이러한 매개변수는 제대로 sanitization 되지 않은 경우 악용될 수 있습니다. 예를 들어 다음과 같은 URL 을 볼 수 있습니다.
http://some-website.com/page.php?id=XX
이 URL 에서 id는 데이터베이스와 상호 작용하는 매개변수입니다. 이러한 매개변수를 사용하는 모든 웹 페이지는 입력이 제대로 sanitization 되지 않은 경우 SQL 인젝션에 취약할 수 있습니다.
SQL 인젝션 취약점을 테스트하는 간단한 방법 중 하나는 작은따옴표 기술을 사용하는 것입니다. 방법은 다음과 같습니다.
') 를 추가합니다. 예를 들어 URL 을 다음과 같이 변경할 수 있습니다: http://some-website.com/page.php?id=1'이것이 작동하는 이유는 SQL 에서 숫자 및 문자열 데이터 유형 모두 불균형 작은따옴표가 도입되면 구문 오류를 생성하기 때문입니다. 이 오류는 SQL 인젝션 취약점의 존재를 드러낼 수 있습니다.
작은따옴표를 추가해도 오류가 표시되지 않는다고 해서 SQL 인젝션 취약점이 없다는 의미는 아닙니다. 애플리케이션이 작은따옴표를 필터링하고 있을 수 있으며, 이 경우 취약점을 테스트하기 위해 다른 기술을 사용해야 합니다. 걱정하지 마세요. 이러한 고급 기술은 향후 강의에서 다룰 것입니다.
윤리적 해킹은 보안을 개선하는 것입니다. 테스트 노력에서 항상 개인 정보 보호 및 합법성을 존중하십시오. 즐거운 학습 되세요!
잠재적인 SQL 인젝션 포인트를 식별하신 것을 축하드립니다! 이제 다음 단계로 넘어가 SQL 인젝션 취약점의 유형을 결정해 보겠습니다. 여기서는 두 가지 주요 유형, 즉 숫자 기반 및 문자열 기반 SQL 인젝션에 중점을 둡니다.
입력 매개변수 (이하 x라고 함) 가 웹 애플리케이션에 의해 정수로 처리될 때 SQL 쿼리는 다음과 같을 수 있습니다.
select * from <table_name> where id = x
숫자 기반 SQL 인젝션을 식별하기 위해 and 1=1 및 and 1=2의 두 가지 간단한 논리 조건을 사용합니다. 방법은 다음과 같습니다.
http://some-website.com/page.php?id=x and 1=1을 입력합니다. 페이지가 예상대로 로드되면 다음 단계로 진행합니다.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 인젝션 취약점을 나타냅니다.
경우에 따라 입력 매개변수 x는 문자열로 처리됩니다. SQL 쿼리는 다음과 같을 수 있습니다.
select * from <table_name> where id = 'x'
문자열 기반 인젝션을 식별하기 위해 숫자 인젝션과 유사한 접근 방식을 사용하지만 문자열 조건 and '1'='1' 및 and '1'='2'를 사용합니다. 방법은 다음과 같습니다.
http://some-website.com/page.php?id=x' and '1'='1을 입력합니다. 페이지가 예상대로 로드되면 다음 단계로 진행합니다.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 인젝션 취약점에 대해 더 자세히 알아보겠습니다. 우리의 초점은 이러한 취약점을 악용하여 로그인 인증을 우회하는 방법, 즉 "유니버설 비밀번호" 공격이라고도 하는 기술에 맞춰질 것입니다.
시작하기 위해 랩 환경을 준비해야 합니다. 의도적으로 안전하지 않도록 설계된 PHP/MySQL 웹 애플리케이션인 Damn Vulnerable Web Application (DVWA) 를 사용하여 웹 애플리케이션 보안을 이해하는 데 이상적인 학습 도구로 만들 것입니다.
sqli-labs Docker 이미지 다운로드: sqli-labs Docker 이미지는 Docker Hub 에서 다운로드할 수 있습니다. 터미널에서 다음 명령을 사용하여 이미지를 가져옵니다.
docker pull acgpiano/sqli-labs
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을 클릭하십시오.
이제 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
이 쿼리는 이해하기 쉽습니다. username과 password가 모두 일치하는 행을 반환하면 로그인이 성공합니다.
이전 랩의 지식을 바탕으로 다음 페이로드를 입력해 보겠습니다.
사용자 이름: 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 인젝션 취약점을 이해하고 악용하는 실질적인 경험을 얻었습니다.