본문 바로가기

Web hacking

HTML Entity

 

HTML Entity란?

 

HTML Entity(특수문자)는 HTML 문서에서 특수 기호를 표시하기 위해 사용하는 문자이다. 예를 들어, < 기호는 HTML의 시작 태그로 인식되기 때문에, < 라는 기호만을 그대로 기재하면 브라우저에서의 표시에 문제가 생기거나 표시되지 않거나 한다. HTML에서 특별한 의미로 사용되는 이러한 기호를 브라우저에서 그대로 표시하고 싶은 경우는 '특수 문자'라고 하는 것으로 변환해서 사용할 필요가 있다. 특수 문자에는 전용의 문자 코드가 있어, 그 코드를 기재하는 것으로 기호를 브라우저상에 그대로 표시시킬 수가 있다. 예를 들어, < 기호는 이 기호의 의미로 브라우저에서 표시하게 하는 특수문자인 &lt; 로 변환하여 사용한다. 

 

그림 1 ( HTML Entity 표 )

 

 

XSS를 막는 HTML Entity

 

PHP 환경에서, 유저 입력값에 대해 htmlentities() 함수를 사용해 HTML entity encoding을 적용시킨다면 DB에는 '<' 나 '&' 같은 문자들이 raw 한 형태로 저장되는 것이 아니라, &lt; &amp; 와 같은 html entity 문자가 저장될 것이다. 그리고 해당 값이 DB에서 출력될 때 html entity encoding이 적용된 형태 그대로 브라우저에 전달(출력)이 된다. ( 데이터가 출력되는 과정에서 html_entity_decode 을 하지 않는다면.. )

 

아래는 htmlentities() 함수를 사용해본 예제이다. 

 

<?php
$str = "<script>alert(123)</script>&";
echo htmlentities($str);
echo "\n";
$str2= "&#60;script&#62;alert(2)&#60;/script&#62;";
echo html_entity_decode($str2);
?>

-- OUTPUT --
&lt;script&gt;alert(123)&lt;/script&gt;&amp;
<script>alert(2)</script>

 

 

 

XSS와 HTML Entity

 

HTML Entity가 XSS의 방어에만 사용되지는 않는다. ( 아래 실습에서 확인 가능하다. )

 

추가적으로, hackerone의 report/484434 에서는 HTML Entity(Encoding)가 XSS 공격에 활용된 것을 확인 할 수 있다. ( 해당 기능을 직접 사용해보지 않아서, 정확히 어떻게? 스크립트가 실행될 수 있는지는 모르겠다. )

 

 

실습 ( PHP 환경, XSS 방어 대책이 전혀 구현되어 있지 않은 환경 )

 

&#60;script&#62;alert(2)&#60;/script&#62;
&#x3c;script&#x3e;alert(3)&#x3c;/script&#x3e;
&lt;script&gt;alert(4)&lt;/script&gt;

 

위 같이 html encoding을 적용해, 삽입한 스크립트는 모두 실행되지 않았다. 

 

<script>alert&#40;123&#41;</script>
<script>alert("No?")</script>
<script>alert&#x28;123&#x29;</script>

( 응답 페이지 소스 보기 )
<td><script>alert&#40;123&#41;</script><br><script>alert("No?")</script><br><script>alert&#x28;456&#x29;</script></td>

 

위와 같은 경우 오직, alert("No?") 만 실행되어진다. alert&#40;123&#41; 와 같은 경우는 왜 시행이 안될까? HTML DEC Encoding 이 적용되었기 때문이다. 현재 <script> 태그 사이에 있는데, 어떠한 attribute 속성에도 들어가 있지 않기에 스크립트가 실행되지 않는다.   

 

<img src="x" onerror=alert&#x28;&#x22;Hello&#x22;&#x29;>
<img src="x" onerror=alert&#40;321&#41;>
<img src="x" onerror=alert&#40;&quot;NONO?&quot;&#41;>
<img src="x" onerror=alert&#x28;&quot;YEEES??&quot;&#x29;>

 

위와 같이 <img> 태그에 onerror 속성을 이용해 alert()를 발생시켜보았다. 결과는 모두 성공이였다. HTML의 attribute( ex. img 태그의 attribute인 onerror )에 들어가는 HTML Encoding은 브라우저가 알아서 풀어서 실행한다. 브라우저에서 자동으로 문자로 치환해서 수행하게 된다. ( &quot 와 같은 HTML Entity Encoding 문자 또한 alert()가 문제 없이 실행됨을 확인할 수 있다. )

 

 

 

 

 

참조 

 

https://www.freeformatter.com/html-entities.html


https://codingeverybody.kr/html-%ed%8a%b9%ec%88%98-%eb%ac%b8%ec%9e%90-%ec%82%ac%ec%9a%a9%eb%b2%95/


https://reeddesign.co.uk/test/character-entities.html


 

HTML은 3가지 encoding 방식을 제공 ( 숫자 16진수, 숫자 10진수, 엔티티 참조 )

https://stackoverflow.com/questions/20357800/html-entities-when-to-use-decimal-vs-hex

 

HTML Entities: When to Use Decimal vs. Hex

Is there a good rule of thumb for when to use decimal vs. hexadecimal notation for HTML entities? For example, a non-breaking hyphen is written in decimal as ‑ and in hex as ‑.

stackoverflow.com


https://hackerone.com/reports/484434

 

Imgur disclosed on HackerOne: Stored XSS on imgur profile

 

hackerone.com

 

 

추가 공부..

 

attribute란?

https://inpa.tistory.com/entry/%F0%9F%8C%90-attribute-property-%EC%B0%A8%EC%9D%B4

 

🌐 한방에 이해하는 attribute 와 property 속성 차이

Attribute vs Property 정의 차이 attribute 와 property 를 한국어로 번역하자면 둘다 '속성' 이라는 의미를 가지고 있다. 단순히 단어명이 같은 것을 떠나서 실제로 둘은 html 요소에 대한 클래스와 아이디

inpa.tistory.com

 

 

수정 : 2024-04-12