SQL Injection 공격정리

1. SQL Injection이란

1.1 개념

SQL Injection(인젝션)은 웹 애플리케이션에서 사용자의 입력값을 적절히 검증하지 않을 때 발생하는 보안 취약점입니다.
공격자가 SQL 문을 조작하여 데이터베이스를 조작하거나 민감한 정보를 빼내는 공격 기법입니다.

1.2 SQL Injection 공격이 얼마나 위험할까?

  • 공격자가 로그인 우회를 통해 관리자 계정으로 로그인할 수 있습니다. 실제로 관리자 계정 관리가 허술한 경우 가장 위험한 취약점이 되는 경우가 종종 발생합니다.
  • 데이터베이스의 모든 고객 정보(이름, 이메일, 비밀번호 등)가 유출될 수 있습니다.
  • 데이터를 삭제하여 서비스 마비를 일으킬 수도 있습니다.

🚨 실제 사례:
2008년, 유명한 웹사이트 Heartland Payment Systems가 SQL Injection 공격을 당해 1억 3천만 건 이상의 신용카드 정보가 유출되었습니다.

2. SQL Injection 공격 예제

가장 일반적인 로그인 상황에서의 공격예제를 살펴보겠습니다.

🚨 취약한 로그인 코드는 다음과 같습니다. (SQL Injection 가능)

// 사용자가 GET 방식으로 입력한 값(username, password)을 받아옴
$username = $_GET['username'];
$password = $_GET['password'];

// SQL 쿼리를 문자열로 직접 작성 (취약한 코드)
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";

위 코드를 살펴보면 사용자가 입력한 값이 그대로 SQL 문에 포함되므로 공격자가 SQL을 조작할 수 있습니다.

2.1 첫번째 공격예제 – SQL Injection을 이용한 관리자 로그인 우회

공격자가 로그인 폼에서 다음과 같이 입력했다고 가정해보겠습니다.

image 21

이러면 실제 실행되는 SQL 문은 다음과 같습니다.

SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1';
  • '1'='1'항상 참(True) 이므로, 비밀번호를 입력하지 않고도 로그인에 성공하는 것을 확인할 수 있습니다.

3. SQL Injection 방어 방법

SQL Injection 공격을 방어하려면 사용자 입력값을 직접 SQL 문에 포함시키지 않아야 방어가 가능합니다.
다음과 같은 보안 조치를 적용하면 안전하게 보호할 수 있습니다.

3.1 Prepared Statement (준비된 쿼리) 사용

SQL Injection 공격이 가능한 이유는 사용자 입력값이 SQL 문에 직접 포함되기 때문입니다.
Prepared Statement는 사용자 입력값을 직접 SQL 문에 넣지 않고, 별도로 처리하여 SQL Injection을 차단하는 방식입니다.

3.2 입력값 검증 (Validation)

사용자가 입력한 값이 허용된 형식인지 확인하는 단계가 필요합니다. 예를 들어, ID는 영문과 숫자로만 입력 가능하도록 제한하는 것을 추천드립니다.

if (!preg_match("/^[a-zA-Z0-9_]+$/", $username)) {
    die("잘못된 입력값입니다.");  //입력값으로 특수문자가 포함되어있는 경우 뜨는 메시지입니다.

위와 같이 특수문자 입력을 제한하는 코드를 삽입하면 SQL Injection 차단이 가능합니다.

3.3 최소 권한 원칙 적용

웹사이트에서 데이터베이스 계정의 권한을 최소한으로 부여해야 하는 것이 보안상 좋습니다. 예를 들어, 일반 사용자는 SELECT(조회)만 가능하도록 설정하고, DROP(삭제) 같은 위험한 권한은 부여하지 않는 것을 추천드립니다.

GRANT SELECT, INSERT, UPDATE ON mydb.users TO 'webuser'@'localhost';

위 경우는 MYSQL에서의 최소 권한 적용 예제인데, DROP의 권한은 부여하지 않았기에 공격자가 Injection을 시도하여 테이블 삭제를 하는 것이 불가능합니다.

3.4 웹방화벽(WAF)사용

웹 애플리케이션 방화벽인 WAF를 적용하면 SQL Injection 공격을 자동으로 탐지하고 차단이 가능합니다. 대표적인 무료 웹방화벽으로는 ModSecurity가 있습니다. 추가적으로 IPS에서도 애플리케이션층의 공격이 차단가능하지만 개인이 IPS를 사용하는 것은 부담이 있을 수 있으므로 ModSecurity를 추천합니다.

error: 우클릭 할 수 없습니다.