본문 바로가기
AWS

[클라우드 보안] WAF DVWA 미니프로젝트 -중편-

by Nirah 2023. 2. 21.

클라우드 보안 WAF DVWA 미니프로젝트 -상편- 에 이어서 진행하겠다.

 

클라우드 보안 상-중-하편 목록

https://raid-1.tistory.com/185

https://raid-1.tistory.com/189

https://raid-1.tistory.com/190

 

 

7.공격 테스트

CloudFormation 을 통해 생성된 DVWA 웹 서버를 이용하여 웹 공격

공격방식은 일반적으로 웹 공격에 많이 사용되는 SQL Injection 공격과 XSS 공격

 

SQL Injection 공격 :  클라이언트의 반환 메시지를 이용하여 불법 인증 및 정보를 유출하는 공격.

 응용 프로그램에 강제로 구조화 조회 언어(SQL) 구문을 삽입하여 내부 데이터베이스(DB) 서버의 데이터를 유출 및 변조하고 관리자 인증을 우회할 수도 있다.

이 공격은 MS SQL 서버뿐만 아니라 모든 관계형 데이터베이스 관리 시스템(RDBMS)에서 가능하다.

xkcd   327화 'Exploits of a Mom'

 

XSS 공격 : 기본적인 수준에서 XSS 공격은 공격자가 웹 양식 또는 웹 앱 URL에 악성코드를 주입해 애플리케이션이 본래 애플리케이션의 의도와 다른 특정 작업을 실행하도록 유도하는 것이다.

예를 들어 게시판이나 웹 메일등에서 자바 스크립트같은 스크립트코드를 삽입하여 의도치않은 기능이 작동하도록 하는 공격이 있다.

공격자가 XSS공격을 통해서 쿠키정보 및 세션 ID를 획득할 수 있다.

 

1. Persistent(or Stored) XSS (지속형 혹은 저장형)
웹 애플리케이션의 취약한 곳에 악성 스크립트를 삽입 - 해당 스크립트는 DB에 저장됨
악성 스크립트가 저장된 게시글 등을 열람한 사용자들은 쿠키를 탈취당하던가 다른 사이트로 리디렉션 되는 공격 받음

2. Reflected XSS (반사형)
사용자에게 입력받은 검색어를 그대로 보여주는 곳이나 사용자가 입력한 값을 에러 메세지에 포함해 보여주는 곳 등에 악성 스크립트를 삽입 - 서버가 사용자의 입력 값을 포함해 응답할 때 스크립트 실행

3. DOM based XSS (Document Object Model 기반)
악의적인 스크립트가 포함된 URL을 사용자가 요청하게 되어 브라우저를 해석하는 단계에서 공격
악의적인 스크립트로 인해 클라이언트 측 코드가 원래 의도와는 다르게 실행됨

 

 

 

 

SQL INJECTION

SQL Injection 공격을 진행하기 위하여 DVWA 메뉴에서 아래와 같이 “SQL Injectin” 메뉴를 클릭한 후

우측의 “User ID” 를 입력하는 창에 아래의 SQL 구문을 입력한 후 “Submit” 버튼을 클릭

 
' OR 1=1 #

