<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>junnyontop-pixel.log</title>
        <link>https://velog.io/</link>
        <description>6학년 개발자</description>
        <lastBuildDate>Fri, 13 Feb 2026 13:08:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>junnyontop-pixel.log</title>
            <url>https://velog.velcdn.com/images/junnyontop-pixel/profile/01d06a3c-11df-44ea-a138-45894db656e0/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. junnyontop-pixel.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/junnyontop-pixel" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[gruyere 해킹해보기 2편]]></title>
            <link>https://velog.io/@junnyontop-pixel/gruyere-%ED%95%B4%ED%82%B9%ED%95%B4%EB%B3%B4%EA%B8%B0-2%ED%8E%B8</link>
            <guid>https://velog.io/@junnyontop-pixel/gruyere-%ED%95%B4%ED%82%B9%ED%95%B4%EB%B3%B4%EA%B8%B0-2%ED%8E%B8</guid>
            <pubDate>Fri, 13 Feb 2026 13:08:22 GMT</pubDate>
            <description><![CDATA[<h2 id="서론">서론</h2>
<p>본격적으로 <a href="https://google-gruyere.appspot.com/part2">문서</a>를 보면서 실습하다 보니 <code>Reflected XSS via AJAX</code>라는 내용이 있었다.</p>
<h4 id="ajax란">AJAX란?</h4>
<ul>
<li><p><code>Ajax는 Asynchronous JavaScript And XML&#39; 또는 &#39;Asynchronous JavaScript transfer (x-fer)&#39;의 약자이다. 말 그대로 JavaScript와 XML 형식을 이용한 비동기적 정보 교환 기법이다.</code> - 나무위키</p>
</li>
<li><p>그냥 페이지 전체를 새로고침하지 않고 데이터만 슥 바꾸는 방법이라고 보면 된다.</p>
</li>
</ul>
<hr>
<h3 id="ajax가-사용되는-곳-찾기">AJAX가 사용되는 곳 찾기</h3>
<p>다시 <a href="https://google-gruyere.appspot.com/">gruyere</a>에 들어가서 <code>계정생성</code>,<code>로그인</code>을 해준다.</p>
<blockquote>
<p>그냥 페이지 전체를 새로고침하지 않고 데이터만 슥 바꾸는 방법이라고 보면 된다.</p>
</blockquote>
<p>이걸 보면 딱봐도 글 <code>삭제</code>,<code>추가</code>에 사용될거 같다.</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/020d428f-e004-474e-a340-fe2c01b48f9a/image.png" alt="">
이렇게 글을 하나 작성해주고
콘솔창을 열어서 저 <code>[X]</code>버튼을 찍어보면</p>
<pre><code class="language-html">&lt;a href=&quot;/469790294992189573147013988367009809944/deletesnippet?index=0&quot;&gt;[X]&lt;/a&gt;</code></pre>
<p><code>/deletesnippet</code>이걸로 글을 삭제하고 <code>?index=0</code>이걸로 어느 글을 삭제할지 정하는거 같다 <code>index=0</code>의 의미는 데이터가 리스트 같은데에 저장돼 있는데 그 인덱스 번호를 뜻하는거 같다.</p>
<p>여기서 <code>?index=0</code>을 <code>?index=&lt;script&gt;alert(&quot;xss&quot;)&lt;/script&gt;</code>이렇게 바꿔보면</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/09472a8b-b04d-4cf3-abe5-64224741fc82/image.png" alt="">
이렇게 팝업이 잘 뜨는것을 볼 수 있다.</p>
<hr>
<h2 id="관련-링크">관련 링크</h2>
<ul>
<li><a href="https://google-gruyere.appspot.com/">https://google-gruyere.appspot.com/</a></li>
<li><a href="https://google-gruyere.appspot.com/part2">https://google-gruyere.appspot.com/part2</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[구글 gruyere 해킹해보기 1편]]></title>
            <link>https://velog.io/@junnyontop-pixel/%EA%B5%AC%EA%B8%80-gruyere-%ED%95%B4%ED%82%B9%ED%95%B4%EB%B3%B4%EA%B8%B0-1%ED%8E%B8</link>
            <guid>https://velog.io/@junnyontop-pixel/%EA%B5%AC%EA%B8%80-gruyere-%ED%95%B4%ED%82%B9%ED%95%B4%EB%B3%B4%EA%B8%B0-1%ED%8E%B8</guid>
            <pubDate>Fri, 13 Feb 2026 11:38:45 GMT</pubDate>
            <description><![CDATA[<h3 id="서론">서론</h3>
<p>이론만 막 배우니 머리에 들어오는게 없는거 같아 찾아본게 이 <a href="https://google-gruyere.appspot.com/">gruyere</a>이다.
앞에 나오는 이상한 영어들은 일찌감치 집어치우고 실습부터 했다.</p>
<h3 id="시작">시작</h3>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/b6b6def7-d84d-4371-9c9e-51a54c7c7bca/image.png" alt="">
먼저 들어가니 이런 사이트가 있었다.
밑으로 내려가서 <code>Continue &gt;&gt;</code>버튼을 누르고 들어가니
<img src="https://velog.velcdn.com/images/junnyontop-pixel/post/5af6649e-4456-4f21-b8e3-43501e27d8c0/image.png" alt="">
또 이런 영어들이 나를 반겨주는데 앞에서 말했듯이 집어치우고
<code>https://google-gruyere.appspot.com/start</code>를 눌러 본격적으로 시작한다.</p>
<hr>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/168435e6-74b5-417c-b222-8600dfe12669/image.png" alt="">
이렇게 게시판같은 페이지가 뜨는데 일단 로그인부터 해보자.</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/c533ba88-4502-4bb1-bcd3-31603197f174/image.png" alt="">
회원가입창에서 가입을 해주고</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/e07fb272-320c-49bd-ad76-ca50ad850fdd/image.png" alt="">
로그인을 한다.</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/e9cb2ff6-cf76-46ea-bbba-dbf2ae63ded2/image.png" alt="">
로그인을 해주면 이런 화면이 뜨는걸 볼 수 있다.
그리고 시작부터 gruyere의 허술함이 들어난다.
<code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/login?uid=junnyontop-pixel&amp;pw=124QWEasd</code>
이렇게 <code>url</code>에 <code>id</code>와 <code>pw</code>노출시킨 것이다.</p>
<p>위에 <code>newSnippet</code>을 눌러보니 게시글을 올릴 수 있는거 같다.
<code>Limited HTML is now supported in snippets (e.g., &lt;b&gt;, &lt;i&gt;, etc.)!</code>이렇게 <code>html</code>태그를 허용해주는거 같다.
그래서 바로 <code>script</code>태그로 테스트 해보니 <code>script</code>태그는 안먹히는거 같다.</p>
<hr>
<p>차례로 <code>My Snippets</code>을 눌러주니
<code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/snippets.gtl</code>주소가 이렇게 생겼다.
혹시나 <code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/snippets.gtl?uid=</code>이렇게 아무거나 찍어 보니</p>
<p><code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/snippets.gtl?uid=cheddar</code>
여기서</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/4e6961be-8cd5-41a8-8230-51e1386e1d50/image.png" alt="">
이렇게 다른 사람의 게시글을 훔쳐볼 수 있었다.</p>
<p><code>?uid=cheddar</code>이걸 유용하게 써먹을 수 있을듯 하다.</p>
<hr>
<p>혹시 관리자의 글도 볼 수 있을까 싶어,
<code>?uid=admin</code>,<code>?uid=Admin</code>이런걸 시도해 보니
대소문자 구분은 안하는거 같고 많은 걸 시도해 보던 도중...</p>
<p><code>?uid=administrator</code>이걸 시도해보면
주소창은 <code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/snippets.gtl?uid=administrator</code>인데</p>
<p>화면엔
<img src="https://velog.velcdn.com/images/junnyontop-pixel/post/d748bdd7-89b2-478b-8762-4e360507da74/image.png" alt="">
<code>Admin</code>으로 표시되어있다.</p>
<p>뭔가 힌트를 얻은거 같지만 관리자의 게시글을 훔쳐볼순없었다.</p>
<hr>
<p>다음으로 옆에있는 Profile을 누르니
<img src="https://velog.velcdn.com/images/junnyontop-pixel/post/d5f06946-a069-4988-8d23-c83073ebd415/image.png" alt="">
이렇게 프로필을 수정할 수 있었다.</p>
<p><code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/editprofile.gtl</code>여긴 주소가 이런데 아까 봤던 그걸 사용해 보자.</p>
<p><code>https://google-gruyere.appspot.com/469790294992189573147013988367009809944/editprofile.gtl?uid=cheddar</code></p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/dad1897d-9ac6-4732-ac09-81d91556f47e/image.png" alt="">
역시 맞았다!
이걸로 다른사람의 프로필도 수정할 수 있다.</p>
<p>그리고 여기에 <code>Private Snippet</code>이란 항목이 있다.
여기에 <code>uid=administrator</code>를 사용해보면 게시글을 볼 수 있을지도 모른다.</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/ae9628d3-e6ab-4a8c-a968-29cdd04b417a/image.png" alt="">
성공이다.
추가로 <code>My password is secret. Get it?</code>라는 정보도 획득했다.
이 정보에 따르면 관리자의 <code>pw</code>는<code>secret</code>같다.</p>
<hr>
<p>로그아웃을 해주고
로그인 창에서 <code>User name:administrator</code>,<code>Password:secret</code>으로 작성해주니
관리자로 로그인을 성공했다!</p>
<p><img src="https://velog.velcdn.com/images/junnyontop-pixel/post/4f77b832-eba9-4c1c-95c8-75598e93b33e/image.png" alt="">
관리자로 로그인한 상태의 페이지이다.</p>
<p>이제 <code>xss</code>공격을 해볼거다.
아까 html태그를 허용했지만 <code>script</code>태그는 안되던 <code>New Snippet</code>을 클릭하고,</p>
<pre><code class="language-html">&lt;img src=&quot;&quot; onerror=&quot;alert(&#39;xss&#39;)&quot;&gt;</code></pre>
<p>이렇게 작성해주면</p>
<p><code>You are not an author.</code>라고 뜨면서 안된다.
<code>Profile</code>에 들어가면
<img src="https://velog.velcdn.com/images/junnyontop-pixel/post/1541cbec-24be-409e-96d9-aae4a0035a58/image.png" alt="">
이렇게 선택지가 더 생긴걸 볼 수 있다.</p>
<p><code>Is author</code>을 Yes로 변경해주고 다시 작성해주면
<img src="https://velog.velcdn.com/images/junnyontop-pixel/post/b57d08f9-a72b-4761-aed0-cfe6ea8c527e/image.png" alt="">
잘 뜨는것을 볼 수 있다.</p>
<hr>
<p>추가로 쿠키까지 가져가 비밀번호 없이 로그인하는 것 까지 해보겠다.</p>
<pre><code class="language-html">&lt;img src=&quot;&quot; onerror=&quot;alert(&#39;쿠키: &#39; + document.cookie);&quot;&gt;</code></pre>
<p>아까처럼 스니펫에 이걸 추가하면</p>
<p><code>GRUYERE=31131337|administrator|admin|; GRUYERE_ID=404477456041413703389788683660411129398</code>
쿠키가 나온다 이렇게 나온 쿠키를</p>
<p>로그아웃 후,</p>
<pre><code class="language-js">document.cookie = &quot;GRUYERE=31131337|administrator|admin|&quot;;</code></pre>
<p>콘솔창에 입력하면 로그인이 된다.</p>
<hr>
<h2 id="💡-이번-실습으로-배운-점">💡 이번 실습으로 배운 점</h2>
<ol>
<li><strong>파라미터는 믿을 게 못 된다:</strong> 클라이언트가 보내는 <code>uid</code> 같은 값은 누구나 수정할 수 있으므로, 서버에서 반드시 세션 기반의 검증을 거쳐야 한다.</li>
<li><strong>비밀번호 힌트의 위험성:</strong> 관리자라면 유추하기 쉬운 비밀번호나 힌트를 남기지 말아야 한다.</li>
<li><strong>XSS의 위력:</strong> <code>script</code> 태그가 막혔더라도 <code>onerror</code> 같은 이벤트 핸들러를 통해 얼마든지 공격이 가능하다는 것을 깨달았다.</li>
</ol>
]]></description>
        </item>
    </channel>
</rss>