HTML 인젝션
개요
- 취약한 매개변수에 악의적인 HTML 코드를 삽입하는 공격
- HTML 태그로 악의적인 사이트에 연결하거나 악성 파일을 다운로드 하도록 유도
- XSS(Cross Site Script) 취약점 일부에 포함되는 취약점
사전 지식
- HTML은 하이퍼텍스트를 활용한 마크업 언어로 WWW(World Wide Web) 페이지를 구성하기 위한 하이퍼링크의 표현하는 규약
- 클라이언트 사이드 스크립트(Client Side Script) : 클라이언트(사용자) 측에서 처리하는 것으로, 클라이언트가 입력한 것을 수신하여 HTML로 만들어서 크롬과 같은 어플리케이션에 해석해서 표시. 대표적으로 자바스크립트가 있다.
- 서버 사이드 스크립트(Server-Side Script) : 서버 측에서 즉시 처리하는 것으로 서버 사이드는 클라이언트로 보낼 웹 페이지(HTML, JavaScript 등이 담긴)를 만들며, 서버 동작에 중요한 업무(사용자 유효성, DB 관련 업무)을 수행한다. 대표적인 언어로 Java, PHP, Python, Node.js, ASP 등이 있다.
HTML Injection Cheat Sheat
예시 |
<script src=“/assets/some-script.js”></script> |
<iframe src = http://[URL]></iframe> |
<meta name="language" content="0;data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==" http-equiv="refresh"/> |
<meta name="language" content="5;http://[URL]" http-equiv="refresh"/> |
HTML 테그
HTML 태그 | 설명 |
<html></html> | html의 시작과 끝을 표현 |
<head></head> | 웹 페이지에서 직접적으로 표현되지 않는 태그의 집합을 표현 ※ <title>, <link> <style> 등.. |
<body></body> | 페이지가 브라우저에 실제로 표한할 것들 ※ <a><img><table><br><p><b><form> 등.. |
<title></title> | 제목 표시줄 |
<meta> | 태그 안에 웹 페이지의 정보를 표현 이 정보는 웹 페이지에 보이지 않음 ※ charset, http-equiv, content, name 등.. |
<div></div> | 임의의 레이아웃 구분을 표현 |
<a></a> | 하이퍼링크 태그 |
<script></script> | 코드 삽입 |
<iframe></iframe> | 페이지 내부에 새로운 페이지 삽입 가능 |
<link></link> | 외부 파일과의 연결 표현 |
<span></span> | 임읭의 레이아웃 구분을 표현 |
<p></p> | 하나의 문단을 표현 |
<li></li> | 목록을 표현 |
<style></style> | 해당 문서의 적용되는 css 표현 |
<footer></footer> | 저자, 저작권, 연관 페이지 등을 표현 |
실습1 (난이도 : 하)
1. html injection 클릭 후 난이도는 하로 설정
2. html 태그를 삽입 시 html 태그가 정상 동작 확인
3. 페이지 소스 보기를 통해 확인한 결과 입력값 제한을 하지 않아 html 태그가 업로드 되는 것을 확인
4. 자바스크립트 명령어인 alert(document.cookie)를 입력 시 쿠키 정보 획득 확인
실습3 (난이도 : 중)
1. 입력란에 html 태그 입력 시 정상 동작하지 않고 문자 그대로 출력 확인
2. 페이지 소스 보기를 통해 확인 결과, ‘<’, ‘>’와 같은 특수문자가 치환된 것으로 확인
3. URL 인코딩을 하여 html 태그 및 명령어 입력 시 정상 동작 확인
실습3 (난이도 : 상)
1. 입력란에 URL 인코딩한 값을 입력 시, 문자열 그대로 찍히는 것을 확인
2. bee-box 홈페이지 코드를 확인했을 때, htmlspecialchars() 함수를 사용하여 특수문자를 HTML 엔티티로 변환시켜 HTML 태크를 사용할 수 없도록 조치한 것으로 확인
실습4 – iframe injection (난이도 : 하)
1. iframe Injection 탭으로 이동했을 때 URL에 iframe 태그를 통해 ‘robots.txt’ 파일을 불러오는 것을 확인
2. URL에 iframe 태그를 사용 시, 정상적으로 새로운 페이지를 불러오는 것을 확인
※ 입력 구문 : https://192.168.30.130/bWAPP/iframei.php?ParamUrl=robots.txt" width="250"></iframe><iframe src=https://192.168.30.130/bWAPP/htmli_get.php width="250"></iframe>&ParamWidth=250&ParamHeight=250
조치 방법
1. PHP Secure Coding
- ‘<’, ‘>’와 같은 메타문자(특수문자)를 일반문자로 치환
2. HTML에서 htmlspecialchars() 함수를 사용하여 특수문자를 이스케이프 처리
function a($var) // 입력 받은 특수문자를 이스케이프 처리 { if (is_array($var)) { return array_map(‘a’, $var); } else { return htmlspecialchars($var, ENT_QUOTES, ‘UTF-8’); } |