<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>유나의 네트워크 탐험일지</title>
    <link>https://yyuna.tistory.com/</link>
    <description>오늘보다 성장한 내일이 될 수 있도록 노력중입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 8 Sep 2026 12:25:55 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>YYUNA</managingEditor>
    <image>
      <title>유나의 네트워크 탐험일지</title>
      <url>https://tistory1.daumcdn.net/tistory/6722256/attach/6d0ac73539b340ba8636e46c00c7af0f</url>
      <link>https://yyuna.tistory.com</link>
    </image>
    <item>
      <title>58회 기출문제 2 (SQL)</title>
      <link>https://yyuna.tistory.com/138</link>
      <description>&lt;p data-ke-size=&quot;size16&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;a href=&quot;https://yunamom.tistory.com/397&quot;&gt;https://yunamom.tistory.com/397&lt;/a&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 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 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1. 문자열 처리함수&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle 기준&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dt4tY/dJMcafAPale/Kqem3LgtO5OA0E37fNES6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dt4tY/dJMcafAPale/Kqem3LgtO5OA0E37fNES6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dt4tY/dJMcafAPale/Kqem3LgtO5OA0E37fNES6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDt4tY%2FdJMcafAPale%2FKqem3LgtO5OA0E37fNES6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;302&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;302&quot;/&gt;&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;TRIM: 앞뒤의 x를 제거, SQL&lt;/li&gt;
&lt;li&gt;RTRIM: 오른쪽 끝의 x만 제거, SQL&lt;/li&gt;
&lt;li&gt;REPLACE: 인수 3개인데 마지막인수 생략 시 빈문자열로 대체 = 문자열 전체에서 X를 제거, SQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 Oracle TRIM은 TRIM( - FROM - ) 형태라 애초에 틀림 ㅋㅋ 1번&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 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;h2 data-ke-size=&quot;size26&quot;&gt;2. 실행 시 추출되는 행의 개수&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a_c, abc, acc 1개씩 존재한다는 가정&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJFJFg/dJMcahenhh8/07uzLbzkXSV5rmSgKfpUS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJFJFg/dJMcahenhh8/07uzLbzkXSV5rmSgKfpUS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJFJFg/dJMcahenhh8/07uzLbzkXSV5rmSgKfpUS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJFJFg%2FdJMcahenhh8%2F07uzLbzkXSV5rmSgKfpUS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;100&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;100&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;&amp;nbsp; LIKE 특수문자 &amp;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;li&gt;_: 아무 글자 1개&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;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; ESCAPE '\' &amp;gt;&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;p data-ke-size=&quot;size16&quot;&gt;해석하자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot; 앞뒤에 무엇이 있든 상관없이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 안에 a_c가 그대로 포함되어 있어야 한다. &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;ESCAPE가 없없다면 a_c, abc, acc 다 됨&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 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;h2 data-ke-size=&quot;size26&quot;&gt;13.&amp;nbsp; 정규표현식&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;58&quot; data-origin-height=&quot;30&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2qxpd/dJMcafgyjGB/Gy9CsFXxis4g9NirM0mce1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2qxpd/dJMcafgyjGB/Gy9CsFXxis4g9NirM0mce1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2qxpd/dJMcafgyjGB/Gy9CsFXxis4g9NirM0mce1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2qxpd%2FdJMcafgyjGB%2FGy9CsFXxis4g9NirM0mce1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;58&quot; height=&quot;30&quot; data-origin-width=&quot;58&quot; data-origin-height=&quot;30&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;^: 문자열 시작&lt;/li&gt;
&lt;li&gt;&lt;u&gt;\w: 영문자, 숫자, 밑줄 _&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;*: 0개 이상 반복&lt;/li&gt;
&lt;li&gt;$: 문자열 끝&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해석하자면&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;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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;14.&amp;nbsp;&lt;/h2&gt;</description>
      <category>SQLD</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/138</guid>
      <comments>https://yyuna.tistory.com/138#entry138comment</comments>
      <pubDate>Thu, 6 Aug 2026 22:02:59 +0900</pubDate>
    </item>
    <item>
      <title>58회 기출문제 1 (이론)</title>
      <link>https://yyuna.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size18&quot;&gt;**문제출처: &lt;a href=&quot;https://yunamom.tistory.com/397&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://yunamom.tistory.com/397&lt;/a&gt; **&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 기본 엔티티&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;li&gt;다른 엔티티로부터 발생하지 않음&lt;/li&gt;