※ 참고로 위 공격에 사용되는 특수문자는 텝키 위에 있는 “`” 이다.

코드를 직접 입력했는데 공격이 성공되지 않으면 위 코드를 그대로 복사해서 쓰자.

 

※ 원리

User ID에 아이디를 넣고 Submit을 눌렀을 시 실행되는 SQL문은 아래와 같다

(직접 확인하고 싶으면 우분투 서버에 접속해서 ~/DVWA/vulnerabilities/sqli/source/low.php를 확인)

SELECT first_name, last_name FROM users WHERE user_id = '$id'

따라서 ' OR 1=1 # 을 주입하게 되면

SELECT first_name, last_name FROM users WHERE user_id = '' OR 1=1 #'

이렇게 된다. 여기서 #은 주석이라 뒤쪽이 다 주석처리가 되며, OR 1=1 조건은 항상 참이라는 결과를 가져오게 되므로

SELECT first_name, last_name FROM users

가 되면서 Users 테이블의 모든 레코드들의 first_name, last_name 정보들을 가져오게 된다.

 

SQL Injection 공격에 사용되는 가장 기본적인 구문 중 하나인데,

실제로 현재 사용되는 대부분의 웹 서비스는 이와 같은 간단한 SQL 구문에 대해서는 취약점이 없을 것으로 예상된다.

 

 

 

짜잔~ 다음과 같이 사설에 있어야 할 유저 계정정보들이 쫙 유출돼서 나온다.  (공격 성공)

해당 계정들은 지금 DB를 만들지 않았으니, EC2 서버 내의 계정이다.

1인 admin 의 정보만 보여야 하지만 Gordon 부터 Bod까지 더 많은 이름들이 출력된다. 이 자체가 취약점이다

 

 

XSS EXPLOIT

실제로 발생하는 다양한 웹 서비스 공격방식 중 하나인 XSS Exploit 공격을 진행하도록 다.

DVWA 메뉴에서 아래와 같이 “XSS(Reflected)” 메뉴를 클릭한 후 우측의 “User ID” 를 입력하는 화면에서 아래의 XSS 코드를 입력한 후 “Submit” 버튼을 클릭

 

<script>alert(document.cookie)</script>

 

 

 

참고로 EC2 내부의 user ID 입력창 관련 소스코드는 아래와 같다.

(직접 확인하고 싶으면 우분투 서버에 접속해서 ~/DVWA/vulnerabilities/xss_r/source/low.php를 확인)

<?php

header ("X-XSS-Protection: 0");

// Is there any input?
if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
    // Feedback for end user
    echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
}

?>

이 코드는 원래 내 user ID를 쓰면 Hello 이름 이런식으로 나오는 코드다

여기에 아까 그 코드가 적용되면

<?php
  header ("X-XSS-Protection: 0");

  // Is there any input?
  if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) {
      // Feedback for end user
      $html .= '<pre>Hello ' . <script>alert(document.cookie)</script> . '</pre>';
  }
?>

가 되면서 document의 쿠키 정보를 경고창으로 보게 된다

여기선 우리가 쉽게 보려고 경고창으로 띄운거지만, 실제 공격에선 자신이 설정한 URL로 쿠키 값이 전송되게 하는 등의 방식이 사용된다.

 

 

 

 

 

“Submit” 버튼을 클릭하면 아래와 같이 경고창이 나타나며 경고창에는 쿠키 정보가 포함되어 있다.

이 경고창은 조금 전 입력한 XSS 코드에 의하여 생성된 것으로,

취약한 시스템에서의 쿠키 정보를 탈취하는 것을 손쉽게 시연하기 위하여 경고창 방식을 사용했다.

경고창의 “OK” 버튼을 클릭하면 아래와 같이 XSS (Reflected)화면에 Hello 라는 문자가 출력된 것을 확인 (공격 성공)

 

 

 

 

 

8. WAF로 방어

공격을 당해 봤으니, 이제 방어도 해보자.

SQL Injection과 XSS 공격은 AWS에서 제공하는 rule group으로 간단하게 막을 수 있다

  • AWS WAF 를 이용하여 웹 액세스 제어 목록(웹 ACL)을 생성하고 필요한 Rule을 추가하는 방법
  • AWS Manaed Rule을 이용해서 이전 실습에서 진행하였던 SQL Injection 공격과 XSS 공격을 차단
  • custom Rule을 이용해서 특정 국가 및 특정 user-agent 에서 유입되는 트래픽을 차단

 

AWS Managed Rule 추가

Web ACL 에 Rule 을 적용하기 위해서는 Rule 이나 Rule Group 을 생성해야 한다.

관리자는 적용하고자 하는 목적에 따라 AWS 가 관리하는 AWS Managed Rule 을 사용하거나 3rd Party 파트너가 제공하는 관리형 Rule Group 을 사용할 수도 있다.

아니면 Managed Rule 이나 Rule Group 을 사용하지 않고 공격 타입별로 각각의 Rule 을 생성한 후 Web ACL 에 적용할 수도 있다.

 

 

AWS managed rule groups 외에는 마켓플레이스에서 사서 사용하는 애들이다

Core rule set으로 XSS 공격을, SQL database로 SQL Injection을 막을 수 있다

나머지 AWS managed rule groups 정보 확인

 

 

Core rule set rule group 에는 일반적으로 웹 애플리케이션에 적용할 수 있는 Rule이 포함되어 있다.

이러한 규칙은 OWASP 발행물 및 수많은 CVE(일반적인 취약성 및 노출도)에 설명된 취약성을 포함하여 광범위한 취약성을 악용하는 일이 없도록 보호한다.

 

SQL database rule group 에는 SQL 주입 공격과 같은 SQL 데이터베이스 악용과 관련된 요청 패턴을 차단하는 Rule이 포함되어 있다.

이렇게 하면 승인되지 않은 쿼리가 원격으로 삽입되는 것을 방지할 수 있다.

 

자세한 사항은AWS DOCS를 참고

 

 

여기서 뭐 선택하지 말고 세이브를 누른다.

 

 

 

적용한 Rule 테스트

적용한 Rule들이 정상적으로 동작을 하는지 확인하기 위해 앞서 모듈 1에서 구성했던 DVWA 웹에 접속해서 모듈 2에서 실행했던 SQL injection  XSS exploit를 재시도 한다.

 

 

  •  SQL injection 

이전 과정에서 차단되지 않았던 SQL injection 구문이 “403 Forbidden” 메시지와 함께 차단

 

 

  •  XSS exploit

 XSS exploit 구문 역시 “403 Forbidden” 메시지와 함께 차단

 

 

 

 

 

 

 

=======================================================================================

9. CUSTOM RULE 추가 

  1. 국가별 IP 정보를 기준으로 특정 국가 유입 트레픽 차단
  2. AWS WAF에서 제공하는 문자열 일치 기반으로 특정 user-agent로 유입되는 트래픽을 차단

 

 

1. 국가별 IP 정보를 기준으로 특정 국가 유입 트레픽 차단

 

Chrome Extension 설정

차단 설정을 하기에 앞서 사용자의 PC 에서 발생하는 트래픽이 특정 국가에서 발생되는 것처럼 환경을 설정하기 위하여 이전 단계에서 설치하였던 Chrome Extension 을 사용

 

크롬 브라우저에서 Browsec VPN 을 선택한 후 아래와 같이 “OFF” 를 “On” 으로 변경한 후 “Change” 버튼을 클릭하여 사용하고자하는 국가를 선택한다. (Singapore 를 선택했다)

일단 이 상태에서 DVWA 페이지가 정상적으로 접속이 되는지 확인한다.

싱가폴에서 접속을 해도 잘 들어와진다.

 

 

 

Rule 추가

페이지가 정상적으로 접속이 된다면 이번에는 Singapore 에서 유입되는 트래픽을 차단하는 Rule을 Web ACL 에 추가. Web ACL 에 새로운 Rule 을 추가하기 위하여 아래와 같이 선택한 Web ACL 의 상세 화면 중 상단의 “Rules” 를 선택한 후 화면 우측의 “Add rules” 메뉴를 클릭한다.

이 메뉴를 클릭하면 하위 메뉴를 확인할 수 있는데 하위 메뉴 중 “Add my own rules and rule groups” 메뉴를 클릭한다.

이 메뉴를 선택하면 새로운 WAF Rule 을 생성하거나 미리 만들어 둔 Rule Group 을 Web ACL 에 추가할 수 있다.

새로운 Rule 을 생성하기 위하여 다음과 같이 여러 옵션들을 정의한다.

아래 3가지를 제외한 나머지는 모두 기본값으로 선택한다.

  1. Name = 임의의 이름 입력 (ex. SG-Block)
  2. Inspect = Originates from a country in 선택
  3. Country Codes = Singapore - SG 선택

 

생성하려고하는 Rule 의 Default Action 이 Block 인 것을 확인한 후 “Add Rule” 버튼을 클릭

 

참고로 특정 국가에서 들어오는 ip만 막을수 있는 것 뿐만 아니라, 헤더, 라벨, 쿠키 등등

막을수 있는 조건은 많으므로 적절한 것을 선택하자.

별도의 Priority 설정이 필요 없으므로 “Save” 버튼을 클릭하고 새 룰 생성 확인

아래 화면과 같이 생성된 Rule 이 901 WCU 을 점유하는 것을 확인

 

적용한 Rule 테스트

  • 이제 Singapore 에서 발생하는 트래픽을 차단할 수 있는 Rule 이 Web ACL 에 추가되었으므로 크롬 브라우저에서 다시 한 번 DVWA 로 접속해보도록 한다.
  • 모든 설정이 정상적으로 이뤄졌다면 아래와 같이 “403 Forbidden” 메시지와 함께 차단된 것을 확인할 수 있다.

국가별 차단 기능을 확인하였으므로 Browsec 를 “Off”하자.

 

 

 

 

 

 

2. AWS WAF에서 제공하는 문자열 일치 기반으로 특정 user-agent로 유입되는 트래픽을 차단

차단 설정을 하기에 앞서 사용자의 PC 에서 발생하는 트래픽이 user-agent 로 유입되는 것처럼 환경을 설정하기 위하여 이전 단계에서 설치하였던 Chrome Extension 을 사용하겠다.

크롬 브라우저에서 User-Agent Switcher 을 선택한 후 아래와 같이 “iOS” 와 “iPhone6”을 차례대로 선택한다.

 

 

이제 이 상태에서는 브라우저에서 발생하는 모든 트래픽은 iPhone6 라는 user-agent를 헤더로 트래픽이 전송된다.

이 상태에서 DVWA 페이지가 정상적으로 접속이 되는지 확인한다.

 

 

Rule 추가

해당 user-agent 로 유입되는 트래픽을 차단하는 정책을 Web ACL 에 추가한다.

Web ACL 에 새로운 Rule 을 추가하기 위하여 아래와 같이 선택한 Web ACL 의 상세 화면 중 상단의 “Rules” 를 선택한 후 화면 우측의 “Add rules” 메뉴를 클릭한다.

이 메뉴를 클릭하면 하위 메뉴를 확인할 수 있는데 하위 메뉴 중 “Add my own rules and rule groups” 메뉴를 클릭한다.

 

  • 새로운 Rule 을 생성하기 위하여 다음과 같이 여러 옵션들을 정의한다. 아래 3가지를 제외한 나머지는 모두 기본값으로 선택한다.
    1. Name = 임의의 이름 입력 (ex. iphone-Block)
    2. Inspect = Header 선택
    3. Header Field Name = User-Agent 입력
    4. Match Type = Contains String 선택
    5. String to match = iphone 입력
    6. Text Transformation = Lowercase 선택 (대소문자 상관 없이 검사)

 

 

생성하려고하는 Rule 의 Default Action 이 Block 인 것을 확인한 후 “Add Rule” 버튼을 클릭

 

 

적용한 Rule 테스트

  • 이제 특정 user-agent로 발생하는 트래픽을 차단할 수 있는 Rule 이 Web ACL 에 추가되었으므로 크롬 브라우저에서 다시 한 번 DVWA 로 접속한다.
  • 모든 설정이 정상적으로 이뤄졌다면 아래와 같이 “403 Forbidden” 메시지와 함께 차단된 것을 확인한다.

 

문자열 일치 기반 차단 기능을 확인하였으므로 User-Agent Switcher 를 아래와 같이 원복 한다.

 

 

 

 

 

 

 

 

 

 

 

====================================================================================

부록 ++++++) custom Rule 작성 시 참고 사항

공식 문서 참조

3-1) If a request

 

If a request에서 Statement에 대한 사항을 AND, OR, NOT으로 지정해줄 수 있다

AND나 OR로 지정한다면 Statement를 한번에 여러개 만들수있다

3-2) Inspect

 

위의 2개는 국가나 IP로 제한하는거고, 아래의 Request Components들에 대해 알아보자면

이름 설명
Header 특정 요청 헤더
Header field name에 특정 필드 이름을 넣으면 된다
필드 종류는 HTTP 헤더 검색해보기
Single query parameter 쿼리 문자열의 일부로 정의한 모든 파라미터. WAF는 지정한 파라미터의 값을 검사함
Query argument도 정해줘야 함
All query parameter Single query parameter와 유사하지만, WAF가 쿼리 문자열 내의 모든 매개변수 값을 검사함
규칙 비용에 10 WCUs 추가됨
URI path 리소스를 식별하는 URL의 부분
Query string ? 문자 뒤에 나타나는 URL의 부분 (?가 있을 때)
Body 요청 헤더 바로 뒤에 오는 요청 부분
여기엔 웹 요청에 필요한 추가 데이터가 포함됨
HTTP method 웹 요청이 오리진에게 수행을 요구하고 있는 작업 유형을 나타냄

3-3) Text transformation

 

패턴 또는 집합 제약 조건을 찾는 문에서 요청을 검사하기 전에, WAF에서 적용할 변환을 제공할 수 있다

각 변환은 10WCU다

이름 설명
Compress whitespace 여러 공백을 하나의 공백으로 바꾸고 공백 문자로 바꿈
ex) \t를 tab으로, \n을 새 줄로
HTML entity decode HTML로 인코딩된 문자를 디코딩
ex) %quot를 "로 바꿈
Lowercase 소문자로 변환 - 즉 대문자/소문자 구분 없이 보겠다는 뜻
Command line 공격자가 OS CLI 명령을 삽입하는 등 명령의 일부 또는 전체를 위장하는 상황 완화
ex) \ " ' ^ 문자 삭제
URL decode URL로 인코딩된 요청을 디코딩

 

 

클라우드 보안 WAF DVWA 미니프로젝트 -하편- 에 이어서 진행해보도록 하겠다.