728x90
반응형

1. SQL 인젝션(SQL Injection) 해킹 수법

1.1. SQL 인젝션 개요

SQL 인젝션은 공격자가 애플리케이션의 사용자 입력 필드를 통해 악의적인 SQL 코드를 삽입하여 데이터베이스에 대한 비정상적인 쿼리나 명령을 실행시키는 공격 방식입니다. 공격자는 이를 통해 데이터베이스 접근 권한을 얻고, 데이터 유출, 삭제, 수정, 심지어 데이터베이스 전체 삭제까지 할 수 있습니다.

1.2. SQL 인젝션 공격 흐름

  1. 취약점 발견: 공격자는 웹 애플리케이션의 사용자 입력 필드(로그인 폼, 검색 필드 등)에서 SQL 쿼리 삽입 지점을 찾습니다. 이 지점에서 SQL 쿼리를 입력하여 DB와 상호작용할 수 있습니다.
  2. SQL 쿼리 삽입: 공격자는 의도적으로 입력 필드SQL 명령어를 삽입하여 데이터베이스가 의도하지 않게 쿼리를 실행하게 만듭니다. 예를 들어:
    • admin' --와 같은 입력을 통해 SELECT * FROM users WHERE username = 'admin' AND password = 'password' 쿼리를 변조하여 인증을 우회할 수 있습니다.
    • DROP TABLE users;와 같은 명령어를 삽입하여 특정 테이블을 삭제할 수도 있습니다.
  3. DB 응답 확인: 만약 입력값이 제대로 필터링되지 않으면, 해커는 예상대로 DB에서 데이터를 추출하거나 수정할 수 있습니다. 이때 공격자는 에러 메시지쿼리 응답을 통해 시스템을 더 파악할 수 있습니다.
  4. 악용: 해커는 DB 정보 추출, 사용자 정보 탈취, 관리 권한 상승 등 다양한 방법으로 시스템에 대한 제어권을 획득할 수 있습니다.

1.3. SQL 인젝션 종류

SQL 인젝션에는 여러 가지 유형이 있습니다. 대표적인 예시를 살펴보겠습니다:

기본적인 SQL 인젝션: 쿼리에서 입력값을 받아와 직접 실행하는 경우, 해커는 쿼리를 변형하여 데이터를 삭제하거나 변경할 수 있습니다.

 
SELECT * FROM users WHERE username = 'admin' AND password = 'password';

입력값: admin' --
결과:이는 admin 사용자에 대한 비밀번호 확인을 무시하고 인증을 우회할 수 있습니다.

SELECT * FROM users WHERE username = 'admin' AND password = '';
  • 예:

블라인드 SQL 인젝션 (Blind SQL Injection): 공격자가 오류 메시지를 받지 않지만 여전히 쿼리를 통해 정보를 추출할 수 있는 경우입니다. 이 경우, 응답에 대한 차이를 통해 데이터를 유추합니다.

SELECT * FROM users WHERE username = 'admin' AND password = 'password' AND 1=1;

이 쿼리로 항상 참이므로 응답이 정상이라면 유효한 계정일 수 있습니다. 이후 다른 값을 넣어가며 정보를 추출합니다.

  • 예:
  • 시간 기반 Blind SQL Injection: 응답이 지연되는 시간을 통해 공격자가 쿼리의 결과를 유추하는 방식입니다. 예를 들어, SLEEP() 함수나 WAITFOR DELAY 명령을 사용하여 특정 조건에서만 시간을 지연시키는 방식입니다.

UNION 기반 SQL 인젝션: UNION 명령어를 사용하여 여러 쿼리의 결과를 결합할 수 있습니다. 이 기법을 통해 해커는 다른 테이블에서 데이터를 추출할 수 있습니다.

SELECT username, password FROM users WHERE username = 'admin' UNION SELECT table_name, null FROM information_schema.tables;

2. SQL 인젝션 대응 방안

SQL 인젝션은 애플리케이션 보안에서 매우 중요한 문제로, 이를 방지하려면 여러 계층에서의 예방 조치가 필요합니다. 아래는 SQL 인젝션을 방어하기 위한 상세한 대응 방안입니다.

2.1. 입력 검증 및 파라미터화된 쿼리 사용

