오래 못 할 짓 하지 않기
SQL Injection 본문
SQL문을 사용하여 DB에 대한 취약점에 접근하는 법으로
SQL문을 주입하고 실행되게 하여 비정상적으로 작동하게 하는 방법이다.
공격이 쉬운 편이고, 큰 피해를 입힐 수 있다.
[ 로그인 관련 ]
SELECT * FROM User WHERE id = 'hello_user1' AND password = '1q2w3e4r'
(아이디 입력) (비밀번호 입력)
를 실행시켜서 where절 조건에 만족하는 정보가 있다?
▶ 로그인에 성공하는 것이 기존 방식이다.
우리가 ID는 알아내기가 쉽지만, 비밀번호를 알아내는 것이 어렵다.
하지만 ID만 알아도 해당 유저로 로그인 할 수 있다면 어떨까?
우리가 입력한 것을 Where절 id 와 password 칸에 넣고 그 입력을 토대로 SQL문을 실행한다.
그럼 id까지만 맞추고, 그 뒤 password 쪽을 무시하도록 만드는 것이다.
[ 방법 1 주석 ]
id 를 입력하는 칸에, [ id + 뒤를 주석처리 ] 를 만들어주면 된다.
주석 처리는 # 이나 -- 로 할 수 있기 때문에
우리가 추가해야 하는 것은 ' # 이다.
만든 결과는 아래와 같다.
SELECT * FROM User WHERE id = 'hello_user1 ' # ' AND password = '1q2w3e4r' |
이렇게 들어가게 되고 이렇게 만들어진 명령어는
SELECT * FROM User WHERE id = 'hello_user1 ' |
위과 같다.
만약 id도 모른다?
id 쪽을 참으로 만들기 위해 [ id = ' ' OR 1=1 # ' ] 의 형태로 만들어준다.
SELECT * FROM User WHERE id = ' ' OR 1=1 # ' AND password = ' ' |
SELECT * FROM User |
이러면 모든 유저의 정보를 확인할 수 있다.
취약점을 보완하려면
1. (가장 간단함)
Mybatis에서 parameter를 받는 방법은 #{id} 혹은 ${id} 가 있다.
parameter를 #으로 받으면 String처리가 되기 때문에 앞 뒤에 ' 가 붙는다.
→ SELECT * FROM User WHERE id= ' hello_user1 ' AND password = '1q2w3e4r'
parameter를 $로 받으면 ' ' 로 감싸지지 않고 바로 SQL문으로 들어가기 때문에 한 단계 안전하다.
→ SELECT * FROM User WHERE id= hello_user1 AND password = 1q2w3e4r
2. Parameter로 받아 넘기기 전에 Query 와 관련된 기호들은 필터링하기
매우 기초적인 방법임 되는 사이트는 거의 없을거다.
이 외에도 많은 방법이 있는데 아직 내 수준이 안 되므로 패스
(참고)
https://noirstar.tistory.com/264
https://www.youtube.com/watch?v=yF4ojDexg0Q&t
https://www.youtube.com/watch?v=OUGrSB0CAxs
(Query 쓸 줄 아는 입문자가 보기엔 이게 제일 쉬움)