어플리케이션을 개발하고 나서 어느정도 규모가 되는 시스템들은 언제나 해킹시도가 있을 수 있습니다. 언제나 내 시스템이 한순간에 침투해 엉망으로 만들어 놓을 수 있습니다. SQL Injection이란 무엇이고 어떻게 대처해야 하는 지 알아보시죠!
SQL injection이란?
SQL Injection은 데이터베이스와 연결된 웹 애플리케이션에서 많이 발생하는 보안 취약점 중 하나입니다. 이 공격은 공격자가 SQL 쿼리에 악의적인 코드를 삽입함으로써 데이터베이스를 조작하거나 접근하는 것입니다. 예를 들어, 로그인 폼에서 유저 이름과 비밀번호를 입력하는 곳에 특별한 코드를 넣어 데이터베이스에서 정보를 유출할 수 있습니다.
공격의 종류
SQL injection 공격은 크게 다음과 같은 세 가지 종류로 나눌 수 있습니다.
- 데이터 추출 공격: 공격자가 데이터베이스에 저장된 데이터를 탈취하는 공격입니다.
- 데이터 조작 공격: 공격자가 데이터베이스에 저장된 데이터를 변경하거나 삭제하는 공격입니다.
- 시스템 제어 공격: 공격자가 데이터베이스를 통해 시스템을 제어하는 공격입니다.
공격의 피해
SQL injection 공격에 성공하면 다음과 같은 피해를 입을 수 있습니다.
- 개인 정보 유출: 공격자가 사용자의 이름, 비밀번호, 계좌번호, 신용카드 번호 등의 개인 정보를 탈취할 수 있습니다.
- 데이터 손상: 공격자가 데이터베이스에 저장된 데이터를 변경하거나 삭제하여 시스템을 마비시킬 수 있습니다.
- 시스템 제어: 공격자가 시스템을 제어하여 악성코드를 유포하거나 시스템을 파괴할 수 있습니다.
대응 방안은?
다양한 방법이 있지만 다음과 같은 방안이 있을 수 있습니다.
1. Prepared Statements: 이 방법은 SQL 쿼리에서 변수를 사용할 때 미리 준비된 문장(prepared statement)을 쓰는 것입니다. 이렇게 하면 SQL 엔진이 변수의 값을 쿼리의 일부로 취급하지 않으므로 SQL Injection을 효과적으로 막을 수 있습니다.
SELECT * FROM users WHERE username = ? AND password = ?
2. Stored Procedures: 저장 프로시저를 사용하면 로직이 데이터베이스 내부에서 처리되므로 외부 입력에 의한 조작이 어려워집니다.
3. ORM 사용: Object-Relational Mapping (ORM) 라이브러리를 사용하면 SQL 쿼리를 직접 작성하지 않아도 되므로 실수로 인한 취약점을 줄일 수 있습니다.
4. Input Validation: 사용자 입력을 엄격하게 검사하고 필터링하는 것도 중요합니다. 예를 들어, 숫자만 입력되어야 하는 필드에 문자가 입력되면 에러를 반환해야 합니다.
5. Web Application Firewall (WAF): WAF는 SQL Injection과 같은 웹 애플리케이션 공격을 식별하고 차단할 수 있습니다.
6. Escape Characters: 사용자 입력에서 특수 문자를 이스케이프해서 SQL 쿼리의 일부로 해석되지 않게 합니다.
7. Least Privilege Principle: 데이터베이스에 접근하는 계정이 최소한의 권한만을 가지도록 설정합니다. 예를 들어, 읽기 전용 데이터를 다루는 서비스의 경우에는 데이터베이스에 대한 ‘쓰기’ 권한을 제거합니다.
8. Monitoring and Logging: SQL 쿼리 패턴을 모니터링하고 로깅하여 이상한 쿼리가 나타나면 경보를 발생시키는 것도 좋은 방법입니다.
WAF로 예방할 수 있을까?
WAF는 알려진 SQL Injection 공격 패턴을 탐지하여 실시간으로 차단할 수 있습니다. 예를 들어, “OR ‘1’=’1′” 같은 페이로드가 들어오면 WAF가 이를 탐지하고 해당 요청을 차단할 수 있습니다. 그러므로 WAF는 SQL Injection 공격을 예방하는 데 한계가 있는 보완적인 대책이 될 수 있습니다.
한계점
- Zero-Day Attacks: 아직 알려지지 않은 새로운 공격 패턴에 대해서는 WAF가 효과적이지 않을 수 있습니다.
- False Positives/Negatives: 때로는 정상적인 요청을 공격으로 오인하거나, 반대로 실제 공격을 놓칠 수도 있습니다.
- Overhead: WAF는 추가적인 리소스와 관리가 필요하며, 잘못 구성되면 성능에 영향을 줄 수 있습니다.
- Complex Attacks: 공격자가 WAF의 감지를 우회하려고 복잡한 방법을 사용하는 경우에도 완벽하게 차단하기 어려울 수 있습니다.
WAF만으로 완전한 보안을 기대하는 것은 위험하므로, WAF는 다른 보안 대책(예: Prepared Statements, Stored Procedures, Input Validation 등)과 함께 사용하는 것이 좋습니다. 여러 레이어에서의 보안 방안을 적용하면 훨씬 더 견고한 보안을 구현할 수 있습니다.
마치며
우리는 어느경우에도 보안을 등한시하면 안됩니다. WAF나 방어 시스템을 설정해 놓고 끝이 아니라, 지속적으로 보안 설정을 업데이트하고 모니터링하는 것이 중요하다는 것을 명심해야 합니다.