SCW アイコン
ヒーロー背景(区切りなし)
ブログ

코더들이 보안을 정복하다: 공유 및 학습 - SQL 인젝션

Jaap Karan Singh
2018年12月06日 掲載
最終更新日: 2026年3月9日

간단히 말해 SQL (또는 구조화된 쿼리 언어) 은 관계형 데이터베이스와 통신하는 데 사용되는 언어입니다. 개발자, 데이터베이스 관리자 및 애플리케이션이 데이터베이스를 관리하는 데 사용하는 쿼리 언어입니다. 매일 엄청난 양의 데이터가 생성되고 있습니다..

우리의 데이터는 빠르게 세계에서 가장 가치 있는 상품 중 하나로 부상하고 있습니다... 그리고 가치 있는 것이 있으면 악의적인 사람들은 이익을 위해 그 데이터를 손에 넣고 싶어할 것입니다.

공격자들은 SQL 인젝션을 사용하고 있습니다. 가장 오래된 것 중 하나입니다 (1998년부터!)그리고 가장 성가신 데이터 취약점은 전 세계 수백만 데이터베이스에 있는 민감한 정보를 도용하고 변경하는 것입니다.이는 교활한 일이기 때문에 데이터를 안전하게 보호하려면 개발자는 SQL 인젝션 (및 방어 방법) 을 이해해야 합니다.

이를 위해 SQL 인젝션의 세 가지 주요 측면에 대해 살펴보겠습니다.

  • 動作原理
  • 왜 그렇게 위험한가요
  • 이를 방지하는 방법

SQL 인젝션에 대한 이해

SQL 인젝션은 컨텍스트라는 한 단어로 이해할 수 있습니다.

응용 프로그램에는 두 개의 컨텍스트가 있습니다. 하나는 데이터용이고 다른 하나는 코드용입니다.코드 컨텍스트는 컴퓨터에 무엇을 실행할지 알려주고 이를 처리할 데이터와 구분합니다.

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

한 예로 웹 사이트에서 공격자가 '” OR 1=1"을 입력하고 SQL 쿼리 끝에 입력하는 입력 필드를 들 수 있습니다.이 쿼리를 실행하면 데이터베이스의 모든 행에 대해 “true”가 반환됩니다.즉, 쿼리된 테이블의 모든 레코드가 반환됩니다.

SQL 인젝션의 영향은 치명적일 수 있습니다.로그인 페이지에서 이런 일이 발생하면 사용자 이름과 암호를 포함한 모든 사용자 기록이 반환될 수 있습니다.데이터를 가져오는 간단한 쿼리가 성공하면 데이터 변경 쿼리도 성공합니다.

SQL 인젝션 취약점이 실제로 어떻게 보이는지 확인할 수 있도록 몇 가지 취약한 코드를 살펴보겠습니다.

이 코드를 확인해 보세요:

문자열 쿼리 = “사용자_데이터에서 계정 잔액 선택 여기서 사용자_이름 =”
+ 요청. 매개 변수 가져오기 (“고객 이름”);
시도해 보세요 {
명령문 = 연결.명령문 작성 (...);
결과 집합 결과 = 명령문. 쿼리 실행 (쿼리);
}

이 코드는 검증 없이 클라이언트의 파라미터 정보를 SQL 쿼리의 끝에 추가하기만 합니다.이 경우 공격자는 입력 필드 또는 URL 매개 변수에 코드를 입력하고 해당 코드가 실행됩니다.

중요한 것은 공격자가 각 SELECT 쿼리에 '” OR 1=1만 추가할 수 있다는 것이 아니라 공격자가 모든 유형의 SQL 쿼리 (INSERT, UPDATE, DELETE, DROP 등) 를 조작하고 데이터베이스가 지원하는 모든 항목으로 확장할 수 있다는 것입니다.대단한 방법이 있습니다. 자원 무엇이 가능한지 보여주는 공개 도메인에서 사용할 수 있는 도구도 있습니다.

곧 이 문제를 해결하는 방법을 알아보겠습니다.먼저, 얼마나 많은 피해를 입힐 수 있는지 이해해 봅시다.

SQL 인젝션이 위험한 이유

다음은 SQL 인젝션으로 인한 침해의 세 가지 예시입니다.

  • 일리노이주 선거관리위원회 웹사이트 침해되었습니다 SQL 인젝션 취약점 때문입니다.공격자들은 20만 명의 미국 시민의 개인 데이터를 훔쳤습니다.발견된 취약점의 특성상 공격자가 데이터를 변경하지는 않았지만 변경했을 수도 있었습니다.
  • 남아공 웹사이트 호스팅 회사인 Hetzner는 침해되었습니다 40,000개에 달하는 고객 기록을 보유하고 있습니다.SQL 인젝션 취약성으로 인해 데이터베이스의 모든 고객 기록이 도용될 수 있었습니다.
  • 미국 미네소타에 있는 가톨릭 금융 서비스 제공자는 침해되었습니다 SQL 인젝션을 사용합니다.약 130,000명의 고객에 대한 계좌 번호를 포함한 계정 세부 정보가 도난당했습니다.

민감한 데이터는 계정을 탈취하거나, 암호를 재설정하거나, 돈을 훔치거나, 사기를 저지르는 데 사용될 수 있습니다.

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

공격이 성공하면 고객은 회사에 대한 신뢰를 잃을 수 있습니다.시스템 손상이나 규제 벌금을 복구하려면 수백만 달러가 소요될 수 있습니다.

하지만 꼭 그렇게 끝낼 필요는 없습니다.

SQL 인젝션 무력화

응용 프로그램의 일부에 명확하게 레이블을 지정하여 컴퓨터가 특정 부분이 실행될 데이터인지 코드인지 알 수 있도록 하면 SQL 삽입을 방지할 수 있습니다.파라미터화된 쿼리를 사용하여 이 작업을 수행할 수 있습니다.

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

