바로가기 메뉴
컨텐츠 바로가기
주메뉴 바로가기
하단정보 바로가기

Is Your Website Hackable?
70% are. Detect and Action with Acunetix

SQL Injection (SQLi)

SQL Injection (SQLi)은 공격자가 웹 어플리케이션의 데이터베이스 서버 (또한 일반적으로 관계 데이터베이스 관리 시스템 - RDBMS이라고도 함)을 관리하는 악성 SQL 문장 (또한 일반적으로 악성 페이로드라고도 함)을 실행할 수 있는 주입 공격을 말합니다. SQL Injection 취약성은 SQL 기반의 데이터베이스를 사용하는 모든 웹사이트 또는 웹 어플리케이션에 영향을 미칠 가능성이 있기 때문에, 이 취약성은 웹 어플리케이션 취약성 중 가장 오래 되었고, 가장 만연하며, 가장 위험한 취약성 중 하나입니다.

SQL Injection 취약성을 이용하여, 맞은 상황이 주어지면, 공격자는 이 취약성을 사용하여 웹 어플리케이션의 인증 및 권한 부여 매커니즘을 우회하여 전체 데이터베이스의 컨텐츠를 검색할 수 있습니다. SQL Injection은 또한 데이터베이스의 기록을 추가, 변경 및 삭제하는 데 사용할 수 있으며, 결국 데이터 완결성에 영향을 미칩니다.

그러한 의미에서, SQL Injection은 공격자가 고객 데이터, 개인 식별 정보 (PII), 영업 기밀, 지적 재산 및 기타 민감한 정보를 포함하여, 민감한 데이터에 권한 없이 접속할 수 있도록 합니다.

SQL Injection이 작용하는 방법

데이터베이스 서버에 대해 악성 SQL 쿼리를 가동하려면, 공격자는 먼저 SQL 쿼리 내부에 포함된, 웹 어플리케이션 내 입력 값을 찾아야 합니다.

SQL Injection 공격이 일어나기 위해서는, 취약한 웹사이트가 직접 SQL 문장 내 사용자 입력 값을 포함할 필요가 있습니다. 그러면 공격자는 페이로드를 삽입할 수 있으며, 이러한 페이로드가 SQL 쿼리의 일부로서 포함되고 데이터베이스 서버에 대해서 가동됩니다.

다음의 서버 측 의사 코드를 사용하여 웹 어플리케이션에 대해 사용자를 인증합니다.

위 스크립트는 사용자, 사용자 이름 및 비밀번호 행이 있는 표로 데이터베이스에 대해 사용자 이름과 비밀번호로 사용자를 인증하는 간단한 예시입니다.

위 스크립트가 SQL Injection에 취약한 이유는, 공격자가 데이터베이스 서버가 실행하는 SQL 문장을 변경하는 방식으로 악성 입력 값을 제시할 수 있기 때문입니다.

SQL Injection 페이로드의 간단한 예시는 비밀번호 필드를 password 또는 1=1로 설정하는 것처럼 단순할 수 있습니다.

이렇게 하면 다음의 SQL 쿼리를 데이터베이스 서버에 대해 가동하는 결과로 이어집니다.

또한 공격자는 SQL 문장의 나머지 부분이 SQL 쿼리의 더 상세한 실행을 관리하도록 명령할 수 있습니다.

일단 쿼리를 실행하면, 그 결과는 처리할 어플리케이션으로 돌아오며, 인증 우회로 이어집니다. 인증 우회가 가능해질 경우, 어플리케이션은 쿼리 결과에서 첫 번째 계정으로 공격자가 로그인할 가능성이 높아집니다 - 데이터베이스에서 첫 번째 계정은 보통 관리자 계정입니다.

공격자가 SQL로 할 수 있는 가장 최악의 일은 무엇입니까?

SQL은 RDBMS에 저장된 데이터를 관리하도록 설계된 프로그래밍 언어이며, 그러므로 SQL을 사용하여 데이터에 접속, 변경 및 삭제할 수 있습니다. 또한, 특정한 경우에, RDBMS 또한 SQL 문장으로부터 운영 시스템에 명령어를 가동할 수 있습니다.

