정보보안 전문가를 꿈꾸며 작성하는 블로그입니다.

SK 쉴더스 루키즈

[SK 쉴더스] 애플리케이션 보안 2일차 - Web Hacking 실습 2

minjoo 2022. 9. 17. 16:08

1. XSS(Cross Site Scripting)

- 웹 애플리케이션을 이용하여 다른 사용자에게 악성코드를 보내는 데 사용

- 스크립트를 활용

- 스크립트는 공격자가 작성하므로 다양한 공격 가능

 

1.1 DBD 공격유형 (Dirve By Download)

- 악성코드를 자연스럽게 다운로드 하도록 유도함

- 스크립트 자체는 악성코드 x → 보안 솔루션에 탐지되지 않고 정상동작

- 스크립트는 악성코드를 다운로드 하도록 함

- 악성코드가 실행되면 랜섬웨어 또는 트로이 목마 등이 동작

 

1.2 XSS로 cookie 값을 훔치는 방법

- 방문자의 웹 브라우저가 스크립트가 있는 페이지를 방문하면, 스크립트가 쿠키를 공격자 컴퓨터로 전송

- 공격자는 자신의 쿠키를 지우고 전송받은 쿠키로 교체

- 공격자가 해당 웹사이트에 접속하면 로그인 된 상태

→ 대응방법 : 쿠키에 IP 주소를 난독화해서 넣으면 어디서 접속했는지 검증 가능, 다른 IP에서 접속하면 비정상

 

2.  XSS 실습

2.1 DVWA - XSS Reflected

- 사용자가 입력한 값을 그대로 실행시켜 사용자에게 보여줌

① Low - 실행됨

<script>alert('xss')</script> 입력

② Medium

<script>alert('xss')</script> 입력

- <script> 태그 사라지고 alert('xss')만 남음

- view source를 이용해 소스코드 확인

DBWA XSS(reflected) medium 소스코드

- str_replace 함수가 '<script>'를 Null로 치환하고 있음

→ 우회방법1 : <script> 라는 문자열을 치환하고 있으므로 <Script> 등 대소문자를 섞어서 사용

<Script>alert('xss')</script> 입력

→ 우회방법2 : 불필요한 속성 추가  ex) <script img=x>alert('xss')</script>

→ 우회방법3 : 공백 추가  ex) <script >alert('xss')</script>  // 태그는 속성 추가가 가능하므로 공백이 구분자 역할

→ 우회방법4 : 스크립트 태그를 중첩  ex) <scr<script>ipt>alert('xss')</script>

※ str_replace() 함수와 같이 치환방법을 사용하는 것은 우회할 수 있는 방법이 많이 있음(좋은방법이 아님)

→ 우회방법 5 : 정규식 사용  ex) preg_replace() 함수

→ 가장 적절한 우회 방법 : Secure Coding 함수 적용

     - htmlspecialchars() 함수 : html 태그로 변환하는 함수
       < → &lt; , > → &gt; , & → &emp; , " → &quot; , ' → &#039; 로 변환

       → 웹브라우저를 통해 볼 때는 정상적으로 보이지만 스크립트는 실행되지 않음

 

2.2 DVWA - XSS Stored

- 스크립트를 DB에 저장했다가 방문자의 웹브라우저에서 동작하도록 만드는 방식

- 게시판, 방명록 등에 스크립트가 저장되는 방식

 

1) Low

- Message 란에 스크립트코드 입력 시 정상 동작

2) Medium

- View Source를 보면 message부분은 secure coding 3중 방어를 하고있음, name부분은 <script>를 null로 치환

→ message부분에 스크립트 삽입은 불가

- name 부분에 스크립트를 삽입하려고 보니, 10글자 제한(클라이언트에서 입력 제한)

→ 개발자도구(F12)를 이용해 10글자 제한 해제(maxlength=10을 수정)

 

2.3 DVWA - XSS Stored(Medium) - Client의 요청을 Proxy에서 수정해서 전송

- Burp Suite에서 proxy 메뉴를 누르고 intercept on (인터넷 연결 속성에서 LAN 설정-프록시ON)

- 이름에 abcde, 내용은 12345를 입력하고 Sign Guestbook

 Burp Suite에 intercept

- abcde를 지우고 스크립트 삽입 후 forward클릭, intercept off

 스크립트가 실행됨을 확인

* Proxy 도구

- Server와 Client의 사이에 존재하는 것

- Server에게는 Client인 척하고, Client에게는 Server인 척함

- Server에 가까우면 Server의 부담을 줄여줌

- Internet에 있으면 Client의 IP주소를 숨겨줌

- Client에 가까이 있으면 방화벽의 역할 또는 http 요청을 조작할 수 있음

- 대표적 도구 : Burp Suite, Paros Proxy(소스코드 공개, 커스터마이징 가능), charley, Fiddler2, Achilles 등

- Firewall 역할도 함 : 데이터 내용을 모두 감시하고 전달

- Local Proxy : 컴퓨터 안에 설치한 Proxy, 공격자가 자신의 트래픽을 Proxy에서 확인, 조작 가능

- Internet Proxy : Client의 IP를 숨겨줌

 

* Burp Suite

- Burp : 트림, Suite : 여러개를 붙여놓음

 

* 모의 해킹 및 실제 해킹 상황에서 약 1/4은 F12(개발자도구) 또는 Proxy 도구로 풀림

 

3. 난독화

- 원래 목적 : 개발자들이 내부 정보를 숨기기위함