예를 들어 '” OR 1=1"과 같은 공격은 작동하지 않습니다.데이터베이스는 문자열 “OR 1=1"을 검색하지만 데이터베이스에서는 찾을 수 없습니다.그냥 어깨를 으쓱하며 “죄송합니다. 찾을 수 없습니다.” 라고 말하기만 하면 됩니다.

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

대부분의 개발 프레임워크는 SQL 인젝션에 대한 기본 제공 방어 기능을 제공합니다.

객체 관계형 매퍼 (ORM), 예: 엔티티 프레임워크 .NET 제품군에서는 기본적으로 쿼리를 매개 변수화합니다.이렇게 하면 별도의 작업 없이 SQL 삽입을 처리할 수 있습니다.

그러나 특정 ORM이 어떻게 작동하는지 알아야 합니다.예를 들어, 동면, 자바 세계에서 널리 사용되는 ORM입니다. 여전히 취약할 수 있음 잘못 사용하면 SQL 인젝션에 적용됩니다.

쿼리를 파라미터화하는 것이 최우선이자 최선의 방어책이지만 다른 방법도 있습니다.또한 저장 프로시저는 SQL 매개 변수를 지원하며 SQL 삽입을 방지하는 데 사용할 수 있습니다.저장 프로시저가 있다는 점을 염두에 두십시오. 또한 올바르게 구축되어야 합니다. 이것이 작동하려면.

//이것도 정말 검증되어야 합니다
문자열 사용자 지정 이름 = 요청.GetParameter (“고객 이름”);
//입력 검증을 수행하여 공격을 탐지합니다.
문자열 쿼리 = “사용자_데이터에서 계정_잔액 선택 여기서 사용자_이름 =?“;

준비된 명령문 pstmt = 연결.준비된 명령문 (쿼리);
PSTM. 세트 문자열 (1, 사용자 지정 이름);
결과 집합 결과 = PSTMT. 쿼리 실행 ();

입력 내용을 항상 확인하고 삭제하세요.“OR 1=1"과 같은 일부 문자는 애플리케이션의 적법한 사용자가 입력하지 않으므로 허용할 필요가 없습니다.처리하기 전에 사용자에게 오류 메시지를 표시하거나 입력에서 제거할 수 있습니다.

즉, 인증 및 위생 처리에만 의존하여 보호하지 마십시오.똑똑한 사람들이 이 문제를 해결할 방법을 찾았어요.좋은 심층 방어 (DiD) 전략이긴 하지만, 파라미터화는 모든 기반을 포괄할 수 있는 확실한 방법입니다.

또 다른 좋은 DiD 전략은 데이터베이스 내에서 '최소 권한'을 사용하고 입력을 화이트리스트에 추가하는 것입니다.최소 권한을 적용한다는 것은 애플리케이션이 데이터베이스 내에서 무제한으로 사용할 수 없다는 것을 의미합니다.공격자가 액세스 권한을 얻더라도 입힐 수 있는 피해는 제한적입니다.

OWASP에는 훌륭한 기능이 있습니다 SQL 인젝션 치트 시트 여러 언어 및 플랫폼에서 이 취약점을 처리하는 방법을 보여 줄 수 있습니다... 하지만 더 나은 방법을 원한다면 지금 바로 당사 플랫폼에서 원하는 언어로 SQL 삽입 챌린지를 플레이할 수 있습니다. 시작하기 위해 가장 인기 있는 몇 가지 방법을 소개합니다.

C #에서의 SQL 인젝션

Node.js 파일에 SQL 인젝션

파이썬 장고에서의 SQL 인젝션

자바 스프링에서의 SQL 인젝션

여정의 시작

SQL 인젝션과 이를 수정하는 데 필요한 단계를 이해하는 데 상당한 진전을 이루었습니다.멋지네요!

지금까지 SQL 삽입이 어떻게 발생하는지 살펴보았습니다. 일반적으로 공격자가 입력을 사용하여 악의적인 목적으로 데이터베이스 쿼리를 제어하는 경우를 들 수 있습니다.

또한 SQL 인젝션 취약점 악용으로 인한 피해도 확인되었습니다. 계정이 손상되어 수백만 달러의 손실이 발생할 수 있습니다... 악몽 같은 일이자 비용이 많이 드는 일입니다.

SQL 인젝션을 방지하는 방법을 살펴보았습니다.

  • 쿼리 파라미터화
  • 객체 관계형 매퍼 및 저장 프로시저 사용
  • 사용자 입력 검증 및 화이트리스트 작성

이제, 그것은 당신에게 달렸습니다.연습은 계속 배우고 숙달할 수 있는 가장 좋은 방법입니다. 저희 웹사이트를 확인해 보는 건 어떨까요? 학습 리소스 SQL 인젝션에서 다음을 시도하십시오. 무료 데모 플랫폼의?시큐어 코드 워리어가 되기 위한 여정을 잘 마칠 수 있을 거예요.

リソースを見る
リソースを見る

공격자들은 SQL 인젝션을 사용하고 있습니다. SQL 인젝션은 1998년 이후 가장 오래된 것 중 하나입니다.그리고 가장 성가신 데이터 취약점은 전 세계 수백만 데이터베이스에 있는 민감한 정보를 도용하고 변경하는 것입니다.

もっと興味がありますか?

Jaap Karan Singhは、Secure Coding Evangelistであり、Chief Singhであり、Secure Code Warrior の共同設立者です。

もっと詳しく

