Injection이란, 악성 사용자가 보안상의 추약점을 이용하여 임의의 sql문을 주입하고 실행되게 하여 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위이다. '여기어때' 홈페이지도 2017년 3월에 해당 공격을 당했다고 한다.
1. 공격 종류
① 논리적 에러
or 뒤에 있는 구문 1=1 은 항상 true인 값이다. 따라서 항상 결과를 보여주게 된다.
② Union 명령어
원하는 컬럼값까지 한꺼번에 보일 수 있다. 현재 id, passwd까지 같이 보이도록 인젝션했다.
③ Boolean based Injection
참과 거짓만 출력하는 페이지에 공격자가 조작한 쿼리로 인해 db내용을 노출할 수 있다.
④ Time based Injection
값 뒤에 sleep() 함수를 넣어 만약 참이면 sleep 함수가 실행되고 거짓일 경우 sleep 함수가 실행되지 않도록 한다. 이를 통해 데이터베이스의 내용을 알 수 있다.
2. 대응방안
① 입력 값에 대한 검증
② prepared statement 구문 사용
사용자의 입력값이 데이터베이스의 파라미터로 들어가기 전, DBMS가 미리 컴파일하여 실행하지 않고 대기한다. 그 후 사용자의 입력값을 문자열로 인식하게 하여 공격쿼리가 들어가도 사용자의 입력은 이미 의미 없는 단순 문자열이기 때문에 쿼리문이 공격자의 의도대로 동작하지 않는다.
③ 에러 메시지 노출 금지
④ 웹 방화벽 사용
'CS > 데이터베이스' 카테고리의 다른 글
SQL vs NoSQL (0) | 2021.09.29 |
---|---|
트랜잭션의 격리수준 (0) | 2021.09.28 |
수직적 확장과 수평적 분할 (0) | 2021.09.28 |
인덱스란? (0) | 2021.07.20 |
트랜잭션의 정의와 특징 (0) | 2021.06.30 |