코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작, 즉 SQL query문을 공격자가 임의로 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다.
위와 같이, SQL에 query를 보내는 코드에 사용자가 입력한 문자열이 그대로 전달될 때, 이를 악용하여 DB 서버에 접근, SQL의 모든 권한을 가짐.
로그인 과정 중, 다음과 같은 SQL query문이 있다고 가정
db.query(`SELECT * FROM USER_DATA WHERE ID = '${id}';`);
유저가 입력한 id
를 통해 USER_DATA라는 테이블에서 유저의 로그인 정보를 가져오는 query문
id
를 정상적으로 입력한 경우에는 다음과 같이 SQL에 query가 전달됨
mysql -> SELECT * FROM USER_DATA WHERE ID = '쌈뽕한 아이디';
+----+-------------+-----------------+
| id | ID | HASHED_PW |
+----+-------------+-----------------+
| n | 쌈뽕한 아이디 | 해시화 된 비밀번호 |
+----+-------------+-----------------+
이 때, id
를 "Hi'; TRUNCATE TABLE USER_DATA;"
로 입력하면 다음과 같이 SQL에 query가 전달됨
mysql -> SELECT * FROM USER_DATA WHERE ID = 'HI'; TRUNCATE TABLE USER_DATA;';
Empty set (0.00 sec)
Query OK, 15 rows affected (0.04 sec)
'> ;
USER_DATA라는 테이블에 저장된 데이터를 삭제하게 됨.
로그인 과정 중, 다음과 같은 SQL query문이 있다고 가정
db.query(`SELECT user FROM USER_DATA WHERE id='id' AND password = 'pw';`);
이 때 id
를 admin
(또는 특정 계정), pw
를 ' OR '1' = '1
로 넣으면 다음과 같이 query가 전달되고, 특정 계정에 로그인 할 수 있게 된다.
mysql -> SELECT * FROM USER_DATA WHERE ID = 'admin' AND password = '' OR '1' = '1';
+----+-------------+-----------------+
| id | ID | password |
+----+-------------+-----------------+
| 1 | admin | admin의 비밀번호 |
+----+-------------+-----------------+
또한, id
를 admin'; --
로 전달하여 password 확인문을 아예 주석처리 하는 방법도 있다.
mysql -> SELECT * FROM USER_DATA WHERE ID = 'admin';-- ' AND password = '아무거나';
+----+-------------+-----------------+
| id | ID | password |
+----+-------------+-----------------+
| 1 | admin | admin의 비밀번호 |
+----+-------------+-----------------+