위 내용을 염두에 두고, 다음 내용을 고려하면, 성공적인 SQL Injection 공격이 공격자에게 얼마나 유리한지 더 쉽게 이해할 수 있습니다.

  • • 공격자는 SQL Injection을 사용하여 인증을 우회하거나 특정 사용자인 척 가장할 수 있습니다. .
  • • SQL의 주요 기능 중 하나는 쿼리에 기반하여 데이터를 선별하고 해당 쿼리의 결과를 출력하는 것입니다. SQL Injection 취약성은 데이터베이스 서버에 있는 데이터 전체를 공개하도록 할 수 있습니다.
  • • 웹 어플리케이션은 데이터베이스 내 데이터를 변경하는 데 SQL을 사용하기 때문에, 공격자는 SQL Injection을 사용하여 데이터베이스에 저장된 데이터를 변경할 수 있습니다. 데이터를 변경하면 데이터 완결성에 영향을 미치며 거부 문제를 야기할 수 있습니다. 예를 들어, 거래 무효화, 잔고 변경 및 기타 기록 변경 등의 문제를 야기할 수 있습니다.
  • • SQL을 이용하여 데이터베이스에서 기록을 삭제합니다. 공격자는 SQL Injection 취약성을 사용하여 데이터베이스에서 데이터를 삭제할 수 있습니다. 적절한 백업 전략을 사용하는 경우라도, 데이터 삭제는 데이터베이스를 복구할 때까지 어플리케이션의 이용 가능성에 영향을 미칠 수 있습니다.
  • • 일부 데이터베이스 서버는 데이터베이스 서버에 운영 시스템 명령의 임의적 실행을 허용하도록 구성되어 있습니다 (의도적이든 아니든 간에). 맞는 상황이 주어지면, 공격자는 방화벽 뒤에 존재하는 내부 네트워크를 공격하는 초기 매개체로서 SQL Injection을 사용할 수 있습니다.

SQL Injection 공격의 구조

SQL Injection을 위해서는 단지 두 가지의 조건만 부합하면 됩니다. SQL을 사용하는 관계형 데이터베이스와, SQL 쿼리에서 직접 사용하는, 사용자가 제어할 수 있는 입력 값입니다.

아래 예시에서, 공격자의 목표는 웹 어플리케이션에 존재하는 SQL Injection 취약성을 이용하여 데이터베이스에서 데이터를 빼내는 것이라고 가정합니다.

예를 들면, SQL 쿼리가 정수 값을 예상할 때 열을 제공하거나 의도적으로 SQL 문장에 문법 오류를 삽입하는 등, 입력 값이 부적절한 SQL 문장을 공급하면 데이터베이스 서버가 오류를 발생시키는 상황이 일어나게 됩니다.

오류는 개발 중에 개발자들에게 매우 유용하지만, 실제 사이트에서 활성화되면, 공격자에게 너무 많은 정보를 드러낼 수 있습니다. SQL 오류는 공격자가 데이터베이스의 구조에 관한 정보를 어디에서 입수할 수 있는지 그 지점을 설명하는 경향이 있으며, 일부 경우에는 오류 메시지에서 정보를 추출함으로써 전체 데이터베이스를 나열하기도 합니다. 이러한 기법을 오류 기반의 SQL Injection이라고 합니다. 그 정도로, 데이터베이스 오류는 실제 사이트를 마비시키거나, 아니면 접속이 제한되는 파일에 접속하게 할 수 있습니다.

데이터를 빼내는 또 한 가지 일반적인 기법은 UNION SQL 운영자를 활용하여, 공격자가 두 가지 이상의 SELECT 문장 결과를 하나의 결과로 결합하도록 하는 것입니다. 이렇게 하면 어플리케이션이 HTTP 응답 내에서 데이터를 돌려 보냅니다. 이 기법을 UNION 기반의 SQL Injection이라고 합니다.

아래 예시는 이와 같은 기법을 보여주는 예시입니다. Acunetix에서 관리하는 의도적으로 취약하게 만든 웹사이트인 testphp.vulnweb.com에서 볼 수 있습니다.

아래 HTTP 요청은 합법적인 사용자가 전송하는 정상적인 요청입니다.

위의 요청이 정상적으로 보이기는 하지만, GET 요청의 쿼리 열에서 아티스트 (artist) 변수는 SQL Injection에 취약합니다.

아래 SQL Injection 페이로드는 URL의 쿼리 열에서 값을 -1로 설정하여 존재하지 않는 기록을 찾도록 쿼리를 변경합니다 (또한 데이터베이스에 존재하지 않는 다른 값일 수 있지만, 데이터베이스에서 ID는 음수인 경우는 드뭅니다).

SQL Injection에서, 일반적으로 UNION 운영자를 사용하여 공격자가 웹 어플리케이션에서 가동할 목적의 원래 쿼리에 악성 SQL 쿼리를 연결시킬 수 있도록 합니다. 주입된 쿼리의 결과를 원래 쿼리의 결과와 연합하여, 공격자가 다른 표에서 행의 값을 입수하여 데이터베이스의 데이터를 빼낼 수 있도록 합니다.

위의 예시는 데이터베이스에 대한 쿼리를 변경하여 공격자가 추출하고자 하는 데이터를 돌려 보낼 수 있음을 보여줍니다. 아래 예시는 SQL Injection 페이로드를 사용하여 이 의도적으로 취약하게 만든 사이트에서 데이터를 빼돌리는 방법을 보여줍니다.