본문 바로가기
Web Hacking/Bee-Box

[ Bee-Box ] HTML Injection - Reflected(GET)

by 코뮤(commu) 2020. 3. 27.
728x90
반응형

 

 

 

 

HTML 인젝션이란?

 

 

HTML 인젝션은 일종의 코드 인젝션 공격입니다.

HTML 인젝션의 기법은 크게 두가지로 나뉩니다.

 

 

 

  • 반사(Reflected) 기법
  • 저장(Stored) 기법

 

 

 

 

 

 

반사(Reflected) 기법

 

HTML 인젝션 - 반사기법은 URL에 악의적인 HTML 태그를 삽입해서

링크를 클릭한 사용자의 PC에서 HTML 태그가 실행되게 하는 공격입니다.

 

 

 

 

저장(Stored) 기법

 

HTML 인젝션 -저장기법은 악의적인 HTML 태그를 데이터베이스에 저장해서

저장된 태그 내용을 확인한 사용자의 PC에 HTML태그가 실행되게 하는 공격입니다.

 

 

 

 

반사기법 vs 저장기법

 

반사기법과 저장기법의 가장 큰 차이점은 악의적인 HTML 태그의 삽입 위치입니다.

반사기법URL에 태그를 삽입하고, 저장기법데이터베이스에 삽입합니다.

 

 

 

 

 

 

 

 


 

 

 

 

이제 직접 비박스에서 실습을 해봅시다!

호스트에서 비박스를 실행하는 방법을 모른다면 앞전의 포스팅을 보고오시는 것을 추천드립니다 ㅎㅅㅎ

 

 

 

 

 

 

 

아이디에 bee, 비밀번호에 bug를 쳐서 로그인합니다.

 

 

HTML Injection (GET) 항목을 선택하고 HACK 을 누릅니다.

 

 

 

 

 

HTML Injection - Reflected(GET) low(하) 단계

 

 

 

 

 

 

 

이 페이지는 가장 낮은 단계로 사용자가 입력한 값을 그대로 출력하는데,

입력값을 검증하는 코드가 누락되어 있어 관리자가 의도하지 않은 내용을 출력할 수 있는 취약점이 존재합니다.

 

 

 

h1 태그를 이용해서 확인해보도록하겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

h1 태그가 인식되는 것을 알 수 있는데요,

 

url에서도 firstname, lastname 이라는 취약한 변수가 노출되는 것을 확인할 수 있습니다.

 

 

 

 

http://192.168.100.198/bWAPP/htmli_get.php?firstname=hello&lastname=%3Ch1%3Eworld%21%3C%2Fh1%3E&form=submit

 

 

 

공격자는 이러한 주소의 형태로 사용자들에게 유도할 수 있고,

저 링크를 클릭한 사용자는 서버가 의도하지 않은 내용을 출력하게 됩니다.

 

 

 

 

 

 

 

HTML Injection - Reflected(GET) medium(중) 단계

 

 

 

 

 

 

 

 

우측 상단의 Set your security level을 medium으로 세팅을 해서

난이도 중을 선택해보도록 하겠습니다.

 

 

 

초반에 했던대로, h1 태그를 이용해서 확인해보도록 하겠습니다.

 

 

 

 

 

 

 

난이도 중은 <h1></h1> 을 html 태그가 아닌 문자로 인식하는군요.

 

 

우회과정을 확인하기 위해서 서버에서 코드를 찾아보도록하겠습니다.

 

 

 

소스파일은 /var/www/bWAPP 경로에 존재합니다.

 

 

 

 

 

터미널창을 열어서

cd /var/www/bWAPP

vim htmli_get.php

 

명령어를 입력합니다.

 

 

 

 

 

그럼 htmli_get.php 파일을 볼 수 있습니다.

 

 

 

 

 

 

 

소스코드를 살펴보니

low 난이도는 no_check() 라는 함수를 통해서,

medium 난이도는 xss_check_1() 라는 함수를 통해서,

high 난이도는 xss_check_3() 라는 함수를 통해서 data를 받는 것을 알 수 있습니다.

 

 

 

저 함수들은 functions_external.php 에 정의되어 있기때문에

functions_external.php 파일을 살펴보도록 하겠습니다.

 

 

 

 

 

 

 

 

 

난이도 low의 no_check() 함수입니다.

 

 

데이터를 받으면 그 데이터를 그대로 return 해주고 있는 것을 확인할 수 있습니다.

 

 

 

 

 

 

난이도 medium의 xss_check_1() 함수입니다.

 

받은 데이터에 < 또는 > 가 있으면 각각 &lt와 &gt 로 변환하고,

한번 디코딩을 해서 데이터를 리턴해줍니다.

 

 

기본적으로 브라우저는 <와 같은 특수문자를 인코딩해서 서버측에 보내게 되고,

서버측은 받을때 디코딩해서 받게 됩니다.

 

xss_check_1() 함수는 디코딩을 해주는 urldecode() 함수를 사용하고 있으니

<와 >를 인코딩한 값을 넣어주면 우회가 가능할 듯 합니다.

 

참고로 url인코딩을 행할 시 <%3c ,>%3e, /%2f 로 변환됩니다.

 

 

 

 

hello

%3ch1%3eworld%3c%2fh1%3e

 

 

의 형태로 넣어주면 우회가 가능한 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

HTML Injection - Reflected(GET) high(상) 단계

 

 

 

 

 

난이도 상으로 가볼까요?

 

 

 

 

 

 

 

 

 

 

난이도를 high로 선택하고 Set을 눌러봅니다.

 

 

 

 

 

 

 

 

 

일반적인 html태그는 문자로 인식합니다.

 

 

 

 

 

 

 

medium 방식에서 시도했던 인코딩 우회도 막히네요.

 

 

 

난이도 상의 코드를 살펴볼까요?

 

난이도 상은 xss_check_3() 함수로 데이터를 우회하고 있습니다.

 

 

 

 

 

 

 

 

이 함수는 htmlspecialchars라는 기본함수를 이용해서 입력값을 우회하고 있습니다.

 

 

 

 

 

 

htmlspecialchats?

 

PHP에서 제공하는 기본함수로, HTML에서 사용하는 특수문자를 UTF-8로 변경하는 역할을 합니다.

 

htmlspecialchars에서 바꾸는 특수문자는 &,",',<,> 가 있습니다.

 

 

 

 

 

 

 

 

HTML Injection 대응방안

 

 

 

HTML Injection 공격을 방지하려면 htmlspecialchars 함수를 사용해

태그에 사용하는 특수문자들을 인식할 수 없도록 인코딩해줍니다.

 

 

 

 

 

 

728x90
반응형