セキュアコードウォリアーは、ソフトウェア開発ライフサイクル全体を通じてコードを保護し、サイバーセキュリティを最優先とする文化を組織に根付かせるために存在します。AppSec管理者、開発者、CISO、あるいはセキュリティに関わるあらゆる立場の方々に対し、組織が安全でないコードに関連するリスクを軽減できるよう支援します。

デモ予約
共有対象:
リンクトインのブランドソーシャルx ロゴ
作成者
Jaap Karan Singh
2018年12月06日掲載

Jaap Karan Singhは、Secure Coding Evangelistであり、Chief Singhであり、Secure Code Warrior の共同設立者です。

共有対象:
リンクトインのブランドソーシャルx ロゴ

간단히 말해 SQL (또는 구조화된 쿼리 언어) 은 관계형 데이터베이스와 통신하는 데 사용되는 언어입니다. 개발자, 데이터베이스 관리자 및 애플리케이션이 데이터베이스를 관리하는 데 사용하는 쿼리 언어입니다. 매일 엄청난 양의 데이터가 생성되고 있습니다..

우리의 데이터는 빠르게 세계에서 가장 가치 있는 상품 중 하나로 부상하고 있습니다... 그리고 가치 있는 것이 있으면 악의적인 사람들은 이익을 위해 그 데이터를 손에 넣고 싶어할 것입니다.

공격자들은 SQL 인젝션을 사용하고 있습니다. 가장 오래된 것 중 하나입니다 (1998년부터!)그리고 가장 성가신 데이터 취약점은 전 세계 수백만 데이터베이스에 있는 민감한 정보를 도용하고 변경하는 것입니다.이는 교활한 일이기 때문에 데이터를 안전하게 보호하려면 개발자는 SQL 인젝션 (및 방어 방법) 을 이해해야 합니다.

이를 위해 SQL 인젝션의 세 가지 주요 측면에 대해 살펴보겠습니다.

  • 動作原理
  • 왜 그렇게 위험한가요
  • 이를 방지하는 방법

SQL 인젝션에 대한 이해

SQL 인젝션은 컨텍스트라는 한 단어로 이해할 수 있습니다.

응용 프로그램에는 두 개의 컨텍스트가 있습니다. 하나는 데이터용이고 다른 하나는 코드용입니다.코드 컨텍스트는 컴퓨터에 무엇을 실행할지 알려주고 이를 처리할 데이터와 구분합니다.

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

한 예로 웹 사이트에서 공격자가 '” OR 1=1"을 입력하고 SQL 쿼리 끝에 입력하는 입력 필드를 들 수 있습니다.이 쿼리를 실행하면 데이터베이스의 모든 행에 대해 “true”가 반환됩니다.즉, 쿼리된 테이블의 모든 레코드가 반환됩니다.

SQL 인젝션의 영향은 치명적일 수 있습니다.로그인 페이지에서 이런 일이 발생하면 사용자 이름과 암호를 포함한 모든 사용자 기록이 반환될 수 있습니다.데이터를 가져오는 간단한 쿼리가 성공하면 데이터 변경 쿼리도 성공합니다.

SQL 인젝션 취약점이 실제로 어떻게 보이는지 확인할 수 있도록 몇 가지 취약한 코드를 살펴보겠습니다.

이 코드를 확인해 보세요:

문자열 쿼리 = “사용자_데이터에서 계정 잔액 선택 여기서 사용자_이름 =”
+ 요청. 매개 변수 가져오기 (“고객 이름”);
시도해 보세요 {
명령문 = 연결.명령문 작성 (...);
결과 집합 결과 = 명령문. 쿼리 실행 (쿼리);
}

이 코드는 검증 없이 클라이언트의 파라미터 정보를 SQL 쿼리의 끝에 추가하기만 합니다.이 경우 공격자는 입력 필드 또는 URL 매개 변수에 코드를 입력하고 해당 코드가 실행됩니다.

중요한 것은 공격자가 각 SELECT 쿼리에 '” OR 1=1만 추가할 수 있다는 것이 아니라 공격자가 모든 유형의 SQL 쿼리 (INSERT, UPDATE, DELETE, DROP 등) 를 조작하고 데이터베이스가 지원하는 모든 항목으로 확장할 수 있다는 것입니다.대단한 방법이 있습니다. 자원 무엇이 가능한지 보여주는 공개 도메인에서 사용할 수 있는 도구도 있습니다.

곧 이 문제를 해결하는 방법을 알아보겠습니다.먼저, 얼마나 많은 피해를 입힐 수 있는지 이해해 봅시다.

SQL 인젝션이 위험한 이유

다음은 SQL 인젝션으로 인한 침해의 세 가지 예시입니다.

  • 일리노이주 선거관리위원회 웹사이트 침해되었습니다 SQL 인젝션 취약점 때문입니다.공격자들은 20만 명의 미국 시민의 개인 데이터를 훔쳤습니다.발견된 취약점의 특성상 공격자가 데이터를 변경하지는 않았지만 변경했을 수도 있었습니다.
  • 남아공 웹사이트 호스팅 회사인 Hetzner는 침해되었습니다 40,000개에 달하는 고객 기록을 보유하고 있습니다.SQL 인젝션 취약성으로 인해 데이터베이스의 모든 고객 기록이 도용될 수 있었습니다.
  • 미국 미네소타에 있는 가톨릭 금융 서비스 제공자는 침해되었습니다 SQL 인젝션을 사용합니다.약 130,000명의 고객에 대한 계좌 번호를 포함한 계정 세부 정보가 도난당했습니다.

민감한 데이터는 계정을 탈취하거나, 암호를 재설정하거나, 돈을 훔치거나, 사기를 저지르는 데 사용될 수 있습니다.

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

공격이 성공하면 고객은 회사에 대한 신뢰를 잃을 수 있습니다.시스템 손상이나 규제 벌금을 복구하려면 수백만 달러가 소요될 수 있습니다.

