티스토리 뷰

SQL Injection( SQL 주입 )

웹 애플리케이션이 백엔드에서 구동 중인 데이터베이스에 질의를 하는 과정에 사용되는 SQL 쿼리를 조작하여
데이터베이스를 대상으로 공격자가 의도한 악의적인 행위를 할 수 있는 Injection 기반의 웹 취약점 입니다.
공격자가 SQL Injection 공격에 성공하게 되면 조직 내부의 민감한 데이터나 개인 정보를 획득 할 수 있으며,
심각한 경우에는 조직의 데이터 전체를 장악하거나 완전히 손상시킬 수 있습니다.

 

 

SQL Injection의 동작 원리

정상적인 로그인 요청 수행 과정
SQL Injection을 통한 로그인 우회

admin' or '1'='1 // 공격자가 아이디입력칸에 입력 비밀번호는 아무거나 입력

 

공격자가 적은 ID, PW 전송

// http요청을 통해 서버로 전달된 뒤 최종적으로 만들어지는 쿼리 
SELECT * FROM users WHERE id='admin' or '1'='1' AND password='anything';

 

SQL의 논리 연산을 조작하여 무조건 참이 되게 만들었으므로  위 SQL의 쿼리는 웹 애플리케이션에 admin이라는 사용자 계정이 존재한다면 패스워드가 일치하는지 여부와는 상관없이 admin계정으로 로그인을 할 수 있게 됩니다.

 

참이 되는 이유 : AND연산자가 OR연사자보다 우선순위가 높기 때문에 이런식으로 하게 된다면 무조건 참이 됩니다.

 

SQL Injection 유형

 

오류(Error) 기반 SQL Injection

잘못된 문법이나 자료형 불일치 등에 의해 웹 브라우저에 표시되는 데이터베이스 오류를 기반으로 수행되는 공격 기법입니다. 공격자는 의도적인 오류를 유발시키고 해당 오류 정보를 바탕으로 데이터베이스명, 테이블, 컬럼 정보 등을 파악할 수 있게 됩니다. 

 

 

UNION 기반 SQL Injection

공격자가 의도한 SQL 쿼리를 UNION 연산자를 이용하여 기존 SQL 쿼리에 덧붙이고 기존 SQL을 무효화시켜 원하는 내부 데이터를 절취할 수 있는 공격 기법입니다.

 

 

Blind SQL Injection

웹 브라우저 화면상에 데이터베이스 오류 정보나 데이터가 직접적으로 노출되지 않을 때 이용되는 기법으로 공격자가 육안으로 확인할 수 있는 데이터베이스 오류나 데이터가 없다는 점에 착안되어 Blind SQL Injection 혹은 추론 기반 SQL Injection이라고 불립니다. 공격자는 공격이 성공했는지 판단하기 위해 미세한 서버의 응답과 동작 방식까지 관찰하고 공격 성공의 단서로서 활용해야 합니다. 다음은 일반적으로 사용되는 기법입니다.

 

 

Boolean 기반 

SQL 쿼리의 결과가 참 또는 거짓이냐에 따라 웹 애플리케이션의 응답이 다른 경우 사용됩니다. 오로지 참/거짓만을 판단할 수 있는 서버의 응답만으로 공격을 수행하므로 공격자는 논리적으로 문제가 없는 공격 쿼리를 작성하기 위해 많은 시간과 노력을 할애해야 합니다. 

 

 

Time 기반

SQL 쿼리의 결과가 참 또는 거짓이냐에 따라 서버의 응답 시간을 제어할 수 있을 때 사용됩니다. MySQL의 Sleep(5000);와 같이 밀리초의 단위의 시간 동안 대기하는 SQL 명령을 사용해 공격의 성공 여부를 판단합니다. 공격자가 지정한 시간만큼 응답이 지연된다면 SQL Injection에 취약한 것으로 간주할 수 있습니다. 

 

 

 

SQL Injection 예방

입력값 검사

