혜랑's STORY

[2020-2학기 웹] : HTML Injection - Reflected (get) 본문

2020 SISS 21기 활동/2학기 WEB

[2020-2학기 웹] : HTML Injection - Reflected (get)

hyerang0125 2020. 9. 9. 20:45

1. HTML Injection(Reflected)이란?

 Injection은 프로그래머가 구현한 코드에 악의적인 코드를 주입하여 코드가 예상치 못한 방향으로 흘러가게 만드는 기법이다. 즉, 신뢰할 수 없는 데이터가 예기치 않은 명령을 실행하거나 올바른 권한 없이 데이터에 접근하도록 인터프리터를 속이는 것이다.

 HTML Injection은 Reclectec 방식과 Stored 방식으로 구분되며, 오늘 실습할 예정인 Relflected 방식은 공격자가 태그, 스크립트를 삽입한 URL을 클라이언트가 사용했을 경우, 서버로 HTTP요청을 보내고 응답받을 시 태그, 스크립트가 클라이언트에서 실행되는 방식이다. 그렇기 때문에 클라이언트는 실제 웹 사이트 접근이 아닌 피싱 사이트로 접속되는 문제가 발생할 수 있다. 

 이 때, 공격자가 악의적인 URL을 유포하는 방법에는 이메일, 게시판에 URL 링크 정보 노출, SNS를 통해서 URL 링크 정보를 노출하는 방식 등이 있다.

2. 실습

- 참고 ([htmli_get.php / functions_external.php 경로] : /var/www/bWAPP )

security_level에 대한 value값

 아래 코드를 통하여 security_level이 low일땐 no_check() 함수, midiun일땐 xss_check_1()함수, high일땐 xss_check_3()함수가 실행된다는 것을 알 수 있다.

security_level에 따라 실행되는 함수

 

- low Level

 low level에서 실행되는 no_check() 함수는 입력받은 데이터를 그대로 출력한다는 것을 알 수 있다.

no_check() 코드

 실행 결과 입력했던 값이 html코드로 인식되어 출력되는 것을 알 수 있다.

low level 실행화면

 

- mediun Level

 midium level에서 실행되는 xss_check_1() 함수는 str_replace() 함수를 이용하여 "<" 문자를 "&lt;" 문자로 치환하고, ">" 문자를 "&gt;" 문자로 치환하는 것을 알 수 있다. 

xss_check_1() 코드
xss_check_1() 함수가 적용된 모습

이럴 땐, url encoding을 우회하여 "<""%3c", ">" "%3e", "/""%2f"로 바꾸어 입력하면 정상적으로 출력되는 것을 확인 할 수 있다.

medium level 실행결과

 

- high Level

high level에서 실행되는 xss_check_3() 함수는 htmlspecialchars를 이용하여 아래와 같이 바꾼다. 즉, HTML 코드로 인식할 수 없게 처리하여 오류를 방지할 필요성이 있거나 HTML 소스를 그대로 보여주어야 하는 경우에 사용된다.

특수문자 변환된 문자
&amp;
""  &#039;
< &lt;
> &gt;
  • ENT_COMPAT : 기본모드로, [ "" ]만 변환
  • ENT_QUOTES : [ '' ]와 [ "" ] 모두 변환
  • ENT_NOQUOTES : [ '' ]와 [ "" ] 둘 다 변환하지 않음

xss_xheck_3() 코드

아래 실행 결과를 통하여 입력한 html코드와 URL 인코딩 우회 방법 모두 문자로 인식한다는 것을 알 수 있다.

high level에 html코드를 작성한 결과
high level에 URL 인코딩 우회를 작성한 결과

 high level의 문제는 htmlspecialchars() 함수를 사용하여 html과 url encoding 모두를 문자로 변환하여 인식하기 때문에 low, medium level과 달리 악성 사용자로부터 xss 공격을 방지할 수 있다.