SQL Injection 공격
SQL이란?
관계형 데이터베이스에 정보를 저장하고 처리하기 위한 프로그래밍 언어이다.
SQL Injection이란?
웹 애플리케이션과 데이터베이스 간의 연동에서 발생하는 취약점으로, 공격자가 입력 폼에 악의적으로 조작된 쿼리를 삽입하여 데이터베이스 정보를 불법적으로 열람하거나 조작할 수 있는 취약점
공격 유형
1. Error based SQL Injection: 논리적 에러를 활용한 SQL 인젝션
인증 우회를 위해 논리적 에러를 유도하는 방식의 공격 기법이다.
2. Union SQL Injection: UNION 명령어를 활용한 SQL 인젝션
공격자가 추가적인 쿼리를 삽입하여 정보를 획득하는 기법으로, UNION 명령어를 이용하여 여러 쿼리를 합치는 방식을 이용한다.
3. Blind SQL Injection: Boolean based SQL
서버의 반응을 통해 정보를 얻는 SQL 공격 기법으로, 오류 메시지의 자세한 내용이 없어도 공격이 가능하다.
4. Stored Procedure SQL Injection
저장 프로시저는 쿼리를 묶어 하나의 함수처럼 실행하는데, 공격자가 저장 프로시저에 악성 코드를 삽입하여 실행하는 SQL 공격 기법이다.
SQL Injection 공격
공격 대상 페이지 확인
DVWA 에 접속한 상태에서 좌측 메뉴 중 SQL Injection을 클릭한다. 우측에 나타난 User ID 입력 칸에 숫자 1을 입력한 후 User ID 기반 조회를 위해 Submit 버튼을 클릭한다.
위와 같이 User ID = 1에 해당하는 정보가 출력되는 것을 확인할 수 있다.
SQL Injection 공격
위의 User ID 기반 사용자를 조회할 수 있었던 페이지를 대상으로 SQL 공격을 수행해보았다.
User ID 입력칸에 숫자 대신 위와 같은 ' OR 1=1 #라는 SQL Injection 코드를 입력한 후 Submit 버튼을 클릭한다.
※ ' OR 1=1 #
기본적인 우회 방법으로 예를 들어, 로그인 시스템에서 사용자 이름과 비밀번호를 검증하는 SQL 쿼리가 아래와 같다면
SELECT * FROM users WHERE username = 'user' AND password = 'pass';
여기서 username 입력란에 ' OR 1=1 #를 삽입하면 쿼리는 아래와 같이 변환된다.
SELECT * FROM users WHERE username = '' OR 1=1 # ' AND password = 'pass';
이 쿼리에서 1=1은 항상 참이므로, username 조건이 무시되고 주석 기호(#) 이후는 해석되지 않는다. 결과적으로 쿼리는 모든 users 테이블의 데이터를 반환하게 되어 인증을 우회할 수 있다.
공격이 성공하였다면 위와 같이 특정 User ID 를 가진 사용자에 대한 정보 뿐만 아니라 모든 사용자에 대한 정보가 공격자가 입력한 코드에 의해 출력되는 것을 확인할 수 있다.
SQL Injection 방어 실습 - 사용자 정의 규칙
SQL Injection 공격 방어 규칙 생성
아래와 같이 미리 생성해둔 MyWAF을 선택한 후 새로운 사용자 정의 규칙을 생성한다.
내리다보면 response body를 선택해주는 칸이 있는데
AWS WAF Configuration A to Z
This workshop is designed to let customer know how to manage AWS WAF Rule to mitigate attack against web services. This workshop includes topics below - Most common web attack method - How to configure AWS WAF customer managed rule to mitigate most common
catalog.us-east-1.prod.workshops.aws
위의 자료를 참고하여 custom_denied라는 새로운 사용자 정의 응답페이지를 생성해준다.
이렇게하면 아래와 같이 SQL_Injection 규칙이 정상적으로 생성되었음을 볼 수 있다.
SQL Injection 공격 방어 확인
공격 단계에서 수행한 것과 마찬가지로 DVWA 의 SQL Injection 메뉴의 User ID 입력칸에 아래와 같은 SQL Injection 코드를 입력한 후 Submit 버튼을 클릭한다.
' OR 1=1 #
그러면 아래 그림과 같이 사용자의 요청이 사용자 정의 차단 페이지 와 함께 차단되는 것을 확인할 수 있다.
※방어 원리
- 앞서 생성한 SQL Injection 규칙은 웹 애플리케이션의 URL 요청 내에서 SQL 관련 구문을 자동으로 탐지하고 차단
- 사용자가 SQL Injection 공격을 시도할 경우 AWS WAF는 즉각적으로 해당 요청을 감지하고 차단 페이지로 응답하여 악의적인 요청이 데이터베이스에 도달하지 못하도록 함
-> DVWA에서 SQL Injection 메뉴의 User ID 입력칸에 SQL Injection 코드(' OR '1'='1 등)를 입력하면 AWS WAF가 해당 패턴을 감지하고 차단하여 SQL Injection 공격 시도를 방어한다!
SQL Injection 방어 실습 - 관리형 규칙
SQL Injection 공격 방어 규칙 생성
아래와 같이 미리 생성해둔 MyWAF을 선택한 후 새로운 AWS 관리형 규칙을 생성하기 아래와 같이 Rules 탭을 선택한 후 Add managed rule groups를 클릭한다.
화면에서 첫번째로 보이는 AWS managed rule groups를 선택하고 세부 메뉴 중 SQL database 규칙 그룹을 선택한다.
아래 그림과 같이 AWS-AWSManagedRulesSQLiRuleSet 규칙이 정상적으로 생성된 것을 확인할 수 있다.
SQL Injection 공격 방어 확인
공격 단계에서 수행한 것과 마찬가지로 DVWA 의 SQL Injection 메뉴의 User ID 입력칸에 아래와 같은 SQL Injection 코드를 입력한 후 Submit 버튼을 클릭한다.
' OR 1=1 #
아래 그림과 같이 사용자의 요청이 AWS 관리형 규칙에 의해 차단되어 403 Forbidden 페이지가 출력되는 것을 확인할 수 있다. 만약 사용자 정의 차단 페이지가 뜬다면 위에서 생성한 SQL_Injection 규칙을 삭제하고 관리형 규칙만 남기면 된다.
※방어 원리
- AWS WAF 관리형 규칙: 사전 구성된 규칙을 배포하여 애플리케이션 취약성과 같은 일반적인 위협을 쉽게 보호할 수 있는 방법인데 일반적인 SQL Injection 공격뿐만 아니라 복잡한 SQL 구문과 변형된 공격 패턴도 감지할 수 있다.
- SQL Injection 탐지 및 차단: 사용자가 입력하는 모든 데이터에서 SQL 구문과 일치하는 패턴을 실시간으로 탐지하여 차단한다. 이렇게 설정된 규칙은 SQL 관련 명령어와 유사한 입력값이 전달될 때 이를 차단하여, 공격이 데이터베이스에 전달되지 않도록 한다.
-> DVWA 애플리케이션의 SQL Injection 메뉴에서 User ID 입력란에 SQL Injection 코드(예: ' OR '1'='1 등)를 입력하고 전송하면 AWS WAF의 관리형 SQL Injection 규칙이 이를 탐지하고 차단한다.
SQL Injection 대응 방안
1. 입력값 검증
- 데이터 타입 검사
- 길이 제한
- addslashes: 입력값에 '/'와 같은 특수문자가 존재하면 특수문자로 동작하지 않도록 방지
2. 웹 방화벽 활용
- 서버에 웹 방화벽을 설치하여 공격을 탐지하고 차단
- 패턴을 기반으로 분석하여 SQL 인젝션으로 보이는 요청을 감지하고 차단
3. Prepared Statement
- DBMS 드라이버를 통해 입력값이 SQL 문장이 아닌 단순한 입력값으로 처리되도록 보장
4. 원시 에러 미출력
- SQL 인젝션과 같은 공격에서 발생하는 원시 에러를 통해 데이터베이스 구조를 추정
- 오류 메시지를 사용자에게 직접 노출하지 않도록 설정
'2024 SWLUG > 클라우드' 카테고리의 다른 글
Backdoor (0) | 2024.11.05 |
---|---|
Command Injection (0) | 2024.10.29 |
Stored XSS (0) | 2024.09.30 |
Reflected XSS (0) | 2024.09.30 |
AWS WAF 실습 환경 구성 (0) | 2024.09.23 |