itsme

(4) SQL Injection -3 본문

Study/보안

(4) SQL Injection -3

itssmeee 2023. 1. 16. 14:03
반응형

3) SQL Injection 방어 방법

 

앞서 만든 사이트의 경우 개발자가 문자열이라는 범위 안에 사용자의 입력값을 넣고자 의도했으나, 싱글쿼터를 이용해서 그 범위를 임의로 벗어날 수 있었다는 것이 핵심이다.

 

1. 특수문자 필터링

가장 쉬운 방법은 싱글쿼터를 막는 것이다.

사용자가 입력하는 싱글쿼터가 쿼리에서의 역할을 수행하지 못하는 그냥 일반 문자로 만들면 된다.

PHP에는 addslashes라는 함수를 이용하여 일반문자로 바꿔줄 수 있다.

addslashes라는 함수의 역할은 싱글쿼터, 더블쿼터, 어퍼스트로피, NULL의 앞에 역슬래시를 붙여 쿼리에서의 역할을 못하는 일반 문자로 만들어 주는 함수이다.

php파일에서 id와 pw부분을 바꿔주고 앞서했던 것과 같이 id : admin'-- , pw:123으로 하자 로그인 실패 문구가 뜨는 것을 볼 수 있다.

MySQL은 특수문자 앞에 역슬래시가 붙으면 특수문제에 있던 쿼리에서의 역할을 사용할 수 없도록 일반 문자 취급을 하게 된다.

 

2. Prepared Statement

Prepared Statement는 사용할 쿼리를 준비해 두고 변화가 필요한 부분만을 교체하는 식으로, 데이터베이스에서 쿼리를 실행시키는 방식이다. 

앞서 만든 쿼리문과 달리 변수 부분을?로 작성하여 대입한 것을 알 수 있다. 그리고 사용할 쿼리를 준비하는 함수인 mysqli_prepare를 사용하였다.

쿼리 준비가 끝나면 입력값을 대입하는 과정이 필요하는데 이 과정을 바인딩이라고 한다.

 

Prepared Statement를 이용하면 사용자로부터 입력받는 데이터가 어떤 형태인지 인지하고, 이를 쿼리 부분과 ㅁ여확히 구분할 수 있기 때문에 사용자가 어떤 데이터를 이용하든 개발자가 의도한 범위를 벗어날 수 없고 이미 준비된 쿼리에 영향을 끼칠 수 없게 되는 것이다. 

 

 

id : admin'-- , pw : 123으로 로그인시도를 하였는데 앞서 공격했을 때와 달리 로그인이 성공적으로 이루어지지 않는 것을 볼 수 있다.

 

3. ORM사용

ORM은 Object Relational Mapping의 약자로, 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해 주는 것을 의미한다.

 

 

4) SQL Injection 워게임 참고 사이트

 

https://ostermiller.org/calc/encode.html 

 

Base64 and URL Encoding and Decoding

 

ostermiller.org

 

https://los.rubiya.kr/

 

Lord of SQLInjection

 

los.rubiya.kr

 

'Study > 보안' 카테고리의 다른 글

(6) XSS-2  (0) 2023.01.17
(5) XSS-1  (0) 2023.01.17
(3) SQL Injection -2  (0) 2023.01.16
(2) SQL Injection - 1  (0) 2023.01.16
(1) 로그인과 검색 페이지 구현하기  (0) 2023.01.15