∞. 기술 면접/4. 데이터베이스

05. 기술 면접 - 데이터베이스 - SQL 인젝션

THE HEYDAZE 2021. 10. 15. 19:36
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

SQL Injection 과 종류

SQL 인젝션이란, 데이터베이스에 전송되는 SQL 쿼리문을 조작하여 데이트를 변조하거나, 허가 되지 않은 정보에
접근하는 공격이다. 주로 개인정보를 빼낼 때 많이 사용되는 기법이다

 

Error based SQL Injection
논리적 에러를 이용한 SQL Injection

https://noirstar.tistory.com/264

password 부분을 주석처리하여 패스워드를 다르게 입력하더라도 해당 계정정보를 조회할 수 있게 된다

 

Union based SQL Injection
Union 명령어를 이용한 SQL Injection
SQL 에서 Union 키워드는 두 개의 쿼리문에 대한 결과를 통합해서 하나의 테이블로 보여주게 하는 키워드 입니다. 정상적인 쿼리문에 Union 키워드를 사용하여 인젝션에 성공하면, 원하는 쿼리문을 실행할 수 있게 됩니다. Union Injection을 성공하기 위해서는 두 가지의 조건이 있습니다. 하나는 Union 하는 두 테이블의 컬럼 수가 같아야 하고, 데이터 형이 같아야 합니다.

https://noirstar.tistory.com/264

 

Blind SQL Injection(Boolean based SQL)
Blind SQL Injection은 데이터베이스로부터 특정한 값이나 데이터를 전달받지 않고, 단순히 참과 거짓의 정보만 알 수 있을 때 사용합니다. 로그인 폼에 SQL Injection이 가능하다고 가정 했을 때, 서버가 응답하는 로그인 성공과 로그인 실패 메시지를 이용하여, DB의 테이블 정보 등을 추출해 낼 수 있습니다.

https://noirstar.tistory.com/264

 

Blind SQL Injection(Time based SQL)

https://noirstar.tistory.com/264

 

Stored Procedure SQL Injection
저장된 프로시저 에서의 SQL Injection
저장 프로시저(Stored Procedure) 은 일련의 쿼리들을 모아 하나의 함수처럼 사용하기 위한 것입니다. 공격에 사용되는 대표적인 저장 프로시저는 MS-SQL 에 있는 xp_cmdshell로 윈도우 명령어를 사용할 수 있게 됩니다. 단, 공격자가 시스템 권한을 획득 해야 하므로 공격난이도가 높으나 공격에 성공한다면, 서버에 직접적인 피해를 입힐 수 있는 공격 입니다.

 

Mass SQL Injection
다량의 SQL Injection 공격
2008년에 처음 발견된 공격기법으로 기존 SQL Injection 과 달리 한번의 공격으로 다량의 데이터베이스가 조작되어 큰 피해를 입히는 것을 의미합니다. 보통 MS-SQL을 사용하는 ASP 기반 웹 애플리케이션에서 많이 사용되며, 쿼리문은 HEX 인코딩 방식으로 인코딩 하여 공격합니다. 보통 데이터베이스 값을 변조하여 데이터베이스에 악성스크립트를 삽입하고, 사용자들이 변조된 사이트에 접속 시 좀비PC로 감염되게 합니다. 이렇게 감염된 좀비 PC들은 DDoS 공격에 사용됩니다.

 

 

SQL Injection - Error based SQL Injection 와 Union based SQL Injection

- 정상적인 웹 요청 및 응답에서는, 사용자가 ID 를 입력하면 서버는 SQL 쿼리문을 통해 데이터베이스에 접근하여
해당 ID 가 있는 지 검색하고, 정보가 있으면 검색 결과를 사용자에게 전송한다. 이 때의 SQL 쿼리문은 아래와 같다

SELECT name, email FROM users WHERE id = {요청 id}


그러나 만약 ID 입력칸에 1' or '1'=1을 입력한다면, WHERE 조건이 id = '1' 또는 '1'='1' 이 되어 항상 True 인 구무이
되어버린다. 즉, where 구문이 우회된 채로 SQL 쿼리문이 실행되기 때문에 데이터베이스 내의 모든 사용자의 정보고 노출된다

SELECT name, email FROM users WHERE ID='1' or '1'='1';

만약 공격자가 ID 입력칸에 1 'UNION SELECT name, pw FROM user#' 을 입력한다면, 공격자가 입력한 SELECT 문이 그대로 실행되어 user 테이블의 pw 와 name 이 모두 출력된다 

 

SELECT name, email FROM users WHERE id = '1' UNION SELECT name, pw FROM users#'

주로 검색 쿼리문에서 위험하다

 

Spring 을 이용해 따로 정리한 글 링크 https://theheydaze.tistory.com/587

 

Spring Mybatis SQL Injection

MyBatis 바인딩 기법 MyBatis 에서는 #{} 바인딩과 ${} 바인딩이 있다 #{} 바인딩은 바인딩 값을 "" 로 감싸주어 바인딩을 해준다 [GET] http://localhost:8080/members?name=root@gmail.com [SQL] select * from..

theheydaze.tistory.com

 

참고 블로그

https://noirstar.tistory.com/264

 

SQL Injection 이란? (SQL 삽입 공격)

1. SQL Injection  1.1 개요 Ÿ   SQL Injection SQL Injection 이란 악의적인 사용자가 보안상의 취약점을 이용하여, 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작

noirstar.tistory.com