SQL 삽입은 응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 방법이다. - 위키백과 -

 

즉 내가 원하는 쿼리를 실행하도록 하는 공격방법이다.

 

예시로 로그인 로직의 sql이 다음과 같다고 하자

SELECT COUNT(*) FROM MEMBER WHERE ID = '{$ID}' AND PW ='${PW}'

 

SQL Injection에 대해 조치가 없다면  ID값에  doldol'# 혹은 doldol;-- 라고 입력하면 실제 사용되는 쿼리는 다음과 같아진다.

 

SELECT COUNT(*) FROM MEMBER WHERE ID = 'doldol' #' AND PW ='${PW}'

즉 doldol이라는 아이디를 가진 사용자가 있다면 ID만으로 로그인이 된다. ID이후의 쿼리는 주석으로 처리되기 때문이다.

 

이러한 SQL Injection을 막는 방법은 여러가지 방법이 있다.

 

1. java에서의 mybatis같은 SQL Mapper 의 사용으로 입력 받는 값이 쿼리가 아닌 문자열로 인식하도록 할 수 있다.

  - 단 mybatis에서도 #{} 를 사용해야자 ${}를 사용하게 된다면 위와같은 SQL Injection에 취약하다.

2. 입력받은 문자열의 공백을 모두 trim 처리한다. SQL은 띄어쓰기로 구문을 분석하기 때문에 입력받은 값들이 SQL일지라도 띄어쓰기가 되어 있지 않다면 하나의 문법으로 인식하기 때문에 문법에러(syntaxerror invalid syntax)를 반환할 것이다.

3. 특수문자들을 치환한다. 이를 이스케이핑이라고 부르며 SQL에서의 특수한역할을 하는 특수문자들을 다른 방법으로 치환하고 다시 사용할 때 역치환하는 방식으로 사용한다.

 

이외에도 일부 사이트에서 비밀번호 입력 시 사용 할 수 없는 특수 문자가 있기도 하다 #, $ 등등

일부 특수문자나 단어를 입력할 수 없도록 하는 방법도 있을 수 있을 것이다.

 

'웹 해킹 코스 > 내용 정리' 카테고리의 다른 글

8주차 SQL Injection 대상 찾기  (1) 2023.12.18
6주차 union을 사용한 SQL Injection  (0) 2023.11.30
4주차 (burp suitte)  (0) 2023.11.15
3주차 (쿠키, 세션)  (0) 2023.11.08
2주차 (DB)  (0) 2023.11.01

+ Recent posts