코더는 보안을 정복 : 공유 및 학습 - SQL 주입

게시일: 2018.12.06.
by Jaap Karan Singh
사례 연구

코더는 보안을 정복 : 공유 및 학습 - SQL 주입

게시일: 2018.12.06.
by Jaap Karan Singh
리소스 보기
리소스 보기

간단히 말해서 SQL(또는 구조화쿼리 언어)은 관계형 데이터베이스와 통신하는 데 사용되는 언어입니다. 개발자, 데이터베이스 관리자 및 응용 프로그램에서 매일 생성되는 방대한 양의 데이터를관리하는 데 사용하는 쿼리 언어입니다.

우리의 데이터는 세계에서 가장 가치있는 상품 중 하나가되고 있습니다 ... 그리고 뭔가 가치가있을 때, 나쁜 사람은 자신의 이익을 위해그것에 손을 얻을 싶어합니다.

공격자는1998년부터가장 오래된 SQL 주입과 페스키트 데이터 취약점을 사용하여 전 세계 수백만 개의 데이터베이스에서 사용할 수 있는 중요한 정보를 훔치고 변경하고 있습니다. 그것은 교활한, 그리고 개발자는 SQL 주입 이해 해야 (뿐만 아니라 그것에 대 한 방어 하는 방법) 우리가 우리의 데이터를 안전 하 게 유지 하는 경우.

이를 위해 SQL 주입의 세 가지 주요 측면에 대해 설명합니다.

  • 작동 방식
  • 왜 그렇게 위험한지
  • 그것을 방어하는 방법

SQL 주입 이해

SQL 삽입은 컨텍스트라는 한 단어를 사용하여 이해할 수 있습니다.

응용 프로그램 내에 는 두 가지 컨텍스트가 존재합니다: 하나는 데이터, 다른 하나는 코드에 대한 것입니다. 코드 컨텍스트는 컴퓨터에 실행할 내용을 알려주고 처리할 데이터에서 분리합니다.

SQL 삽입은 공격자가 SQL 인터프리터에서 실수로 코드로 처리되는 데이터를 입력할 때 발생합니다.

한 가지 예는 공격자가 ''' 또는 1=1"을 입력하고 SQL 쿼리의 끝에 추가되는 웹 사이트의 입력 필드입니다. 이 쿼리가 실행되면 데이터베이스의 모든 행에 대해 "true"를 반환합니다. 즉, 쿼리된 테이블의 모든 레코드가 반환됩니다.

SQL 주입의 의미는 치명적일 수 있습니다. 로그인 페이지에서 이 경우 사용자 이름과 암호를 포함한 모든 사용자 레코드를 반환할 수 있습니다. 데이터를 꺼내는 간단한 쿼리가 성공하면 데이터를 변경하는 쿼리도 됩니다.

일부 취약한 코드를 살펴보고 SQL 주입 취약점이 육체에서 어떻게 보이는지 확인할 수 있습니다.

이 코드를 확인하십시오.

String query = "SELECT account balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
   Statement statement = connection.createStatement( ... );
   ResultSet results = statement.executeQuery( query );
}

여기서 코드는 유효성 검사 없이 클라이언트에서 SQL 쿼리 끝까지 매개 변수 정보를 더하기만 하면 됩니다. 이 경우 공격자는 입력 필드 또는 URL 매개 변수에 코드를 입력할 수 있으며 실행됩니다.

중요한 것은 공격자가 각 SELECT 쿼리에 ''' 또는 1=1"만 추가할 수 있지만 공격자가 모든 유형의 SQL 쿼리(삽입, 업데이트, DELETE, DROP 등)를 조작하고 데이터베이스가 지원하는 모든 것으로 확장할 수 있다는 것입니다. 가능한 것을 보여주는 공용 도메인에는 훌륭한 리소스와 도구가 있습니다.

이 문제를 곧 해결하는 방법을 살펴보겠습니다. 먼저 얼마나 많은 피해를 입을 수 있는지 이해합시다.

SQL 주입이 그렇게 위험한 이유

다음은 SQL 주입으로 인한 위반의 세 가지 예입니다.

  • 일리노이 선거관리위원회 웹사이트는 SQL 주입 취약점으로 인해 위반되었습니다. 공격자는 200,000 명의 미국 시민의 개인 데이터를 훔쳤습니다. 발견된 취약점의 특성상 공격자가 데이터를 변경할 수도 있었지만 그렇지 는 않습니다.
  • 남아프리카 공화국 웹사이트 호스팅 회사인 Hetzner는 40,000건의 고객 기록을 위반했습니다. SQL 주입 취약점으로 인해 데이터베이스의 모든 고객 레코드가 도난당할 수 있습니다.
  • 미국 미네소타의 가톨릭 금융 서비스 제공업체가 SQL 주입을 사용하여 위반되었습니다. 거의 130,000명의 고객에 대한 계정 번호를 포함한 계정 세부 정보가 도난당했습니다.

