XSS CSRF을 알아보다가 SQL injection에 관해서도 알아봐야겠다.
SQL Injection은 말 그대로 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여
공격자가 원하는 데이터 베이스의 중요한 정보를 가져오는 해킹 기법을 말한다.
SQL Injection
SQL Injection은 말 그대로 웹 사이트의 보안상 허점을 이용해 특정 SQL 쿼리문을 전송하여
공격자가 원하는 데이터 베이스의 중요한 정보를 가져오는 해킹 기법을 말한다.
1) Error based SQL injection
SQL문을 제대로 입력하지 못했을 경우에 Error메세지가 뜨는데 그 정보를 공격자가 파악하는 것이다.
예시는 다음과 같다.


2) Union based SQL injection
Union은 테이블을 A와 B의 테이블을 합치는 것이라고 알면 된다.
공격자가 Union을 이용하여 원래의 요청에 추가 쿼리를 삽입하여 정보를 얻어내는 방식이다.
→ 사전 공격을 통해 해당 정보를 얻어야 한다.
예시는 다음과 같다. union select 1,2,3,4,5,6을 입력하게 되면서 번호, 제목, 작성자, 날짜, 조회수와 같은
정보를 얻게 된다.

3) Blind based SQL injection
에러가 발생되지 않는 사이트에서 SQL 쿼리의 참/거짓 동작만으로 DB구조를 파악하는 것이다.
→ 기본적으로 공격 쿼리문 자체가 상당히 개수가 많아지므로 툴을 사용하게 된다.
예시는 다음과 같다.


4) Time based SQL Injection
기본적으로 에러가 발생되지 않는 사이트에서 특정 시간만큼 지연시키는 것이다.
SLEEP을 통해서 제대로 SQL문이 삽입된다면 해당 쿼리문이 선언한 시간만큼 적어진다.

대응 방안
1) 입력값 검증
XSS, CSRF와도 궤를 같이 한다. 서버단에서 특수문자에 대해 민감하게 반응하고 의도한
값인지 체크 하는 것이다.
다음의 예시는 특수문자를 그냥 공백처리하는 java단 코드이다.

2) 서버 보안
- 최소 권한 유저로 DB운영해야한다.
- 신뢰할 수 있는 네트워크, 서버에 대해서만 접근 허용
3) Mybatis
기본적으로 Mybatis에서 변수를 가져와서 실행하는데 $가 있고 #가 있다. $의 경우는 문자열을 그대로
출력해서 가져오므로 SQL에 대해 민감한 따옴표('), 쌍따옴표(")를 그대로 삽입한다.
그러나 #의 경우는 PreParedStatement에 의해서 문자열을 자체적으로 따옴표(')를 맨 앞과
뒤에 처리하므로 안전한 것이다.
→ PreparedStatement는 속도 면에서도 안전성에서도 좋다.
'DB > 이론' 카테고리의 다른 글
| PL/SQL 런타임 작동 방식 (0) | 2024.07.04 |
|---|---|
| Oracle - [ Date ] vs [ TIMESTAMP ] (0) | 2024.06.28 |
| Oracle - INDEX (0) | 2024.06.22 |
| 인덱스(Index) Re (0) | 2024.06.21 |
| VARCHAR, CHAR (0) | 2024.06.21 |