본문 바로가기
공부/AWS

[AWS WAF] #2 SQL Injection & XSS 공격과 방어 (AWS managed rule)

by haejang 2021. 2. 25.
728x90
728x90

목차

1. SQL Injection 공격/설명

2. XSS (Reflected) 공격/설명

3. WAF로 방어

 

※ 시작 전에!

첫번째 글에서 깔았던 크롬 확장 도구인 Browsec VPN을 ON 한 상태로 시작하겠다

 

나라는 아무데나 선택 - 프리미엄 붙은건 돈 나감

 

우리나라에서 뭘 많이 막아논건지 뭐가 문젠진 모르겠지만 암튼 그냥 공격하면 안먹힘

 

 

1. SQL Injection

1-1) 일단 공격해보기

DVWA의 SQL Injection 탭으로 이동해서

 

 

' OR 1=1 #

을 작성해서 Submit을 눌러보자

 

 

여러 계정 정보들이 출력된다 (공격 성공)

1-2) 공격 설명

📌 SQL Injection이란?

악의적인 사용자가 보안상의 취약점을 이용하여 임의의 SQL문을 주입하고 실행되게 해 데이터베이스가 비정상적인 동작을 하도록 조작하는 행위

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 정보들을 가져오게 된다

 

2. XSS (Reflected)

2-1) 일단 공격해보기

XSS (Reflected) 탭으로 가서

 

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

를 작성해서 Submit을 눌러보면

 

 

쿠키 정보가 포함된 경고창이 나타난 후

 

 

Hello라는 문자가 출력된 걸 확인할 수 있다 (공격 성공)

2-2) 공격 설명

📌 XSS (Cross-Site Scripting) 란?

웹 애플리케이션에서 일어나는 취약점으로, 해당 사이트에 접속하는 유저들의 정보를 탈취하는 공격 기법
종류 : Persistent(or Stored), Reflected, DOM based

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

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

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

이름을 쓰고 Submit을 눌렀을 시 적용되는 코드는 아래와 같다

(직접 확인하고 싶으면 우분투 서버에 접속해서 ~/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
      $html .= '<pre>Hello ' . $_GET[ 'name' ] . '</pre>';
  }
?>

원래는 내 이름을 쓰면 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로 쿠키 값이 전송되게 하는 등의 방식이 사용된다

 

3. WAF로 방어

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

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

3-1) WAF 룰 설정

저번 글에서 생성한 WAF의 Web ACLs로 들어와 Rules 탭으로 들어가보자

 

 

Add rules > Add managed rule groups로 들어와서 AWS managed rule groups를 눌러주자

 

 

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

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

나머지 AWS managed rule groups 정보 확인

 

※ rule들에 대한 action은 기본적으로 다 Block되어있다
이 때 Set rules action to count를 활성화하면 해당 룰에 대해선 차단이 아닌 모니터링을 할 수 있게 된다
(본 실습에선 필요 없음)

 

Add rules > Save 눌러서 완료해준 후 잘 적용되었는지 확인

 

3-2) 차단 확인

다시 DVWA의 SQL Injection 탭으로 돌아온 뒤

' OR 1=1 #

을 넣어보면

 

403으로 막혔다 (방어 성공)

 

XSS (Reflected) 탭에서도

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

똑같이 넣어주면

 

역시 403으로 잘 막혔다 (방어 성공)

참고로 위 두 캡처본의 URL을 보면 어떤 공격을 했던 캡처본인지 알 수 있다

 

 

실습 시리즈

#0 실습 전 준비

#1 사전 리소스들과 WAF 구성

#3 특정 국가 or User-Agent 차단 (custom rule)

#4 JSON으로 WAF Rule 직접 작성해보기

#5 실습 마무리 : 로깅 확인 & 리소스 삭제

728x90
728x90

댓글