인젝션의 개념
인젝션(Injection)이란 주사를 뜻합니다. 주사란 뭘까요. 우리 체내에 영양분이나 약성분 등을 집어넣어서 특정 효과를 만들어내는 것이지요? 해킹용어로 자주 사용되는 인젝션이라는 개념도 마찬가지입니다. 값을 입력하는 곳에 특정한 값을 '주입'해서 특정 효과를 만들어내는 것입니다. 개발자가 의도하지 않은 내용을 실행시키려는 것이기 때문에 악의적이라고 볼 수 있습니다. 다양한 인젝션 공격들이 있지만, 이번에는 SQL Injection에 대해서 알아보겠습니다.
SQL Injection
SQL Injection(줄여서 SQLi)이란 "SQL이라는 DB를 조작하는 언어를 웹페이지에 삽입하여 비정상적인 동작을 하는 등의 공격을 하는 해킹 공격 기법"입니다. SQL이 DB에서 어떤 역할을 하는지는 아래 포스트에서 참고해 볼 수 있습니다. https://panda-university.tistory.com/10
웹에서는 WAS에서 DB를 연결하고, SQL 질의문을 전송함을 통해서 DB에 접근하여 필요한 작업을 수행합니다. 이때에 SQL문을 조작하여 질의를 전송한다면 원래 웹에서 수행하기로 한 질의문이 아닌 다른 비정상적인 질의문을 보낼 수 있게 됩니다. 예를 들어, 개인 사용자의 정보를 출력하는 SQL 질의문을 서버에 전송하는 곳에서 파라미터를 조작하는 등으로 SQL 인젝션을 수행해서 다른 사용자의 정보를 출력하도록 만든다면 데이터의 유출이 발생하게 됩니다.
SQLi의 종류
SQLi도 웹의 구조나 상황에 따라 종류가 다양하게 있습니다. SQL을 입력하면 바로 값이 보이는 경우 Non-Blind SQLi라고 구분할 수 있으며, 값이 웹에 나타나지 않는 경우는 Blind SQLi로 구분합니다. Non-Blind SQLi는 매우 기초적인 SQLi, Union SQLi, Error-based SQLi 등이 있으며, Blind SQLi는 True/false(boolean), Time-Based가 있습니다.
- Non-Blind
- Query Result (Basic SQLi)
- Union SQLi
- Error-Based SQLi
- Blind
- True/False(Boolean)
- Time Based
Union SQLi는 Union 문법을 활용해서 공격자가 원하는 select문을 추가적으로 실행하여 필요한 값을 더욱 직접적으로 접근하는 공격 방식입니다. 해당 취약점이 있다면 일반적으로 가장 선호되는 공격방식입니다. 차선택으로는 Error-Based SQLi으로, SQL 관련된 에러가 발생하는 것을 이용해서 원하는 값을 추출해 내는 공격입니다. Union SQLi에 비해서 약간의 난도가 있을 수 있지만 Blind SQLi에 비하면 선호되는 공격방식입니다. 최종적으로 Blind SQLi는 SQLi 중 최후의 수단이며 SQLi 취약점이 있는 곳에서는 거의 무조건 사용할 수 있는 공격 방식입니다. 패킷이 많이 발생한다는 단점이 있지만 수작업으로 할 경우 난이도가 조금 있는 편입니다. Blind-SQLi라고 하면 일반적으로 True/False를 의미합니다. Time-Based의 경우 Blind SQLi에서도 더욱 선호되지 않는 방식입니다. 시간이 추가적으로 소요되기 때문에 안 그래도 느린 Blind-SQLi가 훨씬 더 느려지기 때문입니다.
위험성과 대응법
SQLi 공격이 왜 위험한 것일까요? SQLi는 대부분의 보안컨설턴트들이 높은 보안 위협으로 구분하며 OWASP Top 10에도 지속적으로 들어가는 공격기법입니다. 그 이유는, 웹 서비스의 심장에 위치한 DB에 대한 직접적인 접근이 가능하다는 것이 모든 SQLi로 인해 발생할 수 있는 문제들의 수준을 말해주기 때문입니다. 발생할 수 있는 보안 위협들은 아래와 같습니다.
- DB 노출, 변조, 덤프 ,파괴
- 인증 우회
- 시스템 커맨드 실행
- 시스템 주요 파일 노출
- DDoS
기본적으로 DB를 조작하는 것이므로 사용자의 데이터베이스가 유출되는 문제가 될 수 있습니다. 특정 SQL의 경우 변조를 할 수도 있고, 파괴를 할 수 있기도 합니다. 어떤 경우에서든지, DB에 대한 직접적이고 인가받지 못한 질의문이 실행되는 것은 매우 치명적인 문제를 일으킬 수 있습니다. 개인 취미로 만든 웹 사이트라면 전혀 문제가 되지 않을 수 있겠지만, 실제 서비스를 하고 있는 기업의 DB가 노출된다는 것은 정말 큰 문제입니다. 또한, 인증우회 역시 문제가 될 수 있습니다. 가장 최악의 경우 관리자의 권한을 인증 우회로 획득하게 된다면 웹 사이트에 대한 장악권이 공격자에게 모두 넘어가는 것입니다. 시스템의 커맨드가 실행되는 것과 주요 파일이 노출되는 것도 DB가 실행되고 있는 시스템에 대한 공격이 가능해지기에 위험할 수 있습니다. 따라서 SQLi는 적절한 예방법을 통해 사전에 차단하는 것이 가장 좋습니다. 예방법은 아래와 같습니다.
- 입력값 검증
- 입력값 필터링(화이트리스트 권장)
- 입력값 크기 제한
- 시큐어 코딩
- Dynamic SQL 지양
- Prepared Statement 사용
- ORM 사용
- 데이터 타입 패턴 체크
- Stored Procedure 사용
- 보안 설정
- 권한 관리
- 공통 오류 페이지 사용
- WAF/IDS 사용
'💻Information Security' 카테고리의 다른 글
XSS 대응방안에 대한 자세한 설명 (1) | 2024.01.20 |
---|---|
XSS(Cross Site Scripting)이란? (0) | 2024.01.18 |
Root와 Web Root, 헷갈리는 '루트'란? (0) | 2024.01.15 |
JSON과 JWT! (JSON Web Token) (0) | 2024.01.14 |
Database(DB)와 SQL의 개념과 필요성 (2) | 2024.01.14 |