오래 못 할 짓 하지 않기

SQL Injection 본문

웹 보안

SQL Injection

쫑알bot 2024. 1. 6. 13:11
728x90

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 와 관련된 기호들은 필터링하기


 

 

매우 기초적인 방법임 되는 사이트는 거의 없을거다.

이 외에도 많은 방법이 있는데 아직 내 수준이 안 되므로 패스

 

(참고)