하지만 꼭 그렇게 끝낼 필요는 없습니다.

SQL 인젝션 무력화

응용 프로그램의 일부에 명확하게 레이블을 지정하여 컴퓨터가 특정 부분이 실행될 데이터인지 코드인지 알 수 있도록 하면 SQL 삽입을 방지할 수 있습니다.파라미터화된 쿼리를 사용하여 이 작업을 수행할 수 있습니다.

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

예를 들어 '” OR 1=1"과 같은 공격은 작동하지 않습니다.데이터베이스는 문자열 “OR 1=1"을 검색하지만 데이터베이스에서는 찾을 수 없습니다.그냥 어깨를 으쓱하며 “죄송합니다. 찾을 수 없습니다.” 라고 말하기만 하면 됩니다.

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

대부분의 개발 프레임워크는 SQL 인젝션에 대한 기본 제공 방어 기능을 제공합니다.

객체 관계형 매퍼 (ORM), 예: 엔티티 프레임워크 .NET 제품군에서는 기본적으로 쿼리를 매개 변수화합니다.이렇게 하면 별도의 작업 없이 SQL 삽입을 처리할 수 있습니다.

그러나 특정 ORM이 어떻게 작동하는지 알아야 합니다.예를 들어, 동면, 자바 세계에서 널리 사용되는 ORM입니다. 여전히 취약할 수 있음 잘못 사용하면 SQL 인젝션에 적용됩니다.

쿼리를 파라미터화하는 것이 최우선이자 최선의 방어책이지만 다른 방법도 있습니다.또한 저장 프로시저는 SQL 매개 변수를 지원하며 SQL 삽입을 방지하는 데 사용할 수 있습니다.저장 프로시저가 있다는 점을 염두에 두십시오. 또한 올바르게 구축되어야 합니다. 이것이 작동하려면.

//이것도 정말 검증되어야 합니다
문자열 사용자 지정 이름 = 요청.GetParameter (“고객 이름”);
//입력 검증을 수행하여 공격을 탐지합니다.
문자열 쿼리 = “사용자_데이터에서 계정_잔액 선택 여기서 사용자_이름 =?“;

준비된 명령문 pstmt = 연결.준비된 명령문 (쿼리);
PSTM. 세트 문자열 (1, 사용자 지정 이름);
결과 집합 결과 = PSTMT. 쿼리 실행 ();

입력 내용을 항상 확인하고 삭제하세요.“OR 1=1"과 같은 일부 문자는 애플리케이션의 적법한 사용자가 입력하지 않으므로 허용할 필요가 없습니다.처리하기 전에 사용자에게 오류 메시지를 표시하거나 입력에서 제거할 수 있습니다.

즉, 인증 및 위생 처리에만 의존하여 보호하지 마십시오.똑똑한 사람들이 이 문제를 해결할 방법을 찾았어요.좋은 심층 방어 (DiD) 전략이긴 하지만, 파라미터화는 모든 기반을 포괄할 수 있는 확실한 방법입니다.

또 다른 좋은 DiD 전략은 데이터베이스 내에서 '최소 권한'을 사용하고 입력을 화이트리스트에 추가하는 것입니다.최소 권한을 적용한다는 것은 애플리케이션이 데이터베이스 내에서 무제한으로 사용할 수 없다는 것을 의미합니다.공격자가 액세스 권한을 얻더라도 입힐 수 있는 피해는 제한적입니다.

OWASP에는 훌륭한 기능이 있습니다 SQL 인젝션 치트 시트 여러 언어 및 플랫폼에서 이 취약점을 처리하는 방법을 보여 줄 수 있습니다... 하지만 더 나은 방법을 원한다면 지금 바로 당사 플랫폼에서 원하는 언어로 SQL 삽입 챌린지를 플레이할 수 있습니다. 시작하기 위해 가장 인기 있는 몇 가지 방법을 소개합니다.

C #에서의 SQL 인젝션

Node.js 파일에 SQL 인젝션

파이썬 장고에서의 SQL 인젝션

자바 스프링에서의 SQL 인젝션

여정의 시작

SQL 인젝션과 이를 수정하는 데 필요한 단계를 이해하는 데 상당한 진전을 이루었습니다.멋지네요!

지금까지 SQL 삽입이 어떻게 발생하는지 살펴보았습니다. 일반적으로 공격자가 입력을 사용하여 악의적인 목적으로 데이터베이스 쿼리를 제어하는 경우를 들 수 있습니다.

또한 SQL 인젝션 취약점 악용으로 인한 피해도 확인되었습니다. 계정이 손상되어 수백만 달러의 손실이 발생할 수 있습니다... 악몽 같은 일이자 비용이 많이 드는 일입니다.

SQL 인젝션을 방지하는 방법을 살펴보았습니다.

  • 쿼리 파라미터화
  • 객체 관계형 매퍼 및 저장 프로시저 사용
  • 사용자 입력 검증 및 화이트리스트 작성

이제, 그것은 당신에게 달렸습니다.연습은 계속 배우고 숙달할 수 있는 가장 좋은 방법입니다. 저희 웹사이트를 확인해 보는 건 어떨까요? 학습 리소스 SQL 인젝션에서 다음을 시도하십시오. 무료 데모 플랫폼의?시큐어 코드 워리어가 되기 위한 여정을 잘 마칠 수 있을 거예요.

リソースを見る
リソースを見る

レポートをダウンロードするには、以下のフォームにご記入ください。

当社製品および/または関連するセキュリティコーディングのトピックに関する情報をお送りするため、お客様の同意を求めます。当社は常に、お客様の個人情報を最大限の注意を払って取り扱い、マーケティング目的で他社に販売することは一切ありません。