&lt;li&gt;여러 업무의 기준 정보가 됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'프로젝트'는 보통 회사, 고객, 계약 등 업무가 발생하여 만들어짐&lt;br /&gt;프로젝트는 업무의 중심에서 발생하므로 중심 엔티티로 분류&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 제3정규형(3NF)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1NF: 컬럼 값을 원자값으로&lt;/li&gt;
&lt;li&gt;2NF: 부분 함수 종속 제거&lt;/li&gt;
&lt;li&gt;3NF: 이행 함수 종속 제거&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;ex) 이행 함수 종속: A-&amp;gt;B, B-&amp;gt;C 이면 A-&amp;gt;C&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biLzdm/dJMcah6xNNu/2kdR61CDDRkArspBnHfvy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biLzdm/dJMcah6xNNu/2kdR61CDDRkArspBnHfvy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biLzdm/dJMcah6xNNu/2kdR61CDDRkArspBnHfvy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiLzdm%2FdJMcah6xNNu%2F2kdR61CDDRkArspBnHfvy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;191&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사원번호 -&amp;gt; 부서번호, 부서번호 -&amp;gt; 부서명 이면&lt;br /&gt;사원번호 -&amp;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;646&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LsajQ/dJMcajb3477/nxkJxvaJ8QPygILRNTUaq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LsajQ/dJMcajb3477/nxkJxvaJ8QPygILRNTUaq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LsajQ/dJMcajb3477/nxkJxvaJ8QPygILRNTUaq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLsajQ%2FdJMcajb3477%2FnxkJxvaJ8QPygILRNTUaq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;222&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;222&quot;/&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM0qQw/dJMcaiRRkmO/t4mxVFzYfG31aKINQNVvjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM0qQw/dJMcaiRRkmO/t4mxVFzYfG31aKINQNVvjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM0qQw/dJMcaiRRkmO/t4mxVFzYfG31aKINQNVvjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM0qQw%2FdJMcaiRRkmO%2Ft4mxVFzYfG31aKINQNVvjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;177&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;177&quot;/&gt;&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 data-ke-size=&quot;size16&quot;&gt;&quot;주식별자가 아닌 속성에 종속된 속성을 별도 테이블로 분리&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;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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 데이터 모델링 View&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 관점: What, 어떤 데이터를 관리하는가 ex) 관리해야 할 고객 정보는 무엇인가&lt;/li&gt;
&lt;li&gt;프로세스 관점: How, 업무가 어떻게 수행되는가 ex) 고객이 상품을 어떻게 주문하는가&lt;/li&gt;
&lt;li&gt;상관 관점: Interaction, 서로 어떤 영향을 주고받는가 ex) 업무를 수행할때 어떤 데이터가 수정되는가&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;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 중복성&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;677&quot; data-origin-height=&quot;291&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VzrL5/dJMcai5hYQ0/xEXVMa1tnwyFo8XopArue1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VzrL5/dJMcai5hYQ0/xEXVMa1tnwyFo8XopArue1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VzrL5/dJMcai5hYQ0/xEXVMa1tnwyFo8XopArue1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVzrL5%2FdJMcai5hYQ0%2FxEXVMa1tnwyFo8XopArue1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;677&quot; height=&quot;291&quot; data-origin-width=&quot;677&quot; data-origin-height=&quot;291&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부서명이 영업 1팀으로 바뀌었는데 고객 테이블만 수정하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 부서인데 이름이 영업팀, 영업1팀 2개가 됨,,&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;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;일부만 수정 시 데이터 불일치 발생&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;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 마더보트와 컴퓨터 간의 ERD 관계 해석&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 관계선에 o 표시 존재&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;ERD 관계선 끝의 기호&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;o: 선택, 0개 가능&lt;/li&gt;
&lt;li&gt;|: 반드시 1개&lt;/li&gt;
&lt;li&gt;까마귀발: 여러 개&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, o가 컴퓨터 쪽 관계에 붙어 있다면 컴퓨터 한 대에 연결되는 마더보드는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;없을 수도 있다!&lt;/u&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;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 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 data-ke-size=&quot;size26&quot;&gt;6. 비식별자 관계&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부모 엔티티의 주식별자가 자식에게 내려오긴 하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식의 주식별자에는 포함되지 않고 일반 속성인 FK로만 사용되는 관계&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ag9yw/dJMcad3Z49m/YlNdy3qkWZMh0WRLMhihW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ag9yw/dJMcad3Z49m/YlNdy3qkWZMh0WRLMhihW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ag9yw/dJMcad3Z49m/YlNdy3qkWZMh0WRLMhihW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAg9yw%2FdJMcad3Z49m%2FYlNdy3qkWZMh0WRLMhihW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;347&quot; height=&quot;215&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;부서번호가 사원 테이블에 내려왔지만 사원의 PK는 사원번호,,&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;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;자식 엔티티에서 주식별자로 사용 가능하더라도 별도의 주식별자 생성&lt;/li&gt;
&lt;/ul&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;p data-ke-size=&quot;size16&quot;&gt;생명주기가 동일하면 부모와 자식의 결합도가 강하다는 뜻&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 부모 PK를 자식 PK에 포함하는 식별자 관계가 더 적합&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;u&gt;생명주기 동일&lt;/u&gt;, &lt;u&gt;존재 종속&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;-&lt;/u&gt;&amp;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 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;h2 data-ke-size=&quot;size26&quot;&gt;7. 정규화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1정규화: 반복 속성 제거, 원자값&lt;/li&gt;
&lt;li&gt;2정규화: 부분 함수 종속 제거&lt;/li&gt;
&lt;li&gt;3정규화: 이행 함수 종속 제거&lt;/li&gt;
&lt;li&gt;BCNF 정규화: 모든 결정자가 후보키가 되도록 정리&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;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. 상호배타적 관계&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;167&quot; data-origin-height=&quot;91&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSUbC2/dJMcacxkq29/kK55eTan9k4EpE1xyFlZ30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSUbC2/dJMcacxkq29/kK55eTan9k4EpE1xyFlZ30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSUbC2/dJMcacxkq29/kK55eTan9k4EpE1xyFlZ30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSUbC2%2FdJMcacxkq29%2FkK55eTan9k4EpE1xyFlZ30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;167&quot; height=&quot;91&quot; data-origin-width=&quot;167&quot; data-origin-height=&quot;91&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;차량 한 대는 법인차량, 개인차량 둘 중 하나일뿐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;동시에 둘 다일 수는 없다!&lt;/u&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 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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. 학생과 수강 엔티티 간의 ERD&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ERD(Entity Relationship Diagram)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 데이터베이스 설계도&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;223&quot; data-origin-height=&quot;43&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHHchN/dJMcagNk4Ca/QE0Sl7M4PMz1t09cZkqKk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHHchN/dJMcagNk4Ca/QE0Sl7M4PMz1t09cZkqKk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHHchN/dJMcagNk4Ca/QE0Sl7M4PMz1t09cZkqKk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHHchN%2FdJMcagNk4Ca%2FQE0Sl7M4PMz1t09cZkqKk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;223&quot; height=&quot;43&quot; data-origin-width=&quot;223&quot; data-origin-height=&quot;43&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;학생 한 명은 여러 과목을 수강할 수 있고,&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;p data-ke-size=&quot;size16&quot;&gt;학생과 과목은 원래 &lt;u&gt;다대다 관계&lt;/u&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;수강번호는 학생별로 중복되어 부여될 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주식별자가 하나가 아니라 (학생번호, 수강번호) 두 속성의 조합으로 구성됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이걸 &lt;u&gt;복합 식별자&lt;/u&gt; aka 복합키라고 부른다.&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 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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10. 트랜잭션(Transaction)&lt;/h2&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;li&gt;일관성: 트랜잭션 전후에도 규칙이 유지돼야 한다. C&lt;/li&gt;
&lt;li&gt;고립성: 동시에 실행 시 서로 방해하지 않아야 한다. I&lt;/li&gt;
&lt;li&gt;지속성: 한번 커밋된 결과는 장애가 나도 보존돼야 한다. D&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQLD</category>
      <category>SQLD</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/137</guid>
      <comments>https://yyuna.tistory.com/137#entry137comment</comments>
      <pubDate>Thu, 6 Aug 2026 21:46:08 +0900</pubDate>
    </item>
    <item>
      <title>1401 - Bypass</title>
      <link>https://yyuna.tistory.com/133</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/llSBq/dJMcaaxRAvc/Mfacod1eS8VhtstGG7E1Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/llSBq/dJMcaaxRAvc/Mfacod1eS8VhtstGG7E1Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/llSBq/dJMcaaxRAvc/Mfacod1eS8VhtstGG7E1Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FllSBq%2FdJMcaaxRAvc%2FMfacod1eS8VhtstGG7E1Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;349&quot; height=&quot;205&quot; data-origin-width=&quot;349&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy17AQ/dJMb99MrVP9/s6nN01vNJuCxyurdm44haK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy17AQ/dJMb99MrVP9/s6nN01vNJuCxyurdm44haK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy17AQ/dJMb99MrVP9/s6nN01vNJuCxyurdm44haK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy17AQ%2FdJMb99MrVP9%2Fs6nN01vNJuCxyurdm44haK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;195&quot; height=&quot;281&quot; data-origin-width=&quot;195&quot; data-origin-height=&quot;281&quot;/&gt;&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;docker-compose.yml&lt;/b&gt; : &lt;u&gt;컨테이너를 어떻게 띄울지&lt;/u&gt; 포트, 폴더, 서비스 이름 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;deploy/Dockerfile&lt;/b&gt; : &lt;u&gt;컨테이너 이미지&lt;/u&gt;를 어떻게 만들지 설치, 실행 명령 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;deploy/app.js&lt;/b&gt; : 메인 서버 코드&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;docker-compose.yml&lt;/h4&gt;
&lt;pre id=&quot;code_1773988070936&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: &quot;3.9&quot;
services:
  nginx:
    image: nginx:1.22.0
    ports:
      - &quot;8000:80&quot;
    volumes:
      - ./deploy/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app
  app:
    build:
      context: ./deploy/app&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;8000 접속 시 &lt;u&gt;먼저 nginx를 거친 후 app에 들어간다&lt;/u&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;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;nginx.conf&lt;/h4&gt;
&lt;pre id=&quot;code_1773992320540&quot; class=&quot;nginx&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;go&quot;&gt;&lt;code&gt;events {
    worker_connections  1024;
}