중요한 데이터는 계정을 인수하거나, 암호를 재설정하거나, 돈을 훔치거나, 사기를 저지르는 데 사용할 수 있습니다.

민감한 정보나 개인 식별이 불가능한 정보도 다른 공격에 사용할 수 있습니다. 주소 정보 또는 정부 식별 번호의 마지막 네 자리 숫자를 사용하여 귀하를 회사로 가장하거나 암호를 재설정할 수 있습니다.

공격이 성공하면 고객은 회사에 대한 신뢰를 잃을 수 있습니다. 시스템 또는 규제 벌금에 대한 손상에서 회복하면 수백만 달러의 비용이 들 수 있습니다.

그러나 그것은 당신을 위해 그런 식으로 끝날 필요가 없습니다.

SQL 주입 패배

SQL 삽입은 응용 프로그램의 일부를 명확하게 레이블지정하여 패배할 수 있으므로 컴퓨터는 특정 부품이 실행될 데이터 또는 코드인지 여부를 알 수 있습니다. 매개 변수쿼리를 사용하여 수행할 수 있습니다.

SQL 쿼리에서 매개 변수를 사용하는 경우 SQL 인터프리터는 매개 변수를 데이터로만 사용합니다. 코드로 실행되지 않습니다.

예를 들어 ''' 또는 1=1"과 같은 공격이 작동하지 않습니다. 데이터베이스는 문자열 "OR 1=1"을 검색하고 데이터베이스에서 찾을 수 없습니다. 그것은 단순히 어깨를 으쓱하고 말할 것이다, "죄송합니다, 나는 당신을 위해 그것을 찾을 수 없습니다."

Java에서 매개 변수화된 쿼리의 예는 다음과 같습니다.

대부분의 개발 프레임워크는 SQL 주입에 대한 기본 제공 방어를 제공합니다.

.NET 패밀리의 엔터티 프레임워크와 같은 개체 관계형 매퍼(ORM)는 기본적으로 쿼리를 매개 변수화합니다. 이렇게 하면 어떤 노력도 없이 SQL 주입을 처리합니다.

그러나 특정 ORM의 작동 방식을 알아야 합니다. 예를 들어 Java 세계에서 인기 있는 ORM인 최대 절전 모드는잘못 사용되는 경우에도 SQL 주입에 취약할 수 있습니다.

쿼리 매개 변수화는 첫 번째이자 최고의 방어이지만 다른 검색어도 있습니다. 저장된 프로시저도 SQL 매개 변수를 지원하며 SQL 주입을 방지하는 데 사용할 수 있습니다. 저장 프로시저도 올바르게 빌드해야 이 작업이 작동합니다.

// This should REALLY be validated too
String custname = request.getParameter("customerName");
// perform input validation to detect attacks
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";

PreparedStatement pstmt = connection.preparedStatement( query );
pstmt.setString(1, custname);
ResultSet results = pstmt.executeQuery( );

입력의 유효성을 검사하고 소독합니다. "OR 1=1"과 같은 일부 문자는 응용 프로그램의 합법적인 사용자가 입력하지 않으므로 허용할 필요가 없습니다. 오류 메시지를 사용자에게 표시하거나 처리하기 전에 입력에서 제거할 수 있습니다.

즉, 당신을 보호하기 위해 유효성 검사 및 위생에만 의존하지 마십시오. 영리한 인간은 그 주위에 방법을 발견했다. 그들은 깊이 (DD) 전략에서 좋은 방어, 하지만 매개 변수는 모든 기지를 커버 하는 확실 한 방법.

또 다른 좋은 DiD 전략은 데이터베이스 내에서 "최소 권한'을 사용하고 입력을 화이트리스트하는 것입니다. 최소 권한을 적용하면 응용 프로그램에 데이터베이스 내에서 무제한 전원이 공급되지 않습니다. 공격자가 액세스 권한을 얻으려면 공격자가 할 수 있는 피해가 제한됩니다.

OWASP는 여러 언어와 플랫폼에서이 취약점을 처리하는 방법을 보여 줄 수있는 훌륭한 SQL 주입 치트 시트가 있습니다 ... 하지만 더 나은 하나를 가고 싶은 경우, 당신은 지금 우리의 플랫폼에서 원하는 언어로 SQL 주입 도전을 재생할 수 있습니다; 다음은 시작하는 데 있어 가장 인기 있는 것들 중 일부입니다.

C의 SQL 주입 #

노드에서 SQL 주입.js

파이썬 장고의 SQL 주입

자바 스프링의 SQL 주입

여정이 시작됩니다.

SQL 주입을 이해하는 데 큰 진전을 이루었으며 이를 해결하는 데 필요한 단계를 수행했습니다. 굉장한!

SQL 주입이 어떻게 발생하는지 논의했습니다. 일반적으로 공격자가 입력을 사용하여 자신의 사악한 목적을 위해 데이터베이스 쿼리를 제어합니다.

또한 SQL 주입 취약점의 악용으로 인한 피해를 보았습니다: 계정이 손상될 수 있으며 수백만 달러가 손실될 수 있습니다... 악몽, 그리고 그 비싼 하나.

SQL 주입을 방지하는 방법을 보았습니다.

  • 쿼리 매개 변수화
  • 개체 관계형 매퍼 및 저장된 프로시저 사용
  • 사용자 입력 의 유효성 검사 및 화이트리스팅

지금, 그것은 당신에게 달려 있습니다. 연습은 학습과 건물 숙달을 유지하는 가장 좋은 방법입니다, 그래서 왜 SQL 주입에 우리의 학습 자원을 체크 아웃, 다음 우리의 무료 데모를 시도 플랫폼의? 당신은 되기 위해 당신의 방법에 잘 있을 거 야 Secure Code Warrior .

리소스 보기
리소스 보기

저자

야프 카란 싱

더 알고 싶으신가요?

블로그에서 최신 보안 코딩 인사이트에 대해 자세히 알아보세요.

Atlassian의 광범위한 리소스 라이브러리는 안전한 코딩 숙련도를 확보하기 위한 인적 접근 방식을 강화하는 것을 목표로 합니다.

블로그 보기
더 알고 싶으신가요?

개발자 중심 보안에 대한 최신 연구 보기

광범위한 리소스 라이브러리에는 개발자 중심의 보안 코딩을 시작하는 데 도움이 되는 백서부터 웨비나까지 유용한 리소스가 가득합니다. 지금 살펴보세요.

리소스 허브

코더는 보안을 정복 : 공유 및 학습 - SQL 주입

게시일: 2018.12.06.
Jaap Karan Singh

간단히 말해서 SQL(또는 구조화쿼리 언어)은 관계형 데이터베이스와 통신하는 데 사용되는 언어입니다. 개발자, 데이터베이스 관리자 및 응용 프로그램에서 매일 생성되는 방대한 양의 데이터를관리하는 데 사용하는 쿼리 언어입니다.

우리의 데이터는 세계에서 가장 가치있는 상품 중 하나가되고 있습니다 ... 그리고 뭔가 가치가있을 때, 나쁜 사람은 자신의 이익을 위해그것에 손을 얻을 싶어합니다.

공격자는1998년부터가장 오래된 SQL 주입과 페스키트 데이터 취약점을 사용하여 전 세계 수백만 개의 데이터베이스에서 사용할 수 있는 중요한 정보를 훔치고 변경하고 있습니다. 그것은 교활한, 그리고 개발자는 SQL 주입 이해 해야 (뿐만 아니라 그것에 대 한 방어 하는 방법) 우리가 우리의 데이터를 안전 하 게 유지 하는 경우.

이를 위해 SQL 주입의 세 가지 주요 측면에 대해 설명합니다.

  • 작동 방식
  • 왜 그렇게 위험한지
  • 그것을 방어하는 방법

SQL 주입 이해

SQL 삽입은 컨텍스트라는 한 단어를 사용하여 이해할 수 있습니다.

응용 프로그램 내에 는 두 가지 컨텍스트가 존재합니다: 하나는 데이터, 다른 하나는 코드에 대한 것입니다. 코드 컨텍스트는 컴퓨터에 실행할 내용을 알려주고 처리할 데이터에서 분리합니다.

SQL 삽입은 공격자가 SQL 인터프리터에서 실수로 코드로 처리되는 데이터를 입력할 때 발생합니다.

한 가지 예는 공격자가 ''' 또는 1=1"을 입력하고 SQL 쿼리의 끝에 추가되는 웹 사이트의 입력 필드입니다. 이 쿼리가 실행되면 데이터베이스의 모든 행에 대해 "true"를 반환합니다. 즉, 쿼리된 테이블의 모든 레코드가 반환됩니다.

