<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>kw0n笑 님의 블로그</title>
    <link>https://kw0nw-ara.tistory.com/</link>
    <description>kw0nw-ara 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Fri, 12 Jun 2026 09:49:39 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>kw0n笑</managingEditor>
    <image>
      <title>kw0n笑 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8662595/attach/12a37b49ccbd471cbad8115bde7afe76</url>
      <link>https://kw0nw-ara.tistory.com</link>
    </image>
    <item>
      <title>[Hacking] 시스템 해킹 (1)</title>
      <link>https://kw0nw-ara.tistory.com/3</link>
      <description>&lt;h2 data-heading=&quot;시스템 해킹 (Pwnable) 이해하기&quot; data-ke-size=&quot;size26&quot;&gt;시스템 해킹 (Pwnable) 이해하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&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;시스템 장악 (shell 실행)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템: os를 기반으로 하드웨어를 통제할 수 있는 소프트웨어적 환경&lt;/li&gt;
&lt;li&gt;쉘: 실행하고 싶은 프로그램을 실행시켜주는 프로그램 (cmd, bash, Zsh)&lt;/li&gt;
&lt;li&gt;쉘 실행 =&amp;gt; 시스템 해킹, pwnable의 목표&lt;/li&gt;
&lt;li&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;span style=&quot;background-color: #f6e199;&quot;&gt;프로그램의 취약점을 찾아 공격해 쉘을 실행하는 것이 pwnable의 목표&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-heading=&quot;Pwnable의 문제상황 이해하기&quot; data-ke-size=&quot;size26&quot;&gt;Pwnable의 문제상황 이해하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인터넷 어딘가에 위차한 외부, remote 환경에서 내부 환경으로 침투하여 들어가는 것아 ctf pwnable에서 출제되는 문제 상황&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;656&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czIGSE/dJMcahEqk9q/KAfbnwVjgGBKzTdTWT0iPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czIGSE/dJMcahEqk9q/KAfbnwVjgGBKzTdTWT0iPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czIGSE/dJMcahEqk9q/KAfbnwVjgGBKzTdTWT0iPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczIGSE%2FdJMcahEqk9q%2FKAfbnwVjgGBKzTdTWT0iPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;400&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-heading=&quot;Pwnable 문제 예시&quot; data-ke-size=&quot;size26&quot;&gt;Pwnable 문제 예시&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;hacktheworld.xyz의 pwn 카테고리 문제 확인&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;636&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tqilc/dJMcab5jj5y/HLHOyPWZUCXpnk7rN5KLp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tqilc/dJMcab5jj5y/HLHOyPWZUCXpnk7rN5KLp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tqilc/dJMcab5jj5y/HLHOyPWZUCXpnk7rN5KLp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftqilc%2FdJMcab5jj5y%2FHLHOyPWZUCXpnk7rN5KLp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;478&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;478&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;시스템 해킹 문제를 푸는데 원격 접속(nc, netcat)이 왜 필요한가?&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;nc hacktheworld_cca.xyz 3000
&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;도메인 이름: 인터넷에 연결된 컴퓨터의 이름&lt;/li&gt;
&lt;li&gt;포트: 실행중인 프로그램에 접근하기 위한 번호&lt;/li&gt;
&lt;li&gt;nc (도메인) (포트)로 접속 정보를 나타냄 e.g. nc 101.79.9.58 10001&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-heading=&quot;악의적인 실행흐름 만드는 법&quot; data-ke-size=&quot;size26&quot;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU와 CPU 속의 레지스터, 거기 pc를 저장하고, memory가 존재하는 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로그램 실행과정
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU는 PC에 쓰인 주소에 있는 프로그램 코드를 가져와서 검증없이 실행 =&amp;gt; 이용해보자&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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: #f6e199;&quot;&gt;0xFFFFF라는 임의의 주소에 password가 뭔지 알아내는 코드 삽입하고 pc 값을 0xFFFFF로 바꿔주기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;1084&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4qk0e/dJMcacQFKCK/8cqBHGfwpeJ7F2OJgyUYtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4qk0e/dJMcacQFKCK/8cqBHGfwpeJ7F2OJgyUYtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4qk0e/dJMcacQFKCK/8cqBHGfwpeJ7F2OJgyUYtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4qk0e%2FdJMcacQFKCK%2F8cqBHGfwpeJ7F2OJgyUYtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;492&quot; data-origin-width=&quot;1084&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;p data-ke-size=&quot;size16&quot;&gt;사진 출처: 해킹대회 (CTF) 출전을 위한 시스템킹(Pwnable) 입문 - juntheworld [인프런]&lt;/p&gt;</description>
      <category>Write-up/System Hacking</category>
      <author>kw0n笑</author>
      <guid isPermaLink="true">https://kw0nw-ara.tistory.com/3</guid>
      <comments>https://kw0nw-ara.tistory.com/3#entry3comment</comments>
      <pubDate>Mon, 18 May 2026 15:09:03 +0900</pubDate>
    </item>
    <item>
      <title>[CS] 더블 인코딩</title>
      <link>https://kw0nw-ara.tistory.com/2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS filtering 취약점 공격 방어 시나리오:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; client &amp;rarr; WAF &amp;rarr; 어플리케이션 환경에서 WAF가 요청 검증해서 XSS 공격 코드 차단&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;font-family: NanumGothic; background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;※ WAF: Web Application Firewall, 웹 방화벽&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 data-ke-size=&quot;size23&quot;&gt;1. 시나리오&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APP은 WAF를 통과한 데이터를 받아 작업 수행한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; WAF는 전달 받은 데이터를 다시 디코딩해서는 안 됨, 그러면 오히려 공격자가 더블 인코딩으로 웹 방화벽의 검증을 쉽게 우회함&lt;/p&gt;
