모의해킹

HTML Injection

editor9386 2025. 1. 19. 23:01

HTML Injection 이란 웹 어플리케이션의 보안 취약점 중 하나로 이름 그대로 HTML 구문을 사용하여  공격자가 악의적인 HTML 또는 javaScript 코드를 웹 페이지에 입하는 공격이다. 이를 통해 웹페이지의 동작을 방해하거나 중요한 정보를 탈취 하는 등  사용자에게  피해를 주는 공격이다.

 

 

HTML Injection의 종류 

웹 애플리케이션의 입력 처리 방식에 따라 HTML 인젝션의 유형이 두 가지로 나뉜다.

 

1. Reflected(반사)

URL에 악의적인 HTML 태그를 삽입하여 링크를 클링한 사용자의 PC에서 HTML태그가 실행 되게 하는 공격 종류

Refelcted는 또 데이터를 담는 방식에 따라 GET 방식 POST 방식 두 가지 방식으로 나뉜다.

 

1-1 GET 

GET 방식은 주로 서버에서 리소스를 요청할 때 사용 하는 방식으로 정보 조회나 데이터 요청에 사용하며 요청할 때 데이터가 URL 에 포함된다. 

 

 

1-2 POST

POST 방식은 주로 데이터를 전송할 떄 사용 되는 방식으로 정보를 제출하거나 데이터를 생성 시에 사용되며 데이터는 URL에 나타나는 GET 과 달리 BODY 부분에 데이터가 노출? 담겨진다

 

쉽고 간단하게 말하면 GET 은 요청하려는 데이터나 변수가 URL 에 그대로 나타나는 것이고 POST는 요청하는 데이터나 변수가 URL에 나타나지 않는다.

 

2. Stored(저장)

악의적인 HTML 태그를 데이터베이스에 저장하여 저장된 태그 내용을 확인한 사용자의 PC 에 HTML 태그가 실행되게 하는 공격이다.

Ex) 게시판에 악의적인 Script 구문을 게시하여 많은 사람들이 게시글을 봤을 때 악성 코드가 실행됨

 

Reflected 와 Stored 의 차이점

 

Reflected는 악성코드가 서버에 저장되지 않고 해당 URL으로 이동한 사람에게만 악성코드가 실행되지만

Stored는 악성 코드가 서버에 저장되어 다른 사용자들 에게도 영향을 끼친다.

 

 

 

 

HTML Injection -Reflected(GET) level --low

 

 

처음 화면에 들어가면 URL에 아무것도 없고 http://192.168.0.17/bWAPP/htmli_get.php 로만 써 있다. 

이름을 입력해 보면

 

 

이름을 입력하니 위에 주소창이 길어졌다. 

 

URL을 보면 

http://192.168.0.17/bWAPP/htmli_get.php?firstname=kim&lastname=ji+min&form=submit

내가 입력한 내용이 URL에 그대로 반영이 되는 것을 볼 수 있다. 

이것이 위에서 말한 GET 방식으로 내가 요청하는 데이터가 URL 에 포함이 된다. 

 

이번에는 URL을 입력하지말고 URL으로 다른 이름을 입력해 보면

http://192.168.0.17/bWAPP/htmli_get.php?firstname=kang&lastname=jisu&form=submit

 

입력 바에 입력하지 않고도 내가 원하는 데이터를 입력할 수 있다.

 

http://192.168.0.17/bWAPP/htmli_get.php?firstname=<h1>kim</h1>&lastname=<h2>jisu</h2>&form=submit

이런식으로 HTML 기본 태그들도 입력하면 적용이 되는것을 알 수 있다.

 

 

 

 

http://192.168.0.17/bWAPP/htmli_get.php?firstname=<script>alert(document.cookie);</script>&lastname=jisu&form=submit

도 적용된다.

 

<script>alert(document.cookie);</script> ----- 자신의 쿠키를 보여주는 Script 구문 

 

 

 

 

HTML Injection -Reflected(GET) level --midum

 

<h1>kim</h1>

<h1>kim</h1>

이렇게 입력하면 

 

 

 

Low 레벨 처럼 HTML 태그가 적용이 안되는 것을 볼 수 있다.

 

직접 서버에가서 어떻게 차단하고 있는지 보면 

 

 

입력 창에 < 혹은 > 가 들어가면 &lt , &gt (Html 엔티티) 로 대체 되도록 설정 되어 있다. 

 

HTML 엔티티란 원래 < > 이런걸 치면 태그로 적용되는데 Html 엔티티는 컴퓨터가 읽을 때 < > 의 모습으로 보이지만 태그로 적용이 안된다.  < > 나 & 같은 HTML 구문으로 오해해서 적용 될 특수 문자들을 컴퓨터가 오직 문자열 형식으로 읽음

 

URL 디코딩을 한 내용을 넣어보자

 

%3Ch1%3Ekim%3C/h1%3E

%3C = "<" 

%3E = ">" 

< ,>를 입력하면 HTML 엔티티로 변형되게 되어 있지만 HTML 엔티티와 다르게 인코딩을 한 언어로

컴퓨터에게 글을 보내면 컴퓨터가 읽을 때 %3C 를 <  으로 읽어서 HTML 태그로 적용된다.

 

 

 

 

HTML Injection -Reflected(GET) level --HIGH

 

 

 

 

위에 시도했던 모든 방식으로 해봐도 이건 그냥 못 뚫는다. ㅅㄱ

 

htmlspecialchars() : < > 이거 외에도 다른 특수문자 모두 HTML 엔티티로 변경

 

 

 

 

 

HTML Injection - Reflected (POST)

 

 

POST 는 GET 과 달리 URL에 내가 입력한 값이 노출되지 않는다.

 

그래서 Burp suite 로 프록시를 가로채 보면 

이런식 으로 BODY 부분에 URL에서 나오던 입력한 데이터 값이 보인다.

 

이런식으로 위에 GET 방식으로 했던 것과 같이 다 적용된다.

 

 

 

HTML Injection - Stored (Blog)

입력하면 밑에 부분에 저장되는 방식 

 

이것도 위에 한 html 적용되는 문구를 입력하면 

 

이런 식으로 적용된다. 

 

 

'모의해킹' 카테고리의 다른 글

SQL Injection  (0) 2025.01.24
PHP Code Injection  (0) 2025.01.23
Server-Side Includes (SSI) Injection  (0) 2025.01.21
OS Command Injection  (0) 2025.01.21
iFrame injection  (0) 2025.01.20