http {
    server {
        listen 80;
        listen [::]:80;
        server_name  _;
        
        location = /shop {
            deny all;
        }

        location = /shop/ {
            deny all;
        }

        location / {
            proxy_pass http://app:3000/;
        }

    }

}&lt;/code&gt;&lt;/pre&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;/shop 요청과 /shop/ 요청을 차단&lt;/b&gt;한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;app.js&lt;/span&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773993949327&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;app.post(&quot;/shop&quot;,(req, res)=&amp;gt;{
    const leg = req.body.leg

    if (leg == 'FLAG'){
        return res.status(403).send(&quot;Access Denied&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;leg는 사용자 입력값에서 꺼낸다는 것을 알 수 있다.&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;app은 정확히 &quot;FLAG&quot;를 403으로 접근을 차단한다.&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_1773988683632&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = search(words,leg)

--------------------------------------------------------------

function search(words, leg) {
	return words.find(word =&amp;gt; word.name === leg.toUpperCase())
}&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;사용자가 입력한 값을 대문자로 변환한 후, words 배열에서 name이 일치하는 데이터를 찾아 반환한다.&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_1773995058520&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const words = require(&quot;./ag&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;words 배열은 ag.js에서 가져온다!&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;h4 data-ke-size=&quot;size20&quot;&gt;ag.js&lt;/h4&gt;
&lt;pre id=&quot;code_1773995105602&quot; class=&quot;bash&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;module.exports = [
    {
        &quot;id&quot;: 1,
        &quot;name&quot;: &quot;FLAG&quot;,
        &quot;description&quot;: &quot;DH{fake_flag}&quot;
    }
    
    ...&lt;/code&gt;&lt;/pre&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;u&gt;name 값을 기준으로 대문자로 변환된 입력값과 비교하여 FLAG 데이터를 찾을 수 있다.&lt;/u&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 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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⭐ 취약점&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773988864488&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (leg == 'FLAG'){
  return res.status(403).send(&quot;Access Denied&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;사용자가 입력한 값이 정확히 &quot;FLAG&quot;인 경우에만 차단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773988943136&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function search(words, leg) {
	return words.find(word =&amp;gt; word.name === leg.toUpperCase())
}&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;search 함수가 실행되어 어떤 대소문자의 조합의 flag도 다 FLAG로 바뀐다.&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;u&gt;필터는 원본 기준이나 검색은 대문자로 변환되는 것&lt;/u&gt;이 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필터는 FLAG만 막지만 입력은 대문자로 바꿔서 사용하므로 사용 기준이 다르다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style3&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;145&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBQgBe/dJMcadOOP9X/0VQ6UbPeDeOKed1AsXjDy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBQgBe/dJMcadOOP9X/0VQ6UbPeDeOKed1AsXjDy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBQgBe/dJMcadOOP9X/0VQ6UbPeDeOKed1AsXjDy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBQgBe%2FdJMcadOOP9X%2F0VQ6UbPeDeOKed1AsXjDy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;234&quot; height=&quot;145&quot; data-origin-width=&quot;234&quot; data-origin-height=&quot;145&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f12를 눌러 콘솔 탭에 들어간다.&lt;/p&gt;
&lt;pre id=&quot;code_1773989752136&quot; class=&quot;go&quot; data-ke-language=&quot;go&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;fetch('/shop', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  body: 'leg=flag'
})
.then(r =&amp;gt; r.text())
.then(console.log)&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;686&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nf8j3/dJMcajuLwzl/W8YXuJY9bkKB25bCKqvhr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nf8j3/dJMcajuLwzl/W8YXuJY9bkKB25bCKqvhr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nf8j3/dJMcajuLwzl/W8YXuJY9bkKB25bCKqvhr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNf8j3%2FdJMcajuLwzl%2FW8YXuJY9bkKB25bCKqvhr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;686&quot; height=&quot;387&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;387&quot;/&gt;&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;브라우저에서 /shop으로 요청을 보내면 403 응답으로 접근을 차단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답에서 알 수 있듯이 이는 nginx에서 막은 것이다.&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;브라우저는 이미 정상 경로(/shop)으로 요청을 보내기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;요청을 내가 직접 바꿔서 보낼 수 있어야 한다.&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;원하는 요청을 직접 만들 수 있는 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;curl&lt;/b&gt;&lt;/span&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;pre id=&quot;code_1774257217637&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;go&quot;&gt;&lt;code&gt;curl -X POST &quot;http://host3.dreamhack.games:19225/SHOP&quot; -d &quot;leg=flag&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;/shop 대신 /SHOP 으로 입력 시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;nginx는 다른 경로라고 생각하고 이를 통과&lt;/u&gt;시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Express는 경로 대소문자를 엄격히 구분하지 않아서 /SHOP 요청을 /shop 요청으로 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 정확히 &quot;FLAG&quot;만 막기에 &quot;flag&quot;는 통과하는 취약점이 발생한다.&lt;/p&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;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0ypW/dJMcadH4fEL/GrsQ09JcEI7rYKyXkzijN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0ypW/dJMcadH4fEL/GrsQ09JcEI7rYKyXkzijN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0ypW/dJMcadH4fEL/GrsQ09JcEI7rYKyXkzijN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0ypW%2FdJMcadH4fEL%2FGrsQ09JcEI7rYKyXkzijN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1003&quot; height=&quot;42&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;42&quot;/&gt;&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;p&gt;&lt;img style=&quot;text-align: center; caret-color: transparent; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/czUVCV/dJMcai3Ffgl/AAAAAAAAAAAAAAAAAAAAAHvE7SMdQyN0dg4p1YXSuyOkKtH2cbZIgLYQXPwhxP39/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1774969199&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=d8EnwHF9A0Lh3kbzXEfO%2FgvTOEA%3D&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;31&quot; data-is-animation=&quot;false&quot; /&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;706&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rBXBj/dJMb99TeO7D/1LNhYFwzGjnJaCAPlx4FEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rBXBj/dJMb99TeO7D/1LNhYFwzGjnJaCAPlx4FEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rBXBj/dJMb99TeO7D/1LNhYFwzGjnJaCAPlx4FEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrBXBj%2FdJMb99TeO7D%2F1LNhYFwzGjnJaCAPlx4FEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;706&quot; height=&quot;407&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안/DreamHACK</category>
      <category>Bypass #보안입문 #CTF #모의해킹</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/133</guid>
      <comments>https://yyuna.tistory.com/133#entry133comment</comments>
      <pubDate>Fri, 20 Mar 2026 17:31:43 +0900</pubDate>
    </item>
    <item>
      <title>768 - Command Injection</title>
      <link>https://yyuna.tistory.com/132</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TqC73/dJMcabp033M/orxIN582uogN5E1lylaCwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TqC73/dJMcabp033M/orxIN582uogN5E1lylaCwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TqC73/dJMcabp033M/orxIN582uogN5E1lylaCwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTqC73%2FdJMcabp033M%2ForxIN582uogN5E1lylaCwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;158&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;158&quot;/&gt;&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773984890561&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#!/usr/bin/env python3
import subprocess

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)&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;Flask 웹 앱을 만들기 위해 필요한 모듈을 불러오고 앱을 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773985005704&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@APP.route('/')
def index():
	return render_template('index.html')&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;사용자가 / 주소로 접속하면 index() 함수가 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;templates/index.html 파일을 읽어서 홈 화면을 띄워준다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Flask는 보통 HTML 파일을 render_template()로 렌더링한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773985132671&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@APP.route('/ping', methods=['GET', 'POST'])
def ping():&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;/ping 주소를 담당하는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지를 열거나(GET), 폼 데이터를 제출(POST)할 수 있다.&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;h4 data-ke-size=&quot;size20&quot;&gt;⭐ &lt;b&gt;취약점&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773985255752&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if request.method == 'POST':
	host = request.form.get('host')
        cmd = f'ping -c 3 {host}'&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;사용자가 제출한 폼 데이터에 따라 host 값이 바뀐다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당값을 ping 명령어에 끼워 넣게 되므로 host에 이상한 문자를 넣어도 그대로 들어간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773985527600&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try:
   output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)&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;subprocess.check_output()&lt;/b&gt; 는 외부 명령어를 실행하고 출력 결과를 받아오는 함수다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;셸(/bin/sh)을 열고 cmd 문자열을 명령어로 해석해서 실행하라는 뜻으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;셸에게 전체 문자열 해석을 맡기게 되는 구조&lt;/u&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;amp;&amp;amp; || 등을 입력하더라도 명령어로 해석될 수 있으므로 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;Command Injection&lt;/b&gt;&lt;/span&gt;이 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773985791440&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;return render_template('ping_result.html', data=output.decode('utf-8'))&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;명령이 성공적으로 실행되면 그 결과를 HTML에 넣어서 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;check_output() 의 결과는 보통 바이트(byte) 형태로 decode를 통해 사람이 읽을 수 있는 문자열로 바꾼다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;render_template를 통해 사용자는 브라우저에서 ping 결과를 보게 된다.&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;공격이 성공하면 ping 결과뿐 아니라 &lt;u&gt;cat flag.py 같은 추가 명령의 출력도 같이 보일 수 있다!&lt;/u&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 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;style3&quot; /&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;729&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buuztA/dJMcaaSa2mw/x8XVq0KA6upwrHQnYsvvVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buuztA/dJMcaaSa2mw/x8XVq0KA6upwrHQnYsvvVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buuztA/dJMcaaSa2mw/x8XVq0KA6upwrHQnYsvvVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuuztA%2FdJMcaaSa2mw%2Fx8XVq0KA6upwrHQnYsvvVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;267&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;267&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;/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;445&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BrlEp/dJMcabjfBz1/1WlFd7XRCNXVZnUpLaprNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BrlEp/dJMcabjfBz1/1WlFd7XRCNXVZnUpLaprNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BrlEp/dJMcabjfBz1/1WlFd7XRCNXVZnUpLaprNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBrlEp%2FdJMcabjfBz1%2F1WlFd7XRCNXVZnUpLaprNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;267&quot; data-origin-width=&quot;445&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dusNdc/dJMcacCrHYC/6rUBGef6NYPvPQRwh0bWuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dusNdc/dJMcacCrHYC/6rUBGef6NYPvPQRwh0bWuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dusNdc/dJMcacCrHYC/6rUBGef6NYPvPQRwh0bWuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdusNdc%2FdJMcacCrHYC%2F6rUBGef6NYPvPQRwh0bWuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;569&quot; height=&quot;361&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8.8.8.8 입력시 &lt;b&gt;ping -c 3 8.8.8.8&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yuiXZ/dJMcaiP8Opx/wtobwRbFdHu99gys0bCe9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yuiXZ/dJMcaiP8Opx/wtobwRbFdHu99gys0bCe9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yuiXZ/dJMcaiP8Opx/wtobwRbFdHu99gys0bCe9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyuiXZ%2FdJMcaiP8Opx%2FwtobwRbFdHu99gys0bCe9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;469&quot; height=&quot;280&quot; data-origin-width=&quot;469&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;;&lt;/b&gt;&lt;/span&gt; 는 리눅스 명령어 구분자로 앞 명령이 끝나면 다음 명령도 실행시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 서버 입장에서는 &lt;b&gt;ping -c 3 8.8.8.8, cat flag.py&lt;/b&gt;를 순서대로 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773986545344&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;host = request.form.get('host')
cmd = f'ping -c 3 {host}'
subprocess.check_output(['/bin/sh', '-c', cmd])&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;u&gt;사용자에게 입력받은 host를 명령어로 실행해버리는 취약점을 악용&lt;/u&gt;한 전형적인 &lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;Command Injection&lt;/b&gt;&lt;/span&gt; 공격이 가능해진다.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S8no2/dJMcad2mi3C/bXhnnM9DkUjfxZlsZ65FMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S8no2/dJMcad2mi3C/bXhnnM9DkUjfxZlsZ65FMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S8no2/dJMcad2mi3C/bXhnnM9DkUjfxZlsZ65FMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS8no2%2FdJMcad2mi3C%2FbXhnnM9DkUjfxZlsZ65FMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;880&quot; height=&quot;361&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;361&quot;/&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;33&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baGeBb/dJMcagSnIZz/vja8FrLNvZKkJ8O4PRYnYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baGeBb/dJMcagSnIZz/vja8FrLNvZKkJ8O4PRYnYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baGeBb/dJMcagSnIZz/vja8FrLNvZKkJ8O4PRYnYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaGeBb%2FdJMcagSnIZz%2Fvja8FrLNvZKkJ8O4PRYnYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;127&quot; height=&quot;33&quot; data-origin-width=&quot;127&quot; data-origin-height=&quot;33&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wmhk9/dJMcai3E8h7/hw40Hfr4VsWd9dUie56p9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wmhk9/dJMcai3E8h7/hw40Hfr4VsWd9dUie56p9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wmhk9/dJMcai3E8h7/hw40Hfr4VsWd9dUie56p9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwmhk9%2FdJMcai3E8h7%2Fhw40Hfr4VsWd9dUie56p9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;726&quot; height=&quot;417&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안/DreamHACK</category>
      <category>CommandInjection #CTF #보안입문 #모의해킹</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/132</guid>
      <comments>https://yyuna.tistory.com/132#entry132comment</comments>
      <pubDate>Fri, 20 Mar 2026 15:11:03 +0900</pubDate>
    </item>
    <item>
      <title>769 - SQL Injection</title>
      <link>https://yyuna.tistory.com/131</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dtpYPS/dJMcacJdPZA/oKKcSPgWk4JEVU37vZ5mK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dtpYPS/dJMcacJdPZA/oKKcSPgWk4JEVU37vZ5mK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dtpYPS/dJMcacJdPZA/oKKcSPgWk4JEVU37vZ5mK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdtpYPS%2FdJMcacJdPZA%2FoKKcSPgWk4JEVU37vZ5mK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;793&quot; height=&quot;142&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;142&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;우선 코드를 분석해보자!&lt;/p&gt;
&lt;pre id=&quot;code_1773981072016&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from flask import Flask, request, render_template, g
import sqlite3
import os
import binascii

app = Flask(__name__)
app.secret_key = os.urandom(32)&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;Flask 웹앱을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773981145688&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'&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;현재 폴더의 flag.txt.를 읽어서 FLAG 변수에 저장한다. 없으면 임시값 [**FLAG**] 을 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773981245296&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DATABASE = &quot;database.db&quot;
if os.path.exists(DATABASE) == False:
    db = sqlite3.connect(DATABASE)
    db.execute('create table users(userid char(100), userpassword char(100), userlevel integer);')
    db.execute(f'insert into users(userid, userpassword, userlevel) values (&quot;guest&quot;, &quot;guest&quot;, 0), (&quot;admin&quot;, &quot;{binascii.hexlify(os.urandom(16)).decode(&quot;utf8&quot;)}&quot;, 0);')
    db.commit()
    db.close()&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;DB가 없으면 새로 만들고 users 테이블을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼은 userid, userpasswor, userlevel 총 3개를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 데이터는 (&quot;guest&quot;, &quot;guest&quot;,0), (&quot;admin&quot;, 랜덤비밀번호, 0) 총 2개를 넣는다.&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;admin 비밀번호는 랜덤이라 정상 로그인으로는 맞출 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 admin의 userlevel도 0인 것을 보아 &lt;u&gt;&lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;SQL Injection&lt;/b&gt;&lt;/span&gt;으로 admin 행을 끌어오게 만드는 문제&lt;/u&gt;일 가능성이 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773981449424&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def query_db(query, one=True):
    cur = get_db().execute(query)
    rv = cur.fetchall()
    cur.close()
    return (rv[0] if rv else None) if one else rv&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;p data-ke-size=&quot;size16&quot;&gt;전달받은 query 문자열을 그대로 실행한다. 파라미터 바인딩이 없기에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 입력이 SQL문 안으로 그대로 들어가면 SQL Injection이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773981634928&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        userlevel = request.form.get('userlevel')
        res = query_db(f&quot;select * from users where userlevel='{userlevel}'&quot;)
        if res:
            userid = res[0]
            userlevel = res[2]
            print(userid, userlevel)
            if userid == 'admin' and userlevel == 0:
                return f'hello {userid} flag is {FLAG}'
            return f'&amp;lt;script&amp;gt;alert(&quot;hello {userid}&quot;);history.go(-1);&amp;lt;/script&amp;gt;'
        return '&amp;lt;script&amp;gt;alert(&quot;wrong&quot;);history.go(-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 data-ke-size=&quot;size16&quot;&gt;request.form.get() 는 &lt;u&gt;사용자가 웹에서 입력한 값을 가져오는 함수&lt;/u&gt;다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;⭐ 사용자가 POST로 보낸값은 &lt;b&gt;userlevel = request.form.get('userlevel')&lt;/b&gt; 뿐이다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;보통 로그인이라면 아이디, 비밀번호도 받아야 하는데 해당 문제는 userlevel만 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 이 문제는 특정 조건을 만족하는 행을 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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; ⭐&amp;nbsp; 취약점&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773981878952&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;res = query_db(f&quot;select * from users where userlevel='{userlevel}'&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;사용자 입력을 SQL 문자열에 직접 이어붙였기 때문에 취약하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 입력값에 따옴표를 끊고 &lt;u&gt;SQL 문법을 섞으면&lt;/u&gt; 원래 개발자가 의도한 조건을 바꿀 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조가 전형적인 &lt;span style=&quot;background-color: #f3c000;&quot;&gt;&lt;b&gt;SQL Injection&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;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; ⭐&amp;nbsp; 플래그가 나오는 조건&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773982014704&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if userid == 'admin' and userlevel == 0:
	return f'hello {userid} flag is {FLAG}'&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;플래그를 얻으려면 res에 들어온 첫번째 행이 userid == 'admin', userlevel == 0 이어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에 이미 (&quot;admin&quot;, 랜덤비밀번호, 0) 행이 존재하므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;쿼리 결과의 첫번째 행을 admin으로 만들면 된다!&lt;/u&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 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;style3&quot; /&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;479&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpMGkf/dJMcaflCUjd/KdVMk3xfTik2TYSr1ig3c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpMGkf/dJMcaflCUjd/KdVMk3xfTik2TYSr1ig3c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpMGkf/dJMcaflCUjd/KdVMk3xfTik2TYSr1ig3c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpMGkf%2FdJMcaflCUjd%2FKdVMk3xfTik2TYSr1ig3c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;150&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PXPXl/dJMcaaxRp1x/MvJfaKEU6X199FY7y1Ewe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PXPXl/dJMcaaxRp1x/MvJfaKEU6X199FY7y1Ewe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PXPXl/dJMcaaxRp1x/MvJfaKEU6X199FY7y1Ewe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPXPXl%2FdJMcaaxRp1x%2FMvJfaKEU6X199FY7y1Ewe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;487&quot; height=&quot;294&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 해석했던대로 입력값은 userlevel만 존재한다.&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;382&quot; data-origin-height=&quot;261&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfq2YP/dJMcabp0Ybl/xgfUfvumsTLK0IMfK3ee80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfq2YP/dJMcabp0Ybl/xgfUfvumsTLK0IMfK3ee80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfq2YP/dJMcabp0Ybl/xgfUfvumsTLK0IMfK3ee80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfq2YP%2FdJMcabp0Ybl%2FxgfUfvumsTLK0IMfK3ee80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;261&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;261&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb3XzK/dJMcadac6hA/Gszobi5JXzaDcI1R2HP3G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb3XzK/dJMcadac6hA/Gszobi5JXzaDcI1R2HP3G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb3XzK/dJMcadac6hA/Gszobi5JXzaDcI1R2HP3G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb3XzK%2FdJMcadac6hA%2FGszobi5JXzaDcI1R2HP3G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;538&quot; height=&quot;163&quot; data-origin-width=&quot;538&quot; data-origin-height=&quot;163&quot;/&gt;&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;정상값인 0 을 입력할 경우, guest로 정상 로그인된다.&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;우리는 플래그 조건을 참고하여 admin 행이 나오게 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;⭐ SQL Injection 공격&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1773983128705&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select * from users whrere userlevel='입력값'&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;원래 쿼리에서 입력값으로 WHERE 조건을 바꿔야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1773982605960&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0' AND userid='admin' --&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;우리의 목표는 admin이 첫번째로 출력되게 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당값을 입력하면 &lt;b&gt;select * from users wherer userlevel='0' AND userid='admin' --&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;0'을 입력하여 문자열을 강제로 닫고 AND 조건을 추가하여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&quot;userlevel이 0이면서 admin&quot; 인 데이터만&lt;/u&gt; 가져오게 된다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 '가 남아있으므로&lt;span style=&quot;background-color: #f3c000;&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;size16&quot;&gt;--을 빼면 Ineternal Server Error가 뜨는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eK7Oub/dJMcacvGUGv/bSMwqCCJmWfHZ4LOjck6R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eK7Oub/dJMcacvGUGv/bSMwqCCJmWfHZ4LOjck6R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eK7Oub/dJMcacvGUGv/bSMwqCCJmWfHZ4LOjck6R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeK7Oub%2FdJMcacvGUGv%2FbSMwqCCJmWfHZ4LOjck6R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;204&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;204&quot;/&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HppvO/dJMcafMIP6U/7pVGGykjxFFPXngrKIewe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HppvO/dJMcafMIP6U/7pVGGykjxFFPXngrKIewe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HppvO/dJMcafMIP6U/7pVGGykjxFFPXngrKIewe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHppvO%2FdJMcafMIP6U%2F7pVGGykjxFFPXngrKIewe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;280&quot; data-origin-width=&quot;467&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;63&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qXsSa/dJMcafMI4Su/S8D2IKKTbFbPPBA519iMd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qXsSa/dJMcafMI4Su/S8D2IKKTbFbPPBA519iMd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qXsSa/dJMcafMI4Su/S8D2IKKTbFbPPBA519iMd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqXsSa%2FdJMcafMI4Su%2FS8D2IKKTbFbPPBA519iMd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;63&quot; data-origin-width=&quot;280&quot; data-origin-height=&quot;63&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;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;716&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dciY8z/dJMcacCrz4b/iCagVbL0dQ2Ke2S716Bkck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dciY8z/dJMcacCrz4b/iCagVbL0dQ2Ke2S716Bkck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dciY8z/dJMcacCrz4b/iCagVbL0dQ2Ke2S716Bkck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdciY8z%2FdJMcacCrz4b%2FiCagVbL0dQ2Ke2S716Bkck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;716&quot; height=&quot;418&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제 해결 성공!&lt;/p&gt;</description>
      <category>보안/DreamHACK</category>
      <category>SQLInjection #웹해킹 #보안입문 #CTF</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/131</guid>
      <comments>https://yyuna.tistory.com/131#entry131comment</comments>
      <pubDate>Fri, 20 Mar 2026 14:00:01 +0900</pubDate>
    </item>
    <item>
      <title>ASA SSH, Telnet 접속</title>
      <link>https://yyuna.tistory.com/129</link>
      <description>&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;1287&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOMV7k/dJMcaaDIcBs/VC8QZGkKuhScVsfYTHwsnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOMV7k/dJMcaaDIcBs/VC8QZGkKuhScVsfYTHwsnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOMV7k/dJMcaaDIcBs/VC8QZGkKuhScVsfYTHwsnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOMV7k%2FdJMcaaDIcBs%2FVC8QZGkKuhScVsfYTHwsnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1287&quot; height=&quot;413&quot; data-origin-width=&quot;1287&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wiDrj/dJMcajtP7Ug/S6kYF6KudtPEW6CYVRmYY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wiDrj/dJMcajtP7Ug/S6kYF6KudtPEW6CYVRmYY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wiDrj/dJMcajtP7Ug/S6kYF6KudtPEW6CYVRmYY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwiDrj%2FdJMcajtP7Ug%2FS6kYF6KudtPEW6CYVRmYY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1383&quot; height=&quot;424&quot; data-origin-width=&quot;1383&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cR7Vi0/dJMcai9xiFS/JZCFj5rywGWpdreqWPznV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cR7Vi0/dJMcai9xiFS/JZCFj5rywGWpdreqWPznV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cR7Vi0/dJMcai9xiFS/JZCFj5rywGWpdreqWPznV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcR7Vi0%2FdJMcai9xiFS%2FJZCFj5rywGWpdreqWPznV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;873&quot; height=&quot;575&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1DAXr/dJMcadtC6NL/Wtud5mHoeGNcSToo9GxuWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1DAXr/dJMcadtC6NL/Wtud5mHoeGNcSToo9GxuWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1DAXr/dJMcadtC6NL/Wtud5mHoeGNcSToo9GxuWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1DAXr%2FdJMcadtC6NL%2FWtud5mHoeGNcSToo9GxuWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;207&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&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;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8LxXV/dJMcagjC9Ad/ExYDkEFG9kf8EYaKcK9PKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8LxXV/dJMcagjC9Ad/ExYDkEFG9kf8EYaKcK9PKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8LxXV/dJMcagjC9Ad/ExYDkEFG9kf8EYaKcK9PKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8LxXV%2FdJMcagjC9Ad%2FExYDkEFG9kf8EYaKcK9PKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;940&quot; height=&quot;131&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;131&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC로 핑이 안가서 윈도우 방화벽 파일프린터및 공유 ICMPv4 규칙 사용&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;947&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMgQoH/dJMcadtC6T9/RQvBN2NI2bnDUEZxlChlxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMgQoH/dJMcadtC6T9/RQvBN2NI2bnDUEZxlChlxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMgQoH/dJMcadtC6T9/RQvBN2NI2bnDUEZxlChlxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMgQoH%2FdJMcadtC6T9%2FRQvBN2NI2bnDUEZxlChlxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;947&quot; height=&quot;171&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;171&quot;/&gt;&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;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;</description>
      <category>네트워크/Project</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/129</guid>
      <comments>https://yyuna.tistory.com/129#entry129comment</comments>
      <pubDate>Mon, 24 Nov 2025 17:31:18 +0900</pubDate>
    </item>
    <item>
      <title>ASA (Adaptive Security Appliance)</title>
      <link>https://yyuna.tistory.com/120</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;❤️ ASA&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASA는 방화벽 + VPN + 침입 방지 + 트래픽 제어 기능을 한 장비에 통합한 보안 게이트웨이 이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 기능&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;방화벽(Firewall): 상태기반 검사로 트래픽을 제어한다. 세션 정보를 기억해서 응답 패킷만 허용한다.&lt;/li&gt;
&lt;li&gt;NAT: 내부 사설 IP를 외부 공인 IP로 변환한다.&lt;/li&gt;
&lt;li&gt;IPS: 비정상 트래픽을 탐지, 차단한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터페이스 이름이 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Inside&lt;/b&gt;&lt;/span&gt; 이면 기본적으로 &lt;u&gt;&lt;b&gt;보안 레벨이 가장 높은 100을 적용&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 인터페이스 이름들은 보안 레벨이 가장 낮은 0을 적용한다.&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;&lt;u&gt;&lt;b&gt;보안 레벨이 같은 곳에서 서로의 트래픽 흐름은 기본적으로 모두 거부&lt;/b&gt;&lt;/u&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;h2 data-ke-size=&quot;size26&quot;&gt;  ASA 명령어&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;방화벽 모드&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;Router Mode(L3): 기본값&lt;/li&gt;
&lt;li&gt;Transparent Mode(L2): 스위치처럼 작동&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1763328163632&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;no firewall transparent  # Router Mode

firewall transparent  # Transparent Mode

show firewall  # 확인&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;h4 data-ke-size=&quot;size20&quot;&gt;컨텍스트 모드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 ASA를 여러 개의 가상 방화벽으로 나눌 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1763328275702&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mode single  # 단일 사용(Default)

mode multiple  # 멀티 사용&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;h4 data-ke-size=&quot;size20&quot;&gt;기본 설정&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASA는 인터페이스에 반드시 이름과 보안 등급을 설정해야 한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;nameif: 인터페잇의 논리적 역할 지정&lt;/li&gt;
&lt;li&gt;Security Level: 0~100, 높은 레벨에서 낮은 레벨 방향은 허용, 반대는 차단, inside=100~outside=0&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1763328418286&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int e0
nameif inside
security-level 100
ip address 1.1.2.0 255.255.255.0&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;h4 data-ke-size=&quot;size20&quot;&gt;ASA&amp;nbsp; Routing&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASA는 라우터처럼 보이지만 OSPF에서 와일드 마스크를 사용하지 않고 &lt;u&gt;&lt;b&gt;서브넷 마스크만 사용&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1763328521408&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;router ospf 1
network 1.1.20.0 255.255.255.0 area 0  # 서브넷 마스크만 사용&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;h4 data-ke-size=&quot;size20&quot;&gt;HTTP 활성화&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC에서 http 접속이 가능하게 설정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1763328718878&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip http server
ip http authentication enable
ip http authentication local
username cisco privilege 15 password cisco&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;정보/ 모니터링 명령어&lt;/h4&gt;
&lt;pre id=&quot;code_1763328659962&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;show interface ip brief  # 인터페이스 확인

show route  # 라우팅 테이블 확인

show conn all  # 연결된 세션 확인

clear config all  # 초기 설정 지우기

command-alias exec c conf t  # 단추 명령 추가

logging enable  # 로그 활성화&lt;/code&gt;&lt;/pre&gt;</description>
      <category>네트워크</category>
      <category>ASA</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/120</guid>
      <comments>https://yyuna.tistory.com/120#entry120comment</comments>
      <pubDate>Mon, 17 Nov 2025 06:32:32 +0900</pubDate>
    </item>
    <item>
      <title>ZFW (Zone-based Policy Firewall)</title>
      <link>https://yyuna.tistory.com/109</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;❤️ ZFW&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cisco 라우터에서 방화벽 기능을 구현하는 방식으로 기존 CBAC보다 발전된 형태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASA/PIX 방화벽처럼 &lt;u&gt;&lt;b&gt;Zone 단위로 트래픽 정책을 관리&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;주요 용어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Zone&lt;/b&gt;&lt;/span&gt;: 논리적 보안 영역&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Zone-pair&lt;/b&gt;: 두 Zone 간의 트래픽 방향 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Policy-map&lt;/b&gt;: 어떤 트래픽을 허용/차단할지 정의&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Class-map&lt;/b&gt;: 어떤 트래픽을 Policy-map에서 참조할지 지정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;ZFW&lt;/b&gt;&lt;/span&gt;은 인터페이스 기반인 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CBAC보다&lt;/span&gt;&amp;nbsp;&lt;u&gt;&lt;b&gt;훨씬 세분화된 정책 관리가 가능&lt;/b&gt;&lt;/u&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;h2 data-ke-size=&quot;size26&quot;&gt;  ZFW 실습&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdgJgH/dJMcahiqCHl/TckKfNAB6akgIHvLBpzsLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdgJgH/dJMcahiqCHl/TckKfNAB6akgIHvLBpzsLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdgJgH/dJMcahiqCHl/TckKfNAB6akgIHvLBpzsLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdgJgH%2FdJMcahiqCHl%2FTckKfNAB6akgIHvLBpzsLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;262&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. zone 생성, 각 인터페이스에 할당&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ZFW에서는 인터페이스를 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;zone&lt;/b&gt;&lt;/span&gt;으로 묶어 관리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;zone security&lt;/b&gt; 명령으로 보안 영역을 만들고 &lt;b&gt;zone-member security&lt;/b&gt; 명령으로 인터페이스를 해당 zone에 할당한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762482407002&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2
zone security inside
zone security outside

int s1/0
zone-member security inside
exit

int s1/1
zone-member security outside
exit

# 확인
do show zone security&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;527&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rtcww/dJMcakzsnCg/8RQG916VLldsqjyYjZKA8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rtcww/dJMcakzsnCg/8RQG916VLldsqjyYjZKA8K/img.png&quot; data-alt=&quot;생성된 zone 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rtcww/dJMcakzsnCg/8RQG916VLldsqjyYjZKA8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRtcww%2FdJMcakzsnCg%2F8RQG916VLldsqjyYjZKA8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;527&quot; height=&quot;384&quot; data-origin-width=&quot;527&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성된 zone 확인&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;h4 data-ke-size=&quot;size20&quot;&gt;2. Zone-pair를 만든다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ZFW는 기본적으로 zone 간 트래픽을 차단하기 때문에 통신을 허용하거나 차단하려면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;Zone-pair&lt;/b&gt;&lt;/span&gt;로 두 zone을 묶어 트래픽 방향을 정의해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762483433256&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2(config)
zone-pair security Outbound source inside destination outside

# 확인
do show zone-pair security&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;713&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t7ju5/dJMcagqhXPu/mzCfqSrTn6hWuVZgLm0Fb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t7ju5/dJMcagqhXPu/mzCfqSrTn6hWuVZgLm0Fb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t7ju5/dJMcagqhXPu/mzCfqSrTn6hWuVZgLm0Fb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft7ju5%2FdJMcagqhXPu%2FmzCfqSrTn6hWuVZgLm0Fb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;132&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;132&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. CPL(Cisco Policy Language)을 이용하여 보안정책을 정의한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;클래스맵&lt;/b&gt;&lt;/span&gt;은 &lt;u&gt;&lt;b&gt;어떤 트래픽을 정책에 적용할 것인지를 정의&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 클래스맵은 ACL이 허용한대로 모든 트래픽에 정책이 매칭된다.&lt;/p&gt;
&lt;pre id=&quot;code_1762483576752&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2
ip access-list extended acl-out
permit ip any any 
exit

# 클래스맵 생성
class-map type inspect class-outbound
match access-group name acl-out
exit&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;&lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;폴리시맵&lt;/b&gt;&lt;/span&gt;은 &lt;u&gt;&lt;b&gt;매칭된 트래픽을 어떻게 처리할지 정의&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;inspect&lt;/b&gt;&lt;/span&gt;로 설정 시 트래픽을 검사하고 세션을 추적하여 통신을 살릴 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1762483740752&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 폴리시맵 생성
policy-map type inspect policy-outbound
class type inspect class-outbound
inspect&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;111&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bneuzk/dJMcain6zjU/Hg8ZXBXyHC6u9ywO1KbU3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bneuzk/dJMcain6zjU/Hg8ZXBXyHC6u9ywO1KbU3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bneuzk/dJMcain6zjU/Hg8ZXBXyHC6u9ywO1KbU3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbneuzk%2FdJMcain6zjU%2FHg8ZXBXyHC6u9ywO1KbU3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;111&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;111&quot;/&gt;&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;h4 data-ke-size=&quot;size20&quot;&gt;4. Zone-pair에 보안정책을 적용한다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;service-policy&lt;/b&gt; 명령을 이용해 &lt;u&gt;&lt;b&gt;보안정책(policy-map)을 Zone-pair에 적용&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이로써 ZFW는 실제로 트래픽을 검사하고 제어할 수 있게 된다!&lt;/p&gt;
&lt;pre id=&quot;code_1762484705991&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;zone-pair security Outbound
service-policy type inspect policy-outbound&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;gt;외부는 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cb3ck1/dJMcab3AlXH/vplgOkm6YJd7kINJZUhDAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cb3ck1/dJMcab3AlXH/vplgOkm6YJd7kINJZUhDAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cb3ck1/dJMcab3AlXH/vplgOkm6YJd7kINJZUhDAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcb3ck1%2FdJMcab3AlXH%2FvplgOkm6YJd7kINJZUhDAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;426&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;426&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;외부&amp;gt;내부는 불가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bARqVG/dJMcaj1Cn5a/RR5SlPFof2qizbcM1quv9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bARqVG/dJMcaj1Cn5a/RR5SlPFof2qizbcM1quv9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bARqVG/dJMcaj1Cn5a/RR5SlPFof2qizbcM1quv9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbARqVG%2FdJMcaj1Cn5a%2FRR5SlPFof2qizbcM1quv9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;433&quot; height=&quot;274&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;274&quot;/&gt;&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;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 data-ke-size=&quot;size26&quot;&gt;  R3&amp;gt;R1(외부&amp;gt;내부) Telnet 허용하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부&amp;gt;내부로 들어오는 인바운드 트래픽 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;T&lt;/b&gt;&lt;b&gt;elnet 트래픽만 대상으로(&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;클래스 맵&lt;/span&gt;) inspect 하도록 정책을 설정(&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;폴리시 맵&lt;/span&gt;)&lt;/b&gt;&lt;/u&gt;하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 zone-pair를 통해 &lt;u&gt;&lt;b&gt;서로 다른 zone 간의 트래픽 방향과 정책을 연결&lt;/b&gt;&lt;/u&gt;하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지정된 방향으로만(source&amp;gt;destination) 정책이 적용된다!&lt;/p&gt;
&lt;pre id=&quot;code_1762485484910&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2
# 클래스맵 생성
class-map type inspect class-inbound
match protocol telnet
exit

# 폴리시맵 생성
policy-map type inspect policy-inbound
class type inspect class-inbound
inspect
exit
exit

# Inbound zone-pair 생성 및 적용
zone-pair security Inbound source outside destination inside
service-policy type inspect policy-inbound&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;378&quot; data-origin-height=&quot;230&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c67q7F/dJMcabP3bG9/T8Za3oZGUPkdLPHvs2dfqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c67q7F/dJMcabP3bG9/T8Za3oZGUPkdLPHvs2dfqK/img.png&quot; data-alt=&quot;외부&amp;amp;gt;내부(Inbound) Telnet 허용된걸 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c67q7F/dJMcabP3bG9/T8Za3oZGUPkdLPHvs2dfqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc67q7F%2FdJMcabP3bG9%2FT8Za3oZGUPkdLPHvs2dfqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;378&quot; height=&quot;230&quot; data-origin-width=&quot;378&quot; data-origin-height=&quot;230&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;외부&amp;gt;내부(Inbound) Telnet 허용된걸 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>네트워크</category>
      <category>ZFW #방화벽</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/109</guid>
      <comments>https://yyuna.tistory.com/109#entry109comment</comments>
      <pubDate>Fri, 7 Nov 2025 12:30:12 +0900</pubDate>
    </item>
    <item>
      <title>CBAC (Context-Based Access Control)</title>
      <link>https://yyuna.tistory.com/108</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;❤️ CBAC&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CBAC은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;Stateful Firewall&lt;/b&gt;&lt;/span&gt; 기능을 갖추어 L7 트래픽이 제어 가능한 ACL이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;Stateful Firewall&lt;/span&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 상태를 추적하여 &lt;u&gt;&lt;b&gt;내부에서 시작된 트래픽의 응답만 허용&lt;/b&gt;&lt;/u&gt;하고&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;동작방식&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;내부 &amp;gt; 외부 트래픽 감시: 내부에서 출발한 패킷을 CBAC가 감시한다. (&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;state tracking&lt;/b&gt;&lt;/span&gt;)&lt;/li&gt;
&lt;li&gt;임시 ACL 생성: CBAC이 설정된 인터페이스 방향으로 송수신 발생 시 임시 ACL이 자동 생성된다.&lt;/li&gt;
&lt;li&gt;세션 종료 시 ACL 삭제: 세션 종료 시 해당 임시 ACL이 제거된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세션 종료 조건&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;TCP: FIN 패킷 후 5초 경과&lt;/li&gt;
&lt;li&gt;UDP: 30초간 트래픽 X&lt;/li&gt;
&lt;li&gt;DNS: 질의 후 5초 이내 응답 없으면 제거, 응답 시 즉시 제거&lt;/li&gt;
&lt;li&gt;ICMP: 10초 이내 응답 없으면 제거&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #f89009;&quot;&gt;&lt;b&gt;RACL vs CBAC&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CBAC는 Stateful 기능으로 세션을 추적하여 ACL을 자동 생성하여 L7 까지 제어가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RACL과 달리 동적으로 ACL이 생성되므로 보안성, 유연성이 높다.&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;h2 data-ke-size=&quot;size26&quot;&gt;  테스트 환경 구축&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRh6C/dJMcagRmeTk/XxcgiLEc6kEho2g2oZFKWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRh6C/dJMcagRmeTk/XxcgiLEc6kEho2g2oZFKWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRh6C/dJMcagRmeTk/XxcgiLEc6kEho2g2oZFKWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRh6C%2FdJMcagRmeTk%2FXxcgiLEc6kEho2g2oZFKWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;787&quot; height=&quot;263&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R2 s1/1 인터페이스에 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;CBAC&lt;/b&gt;&lt;/span&gt;을 설정하여&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R2가 내부(1.1.12.0)에서 외부(1.1.23.0)로 나가는 트래픽을 검사하여 &lt;u&gt;&lt;b&gt;정상적인 응답만 돌아올 수 있도록 허용&lt;/b&gt;&lt;/u&gt;하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 외부 요청은 차단해보자! &lt;b&gt;(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;Stateful Firewall&lt;/span&gt; 역할 수행)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;패킷 검사 규칙 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CBAC이 감시해야 하는 프로토콜을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;내부&amp;gt;외부로 나가는 TCP, UDP, ICMP 트래픽을 감시&lt;/b&gt;&lt;/u&gt;하고 세션 정보를 저장한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762479000238&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2
ip inspect name mycbac tcp
ip inspect name mycbac udp
ip inspect name mycbac icmp&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;h4 data-ke-size=&quot;size20&quot;&gt;외부에서 들어올 트래픽 기본 ACL 정의&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부(1.1.23.3)와의 OSPF 통신은 항상 허용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 ACL은 CBAC과 함께 적용된다. 나머지는 CBAC이 &lt;u&gt;&lt;b&gt;동적으로 임시 ACL을 생성해 허용&lt;/b&gt;&lt;/u&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762479083910&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2
ip access-list extended acl-in
permit ospf host 1.1.23.3 any&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;h4 data-ke-size=&quot;size20&quot;&gt;인터페이스 적용&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;s1/1 인터페이스를 통해 &lt;u&gt;&lt;b&gt;외부로 나가는 트래픽을 추적&lt;/b&gt;&lt;/u&gt;하도록 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부&amp;gt;내부로 들어오는 트래픽은 &lt;b&gt;acl-in + CBAC&lt;/b&gt;이 만든 임시 ACL 규칙으로 제어한다.&lt;/p&gt;
&lt;pre id=&quot;code_1762479175582&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R2
int s1/1
ip inspect mycbac out
ip access-group acl-in in&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;h4 data-ke-size=&quot;size20&quot;&gt;R3 테스트용 서버 구축&lt;/h4&gt;
&lt;pre id=&quot;code_1762479522381&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# R3(config)
line vty 0 15
password cisco
login
transport input telnet

ip http server&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;h2 data-ke-size=&quot;size26&quot;&gt;  테스트 결과 확인&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;R1 &amp;gt; R3 Telnet 테스트(내부 &amp;gt; 외부)&lt;/span&gt;&lt;/h4&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;408&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0XSPV/dJMcaezeXdp/6A5rXvTGCSCbQWSjiVEek1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0XSPV/dJMcaezeXdp/6A5rXvTGCSCbQWSjiVEek1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0XSPV/dJMcaezeXdp/6A5rXvTGCSCbQWSjiVEek1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0XSPV%2FdJMcaezeXdp%2F6A5rXvTGCSCbQWSjiVEek1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;408&quot; height=&quot;226&quot; data-origin-width=&quot;408&quot; data-origin-height=&quot;226&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;u&gt;show ip inspect sessions detail&lt;/u&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CBAC이 현재 추적 중인 세션 목록을 상세히 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VDfh/dJMcaajiYpN/f5xt8UnOkMvpaJdjUzbSsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VDfh/dJMcaajiYpN/f5xt8UnOkMvpaJdjUzbSsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VDfh/dJMcaajiYpN/f5xt8UnOkMvpaJdjUzbSsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VDfh%2FdJMcaajiYpN%2Ff5xt8UnOkMvpaJdjUzbSsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;876&quot; height=&quot;191&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;191&quot;/&gt;&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;telnet 세션을 종료하면 CBAC은 자동으로 삭제된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NVgHJ/dJMcadG6ba1/cN02ky8R6RB2QwJoPeXVek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NVgHJ/dJMcadG6ba1/cN02ky8R6RB2QwJoPeXVek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NVgHJ/dJMcadG6ba1/cN02ky8R6RB2QwJoPeXVek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNVgHJ%2FdJMcadG6ba1%2FcN02ky8R6RB2QwJoPeXVek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;64&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;64&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;R3 &amp;gt; R1 &lt;/span&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;PING, &lt;/span&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;Telnet 테스트(외부 &amp;gt; 내부)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 내부로 접근하는 트래픽은 CBAC이 감지하여 자동 차단된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca7QIi/dJMcahbE49W/tFurMqzXY3UYefFESmiQV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca7QIi/dJMcahbE49W/tFurMqzXY3UYefFESmiQV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca7QIi/dJMcahbE49W/tFurMqzXY3UYefFESmiQV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca7QIi%2FdJMcahbE49W%2FtFurMqzXY3UYefFESmiQV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;260&quot; data-origin-width=&quot;625&quot; data-origin-height=&quot;260&quot;/&gt;&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;내부에서 외부로 나가는 tcp 요청은 다 허용해서 http 응답도 온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2Jyfj/dJMcad8aARQ/U4cAHRoML4ovQ2SyDGsmFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2Jyfj/dJMcad8aARQ/U4cAHRoML4ovQ2SyDGsmFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2Jyfj/dJMcad8aARQ/U4cAHRoML4ovQ2SyDGsmFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2Jyfj%2FdJMcad8aARQ%2FU4cAHRoML4ovQ2SyDGsmFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;401&quot; height=&quot;88&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;88&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;telnet은 거부하고, http만 허용하게 설정도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CBAC이 tcp가 아닌 &lt;u&gt;&lt;b&gt;http(포트 80)만 감시하도록 설정&lt;/b&gt;&lt;/u&gt;하면 된다!&lt;/p&gt;
&lt;pre id=&quot;code_1762481402779&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 이전 CBAC 삭제
no ip inspect name mycbac

# 새로운 CBAC 생성
ip inspect name mycbac http

int s1/1
ip inspect mycbac out&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;685&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8E8Ms/dJMcaiVWxO2/xH70yKDlZcSVMx0pCleDBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8E8Ms/dJMcaiVWxO2/xH70yKDlZcSVMx0pCleDBk/img.png&quot; data-alt=&quot;telnet 접속 거부&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8E8Ms/dJMcaiVWxO2/xH70yKDlZcSVMx0pCleDBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8E8Ms%2FdJMcaiVWxO2%2FxH70yKDlZcSVMx0pCleDBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;108&quot; data-origin-width=&quot;685&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;telnet 접속 거부&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRXATw/dJMb99YZ8LT/8Y6SYUyyWQMITjl2HmPWFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRXATw/dJMb99YZ8LT/8Y6SYUyyWQMITjl2HmPWFK/img.png&quot; data-alt=&quot;http만 동적으로 허용&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRXATw/dJMb99YZ8LT/8Y6SYUyyWQMITjl2HmPWFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRXATw%2FdJMb99YZ8LT%2F8Y6SYUyyWQMITjl2HmPWFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;438&quot; height=&quot;96&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;http만 동적으로 허용&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>네트워크</category>
      <category>ACL</category>
      <category>CBAC</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/108</guid>
      <comments>https://yyuna.tistory.com/108#entry108comment</comments>
      <pubDate>Fri, 7 Nov 2025 10:51:52 +0900</pubDate>
    </item>
    <item>
      <title>Extended ACL(Access Control List) 문법 핵심 정리</title>
      <link>https://yyuna.tistory.com/107</link>
      <description>&lt;pre id=&quot;code_1762473510373&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip access-list extended [ACL이름] 
permit [프로토콜] [출발지] [목적지] [옵션]
deny [프로토콜] [출발지] [목적지] [옵션]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로토콜&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;L3: &lt;b&gt;ip&lt;/b&gt;, ospf, icmp&lt;/li&gt;
&lt;li&gt;L4: &lt;b&gt;tcp&lt;/b&gt;, udp&lt;/li&gt;
&lt;li&gt;L7: http(80/tcp), ssh(22/tcp), dns(53/udp) &lt;u&gt;&lt;b&gt;포트로 식별&lt;/b&gt;&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ip 차단 시 ICMP, OSPF, TCP, UDP 등 모든 IP 패킷이 차단된다!&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;h4 data-ke-size=&quot;size20&quot;&gt;예제1. PING 거부, 라우팅(OSPF) 허용, TCP 허용&lt;/h4&gt;
&lt;pre id=&quot;code_1762473745869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip access-list extended ACL-IN
permit ospf any any
permit tcp any any established
deny icmp any any
permit ip any any&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;permit ospf: 라우터 간 OSPF Neighbor 관계 허용&lt;/li&gt;
&lt;li&gt;permit tcp - established: 내부에서 먼저 시작한 세션의 응답 허용&lt;/li&gt;
&lt;li&gt;deny icmp: PING 차단&lt;/li&gt;
&lt;li&gt;permit ip: 나머지 IP 트래픽 허용&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예제2. 내부 서버(192.168.10.10)에 대한 외부 Telnet 접속만 허용&lt;/h4&gt;
&lt;pre id=&quot;code_1762473885493&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip access-list extended TELNET-IN
permit tcp any 192.168.10.10 eq 23&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;permit tcp [any] [목적지] eq 23: 외부에서 telnet 192.168.10.10 가능&lt;/li&gt;
&lt;li&gt;deny ip: 다른 트래픽(ping, ftp, http 등)은 전부 차단&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*모든 ACL에는 맨 아래에 &lt;u&gt;&lt;b&gt;deny ip any any&lt;/b&gt;&lt;/u&gt; 가 암묵적으로 존재하여 명시하지 않아도 나머지는 전부 차단!&lt;/p&gt;</description>
      <category>네트워크</category>
      <category>ACL</category>
      <author>YYUNA</author>
      <guid isPermaLink="true">https://yyuna.tistory.com/107</guid>
      <comments>https://yyuna.tistory.com/107#entry107comment</comments>
      <pubDate>Fri, 7 Nov 2025 09:13:51 +0900</pubDate>
    </item>
  </channel>
</rss>