Quest. HTML Injection이 무엇인지 정리하시오.

 공격자가 서버에 전달되는 정보에 악의적인 코드를 삽입하여 의도하지 않은 동작이 수행되거나 서버 또는시스템 등 중요정보를 획득할 수 있는 공격이다.

Quest. 아래 화면을 출력하시오.

실행 목표

 

  ① level low

 먼저 이 페이지가 어떻게 동작하는지 보기 위해 아무 단어나 입력해봤다. 그런 후 검사를 통해 HTML소스코드를 확인해봤더니 입력 데이터가 HTML 코드사이에 그대로 삽입이 되는 걸 확인할 수 있었다.

level low 실행결과

따라서 입력에 <h1>SUCCESS</h1>와 <img>태그를 주었고, 위 사진처럼 원하는 결과를 도출했다.

 

  ② level medium

string만 출력되는 level medium

low level일 때와 같은 방법으로 시도한 결과 태그를 인식하지 못하고 문자열이 출력되는 것을 볼 수 있다. 

level low와의 차이점을 알아보기 위해 url의 htmli_get.php 파일을 확인해봤다.

htmli_get.php에서 htmli 함수

htmli_get.php 파일을 확인해보니 난이도 별로 동작 함수가 다르다는 걸 알 수 있었다. level medium은 case가 1인 경우로 xss_check_1 함수를 확인해봤다.

xss_check_1 함수

위 함수를 보면 $data 변수에 입력된 문자열 중 <, >&lt, &gt로 인코딩 하는 것을 알 수 있다. 이때문에 태그가 정상적으로 인식이 되지 않아 단순 문자열로 출력된 것이다.

 

이럴 땐 <를 %3C, >를 %3E로 변환하면 원하는 결과를 얻을 수 있다.

level medium 실행결과

 

  ③ level high

htmli_get.php에서 htmli 함수를 보면 level high(case 2)일 때 xss_check_3 함수가 실행되는 것을 확인할 수 있다.

xss_check_3 함수

xss_check_3 함수에서 htmlspecialchars 함수가 사용되는 것을 확인할 수 있다. htmlspecialchars 함수는 문자열에서 특정한 특수 문자를 HTML 엔티티로 변환하는 함수다. 이때 HTML 엔티티는 일정한 기능이 있는 문자를 단순한 일반 문자로 출력하기 위해 사용하는 코드다.

특수 문자 변환된 문자
& &amp;
"" &quot;
'' &#039;
< &lt;
> &gt;

이처럼 특수한 기능을 갖는 문자를 일반 문자로 취급하기 때문에 태그나 url encode 방식을 인식할 수 없게 된다. 따라서 level high에서는 실행목표를 달성할 수 없다.

 

때문에 htmlspecialchar함수를 사용하면 악성 사용자로부터 XSS 공격을 방지 할 수 있다.

 

* htmlspecialchars 구조

string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] )

 

*인자(paramiter)

string $string : HTML 엔티티로 변환할 문자열

int $quote_style : 이 값은 ''(홑따옴표) 와 ""(겹따옴표) 의 처리방식을 지정한다. 이 값을 생략 시 기본값은 ENT_COMPAT 를 갖는다. 이 값으로 올 수 있는 상수들은 아래와 같다.

ENT_COMPAT 기본모드로, 겹따옴표만 변환
ENT_QUOTES ''(홑따옴표) 와 ""(겹따옴표) 둘다 변환
ENT_NOQUOTES ''(홑따옴표) 와 ""(곁따옴표) 둘다 변환하지 않음

string $charset : 이 값에는 변환에 사용할 문자셋을 지정할 수 있다. 이값을 생략하면 기본 문자셋 값으로 ISO-8859-1 을 갖는다.
bool $double_encode : 이 값은 이미 존재하는 HTML 엔티티를 encode 할지 않을 지를 true 와 false 값으로 지정할 수 있다. 이 값을 생략할 시 기본값은 true 를 갖는다.

복사했습니다!