2022. 6. 14. 16:15ㆍServer의 세계/MySql
위키백과의 Sql Injection를 검색하면 다음의 카툰이 있다.
이게 무슨 말인고 하니,
학교의 데이터베이스에서는 다음과 같은 명령어를 쓰고 있다.
INSERT INTO students (이름) VALUES ('학생 이름');
여기서 학생의 이름을 입력하면 다음과 같이 된다.
INSERT INTO students (이름) VALUES ('Robert');
DROP TABLE students;
--');
첫번째 줄에서 Robert가 입력되었지만 두번째 줄에서 students라는 테이블이 제거 된것이다.
그리고 뒤에 오는 내용들을 주석처리해버렸다. 그래서 해당 학생의 이름을 넣으면 최종적으로 모든 학생 기록이 삭제된다.
W3 Schools에도 Sql Injection 항목이 있다.
설명을 보면 가장 기본적으로 데이터베이스를 파괴시키거나 해킹 할 수 있는 코드 기술이라고 한다.
주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생하며 공격의 쉬운 난이도에 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다.
무섭다!!!!

사례를 좀더 살펴보자.
1. 방법 1
SELECT user FROM user_table WHERE id='입력한 아이디' AND password='입력한 비밀번호';
이런 SQL문이 있을때,
아이디 : admin
비밀번호: ' OR ' 1 ' = ' 1
이렇게 입력하게 되면 어떻게 될까?
SELECT user FROM user_table WHERE id='admin' AND password='' OR '1' = '1';
WHERE 뒤에 있는 구문을 간단히 축약하면 false AND false OR true로 정리할 수 있는데, AND 연산은 OR보다 연산 우선순위가 빠르기 때문에 해당 구문의 연산 값은 true가 되어 올바른 값으로 판단하고 실행하게 된다. 즉, 아이디와 비밀번호를 몰라도 ' OR '1' = '1 구문 때문에 로그인에 성공하게 되는 것이다.
2. 방법 2
다음과 같은 SQL에
uName = getRequestString("username");
uPass = getRequestString("userpassword");
sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'
이렇게 입력하면
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
이렇게 되는데 OR ""=""은 항상 true기 때문에 로그인에 성공할 수 있게 된다.
W3 schools를 통해 그 밖에 많은 SQL Injection 예시들을 확인해볼 수 있다.
SQL Injection
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
www.w3schools.com
이런 SQL injection 관리는 누가하는 거냐?
백앤드개발자나, 프론트개발자가 하는게 아니라 이런 SQL injection 관리는 프레임워크가 해준다고 보면 된다.
스프링 Data JPA에서 제공하는 API을 활용하게 된다면 SQL Injection에 대해서는 고민을 딱히 안해도 된다고 한다.
그래도 위험요소이기에 자세히는 아니어도 꼭 알고 갈 필요는 있다고 생각한다.
D.O.N.E!!!!

'Server의 세계 > MySql' 카테고리의 다른 글
[SQL] 간단하고 명료하게 SQL 명령어 훑기(DDL/DML/DCL/TCL) (0) | 2022.07.04 |
---|---|
[DB] 간단하고 명료하게 DB, DBMS, SQL의 개념 훑기 (0) | 2022.07.04 |
[MySql] VS code와 리눅스 연동하기 (0) | 2022.06.14 |