HTTP 요청을 통해 전달되는 사용자 데이터에 SQL 구문으로 해석될 수 있는 문자 또는 공격에 사용되는 SQL 구문들의 포함여부를 검사하고 포함시 요청을 차단하거나 해당 문자를 제거(또는 다른 문자로 대체)해야 합니다. 일부 SQL Injection 공격에 대해서는 효과가 있지만 이 방법에만 의존해서는 SQL Injection 공격을 안전하게 방어할 수 있습니다. 

  • SQL 기호: 홑따옴표('), 겹따옴표("), 세미콜론(;), 대시(-), 샵(#), 슬래시샵 (/*) 등
  • SQL 구문: SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY 등

 

저장 프로시저 사용

웹 애플리케이션에서 데이터베이스에 접속하여 어떤 작업을 수행할 때 저장 프로시저를 사용하는 방법입니다.

하지만 저장 프로시저 내에서도 SQL 쿼리가 사용되고, 이 SQL 쿼리가 저장 프로시저내에서 안전하지 않은 방식으로 처리된다면

이 또한 여전히 SQL Injection 공격에 노출되게 된다는 단점이 있습니다.

또한 저장 프로시저를 호출하는 명령에 매개변수로서 사용자 입력값이 안전하지 않은 방식으로 사용되는 경우에도 마찬가지입니다.

공격자는 저장 프로시저 실행 명령을 강제로 종료하고

임의의 저장 프로시저(대표적으로 xp_cmdshell이 있음)를 호출하도록 명령을 조작할 수 있습니다. 

다음은 sp_boardList 저장 프로시저 실행 명령을 종료시키고 뒤에 xp_cmdshell 저장 프로시져를 통해

C드라이브의 파일과 디렉토리를 출력하는 쉘 명령을 실행하는 경우입니다.

 

 

매개변수화된 쿼리 적용

매개변수화된 쿼리는 Prepared Statement라고 불리며,

위키백과의 정의를 인용하자면 데이터베이스에서 사용되는 동일하거나 유사한 SQL 쿼리를

효율적으로 반복적으로 실행하기 위해 사용되는 기능입니다.

쉽게 말해서 매개변수화된 쿼리는 자주 사용되는 SQL 쿼리를 데이터베이스에 준비해두었다가,

해당 SQL 쿼리 실행에 필요한 값들만 매개변수로 전달하여 실행하는 방식입니다.

매개변수화된 쿼리를 사용하면 공격자는 SQL 쿼리의 구조를 알 수 없고,

어떤 HTTP 매개변수가 SQL 쿼리의 어느 부분에 전달되는지 알지 못하므로 SQL Injection 방어에 유용하게 활용될 수 있습니다. 

 

매개변수화된 쿼리를 적용하지 않고 데이터베이스에 데이터를 삽입하는 소스코드는  일반적으로 다음과 같습니다.

$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");$sql = "INSERT INTO crews (firstname, lastname, email) VALUES ('$_POST["firstname"]','$_POST["lastname"]','$_POST["email"]')";$mysqli->query($conn, $sql);

SQL 쿼리에 HTTP 매개변수로 전달받은 값이 바로 입력되고 SQL 쿼리가 데이터베이스에 전달되어 실행됩니다. 

 

하지만 위의 소스코드에 매개변수화된 쿼리를 적용하면 다음과 같은 형태가 됩니다. 

$conn = mysqli_connect("example.com","spike","ilovejulia","bebop_db");$stmt = $conn->prepare("INSERT INTO crews (firstname, lastname, email) VALUES (?, ?, ?)");$stmt->bind_param("sss", $firstname, $lastname, $email);$firstname = $_POST['firstname'];$lastname = $_POST['lastname'];
$email = $_POST['email'];
$stmt->execute();

SQL 쿼리의 INSERT 구문을 보시면 VALUES 절에 데이터가 입력될 곳은 물음표(?)로 표기하였습니다.

이를 Placeholder라고 합니다.

이 SQL 쿼리는 데이터베이스에 전송되고,

추후 사용자로부터 전달받은 데이터를 매개변수를 통해 전달(바인딩)하여 SQL 쿼리를 실행합니다.

 

 

참고 사이트 : https://www.bugbountyclub.com/pentestgym/view/52 

'프로그래밍 기초 > database' 카테고리의 다른 글

트랜잭션이란?  (0) 2024.02.19
Prisma 사용하기  (0) 2024.02.08
1:1관계, 1:N관계, N:M관계  (1) 2024.02.06
데이터 무결성 제약 조건  (0) 2024.02.05
DDL, DML, DCL, TCL 이란?  (0) 2024.02.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함