[웹 보안] SQL Injection / DVWA 실습 / 방어방법

비전·2024년 9월 20일

웹 보안

목록 보기
5/5
post-thumbnail

모든 해킹 실습은 본인 소유 시스템에서만 해야 합니다. 타인의 시스템을 침해하는 행위는 불법이며, 법적 처벌을 받을 수 있습니다.

1. SQL Injection이란?

SQL Injection( SQL 인젝션)은 공격자가 애플리케이션의 입력 필드에 악성 SQL 코드를 삽입하여 데이터베이스를 조작하거나 민감한 정보를 유출하는 공격 기법입니다. 이를 통해 인증 우회, 데이터 삭제, 데이터베이스 구조 변경 등의 피해를 초래할 수 있습니다.

2. DVWA 환경에서 SQL Injection 실습

2-1 정상적인 입력

user ID인 1을 입력했을 때 그 유저에 대한 정보를 출력하는 것을 볼 수 있습니다.
출력된 정보가 First name과 Surname 입니다.
그렇다면 데이터베이스 쿼리문을 예측할 수 있습니다.

SELECT first_name, surname FROM [테이블명] WHERE user_id = '[입력값]';

2-2 SQL 공격

'or 1=1--

위 입력값을 입력하면 최종적으로 쿼리문은 아래와 같이 만들어집니다.

SELECT first_name, surname FROM [테이블명] WHERE user_id = ''or 1=1--';

그렇다면 SQL은 --를 주석으로 인식하기 때문에 컴퓨터는 최종적으로

SELECT first_name, surname FROM [테이블명] WHERE user_id = ''or 1=1

라는 입력을 받을 것이고 이것은

user_id가 빈 문자열 또는 항상 참인 조건(1=1)이 성립하므로 모든 사용자의 firstname과 surname이 조회됩니다.

' OR '1'='1

또는 위 코드와 같은 문자열 또한 SQL 공격이 될 수 있습니다.

DB 내의 모든 user_id에 대한 이름이 출력되는 것을 알 수 있습니다.

3. 방어 방법

  • 파라미터화된 쿼리 사용
    Prepared Statements: SQL 쿼리를 작성할 때 사용자 입력을 직접 포함시키지 않고, 파라미터를 사용하는 방법입니다. 이는 입력값을 자동으로 이스케이프 처리하여 SQL Injection을 방지합니다.
// 예시 (Python)
cursor.execute("SELECT * FROM users WHERE user_id = ?", (user_id,))
  • ORM 사용
    Object-Relational Mapping (ORM) 라이브러리를 사용하여 SQL 쿼리를 안전하게 생성합니다. ORM은 SQL 인젝션을 방지하는 데 효과적입니다.

  • 입력 값 검증 및 필터링
    사용자 입력을 철저히 검증하고, 허용된 형식과 범위에 맞지 않는 입력은 차단합니다. 특히, 특수문자나 SQL 예약어를 필터링합니다.

  • WAF 사용
    WAF를 사용하여 악성 요청을 차단하고, SQL Injection 공격을 탐지하는 데 도움을 줍니다.

profile
아는 만큼 보인다

0개의 댓글