- 공격자들이 자신이 만든 스크립트의 내용을 숨기기 위한 목적으로 난독화 사용

- DBD를 위한 스크립트의 경우, 악성코드가 있는 서버의 URL, IP주소, 악성코드의 이름 등이 들어있음

(IP주소, URL을 파악하면 방화벽의 블랙리스트에 추가 → 악성코드 유포지를 방문하지 않게 됨)

- 난독화는 생소한 인코딩에 복잡한 함수를 포함한 것 → 사람은 읽을 수 없지만 웹브라우저는 읽을 수 있음

- 난독화에 사용되는 함수

1) unescape() : escape 처리된 문자들을 원래대로 되돌리는 함수

2) eval() : 연산을 수행하는 함수

3) String.fromCharCode() : 10진수를 ASCII로 변환하는 함수

ex) test 문자열을 사용하지 못할 때

String.fromCharCode(116,101,115,116) (=test)

 

3.1 인코딩, 디코딩

- 인코딩 : 컴퓨터가 이해하기 쉽도록 변환

- 디코딩 : 사람이 이해하기 쉽도록 변환

- ASCII : 7bit(2의 7승), 128개의 문자 표현 가능 - 대문자, 소문자, 숫자, 특수문자, 기능 등을 표시하기 위한 언어

- Unicode(16bit)

* 한글을 표시하는 방법

- EUC-kr : MS에서 사용하는 한글 인코딩

- UTF-8 : Web, DB, Linux 등에서 한글 인코딩

- Base64 : 64진법(2의 6승, 6bit를 2bit 단위로 3개씩 사용), 3배수자리가 되지 않는 경우 패딩(=) 사용

* Base64의 특징

- 원문보다 인코딩 후에 약 1.4배 정도의 크기로 증가하게 됨

- 문자를 3,6,9자리 단위로 맞추기때문에 모자라는 글자는 =(패딩)을 추가함

- 3,6,9자리는 패딩 사용x

- 2,5,8자리는 패딩 1개 사용

- 1,4,7자리는 패딩 2개 사용

- Hex : 16진수

* 16진수 : 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

- 구분자로 주로 % 사용

- 16은 2의 4승이므로 4bit, 4bit 두개는 8bit = 1byte

- %(구분자)를 1byte단위로 사용하므로 %hexhex 패턴을 사용 ex) %0D

- 구분자로 /x를 사용하기도 함 ex) \x0D

 

* UCS(Universal Character Set, 범용 문자 집합)

* UCS2는 16비트를 사용하므로 4자리 단위로 표현 ex) \x09ae, %u1a3c

- UCS에서는 구분자를 %u를 사용하기도 함

 

* <script> </script> 태그에서 '<' 와 '>' 태그를 막는것을 우회하는 방법

- charset을 UTF-7로 사용 → chrome, Edge는 코드가 그대로 보임(실행x), Internet Explorer에서는 경고창이 뜨고 승인시 스크립트 실행

- < 는 +ADw-로, > 는 +AD4-로 사용하면 <script>문이 정상적으로 실행됨(브라우저가 자동으로 번역해 실행)

 

3.2 악성코드 분석 방법

- 정적 분석 : 소스코드, 외형, 사용된 함수 등을 보고 악의적인 행위를 하는지 예상

- 동적 분석 : 실제로 악성코드를 실행해 어떤 악의적인 행위인지 확인

 

4. 실습 준비) Malzilla 1.2.0 설치

- 난독화 해제 도구

 

4.1 난독화 해제 실습 1 - 스크립트 태그를 제외한 부분 난독화 해제

- e부터 ;까지 복사해서 Malzilla의 decoder에 복사 → run script

→ 악성코드 유포지(피싱사이트) url 알아냄

 

4.2 난독화 해제 실습 2

- eval() 함수 : 괄호 안의 내용을 동작시킴

- evla로 이름을 바꾸고 동작 (바꾸지 않고 실행하면 스크립트가 실제로 실행됨)

- 악성코드 유포지의 url 주소 확인 가능

  

4.3 난독화 해제 실습 3

- 복사해서 Malzilla Misc Decoders에 붙여넣기

- concatenate : 잘라져있는 부분을 붙여줌

- 구분자 %u , 2바이트 : UCS2

- UCS2 → Hex(Misc Decoder), Hex → ASCII(Hex View) 과정을 거쳐 난독화 해제

→ 악성코드 유포지의 URL 확인 가능

 

4.4 난독화를 해제하는 방법

- 최대한 정리해서(전처리) Hex로 변환하고 Hex를 ASCII 또는 UTF-8로 변환

 

4.5 Mal.js 파일에 숨어있는 비밀내용

Mal.js

- Malzilla에서 eval() 함수를 evla로 변경 후 스크립트 실행

- " " 안의 내용이 Mal의 내용이므로 난독화 해제

- 중간중간 "," 부분을 제거하기위해 "," 을 공백으로 replace

- 정리된 Hex를 ASCII로 변환

Hex → ASCII로 변환

- 표시된 부분이 =(패딩)이 사용된 base64 인코딩 된 문장으로 보이므로  base64 디코딩

U부터 == 부분 디코딩 결과

→ 숨겨진 패스워드 확인 가능

 

● 공격 스크립트의 약 90%는 난독화를 이용

 

* Deface 공격 : 웹사이트의 첫 페이지를 바꾸는 공격

- 이미 해킹이 다 되어있는 상태에서 D-Day에 이미지만 바꾸는 것