提出
SCW成功アイコン
SCWエラーアイコン
フォームを送信するには「Analytics」クッキーを有効にしてください。完了後、いつでも再度無効にできます。

간단히 말해 SQL (또는 구조화된 쿼리 언어) 은 관계형 데이터베이스와 통신하는 데 사용되는 언어입니다. 개발자, 데이터베이스 관리자 및 애플리케이션이 데이터베이스를 관리하는 데 사용하는 쿼리 언어입니다. 매일 엄청난 양의 데이터가 생성되고 있습니다..

우리의 데이터는 빠르게 세계에서 가장 가치 있는 상품 중 하나로 부상하고 있습니다... 그리고 가치 있는 것이 있으면 악의적인 사람들은 이익을 위해 그 데이터를 손에 넣고 싶어할 것입니다.

공격자들은 SQL 인젝션을 사용하고 있습니다. 가장 오래된 것 중 하나입니다 (1998년부터!)그리고 가장 성가신 데이터 취약점은 전 세계 수백만 데이터베이스에 있는 민감한 정보를 도용하고 변경하는 것입니다.이는 교활한 일이기 때문에 데이터를 안전하게 보호하려면 개발자는 SQL 인젝션 (및 방어 방법) 을 이해해야 합니다.

이를 위해 SQL 인젝션의 세 가지 주요 측면에 대해 살펴보겠습니다.

  • 動作原理
  • 왜 그렇게 위험한가요
  • 이를 방지하는 방법

SQL 인젝션에 대한 이해

SQL 인젝션은 컨텍스트라는 한 단어로 이해할 수 있습니다.

응용 프로그램에는 두 개의 컨텍스트가 있습니다. 하나는 데이터용이고 다른 하나는 코드용입니다.코드 컨텍스트는 컴퓨터에 무엇을 실행할지 알려주고 이를 처리할 데이터와 구분합니다.

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

한 예로 웹 사이트에서 공격자가 '” OR 1=1"을 입력하고 SQL 쿼리 끝에 입력하는 입력 필드를 들 수 있습니다.이 쿼리를 실행하면 데이터베이스의 모든 행에 대해 “true”가 반환됩니다.즉, 쿼리된 테이블의 모든 레코드가 반환됩니다.

SQL 인젝션의 영향은 치명적일 수 있습니다.로그인 페이지에서 이런 일이 발생하면 사용자 이름과 암호를 포함한 모든 사용자 기록이 반환될 수 있습니다.데이터를 가져오는 간단한 쿼리가 성공하면 데이터 변경 쿼리도 성공합니다.

SQL 인젝션 취약점이 실제로 어떻게 보이는지 확인할 수 있도록 몇 가지 취약한 코드를 살펴보겠습니다.

이 코드를 확인해 보세요:

문자열 쿼리 = “사용자_데이터에서 계정 잔액 선택 여기서 사용자_이름 =”
+ 요청. 매개 변수 가져오기 (“고객 이름”);
시도해 보세요 {
명령문 = 연결.명령문 작성 (...);
결과 집합 결과 = 명령문. 쿼리 실행 (쿼리);
}

이 코드는 검증 없이 클라이언트의 파라미터 정보를 SQL 쿼리의 끝에 추가하기만 합니다.이 경우 공격자는 입력 필드 또는 URL 매개 변수에 코드를 입력하고 해당 코드가 실행됩니다.

중요한 것은 공격자가 각 SELECT 쿼리에 '” OR 1=1만 추가할 수 있다는 것이 아니라 공격자가 모든 유형의 SQL 쿼리 (INSERT, UPDATE, DELETE, DROP 등) 를 조작하고 데이터베이스가 지원하는 모든 항목으로 확장할 수 있다는 것입니다.대단한 방법이 있습니다. 자원 무엇이 가능한지 보여주는 공개 도메인에서 사용할 수 있는 도구도 있습니다.

곧 이 문제를 해결하는 방법을 알아보겠습니다.먼저, 얼마나 많은 피해를 입힐 수 있는지 이해해 봅시다.

SQL 인젝션이 위험한 이유

다음은 SQL 인젝션으로 인한 침해의 세 가지 예시입니다.

  • 일리노이주 선거관리위원회 웹사이트 침해되었습니다 SQL 인젝션 취약점 때문입니다.공격자들은 20만 명의 미국 시민의 개인 데이터를 훔쳤습니다.발견된 취약점의 특성상 공격자가 데이터를 변경하지는 않았지만 변경했을 수도 있었습니다.
  • 남아공 웹사이트 호스팅 회사인 Hetzner는 침해되었습니다 40,000개에 달하는 고객 기록을 보유하고 있습니다.SQL 인젝션 취약성으로 인해 데이터베이스의 모든 고객 기록이 도용될 수 있었습니다.
  • 미국 미네소타에 있는 가톨릭 금융 서비스 제공자는 침해되었습니다 SQL 인젝션을 사용합니다.약 130,000명의 고객에 대한 계좌 번호를 포함한 계정 세부 정보가 도난당했습니다.

민감한 데이터는 계정을 탈취하거나, 암호를 재설정하거나, 돈을 훔치거나, 사기를 저지르는 데 사용될 수 있습니다.

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

공격이 성공하면 고객은 회사에 대한 신뢰를 잃을 수 있습니다.시스템 손상이나 규제 벌금을 복구하려면 수백만 달러가 소요될 수 있습니다.

하지만 꼭 그렇게 끝낼 필요는 없습니다.

SQL 인젝션 무력화

응용 프로그램의 일부에 명확하게 레이블을 지정하여 컴퓨터가 특정 부분이 실행될 데이터인지 코드인지 알 수 있도록 하면 SQL 삽입을 방지할 수 있습니다.파라미터화된 쿼리를 사용하여 이 작업을 수행할 수 있습니다.

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