SQL 주입의 의미는 치명적일 수 있습니다. 로그인 페이지에서 이 경우 사용자 이름과 암호를 포함한 모든 사용자 레코드를 반환할 수 있습니다. 데이터를 꺼내는 간단한 쿼리가 성공하면 데이터를 변경하는 쿼리도 됩니다.

일부 취약한 코드를 살펴보고 SQL 주입 취약점이 육체에서 어떻게 보이는지 확인할 수 있습니다.

이 코드를 확인하십시오.

String query = "SELECT account balance FROM user_data WHERE user_name = "
+ request.getParameter("customerName");
try {
   Statement statement = connection.createStatement( ... );
   ResultSet results = statement.executeQuery( query );
}

여기서 코드는 유효성 검사 없이 클라이언트에서 SQL 쿼리 끝까지 매개 변수 정보를 더하기만 하면 됩니다. 이 경우 공격자는 입력 필드 또는 URL 매개 변수에 코드를 입력할 수 있으며 실행됩니다.

중요한 것은 공격자가 각 SELECT 쿼리에 ''' 또는 1=1"만 추가할 수 있지만 공격자가 모든 유형의 SQL 쿼리(삽입, 업데이트, DELETE, DROP 등)를 조작하고 데이터베이스가 지원하는 모든 것으로 확장할 수 있다는 것입니다. 가능한 것을 보여주는 공용 도메인에는 훌륭한 리소스와 도구가 있습니다.

이 문제를 곧 해결하는 방법을 살펴보겠습니다. 먼저 얼마나 많은 피해를 입을 수 있는지 이해합시다.

SQL 주입이 그렇게 위험한 이유

다음은 SQL 주입으로 인한 위반의 세 가지 예입니다.

  • 일리노이 선거관리위원회 웹사이트는 SQL 주입 취약점으로 인해 위반되었습니다. 공격자는 200,000 명의 미국 시민의 개인 데이터를 훔쳤습니다. 발견된 취약점의 특성상 공격자가 데이터를 변경할 수도 있었지만 그렇지 는 않습니다.
  • 남아프리카 공화국 웹사이트 호스팅 회사인 Hetzner는 40,000건의 고객 기록을 위반했습니다. SQL 주입 취약점으로 인해 데이터베이스의 모든 고객 레코드가 도난당할 수 있습니다.
  • 미국 미네소타의 가톨릭 금융 서비스 제공업체가 SQL 주입을 사용하여 위반되었습니다. 거의 130,000명의 고객에 대한 계정 번호를 포함한 계정 세부 정보가 도난당했습니다.

중요한 데이터는 계정을 인수하거나, 암호를 재설정하거나, 돈을 훔치거나, 사기를 저지르는 데 사용할 수 있습니다.

민감한 정보나 개인 식별이 불가능한 정보도 다른 공격에 사용할 수 있습니다. 주소 정보 또는 정부 식별 번호의 마지막 네 자리 숫자를 사용하여 귀하를 회사로 가장하거나 암호를 재설정할 수 있습니다.

공격이 성공하면 고객은 회사에 대한 신뢰를 잃을 수 있습니다. 시스템 또는 규제 벌금에 대한 손상에서 회복하면 수백만 달러의 비용이 들 수 있습니다.

그러나 그것은 당신을 위해 그런 식으로 끝날 필요가 없습니다.

SQL 주입 패배

SQL 삽입은 응용 프로그램의 일부를 명확하게 레이블지정하여 패배할 수 있으므로 컴퓨터는 특정 부품이 실행될 데이터 또는 코드인지 여부를 알 수 있습니다. 매개 변수쿼리를 사용하여 수행할 수 있습니다.

SQL 쿼리에서 매개 변수를 사용하는 경우 SQL 인터프리터는 매개 변수를 데이터로만 사용합니다. 코드로 실행되지 않습니다.

예를 들어 ''' 또는 1=1"과 같은 공격이 작동하지 않습니다. 데이터베이스는 문자열 "OR 1=1"을 검색하고 데이터베이스에서 찾을 수 없습니다. 그것은 단순히 어깨를 으쓱하고 말할 것이다, "죄송합니다, 나는 당신을 위해 그것을 찾을 수 없습니다."

