저번에 풀었던 XSS CTF 문제에서 제목란에 script 태그를 넣으면 먹히고
내용에 태그를 넣으면 먹히지 않았었다.
대응 방법도 연구할 겸
이유가 뭘까? 분석해보았다.
제목은 먹힌다는 걸 알았으니, 일반 텍스트를 넣고
내용에
간단한 경고창을 띄우는 script 태그를 입력했다.
작성 성공
게시판에 잘 등록이 되었다. 이제 이걸 클릭하면??
...아무 변화가 없이
script 태그가 그냥 글자처럼 출력이 되었다.
F12를 눌러 개발자 도구를 살펴봐도 평범하게 적혀있다.
<script>라는 게 찍히는 걸 보면 strip_tags() 함수를 쓴 것도 아닌 것 같다.
strip_tags()는 모든 태그를 없애는 함수이다.
script 라는 태그가 필터링 되어있는 것은 아닐까? 해서
javaScript는 대소문자를 상관하지 않는다고 해
ScripT 처럼 대소문자를 섞어보았다.
하지만 여전히 안됨.
사실 javascript를 인식할 수 만 있으면 되지 않을까? 해서
onmouseover나 onerror 같은 이벤트 핸들러들을 사용해보았다.
이것도 여전히 안됨.
코드가 화면에 출력된다.
혹시 다른 html 태그들도 안 통하는건가?
기본적인 p 태그로 실험해보았다.
그런데 p 태그도 그대로 출력되는 것을 확인했다.
script 태그 입력한 창에서 페이지 소스 보기를 눌러보았다.
마우스 오른쪽 버튼을 누르고 페이지 소스 보기를 누르면 소스를 볼 수 있다.
페이지 소스보기에서 < 와 > 특수문자가 < 와 > 로 변환되어 나타나있는 것을 볼 수 있다.
여기서 두 가지 방지법으로 선택지가 좁혀지는데,
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 <b>bold</b> 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
'해킹 > 해킹 기법' 카테고리의 다른 글
해킹 라이브 정리 - 다크웹, 딥웹, 프록시 서버 (1) | 2023.05.09 |
---|---|
XSS 공격 정리 (Cross-Site Scripting) (2) | 2023.05.08 |
해킹 기법 - 유튜브 해킹 전략 (0) | 2023.05.02 |
로그인 우회 CTF 풀이 # 3 (0) | 2023.04.26 |
DB 데이터 추출 CTF 풀이 (0) | 2023.04.25 |