예를 들어 '” OR 1=1"과 같은 공격은 작동하지 않습니다.데이터베이스는 문자열 “OR 1=1"을 검색하지만 데이터베이스에서는 찾을 수 없습니다.그냥 어깨를 으쓱하며 “죄송합니다. 찾을 수 없습니다.” 라고 말하기만 하면 됩니다.

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

대부분의 개발 프레임워크는 SQL 인젝션에 대한 기본 제공 방어 기능을 제공합니다.

객체 관계형 매퍼 (ORM), 예: 엔티티 프레임워크 .NET 제품군에서는 기본적으로 쿼리를 매개 변수화합니다.이렇게 하면 별도의 작업 없이 SQL 삽입을 처리할 수 있습니다.

그러나 특정 ORM이 어떻게 작동하는지 알아야 합니다.예를 들어, 동면, 자바 세계에서 널리 사용되는 ORM입니다. 여전히 취약할 수 있음 잘못 사용하면 SQL 인젝션에 적용됩니다.

쿼리를 파라미터화하는 것이 최우선이자 최선의 방어책이지만 다른 방법도 있습니다.또한 저장 프로시저는 SQL 매개 변수를 지원하며 SQL 삽입을 방지하는 데 사용할 수 있습니다.저장 프로시저가 있다는 점을 염두에 두십시오. 또한 올바르게 구축되어야 합니다. 이것이 작동하려면.

//이것도 정말 검증되어야 합니다
문자열 사용자 지정 이름 = 요청.GetParameter (“고객 이름”);
//입력 검증을 수행하여 공격을 탐지합니다.
문자열 쿼리 = “사용자_데이터에서 계정_잔액 선택 여기서 사용자_이름 =?“;

준비된 명령문 pstmt = 연결.준비된 명령문 (쿼리);
PSTM. 세트 문자열 (1, 사용자 지정 이름);
결과 집합 결과 = PSTMT. 쿼리 실행 ();

입력 내용을 항상 확인하고 삭제하세요.“OR 1=1"과 같은 일부 문자는 애플리케이션의 적법한 사용자가 입력하지 않으므로 허용할 필요가 없습니다.처리하기 전에 사용자에게 오류 메시지를 표시하거나 입력에서 제거할 수 있습니다.

즉, 인증 및 위생 처리에만 의존하여 보호하지 마십시오.똑똑한 사람들이 이 문제를 해결할 방법을 찾았어요.좋은 심층 방어 (DiD) 전략이긴 하지만, 파라미터화는 모든 기반을 포괄할 수 있는 확실한 방법입니다.

또 다른 좋은 DiD 전략은 데이터베이스 내에서 '최소 권한'을 사용하고 입력을 화이트리스트에 추가하는 것입니다.최소 권한을 적용한다는 것은 애플리케이션이 데이터베이스 내에서 무제한으로 사용할 수 없다는 것을 의미합니다.공격자가 액세스 권한을 얻더라도 입힐 수 있는 피해는 제한적입니다.

OWASP에는 훌륭한 기능이 있습니다 SQL 인젝션 치트 시트 여러 언어 및 플랫폼에서 이 취약점을 처리하는 방법을 보여 줄 수 있습니다... 하지만 더 나은 방법을 원한다면 지금 바로 당사 플랫폼에서 원하는 언어로 SQL 삽입 챌린지를 플레이할 수 있습니다. 시작하기 위해 가장 인기 있는 몇 가지 방법을 소개합니다.

C #에서의 SQL 인젝션

Node.js 파일에 SQL 인젝션

파이썬 장고에서의 SQL 인젝션

자바 스프링에서의 SQL 인젝션

여정의 시작

SQL 인젝션과 이를 수정하는 데 필요한 단계를 이해하는 데 상당한 진전을 이루었습니다.멋지네요!

지금까지 SQL 삽입이 어떻게 발생하는지 살펴보았습니다. 일반적으로 공격자가 입력을 사용하여 악의적인 목적으로 데이터베이스 쿼리를 제어하는 경우를 들 수 있습니다.

또한 SQL 인젝션 취약점 악용으로 인한 피해도 확인되었습니다. 계정이 손상되어 수백만 달러의 손실이 발생할 수 있습니다... 악몽 같은 일이자 비용이 많이 드는 일입니다.

SQL 인젝션을 방지하는 방법을 살펴보았습니다.

  • 쿼리 파라미터화
  • 객체 관계형 매퍼 및 저장 프로시저 사용
  • 사용자 입력 검증 및 화이트리스트 작성

이제, 그것은 당신에게 달렸습니다.연습은 계속 배우고 숙달할 수 있는 가장 좋은 방법입니다. 저희 웹사이트를 확인해 보는 건 어떨까요? 학습 리소스 SQL 인젝션에서 다음을 시도하십시오. 무료 데모 플랫폼의?시큐어 코드 워리어가 되기 위한 여정을 잘 마칠 수 있을 거예요.

ウェビナーを見る
はじめに
もっと詳しく

以下のリンクをクリックし、このリソースのPDFをダウンロードしてください。

セキュアコードウォリアーは、ソフトウェア開発ライフサイクル全体を通じてコードを保護し、サイバーセキュリティを最優先とする文化を組織に根付かせるために存在します。AppSec管理者、開発者、CISO、あるいはセキュリティに関わるあらゆる立場の方々に対し、組織が安全でないコードに関連するリスクを軽減できるよう支援します。

レポートを見るデモ予約
リソースを見る
共有対象:
リンクトインのブランドソーシャルx ロゴ
もっと興味がありますか?

共有対象:
リンクトインのブランドソーシャルx ロゴ
作成者
Jaap Karan Singh
2018年12月06日掲載

Jaap Karan Singhは、Secure Coding Evangelistであり、Chief Singhであり、Secure Code Warrior の共同設立者です。

