정상적인 이메일, 비밀번호 검사
SELECT DISTINCT 1 FROM Users WHERE email = 'dddd@naver.com' AND password = 'SE7vYnBwximuz/hD1hsjM1n83RTUOIn8wLmwwFh2TdDAwQdLAZlqz3Vcfaxg/AtAYMK5+RGpCoIFiImpzzLnCw==';
사용자의 정보를 조회할 때 모든 정보를 조회하는 것이 아닌, 특정 조건을 만족하는 데이터의 존재 유무를 바탕으로 로그인을 진행합니다. 해당 SQL에서 SELECT DISTINCT 1 부분에서 조건에 만족하는 데이터가 있을 경우 1이라는 데이터가 출력되도록 예시가 구성되어있습니다.
- 입력 데이터
- email : dddd@naver.com
- password : SE7vYnBwximuz/hD1hsjM1n83RTUOIn8wLmwwFh2TdDAwQdLAZlqz3Vcfaxg/AtAYMK5+RGpCoIFiImpzzLnCw==
Javascript의 Raw Query로 실행 시
SELECT DISTINCT 1 FROM Users WHERE email = '${email}' AND password = '${password}'
Javascript에서 위와 같이 템플릿 리터럴을 사용하여 RawQuery를 작성하였다는 것을 가정해보도록 하겠습니다.
SQL 인젝션 예제
SELECT DISTINCT 1 FROM Users WHERE email = 'dddd@naver.com' AND password = '' or 1=1 or ''
- 입력 데이터
- email : dddd@naver.com
- password : ' or 1=1 or '
SQL Injection의 패스워드 해킹 논리 구조
- DB에서 dddd@naver.com의 사용자 계정이 있다는 가정하에, SQL의 where절에서는 email 조건을 제외하고 3가지의 조건을 검증하게됩니다.
- password = '' => FALSE
- OR 1=1 => TRUE
- OR '' : '' => FALSE
- 여기서 OR 연산자의 경우 3가지의 조건 중 1개라도 TRUE일 경우 통과하게 됩니다.
- 즉, 1=1이 TRUE이므로 password가 일치하지 않더라도 계정에 접속이 가능하게됩니다.
'Database > MySQL' 카테고리의 다른 글
[EC2] MySQL 정기 백업 crontab 등록 방법 (0) | 2021.08.13 |
---|---|
[MySQL] 클론코딩 tumblr의 게시글 검색 제작기 (0) | 2021.07.21 |