[SQL] SQL Injection 공격

허태림·2024년 5월 20일
0

SQL Injection

코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작, 즉 SQL query문을 공격자가 임의로 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말한다.

위와 같이, SQL에 query를 보내는 코드에 사용자가 입력한 문자열이 그대로 전달될 때, 이를 악용하여 DB 서버에 접근, SQL의 모든 권한을 가짐.

Stacked-queries SQL Injection

로그인 과정 중, 다음과 같은 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라는 테이블에 저장된 데이터를 삭제하게 됨.

Where bypass SQL Injection

로그인 과정 중, 다음과 같은 SQL query문이 있다고 가정

db.query(`SELECT user FROM USER_DATA WHERE id='id' AND password = 'pw';`);

이 때 idadmin (또는 특정 계정), pw' OR '1' = '1 로 넣으면 다음과 같이 query가 전달되고, 특정 계정에 로그인 할 수 있게 된다.

mysql -> SELECT * FROM USER_DATA WHERE ID = 'admin' AND password = '' OR '1' = '1';
+----+-------------+-----------------+
| id | ID          | password        |
+----+-------------+-----------------+
|  1 | admin       | admin의 비밀번호  |
+----+-------------+-----------------+

Classic SQL Injection

또한, idadmin'; --로 전달하여 password 확인문을 아예 주석처리 하는 방법도 있다.

mysql -> SELECT * FROM USER_DATA WHERE ID = 'admin';-- ' AND password = '아무거나';
+----+-------------+-----------------+
| id | ID          | password        |
+----+-------------+-----------------+
|  1 | admin       | admin의 비밀번호  |
+----+-------------+-----------------+
profile
泰林 🌳

0개의 댓글

관련 채용 정보