응용 프로그램 보안 상의 허점을 의도적으로 이용해, 악의적인 SQL문을 실행되게 함으로써 데이터베이스를 비정상적으로 조작하는 공격 기법
SQL 인젝션 공격의 대표적인 경우로, 로그인 폼(Form)을 대상으로 공격을 수행한다. 정상적인 계정 정보 없이도 로그인을 우회하여 인증을 획득할 수 있다.
로그인 시, 아이디와 비밀번호를 input 창에 입력하게 된다. 아이디가 abc, 비밀번호가 만약 1234일 때 쿼리는 아래와 같은 방식으로 전송될 것이다.
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
input 창에 비밀번호를 입력함과 동시에 다른 쿼리문을 함께 입력한다면?
"1234"; DELETE * USER FROM ID = "1";
보안이 완벽하지 않은 경우, 이처럼 비밀번호가 아이디와 일치해서 True
가 되어 뒤에 작성한 DELETE 문이 데이터베이스에 영향을 줄 수도 있다.
기본 쿼리문의 WHERE 절에 OR문을 추가하여 '1' = '1'과 같은 true문을 작성하여 무조건 적용되도록 수정한 뒤 DB를 마음대로 조작할 수도 있다.
select * from client where name='anjinma' and password=' or '1'='1
시스템에서 발생하는 에러 메시지를 이용해 공격하는 방법이다. 보통 에러는 개발자가 버그를 수정하는 면에서 도움을 받을 수 있지만, 해커들은 이를 역이용해 악의적인 구문을 삽입하여 에러를 유발시킨다.
해커는 GET 방식으로 동작하는 URL 쿼리 스트링을 추가하여 에러를 발생시킨다. 이에 해당하는 오류가 발생하면, 이를 통해 해당 웹앱의 데이터베이스 구조를 유추할 수 있고 해킹에 활용한다.
url을 통해 파라미터를 주고받는 GET 방식은 해커가 단순히 url을 통해 전달될 파라미터를 조작하기만 한다면 손쉽게 SQL injection 취약점을 적용할 수 있다.
http://test.com/login.php?id=abc1234 and password=''
검증 로직을 추가하여 미리 설정한 특수문자들이 들어왔을 때 요청을 막아낸다.
데이터베이스 에러 발생 시 따로 처리를 해주지 않았다면, 에러가 발생한 쿼리문과 함께 에러에 관한 내용을 반환해 준다. 여기서 테이블명, 컬럼명, 쿼리문이 노출이 될 수 있기 때문에, 오류발생 시 사용자에게 보여줄 수 있는 페이지를 따로 제작하거나 메시지박스를 띄우도록 해야한다.
서버의 php파일에 sql 쿼리문이 아래와 같이 고정되어 있고 외부의 입력으로는 이 템플릿을 변경할 수 없다면, ?에 들어가는 데이터는 단순히 문자열로 취급하기 때문에 SQL 인젝션은 발생할 수 없다.
INSERT INTO MyGuests VALUES(?, ?, ?)
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Computer%20Science/Database/SQL%20Injection.md
https://noirstar.tistory.com/264
https://www.bugbountyclub.com/pentestgym/view/52
https://m.mkexdev.net/427