해킹/해킹 기법

XSS 대응 방안 - htmlspecialchars 함수

Haemaa 2023. 5. 7. 00:45

저번에 풀었던 XSS CTF 문제에서 제목란에 script 태그를 넣으면 먹히고

내용에 태그를 넣으면 먹히지 않았었다.

 

대응 방법도 연구할 겸

 

이유가 뭘까? 분석해보았다.

 

제목은 먹힌다는 걸 알았으니, 일반 텍스트를 넣고

내용에

간단한 경고창을 띄우는 script 태그를 입력했다.

 

작성 성공

 

게시판에 잘 등록이 되었다. 이제 이걸 클릭하면??

 

 

...아무 변화가 없이

script 태그가 그냥 글자처럼 출력이 되었다.

F12를 눌러 개발자 도구를 살펴봐도 평범하게 적혀있다.

 

<script>라는 게 찍히는 걸 보면 strip_tags() 함수를 쓴 것도 아닌 것 같다.

strip_tags()는 모든 태그를 없애는 함수이다.

 

 

script 라는 태그가 필터링 되어있는 것은 아닐까? 해서

javaScript는 대소문자를 상관하지 않는다고 해

ScripT 처럼 대소문자를 섞어보았다.

 

하지만 여전히 안됨.

 

 

 

사실 javascript를 인식할 수 만 있으면 되지 않을까? 해서

onmouseover나 onerror 같은 이벤트 핸들러들을 사용해보았다.

 

 

이것도 여전히 안됨.

 

코드가 화면에 출력된다.

 

 

혹시 다른 html 태그들도 안 통하는건가?

 

기본적인 p 태그로 실험해보았다.

 

그런데 p 태그도 그대로 출력되는 것을 확인했다.

 

 

 

script 태그 입력한 창에서 페이지 소스 보기를 눌러보았다.

마우스 오른쪽 버튼을 누르고 페이지 소스 보기를 누르면 소스를 볼 수 있다.

 

 

 

페이지 소스보기에서 < 와 > 특수문자가 &lt 와 &gt 로 변환되어 나타나있는 것을 볼 수 있다.

 

여기서 두 가지 방지법으로 선택지가 좁혀지는데,

 

htmlspecialchars 함수 일수도 있고

str_replace 함수로 < 나 > 같은 특정 특수문자들만 바꿨을 수도 있다.

 

 

str_replace라면 URL 인코딩 되어있는 문자는 필터링할 수 없을 것이다.

 

따라서 h1 태그를 이용한 글자를 URL 인코딩해서 게시판에 등록해보았다.

저 사이트는 구글링하면 쉽게 찾을 수 있고, 나온 결과를 복사해서 붙여넣었다.

 

??? 이것도 그대로 출력된다.

 

이 결과로 보아 입력한 내용 전체가 어떤 함수를 거쳐서 출력됨을 알 수 있다.

 

대표적인 것이 바로 htmlspecialchars 인데,

htmlspecialchars는

HTML 코드로 인식될 수 있는 문자열의 일부내용을

특수문자 형태로 변환하여 출력해주는 역할을 하는 함수이다.

 

HTML코드로 인식할 수 없게 처리하여 오류를 방지할 필요성이 있거나

HTML 소스를 그대로 보여주어야 하는 경우 유용하게 사용할 수 있다.

 

&를 & 그대로,

" 를 " 그대로

< 나 > 를 그대로 바꾸어 리턴한다.

 

구현 방법도 간단하다.

 

php

$string = "This is <b>bold</b> text.";
echo htmlspecialchars($string, ENT_QUOTES);
// 출력: This is &lt;b&gt;bold&lt;/b&gt; text.

 

위 코드처럼 php에서 제공하는 htmlspecialchars 함수 안에 넣기만 하면 문자열을 변환해서 출력해준다.

 

몇몇 사이트를 쭉 훑어봤는데

 

이 함수는 XSS 취약점이 발견되었을 때 시큐어 코딩 함수로 제시될 정도로 튼튼한 함수라고 한다.

그래서 특정 조건에 부합하지 않는 이상 우회할 수 없다는 글들이 많았다.

 

하지만 일괄적으로 태그를 다 막아버리면 이미지나 폰트 변경 등 여러가지 사용자 편의 기능까지

막혀버리므로 적절한 밸런스가 필요한 기능이긴 하다.

 

 

 

 

소스참조

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220227719789 

https://zetawiki.com/wiki/PHP_htmlspecialchars() 

https://dazemonkey.tistory.com/24