SLQ Injection 이란?
SQL 삽입, SQL 주입으로도 불리며 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격하는 방식을 말합니다.
웹 어플레케이션은 사용자의 클릭, 입력등에 따라 DB에 있는 데이터를 서로 다르게 받아오게 됩니다. 그러기 위해 Query는 사용자가 입력한 데이터를 포함하는 식으로 동적으로 변하게 되기 때문에 개발자가 의도하지 않은 정보를 열람할 수 있는 가능성이 생깁니다.
위의 상황을 노리고 임의의 쿼리를 생성하여 DB의 정보를 열람하거나 조작하는 경우를 SQL Injection이라고 할 수 있습니다.
공격난이도가 쉽지만 피해가 크기 때문에 OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되었습니다. 따라서 보안에 각별한 주의가 필요합니다.
SQL Injection 유형
- Error based SQL Injection : 논리적 에러를 이용한 방식
- 공격 대상 : SELECT * FROM user WHERE id='admin' AND password='password';
- 공격 예시 : SELECT * FROM user WHERE id=''OR 1=1--' AND password='password';
- 결과 : SELECT * FROM user WHERE id=''OR 1=1 의 형태가 되며 결론적으로 참이 되기때문에 로그인에 성공하게 됩니다. 이와 같이 논리적 에러를 이용하여 Injection하는 방식을 Error based SQL Injection이라고 합니다.
- UNION based SQL Injection : 두 개의 쿼리문에 대한 결과를 통합해 하나의 테이블로 보여주게 하는 방식
- 공격 대상 : SELECT * FROM user WHERE id='admin' AND password='password';
- 공격 예시 : SELECT * FROM user WHERE id='admin UNION SELECT 1,1 -- AND password='password';
- 결과 : SELECT * FROM user WHERE id='admin UNION SELECT 1,1 로 실행하게 되면 user에 등론된 id와 password목록을 모두 조회할 수 있게 됩니다.
- Blind SQL Injection - Boolean based SQL : 특정한 값이나 데이터를 전달받는 것이 아닌, 쿼리를 통해 나온 참과 거짓의 정보만을 통해 정보를 취득
- limit, SUBSTR 등의 SQL문을 사용
- 서버가 응답하는 성공과 실패 여부를 이용해 DB 테이블 정보를 추출해 냄
- 에러가 발생하지 않는 사이트에 사용
- Blind SQL Injection - Time based SQL : Query의 결과를 특정 시간만큼 지연
- SLEEP, BENCHMARK 등의 SQL문을 사용
- 에러가 발생하지 않는 사이트에 사용
- Stored Procedure SQL Injection
- Stored Procedure(저장 프로시저) : 편의를 위해 일련의 Query들을 하나의 함수처럼 모아둔 것
- Mass SQL Injection
- 다량의 SQL Injection 공격
- DB 값을 변조하여 DB에 악성 스크립트를 삽입하고, 사용자들이 변조된 사이트에 접속 시 좀비 PC로 감염되게 함
SQL Injection 예방
- 입력값 검사
- HTTP 요청을 통해 전달되는 사용자 데이터에 SQL 구문으로 해석될 수 있는 문자 또는 공격에 사용되는 SQL 구문들의 포함 여부를 검사하고 포함시 요청을 차단하거나 해당 문자를 제거
- SQL 기호 : 홑따옴표('), 겹따옴표("), 세미콜론(;), 대시(-), 샵(#), 슬래시샵 (/*) 등
- SQL 구문: SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY 등
- HTTP 요청을 통해 전달되는 사용자 데이터에 SQL 구문으로 해석될 수 있는 문자 또는 공격에 사용되는 SQL 구문들의 포함 여부를 검사하고 포함시 요청을 차단하거나 해당 문자를 제거
- Prepare Statement 사용
- 매개변수화 된 Query 로서 어떤 HTTP 매개변수가 SQL쿼리의 어느 부분에 전달되는지 알지 못하기 때문에 방어에 유리함
- Prepare Statement를 사용하면, 특수문자를 자동으로 escaping 해줌 (statement와는 다르게 쿼리문에서 전달인자 값을 ?로 받는 것) 이를 활용해 서버 측에서 필터링 과정을 통해서 공격을 방어
- SQL 서버 오류 발생 시, 해당하는 에러 메시지 감추기
- view를 활용하여 원본 데이터베이스 테이블에는 접근 권한을 높여 일반 사용자는 view로만 접근하여 에러를 볼 수 없도록 만듬
Reference
https://namu.wiki/w/SQL%20injection
https://m.blog.naver.com/lstarrlodyl/221837243294
'Computer Science > Database' 카테고리의 다른 글
SQL과 NoSQL (1) | 2023.09.18 |
---|---|
Redis (0) | 2023.09.17 |
SLQ Injection 이란?
SQL 삽입, SQL 주입으로도 불리며 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격하는 방식을 말합니다.
웹 어플레케이션은 사용자의 클릭, 입력등에 따라 DB에 있는 데이터를 서로 다르게 받아오게 됩니다. 그러기 위해 Query는 사용자가 입력한 데이터를 포함하는 식으로 동적으로 변하게 되기 때문에 개발자가 의도하지 않은 정보를 열람할 수 있는 가능성이 생깁니다.
위의 상황을 노리고 임의의 쿼리를 생성하여 DB의 정보를 열람하거나 조작하는 경우를 SQL Injection이라고 할 수 있습니다.
공격난이도가 쉽지만 피해가 크기 때문에 OWASP에서도 수년 동안 인젝션 기법이 보안 위협 1순위로 분류되었습니다. 따라서 보안에 각별한 주의가 필요합니다.
SQL Injection 유형
- Error based SQL Injection : 논리적 에러를 이용한 방식
- 공격 대상 : SELECT * FROM user WHERE id='admin' AND password='password';
- 공격 예시 : SELECT * FROM user WHERE id=''OR 1=1--' AND password='password';
- 결과 : SELECT * FROM user WHERE id=''OR 1=1 의 형태가 되며 결론적으로 참이 되기때문에 로그인에 성공하게 됩니다. 이와 같이 논리적 에러를 이용하여 Injection하는 방식을 Error based SQL Injection이라고 합니다.
- UNION based SQL Injection : 두 개의 쿼리문에 대한 결과를 통합해 하나의 테이블로 보여주게 하는 방식
- 공격 대상 : SELECT * FROM user WHERE id='admin' AND password='password';
- 공격 예시 : SELECT * FROM user WHERE id='admin UNION SELECT 1,1 -- AND password='password';
- 결과 : SELECT * FROM user WHERE id='admin UNION SELECT 1,1 로 실행하게 되면 user에 등론된 id와 password목록을 모두 조회할 수 있게 됩니다.
- Blind SQL Injection - Boolean based SQL : 특정한 값이나 데이터를 전달받는 것이 아닌, 쿼리를 통해 나온 참과 거짓의 정보만을 통해 정보를 취득
- limit, SUBSTR 등의 SQL문을 사용
- 서버가 응답하는 성공과 실패 여부를 이용해 DB 테이블 정보를 추출해 냄
- 에러가 발생하지 않는 사이트에 사용
- Blind SQL Injection - Time based SQL : Query의 결과를 특정 시간만큼 지연
- SLEEP, BENCHMARK 등의 SQL문을 사용
- 에러가 발생하지 않는 사이트에 사용
- Stored Procedure SQL Injection
- Stored Procedure(저장 프로시저) : 편의를 위해 일련의 Query들을 하나의 함수처럼 모아둔 것
- Mass SQL Injection
- 다량의 SQL Injection 공격
- DB 값을 변조하여 DB에 악성 스크립트를 삽입하고, 사용자들이 변조된 사이트에 접속 시 좀비 PC로 감염되게 함
SQL Injection 예방
- 입력값 검사
- HTTP 요청을 통해 전달되는 사용자 데이터에 SQL 구문으로 해석될 수 있는 문자 또는 공격에 사용되는 SQL 구문들의 포함 여부를 검사하고 포함시 요청을 차단하거나 해당 문자를 제거
- SQL 기호 : 홑따옴표('), 겹따옴표("), 세미콜론(;), 대시(-), 샵(#), 슬래시샵 (/*) 등
- SQL 구문: SELECT, INSERT, UPDATE, DELETE, UNION, GROUP BY, HAVING, ORDER BY 등
- HTTP 요청을 통해 전달되는 사용자 데이터에 SQL 구문으로 해석될 수 있는 문자 또는 공격에 사용되는 SQL 구문들의 포함 여부를 검사하고 포함시 요청을 차단하거나 해당 문자를 제거
- Prepare Statement 사용
- 매개변수화 된 Query 로서 어떤 HTTP 매개변수가 SQL쿼리의 어느 부분에 전달되는지 알지 못하기 때문에 방어에 유리함
- Prepare Statement를 사용하면, 특수문자를 자동으로 escaping 해줌 (statement와는 다르게 쿼리문에서 전달인자 값을 ?로 받는 것) 이를 활용해 서버 측에서 필터링 과정을 통해서 공격을 방어
- SQL 서버 오류 발생 시, 해당하는 에러 메시지 감추기
- view를 활용하여 원본 데이터베이스 테이블에는 접근 권한을 높여 일반 사용자는 view로만 접근하여 에러를 볼 수 없도록 만듬
Reference
https://namu.wiki/w/SQL%20injection
https://m.blog.naver.com/lstarrlodyl/221837243294
'Computer Science > Database' 카테고리의 다른 글
SQL과 NoSQL (1) | 2023.09.18 |
---|---|
Redis (0) | 2023.09.17 |