&lt;pre id=&quot;code_1777650806704&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;(내용)&amp;lt;/script&amp;gt;

// %253Csript%253E (내용을 더블 인코딩 한 값)
// 웹 방화벽이 해당 데이터를 디코딩 후 검증 -&amp;gt; %3Csript%3E(내용을 한 번 인코딩)-&amp;gt; 음 안전하네
// app에서 해당 데이터를 다시 디코딩해서 &amp;lt;script&amp;gt; %3Csript%3E을 게시판 DB에 저장, 검증 후 디코딩 발생
// 희생자가 해당 게시글 읽으면 XSS가 발생하여 악성 자바스크립트 코드 실행&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;검사가 미흡한 php 예시&lt;/p&gt;
&lt;pre id=&quot;code_1777650941559&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

$query = $_GET[&quot;query&quot;]; // PHP는 GET, POST하고 자동으로 디코딩함

if (stripos($query, &quot;&amp;lt;script&amp;gt;&quot;) !== FALSE) {
    header(&quot;HTTP/1.1 403 Forbidden&quot;);
    die(&quot;XSS attempt detected: &quot; . htmlspecialchars($query, ENT_QUOTES|ENT_HTML5, &quot;UTF-8&quot;));
}

...

$searchQuery = urldecode($_GET[&quot;query&quot;]); // 한 번 더 디코딩(urldecodes)

?&amp;gt;

&amp;lt;h1&amp;gt;Search results for: &amp;lt;?php echo $searchQuery; ?&amp;gt;&amp;lt;/h1&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; 아래의 php 코드를 보면 디코딩이 두 번 이루어짐을 알 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1777651245041&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;POST /search?query=%3Cscript%3Ealert(document.cookie)%3C/script%3E HTTP/1.1

if (stripos($query, &quot;&amp;lt;script&amp;gt;&quot;) !== FALSE)

...
-----
HTTP/1.1 403 Forbidden
XSS attempt detected: &amp;amp;lt;script&amp;amp;gt;alert(document.cookie)&amp;amp;lt;/script&amp;amp;gt;]

// 공격 실패

POST /search?query=%253Cscript%253Ealert(document.cookie)%253C/script%253E HTTP/1.1
...
-----
HTTP/1.1 200 OK
&amp;lt;h1&amp;gt;Search results for: &amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt;&amp;lt;/h1&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;&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;&amp;nbsp; HTML entity encoding(출력 시 인코딩)은 HTML 정규화의 반대 과정으로 브라우저가 정규화를 통해 코드를 실행하지 못하도록, 의도적으로 문자를 뭉개서 단순 텍스트로 보이게 만드는 방어 과정이다. 서버에 어떤 값이 저장되어 있든 브라우저에 뿌려줄 때 &amp;lt;를 &amp;amp;lt;로 바꿔서 출력하면 브라우저는 이를 코드로 실행하지 않고 단순한 문자로 인식한다.&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; 브라우저는 HTML 문서를 읽을 때 두 가지 모드로 작동합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;실행 모드 (Parsing Tags):&lt;/b&gt; &amp;lt;script&amp;gt;를 만나면 자바스크립트 코드로서 실행&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 모드 (Rendering Text):&lt;/b&gt; &amp;amp;lt;script&amp;amp;gt;를 만나면 화면에 &amp;lt;script&amp;gt;라고 출력하라는 의미구나 생각&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;해결법: $searchQuery를 출력할 때 htmlspecialchars()를 사용한다.&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;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;라는 값을 입력햇을 때, 서버가 htmlspecialchars()를 써서 보내준다면 서버(php)는 공격자가 보낸 데이터를 받자마자 바로 화면에 뿌리지 않고, htmlspecialchars()에 집어 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table id=&quot;3517174f-477d-807d-be83-ee02d34da46d&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;3517174f-477d-80b9-8eac-f7859b7a72f7&quot;&gt;
&lt;td id=&quot;=Y:^&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;\&amp;#96;vB&quot;&gt;&lt;b&gt;서버가 브라우저에 보내는 코드 (Source)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;usi}&quot;&gt;&lt;b&gt;브라우저가 사용자에게 보여주는 화면 (View)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;hNp~&quot;&gt;&lt;b&gt;스크립트 실행 여부&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3517174f-477d-80d6-8629-f65aff9fd67b&quot;&gt;
&lt;td id=&quot;=Y:^&quot;&gt;&lt;b&gt;인코딩 안 함&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;\&amp;#96;vB&quot;&gt;&amp;lt;h1&amp;gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&amp;lt;/h1&amp;gt;&lt;/td&gt;
&lt;td id=&quot;usi}&quot;&gt;(알림창이 뜸)&lt;/td&gt;
&lt;td id=&quot;hNp~&quot;&gt;&lt;b&gt;실행됨 (위험)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;3517174f-477d-8076-9ec2-c66ac9e2a53a&quot;&gt;
&lt;td id=&quot;=Y:^&quot;&gt;&lt;b&gt;인코딩 함&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;\&amp;#96;vB&quot;&gt;&amp;lt;h1&amp;gt;&amp;amp;lt;script&amp;amp;gt;alert(1)&amp;amp;lt;/script&amp;amp;gt;&amp;lt;/h1&amp;gt;&lt;/td&gt;
&lt;td id=&quot;usi}&quot;&gt;&lt;b&gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;hNp~&quot;&gt;&lt;b&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;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;</description>
      <category>CS</category>
      <author>kw0n笑</author>
      <guid isPermaLink="true">https://kw0nw-ara.tistory.com/2</guid>
      <comments>https://kw0nw-ara.tistory.com/2#entry2comment</comments>
      <pubDate>Sat, 2 May 2026 01:17:30 +0900</pubDate>
    </item>
  </channel>
</rss>