가장 중요한 대응 방안은 사용자 입력을 절대로 SQL 쿼리에 직접 삽입하지 않는 것입니다. 이를 위해서 파라미터화된 쿼리 또는 **준비된 쿼리(Prepared Statements)**를 사용해야 합니다.

  • 파라미터화된 쿼리를 사용하면, SQL 코드와 데이터를 명확하게 분리할 수 있어 입력값이 SQL 쿼리로 해석되지 않도록 보호할 수 있습니다.

예시 (PHP와 MySQLi):

$stmt = $mysqli->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();

이렇게 하면 $username과 $password 값이 SQL 쿼리 안에서 자동으로 안전하게 처리됩니다.

2.2. 입력값 검증 및 정규화

  • 화이트리스트 검증: 사용자로부터 입력받은 값이 특정 형식을 따르는지 확인하는 것이 중요합니다. 예를 들어, 이메일 주소, 전화번호 등은 해당 형식에 맞게 검증하고, 예상되는 입력 값만을 허용해야 합니다.
  • HTML 이스케이프: 사용자 입력에서 HTML 태그나 특수 문자가 포함되었을 경우 이를 이스케이프 처리하여 XSS(교차 사이트 스크립팅) 공격을 방지합니다.
  • 정규화: 입력값에 불필요한 공백이나 특수 문자가 있을 경우 정규화하여 안전한 값으로 변환합니다.

2.3. 오류 메시지 및 디버그 정보 숨기기

공격자는 오류 메시지를 통해 데이터베이스 구조나 테이블, 열 이름을 유추할 수 있습니다. 이를 막기 위해서는 애플리케이션에서 디버그 정보에러 메시지를 사용자에게 노출하지 않도록 해야 합니다.

  • 디버그 모드 비활성화: 운영 환경에서는 디버그 모드를 비활성화하고, 오류 메시지 대신 일반적인 오류 메시지만 출력하도록 설정합니다.
  • 예시:
ini_set('display_errors', 0);  // 에러 메시지 숨기기

2.4. 화이트리스트 기반 접근 제어

  • IP 기반 제한: 관리자 페이지나 중요한 DB 쿼리는 허용된 IP 주소만 접근할 수 있도록 제한합니다.
  • ACL (Access Control List): 애플리케이션에서 중요한 데이터에 접근할 수 있는 권한을 최소한으로 제한합니다. 예를 들어, 특정 권한을 가진 사용자만 DB에 접근할 수 있도록 하고, 다른 사용자는 제한된 데이터만 접근하도록 합니다.

2.5. 데이터베이스 계정 권한 최소화

데이터베이스 계정의 권한을 최소화하여 악용의 여지를 줄입니다. 예를 들어, SELECT만 필요한 사용자에게는 SELECT 권한만 부여하고, DELETE, UPDATE, DROP 등의 권한은 제한해야 합니다.

2.6. WAF (웹 애플리케이션 방화벽) 사용

웹 애플리케이션 방화벽(WAF)은 SQL 인젝션 공격을 자동으로 차단하는 기능을 제공하는 보안 도구입니다. WAF를 사용하여 악성 요청을 탐지하고 차단함으로써 추가적인 방어벽을 구축할 수 있습니다.

2.7. 정기적인 보안 감사 및 취약점 스캐닝

정기적으로 보안 감사취약점 스캐닝을 통해 애플리케이션의 보안 취약점을 점검하고, SQL 인젝션을 포함한 여러 공격 벡터를 점검하여 미리 예방할 수 있습니다.

  • 툴 사용 예시: OWASP ZAP, Burp Suite, Nikto와 같은 도구를 사용하여 SQL 인젝션과 같은 보안 취약점을 자동으로 탐지할 수 있습니다.

결론

SQL 인젝션은 여전히 많은 웹 애플리케이션에서 발견되는 중요한 보안 취약점입니다. 이를 방지하기 위해서는 입력 검증, 파라미터화된 쿼리 사용, 디버깅 정보 숨기기, 최소 권한 원칙 등을 철저히 준수해야 합니다. 보안은 다층 방어가 중요하므로, 여러 가지 방법을 조합하여 강력한 보안 체계를 구축하는 것이 필수적입니다.

728x90
반응형

+ Recent posts