Java에서 매개 변수화된 쿼리의 예는 다음과 같습니다.

대부분의 개발 프레임워크는 SQL 주입에 대한 기본 제공 방어를 제공합니다.

.NET 패밀리의 엔터티 프레임워크와 같은 개체 관계형 매퍼(ORM)는 기본적으로 쿼리를 매개 변수화합니다. 이렇게 하면 어떤 노력도 없이 SQL 주입을 처리합니다.

그러나 특정 ORM의 작동 방식을 알아야 합니다. 예를 들어 Java 세계에서 인기 있는 ORM인 최대 절전 모드는잘못 사용되는 경우에도 SQL 주입에 취약할 수 있습니다.

쿼리 매개 변수화는 첫 번째이자 최고의 방어이지만 다른 검색어도 있습니다. 저장된 프로시저도 SQL 매개 변수를 지원하며 SQL 주입을 방지하는 데 사용할 수 있습니다. 저장 프로시저도 올바르게 빌드해야 이 작업이 작동합니다.

// This should REALLY be validated too
String custname = request.getParameter("customerName");
// perform input validation to detect attacks
String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";

PreparedStatement pstmt = connection.preparedStatement( query );
pstmt.setString(1, custname);
ResultSet results = pstmt.executeQuery( );

입력의 유효성을 검사하고 소독합니다. "OR 1=1"과 같은 일부 문자는 응용 프로그램의 합법적인 사용자가 입력하지 않으므로 허용할 필요가 없습니다. 오류 메시지를 사용자에게 표시하거나 처리하기 전에 입력에서 제거할 수 있습니다.