共有対象:
リンクトインのブランドソーシャルx ロゴ

간단히 말해 SQL (또는 구조화된 쿼리 언어) 은 관계형 데이터베이스와 통신하는 데 사용되는 언어입니다. 개발자, 데이터베이스 관리자 및 애플리케이션이 데이터베이스를 관리하는 데 사용하는 쿼리 언어입니다. 매일 엄청난 양의 데이터가 생성되고 있습니다..

우리의 데이터는 빠르게 세계에서 가장 가치 있는 상품 중 하나로 부상하고 있습니다... 그리고 가치 있는 것이 있으면 악의적인 사람들은 이익을 위해 그 데이터를 손에 넣고 싶어할 것입니다.

공격자들은 SQL 인젝션을 사용하고 있습니다. 가장 오래된 것 중 하나입니다 (1998년부터!)그리고 가장 성가신 데이터 취약점은 전 세계 수백만 데이터베이스에 있는 민감한 정보를 도용하고 변경하는 것입니다.이는 교활한 일이기 때문에 데이터를 안전하게 보호하려면 개발자는 SQL 인젝션 (및 방어 방법) 을 이해해야 합니다.

이를 위해 SQL 인젝션의 세 가지 주요 측면에 대해 살펴보겠습니다.

  • 動作原理
  • 왜 그렇게 위험한가요
  • 이를 방지하는 방법

SQL 인젝션에 대한 이해

SQL 인젝션은 컨텍스트라는 한 단어로 이해할 수 있습니다.

응용 프로그램에는 두 개의 컨텍스트가 있습니다. 하나는 데이터용이고 다른 하나는 코드용입니다.코드 컨텍스트는 컴퓨터에 무엇을 실행할지 알려주고 이를 처리할 데이터와 구분합니다.

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

한 예로 웹 사이트에서 공격자가 '” OR 1=1"을 입력하고 SQL 쿼리 끝에 입력하는 입력 필드를 들 수 있습니다.이 쿼리를 실행하면 데이터베이스의 모든 행에 대해 “true”가 반환됩니다.즉, 쿼리된 테이블의 모든 레코드가 반환됩니다.

SQL 인젝션의 영향은 치명적일 수 있습니다.로그인 페이지에서 이런 일이 발생하면 사용자 이름과 암호를 포함한 모든 사용자 기록이 반환될 수 있습니다.데이터를 가져오는 간단한 쿼리가 성공하면 데이터 변경 쿼리도 성공합니다.

SQL 인젝션 취약점이 실제로 어떻게 보이는지 확인할 수 있도록 몇 가지 취약한 코드를 살펴보겠습니다.

이 코드를 확인해 보세요:

문자열 쿼리 = “사용자_데이터에서 계정 잔액 선택 여기서 사용자_이름 =”
+ 요청. 매개 변수 가져오기 (“고객 이름”);
시도해 보세요 {
명령문 = 연결.명령문 작성 (...);
결과 집합 결과 = 명령문. 쿼리 실행 (쿼리);
}

이 코드는 검증 없이 클라이언트의 파라미터 정보를 SQL 쿼리의 끝에 추가하기만 합니다.이 경우 공격자는 입력 필드 또는 URL 매개 변수에 코드를 입력하고 해당 코드가 실행됩니다.

중요한 것은 공격자가 각 SELECT 쿼리에 '” OR 1=1만 추가할 수 있다는 것이 아니라 공격자가 모든 유형의 SQL 쿼리 (INSERT, UPDATE, DELETE, DROP 등) 를 조작하고 데이터베이스가 지원하는 모든 항목으로 확장할 수 있다는 것입니다.대단한 방법이 있습니다. 자원 무엇이 가능한지 보여주는 공개 도메인에서 사용할 수 있는 도구도 있습니다.

곧 이 문제를 해결하는 방법을 알아보겠습니다.먼저, 얼마나 많은 피해를 입힐 수 있는지 이해해 봅시다.

SQL 인젝션이 위험한 이유

다음은 SQL 인젝션으로 인한 침해의 세 가지 예시입니다.

  • 일리노이주 선거관리위원회 웹사이트 침해되었습니다 SQL 인젝션 취약점 때문입니다.공격자들은 20만 명의 미국 시민의 개인 데이터를 훔쳤습니다.발견된 취약점의 특성상 공격자가 데이터를 변경하지는 않았지만 변경했을 수도 있었습니다.
  • 남아공 웹사이트 호스팅 회사인 Hetzner는 침해되었습니다 40,000개에 달하는 고객 기록을 보유하고 있습니다.SQL 인젝션 취약성으로 인해 데이터베이스의 모든 고객 기록이 도용될 수 있었습니다.
  • 미국 미네소타에 있는 가톨릭 금융 서비스 제공자는 침해되었습니다 SQL 인젝션을 사용합니다.약 130,000명의 고객에 대한 계좌 번호를 포함한 계정 세부 정보가 도난당했습니다.

민감한 데이터는 계정을 탈취하거나, 암호를 재설정하거나, 돈을 훔치거나, 사기를 저지르는 데 사용될 수 있습니다.

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

공격이 성공하면 고객은 회사에 대한 신뢰를 잃을 수 있습니다.시스템 손상이나 규제 벌금을 복구하려면 수백만 달러가 소요될 수 있습니다.

하지만 꼭 그렇게 끝낼 필요는 없습니다.

SQL 인젝션 무력화

응용 프로그램의 일부에 명확하게 레이블을 지정하여 컴퓨터가 특정 부분이 실행될 데이터인지 코드인지 알 수 있도록 하면 SQL 삽입을 방지할 수 있습니다.파라미터화된 쿼리를 사용하여 이 작업을 수행할 수 있습니다.

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

예를 들어 '” OR 1=1"과 같은 공격은 작동하지 않습니다.데이터베이스는 문자열 “OR 1=1"을 검색하지만 데이터베이스에서는 찾을 수 없습니다.그냥 어깨를 으쓱하며 “죄송합니다. 찾을 수 없습니다.” 라고 말하기만 하면 됩니다.

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

대부분의 개발 프레임워크는 SQL 인젝션에 대한 기본 제공 방어 기능을 제공합니다.

객체 관계형 매퍼 (ORM), 예: 엔티티 프레임워크 .NET 제품군에서는 기본적으로 쿼리를 매개 변수화합니다.이렇게 하면 별도의 작업 없이 SQL 삽입을 처리할 수 있습니다.

그러나 특정 ORM이 어떻게 작동하는지 알아야 합니다.예를 들어, 동면, 자바 세계에서 널리 사용되는 ORM입니다. 여전히 취약할 수 있음 잘못 사용하면 SQL 인젝션에 적용됩니다.

쿼리를 파라미터화하는 것이 최우선이자 최선의 방어책이지만 다른 방법도 있습니다.또한 저장 프로시저는 SQL 매개 변수를 지원하며 SQL 삽입을 방지하는 데 사용할 수 있습니다.저장 프로시저가 있다는 점을 염두에 두십시오. 또한 올바르게 구축되어야 합니다. 이것이 작동하려면.

//이것도 정말 검증되어야 합니다
문자열 사용자 지정 이름 = 요청.GetParameter (“고객 이름”);
//입력 검증을 수행하여 공격을 탐지합니다.
문자열 쿼리 = “사용자_데이터에서 계정_잔액 선택 여기서 사용자_이름 =?“;

준비된 명령문 pstmt = 연결.준비된 명령문 (쿼리);
PSTM. 세트 문자열 (1, 사용자 지정 이름);
결과 집합 결과 = PSTMT. 쿼리 실행 ();

입력 내용을 항상 확인하고 삭제하세요.“OR 1=1"과 같은 일부 문자는 애플리케이션의 적법한 사용자가 입력하지 않으므로 허용할 필요가 없습니다.처리하기 전에 사용자에게 오류 메시지를 표시하거나 입력에서 제거할 수 있습니다.

즉, 인증 및 위생 처리에만 의존하여 보호하지 마십시오.똑똑한 사람들이 이 문제를 해결할 방법을 찾았어요.좋은 심층 방어 (DiD) 전략이긴 하지만, 파라미터화는 모든 기반을 포괄할 수 있는 확실한 방법입니다.

또 다른 좋은 DiD 전략은 데이터베이스 내에서 '최소 권한'을 사용하고 입력을 화이트리스트에 추가하는 것입니다.최소 권한을 적용한다는 것은 애플리케이션이 데이터베이스 내에서 무제한으로 사용할 수 없다는 것을 의미합니다.공격자가 액세스 권한을 얻더라도 입힐 수 있는 피해는 제한적입니다.

OWASP에는 훌륭한 기능이 있습니다 SQL 인젝션 치트 시트 여러 언어 및 플랫폼에서 이 취약점을 처리하는 방법을 보여 줄 수 있습니다... 하지만 더 나은 방법을 원한다면 지금 바로 당사 플랫폼에서 원하는 언어로 SQL 삽입 챌린지를 플레이할 수 있습니다. 시작하기 위해 가장 인기 있는 몇 가지 방법을 소개합니다.

C #에서의 SQL 인젝션

Node.js 파일에 SQL 인젝션

파이썬 장고에서의 SQL 인젝션

자바 스프링에서의 SQL 인젝션

여정의 시작

SQL 인젝션과 이를 수정하는 데 필요한 단계를 이해하는 데 상당한 진전을 이루었습니다.멋지네요!

지금까지 SQL 삽입이 어떻게 발생하는지 살펴보았습니다. 일반적으로 공격자가 입력을 사용하여 악의적인 목적으로 데이터베이스 쿼리를 제어하는 경우를 들 수 있습니다.

또한 SQL 인젝션 취약점 악용으로 인한 피해도 확인되었습니다. 계정이 손상되어 수백만 달러의 손실이 발생할 수 있습니다... 악몽 같은 일이자 비용이 많이 드는 일입니다.

SQL 인젝션을 방지하는 방법을 살펴보았습니다.

  • 쿼리 파라미터화
  • 객체 관계형 매퍼 및 저장 프로시저 사용
  • 사용자 입력 검증 및 화이트리스트 작성

이제, 그것은 당신에게 달렸습니다.연습은 계속 배우고 숙달할 수 있는 가장 좋은 방법입니다. 저희 웹사이트를 확인해 보는 건 어떨까요? 학습 리소스 SQL 인젝션에서 다음을 시도하십시오. 무료 데모 플랫폼의?시큐어 코드 워리어가 되기 위한 여정을 잘 마칠 수 있을 거예요.

目次

PDFダウンロード
リソースを見る
もっと興味がありますか?

Jaap Karan Singhは、Secure Coding Evangelistであり、Chief Singhであり、Secure Code Warrior の共同設立者です。

もっと詳しく

セキュアコードウォリアーは、ソフトウェア開発ライフサイクル全体を通じてコードを保護し、サイバーセキュリティを最優先とする文化を組織に根付かせるために存在します。AppSec管理者、開発者、CISO、あるいはセキュリティに関わるあらゆる立場の方々に対し、組織が安全でないコードに関連するリスクを軽減できるよう支援します。

デモ予約ダウンロード
共有対象:
リンクトインのブランドソーシャルx ロゴ
リソースハブ

始めるのに役立つリソース

もっと多くの投稿
リソースハブ

始めるのに役立つリソース

もっと多くの投稿