즉, 당신을 보호하기 위해 유효성 검사 및 위생에만 의존하지 마십시오. 영리한 인간은 그 주위에 방법을 발견했다. 그들은 깊이 (DD) 전략에서 좋은 방어, 하지만 매개 변수는 모든 기지를 커버 하는 확실 한 방법.

또 다른 좋은 DiD 전략은 데이터베이스 내에서 "최소 권한'을 사용하고 입력을 화이트리스트하는 것입니다. 최소 권한을 적용하면 응용 프로그램에 데이터베이스 내에서 무제한 전원이 공급되지 않습니다. 공격자가 액세스 권한을 얻으려면 공격자가 할 수 있는 피해가 제한됩니다.

OWASP는 여러 언어와 플랫폼에서이 취약점을 처리하는 방법을 보여 줄 수있는 훌륭한 SQL 주입 치트 시트가 있습니다 ... 하지만 더 나은 하나를 가고 싶은 경우, 당신은 지금 우리의 플랫폼에서 원하는 언어로 SQL 주입 도전을 재생할 수 있습니다; 다음은 시작하는 데 있어 가장 인기 있는 것들 중 일부입니다.

C의 SQL 주입 #

노드에서 SQL 주입.js

파이썬 장고의 SQL 주입

자바 스프링의 SQL 주입

여정이 시작됩니다.

SQL 주입을 이해하는 데 큰 진전을 이루었으며 이를 해결하는 데 필요한 단계를 수행했습니다. 굉장한!

SQL 주입이 어떻게 발생하는지 논의했습니다. 일반적으로 공격자가 입력을 사용하여 자신의 사악한 목적을 위해 데이터베이스 쿼리를 제어합니다.

또한 SQL 주입 취약점의 악용으로 인한 피해를 보았습니다: 계정이 손상될 수 있으며 수백만 달러가 손실될 수 있습니다... 악몽, 그리고 그 비싼 하나.

SQL 주입을 방지하는 방법을 보았습니다.

  • 쿼리 매개 변수화
  • 개체 관계형 매퍼 및 저장된 프로시저 사용
  • 사용자 입력 의 유효성 검사 및 화이트리스팅

지금, 그것은 당신에게 달려 있습니다. 연습은 학습과 건물 숙달을 유지하는 가장 좋은 방법입니다, 그래서 왜 SQL 주입에 우리의 학습 자원을 체크 아웃, 다음 우리의 무료 데모를 시도 플랫폼의? 당신은 되기 위해 당신의 방법에 잘 있을 거 야 Secure Code Warrior .

우리는 당신에게 우리의 제품 및 / 또는 관련 보안 코딩 주제에 대한 정보를 보낼 수있는 귀하의 허가를 바랍니다. 우리는 항상 최대한의주의를 기울여 귀하의 개인 정보를 취급 할 것이며 마케팅 목적으로 다른 회사에 판매하지 않을 것입니다.

전송
양식을 제출하려면 '분석' 쿠키를 활성화하세요. 완료되면 언제든지 다시 비활성화할 수 있습니다.