<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Limelee</title>
    <link>https://limelee85.tistory.com/</link>
    <description>웹/모바일 보안 공부</description>
    <language>ko</language>
    <pubDate>Sat, 13 Jun 2026 04:18:33 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>LimeLee</managingEditor>
    <image>
      <title>Limelee</title>
      <url>https://tistory1.daumcdn.net/tistory/1898584/attach/c8fdc85d882f4dc59c03fa0101af9197</url>
      <link>https://limelee85.tistory.com</link>
    </image>
    <item>
      <title>AOS frida 패치 - Anti Frida 우회</title>
      <link>https://limelee85.tistory.com/entry/AOS-frida-%ED%8C%A8%EC%B9%98-%EC%95%88%ED%8B%B0-%ED%94%84%EB%A6%AC%EB%8B%A4-%EC%9A%B0%ED%9A%8C</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;모바일 앱 진단을 하기 위해선 보안 솔루션 우회가 필요한 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규모가 크거나 난독화가 되어 있는 앱들은 정적 분석만으로 보기 힘들어서 동적 분석도 겸한다. 이 때 자주 사용하는 게 frida&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frida로 메모리 덤프도 뜨고 로직도 우회하고 별 걸 다하니까 요즘에는 Anti&amp;nbsp;Frida가 적용된 앱들이 많아졌다.&lt;/p&gt;
&lt;p data-ke-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;에러 메세지도 안 띄워주고 칼같이 죽여버리는가하면 동적으로 클래스를 호출하기도 하고 .so파일이 앱 실행할 때 생성되고 지워져 라이브러리 분석을 하기 어렵게 하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frida 탐지의 기본적인 탐지 원리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hackcatml.tistory.com/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hackcatml.tistory.com/96&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1747023923172&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Frida Detection Bypass(Android)&quot; data-og-description=&quot;최근 들어 프리다를 탐지하여 앱을 종료시키는 솔루션들이 꽤 많습니다. 이렇게 되면, 진단하는 입장에서는 애를 먹을 수 밖에 없습니다. 그래서, AOS에서 몇몇 기본적인 프리다 탐지원리 및 우&quot; data-og-host=&quot;hackcatml.tistory.com&quot; data-og-source-url=&quot;https://hackcatml.tistory.com/96&quot; data-og-url=&quot;https://hackcatml.tistory.com/96&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bUi9NV/hyYPlStPK3/QdduVzTz6hcem3IIPefsBK/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144,https://scrap.kakaocdn.net/dn/cz6vws/hyYRzpadIt/4WSUb6R7ARAjmHl1ozpOP0/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144,https://scrap.kakaocdn.net/dn/L37fa/hyYRvtwVjE/zhLsG1GBNHsKPKnEA4tS70/img.png?width=1225&amp;amp;height=500&amp;amp;face=0_0_1225_500&quot;&gt;&lt;a href=&quot;https://hackcatml.tistory.com/96&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://hackcatml.tistory.com/96&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bUi9NV/hyYPlStPK3/QdduVzTz6hcem3IIPefsBK/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144,https://scrap.kakaocdn.net/dn/cz6vws/hyYRzpadIt/4WSUb6R7ARAjmHl1ozpOP0/img.png?width=800&amp;amp;height=144&amp;amp;face=0_0_800_144,https://scrap.kakaocdn.net/dn/L37fa/hyYRvtwVjE/zhLsG1GBNHsKPKnEA4tS70/img.png?width=1225&amp;amp;height=500&amp;amp;face=0_0_1225_500');&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;Frida Detection Bypass(Android)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최근 들어 프리다를 탐지하여 앱을 종료시키는 솔루션들이 꽤 많습니다. 이렇게 되면, 진단하는 입장에서는 애를 먹을 수 밖에 없습니다. 그래서, AOS에서 몇몇 기본적인 프리다 탐지원리 및 우&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;hackcatml.tistory.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;frida를 앱에 attach 하게 되면 앱에 여러 흔적이 남는데 /proc/&amp;lt;pid&amp;gt;/ 하위의 파일들을 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;fopen 함수나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;java.io.File 클래스로 읽어오거나 혹은 그 외의&lt;/span&gt;&amp;nbsp;방법을 이용해서 그 흔적들을 확인한다는 것.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;탐지 로직이 괴랄해서 무슨 Native API를 후킹해야하는지 몇 개의 탐지로직을 제껴야하는지 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;도저히 파악이 안되니&lt;/span&gt; 그냥 frida라는 문자열이 찍히지 않으면 되겠구나 싶었다.&lt;/p&gt;
&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://github.com/AsenOsen/frida-stealth&quot;&gt;https://github.com/AsenOsen/frida-stealth&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1747025161952&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - AsenOsen/frida-stealth: Stealth patch for Frida, stealth knowledge collection&quot; data-og-description=&quot;Stealth patch for Frida, stealth knowledge collection - AsenOsen/frida-stealth&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/AsenOsen/frida-stealth&quot; data-og-url=&quot;https://github.com/AsenOsen/frida-stealth&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uccqC/hyYRkMhRIr/NEtXnHfvuhPQLlaVS4NHkk/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_153_1056_254,https://scrap.kakaocdn.net/dn/qilg2/hyYRzQe3M8/FUXQ113JElkGlwO1KIx2b0/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_153_1056_254&quot;&gt;&lt;a href=&quot;https://github.com/AsenOsen/frida-stealth&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/AsenOsen/frida-stealth&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uccqC/hyYRkMhRIr/NEtXnHfvuhPQLlaVS4NHkk/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_153_1056_254,https://scrap.kakaocdn.net/dn/qilg2/hyYRzQe3M8/FUXQ113JElkGlwO1KIx2b0/img.png?width=1200&amp;amp;height=600&amp;amp;face=963_153_1056_254');&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;GitHub - AsenOsen/frida-stealth: Stealth patch for Frida, stealth knowledge collection&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Stealth patch for Frida, stealth knowledge collection - AsenOsen/frida-stealth&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;a href=&quot;https://github.com/JsHookApp/Frida-Patchs&quot;&gt;https://github.com/JsHookApp/Frida-Patchs&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1747025160785&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;object&quot; data-og-title=&quot;GitHub - JsHookApp/Frida-Patchs: Simple frida anti-detection patch&quot; data-og-description=&quot;Simple frida anti-detection patch. Contribute to JsHookApp/Frida-Patchs development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/JsHookApp/Frida-Patchs&quot; data-og-url=&quot;https://github.com/JsHookApp/Frida-Patchs&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bt6kN6/hyYRpNC3Bj/1uYB0pmKhsnIkqbcBcSsEk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bMr00J/hyYRpGSd8x/0OLfmUYFEGoPKJ40t3us60/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://github.com/JsHookApp/Frida-Patchs&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/JsHookApp/Frida-Patchs&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bt6kN6/hyYRpNC3Bj/1uYB0pmKhsnIkqbcBcSsEk/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600,https://scrap.kakaocdn.net/dn/bMr00J/hyYRpGSd8x/0OLfmUYFEGoPKJ40t3us60/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&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;GitHub - JsHookApp/Frida-Patchs: Simple frida anti-detection patch&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Simple frida anti-detection patch. Contribute to JsHookApp/Frida-Patchs development by creating an account on GitHub.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;github.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;위의 두 레포를 참고했다. 위&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;frida-core와 gum에서 frida, gmain 등 탐지 문자열을 다 변경했다.&lt;br /&gt;&lt;br /&gt;빌드를 하면 몇가지 파일이 생성되는데 frida-server는 실행은 되지만 심볼 명 등이 변경되서 그런지 python-frida에서 앱에 attach를 못한다.&amp;nbsp;&lt;br /&gt;python-frida도 패치된 frida-core로 빌드해주면 되는데 그냥 대안으로 frida-inject 를 이용했다. spawn 기능은 없지만 Termux 등을 통해 단말기 내부에서 attach가 가능하니 USB 디버깅 탐지도 그냥 옵션을 끄는 것으로 우회 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Screenshot_20250512-140643_Termux.jpg&quot; data-origin-width=&quot;2163&quot; data-origin-height=&quot;2220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OR9fU/btsNUE1DJz2/bpIgVQBemukrQpIlkuRYKK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OR9fU/btsNUE1DJz2/bpIgVQBemukrQpIlkuRYKK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OR9fU/btsNUE1DJz2/bpIgVQBemukrQpIlkuRYKK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOR9fU%2FbtsNUE1DJz2%2FbpIgVQBemukrQpIlkuRYKK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2163&quot; height=&quot;2220&quot; data-filename=&quot;Screenshot_20250512-140643_Termux.jpg&quot; data-origin-width=&quot;2163&quot; data-origin-height=&quot;2220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;frida가 안 죽으니 마음껏 후킹 할 수 있다.&lt;/p&gt;</description>
      <category>Web,Mobile/Tool</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/132</guid>
      <comments>https://limelee85.tistory.com/entry/AOS-frida-%ED%8C%A8%EC%B9%98-%EC%95%88%ED%8B%B0-%ED%94%84%EB%A6%AC%EB%8B%A4-%EC%9A%B0%ED%9A%8C#entry132comment</comments>
      <pubDate>Mon, 12 May 2025 18:37:12 +0900</pubDate>
    </item>
    <item>
      <title>Burp Suite에서 Custom 필터링: Bambdas 사용하기</title>
      <link>https://limelee85.tistory.com/entry/burp-suite-Bambdas</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Burp Suite의 History 및 Logger 탭에서는 다양한 필터링 기능을 제공하지만, 문자열 검색 범위를 response로 제한하거나, 특정 헤더가 포함된 request로 필터링하고 싶을 때 아쉬운 부분이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우에 유용한 기능이 &lt;b&gt;Bambdas&lt;/b&gt;. Fiddler Classic의 커스텀 스크립트와 같이 정교한 필터링을 구현이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Bambdas 예시&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Proxy &amp;gt; HTTP history &amp;gt; Filter settings에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Bambda mode&amp;nbsp;&lt;/b&gt;를 선택하면 커스텀 필터를 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Montoya API를 기반으로 작성하고, 메소드 등은 공식 홈페이지 문서 페이지에서 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 response에서만 특정 문자열을 검색하려면 다음과 같은 코드를 작성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724291359688&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if (requestResponse.hasResponse()) {
    var response = requestResponse.response();
    return response.contains(&quot;---찾고자 하는 문자열---&quot;, true);
}
return false;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드를 작성한 후 Bambdas에 적용하면, response 내에서만 특정 문자열을 포함하는 항목들로 필터링이 가능하다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;참고&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://portswigger.github.io/burp-extensions-montoya-api/javadoc/burp/api/montoya/proxy/ProxyHttpRequestResponse.html&quot;&gt;ProxyHttpRequestResponse (Montoya API 2023.12.1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://portswigger.github.io/burp-extensions-montoya-api/javadoc/burp/api/montoya/utilities/Utilities.html&quot;&gt;Utilities (Montoya API 2023.12.1)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Web,Mobile/Tool</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/131</guid>
      <comments>https://limelee85.tistory.com/entry/burp-suite-Bambdas#entry131comment</comments>
      <pubDate>Thu, 20 Jun 2024 17:57:06 +0900</pubDate>
    </item>
    <item>
      <title>SFTP Chroot 감옥 사용자 생성</title>
      <link>https://limelee85.tistory.com/entry/SFTP-Chroot-%EA%B0%90%EC%98%A5-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%83%9D%EC%84%B1</link>
      <description>&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;공유 계정은 SSH 접근 불가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;지정된 공유 디렉터리 상위로 이동 불가&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 서버의 sshd_config 설정을 통해 어렵지 않게 구현할 수 있다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 1. 사용자 생성&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 공유할 계정을 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉘 접근이 불필요한 계정일 경우 nologin으로 설정한다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ useradd share
$ passwd share
$ vi /etc/passwd&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;share:x:1010:1010::/home/share:/usr/sbin/nologin&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. sftp &amp;amp; Chroot 적용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래의 sshd_config 설정을 적용하면 ssh로 쉘에 접근 할 수 없다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ vi /etc/ssh/sshd_config&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Subsystem sftp internal-sftp

Match User share
	ChrootDirectory /home/share
	ForceCommand internal-sftp&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ service ssh restart&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 디렉터리 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 재시작 후 share 계정으로 SSH 쉘 접근이 불가능해지고, sftp로만 접근할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 SSH가 연결이 반복적으로 끊어지는 문제가 발생한다면, Chroot 디렉터리의 권한 설정이 잘못된 경우일 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 Chroot 디렉터리와 상위 디렉터리의 권한을 설정한다.&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;Chroot 디렉터리 및 상위 디렉터리 권한&lt;/b&gt;: root 소유자, 755 권한&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Chroot 디렉터리의 그룹&lt;/b&gt;: share&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로 /home/directory/share를 ChrootDirectory 라면 권한은 다음과 같이 되어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;drwxr-xr-x root&lt;/b&gt;:root home/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;drwxr-xr-x root&lt;/b&gt;:root directory/&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;drwxr-xr-x root:share&lt;/b&gt; share/&lt;/p&gt;
&lt;p data-ke-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;Chroot 디렉터리로 사용하고 싶은 디렉터리의 상위 경로(/test/direc/tory/) 권한을 변경할 수 없고, /home/share는 Chroot 권한 조건을 만족할 수 있는 경우 다음과 같이 설정할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;$ ln -s /test/direc/tory/share /home/share&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;그 후, sshd_config에서 Chroot 경로를 /home/share로 지정하고 SSH 서비스를 재시작하면 Chroot가 정상 작동한다.&lt;/p&gt;
&lt;p data-ke-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>Server</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/129</guid>
      <comments>https://limelee85.tistory.com/entry/SFTP-Chroot-%EA%B0%90%EC%98%A5-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%83%9D%EC%84%B1#entry129comment</comments>
      <pubDate>Mon, 1 Apr 2024 19:23:36 +0900</pubDate>
    </item>
    <item>
      <title>eval()과 Function 생성자의 Scope</title>
      <link>https://limelee85.tistory.com/entry/eval%EA%B3%BC-Function-%EC%83%9D%EC%84%B1%EC%9E%90%EC%9D%98-Scope</link>
      <description>&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval#eval%EC%9D%84_%EC%A0%88%EB%8C%80_%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80_%EB%A7%90_%EA%B2%83!&quot; target=&quot;_self&quot;&gt;&lt;span&gt;eval을 절대 사용하지 말 것!&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;eval() - JavaScript | MDN&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;**eval()**은 문자로 표현된 JavaScript 코드를 실행하는 함수입니다.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval#eval%EC%9D%84_%EC%A0%88%EB%8C%80_%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80_%EB%A7%90_%EA%B2%83!&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/f3X9A/hyU5GYwv3O/R3XFYyP5K8cJDkRwfYDblk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/eval#eval%EC%9D%84_%EC%A0%88%EB%8C%80_%EC%82%AC%EC%9A%A9%ED%95%98%EC%A7%80_%EB%A7%90_%EA%B2%83!&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/f3X9A/hyU5GYwv3O/R3XFYyP5K8cJDkRwfYDblk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&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;eval() - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;**eval()**은 문자로 표현된 JavaScript 코드를 실행하는 함수입니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;eval()은 &lt;span style=&quot;color: #1b1b1b;&quot;&gt;인자로 받은 코드를 caller의 권한으로 수행하는 위험한 함수입니다. &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Function&lt;/span&gt;&lt;span style=&quot;color: #1b1b1b;&quot;&gt;으로는 실현할 수 없는 공격이 가능합니다.&lt;/span&gt;&lt;span style=&quot;color: #1b1b1b;&quot;&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #1b1b1b;&quot;&gt;라고 작성되어있는데 정확히 이게 무슨 소린가 싶다. 그래서 좀 찾아봤다.&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;span style=&quot;color: #1b1b1b;&quot;&gt;자바스크립트에는 &lt;a href=&quot;https://www.w3schools.com/js/js_scope.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;스코프(Scope)&lt;/span&gt;&lt;/a&gt;라는게 있는데 전역 스코프, 블록 스코프, 함수 스코프가 존재한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;JavaScript Scope&quot; data-ke-align=&quot;alignCenter&quot; data-og-description=&quot;W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.&quot; data-og-host=&quot;www.w3schools.com&quot; data-og-source-url=&quot;https://www.w3schools.com/js/js_scope.asp&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Guozc/hyU5LrZH2h/tw1UAvrBFf4KEKit1kO7H0/img.png?width=436&amp;amp;height=228&amp;amp;face=0_0_436_228,https://scrap.kakaocdn.net/dn/bsJoRT/hyU5Sq7pkg/xGQBFyCgMLTIIhVn8XDoZk/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300&quot; data-og-url=&quot;https://www.w3schools.com/js/js_scope.asp&quot;&gt;&lt;a href=&quot;https://www.w3schools.com/js/js_scope.asp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.w3schools.com/js/js_scope.asp&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Guozc/hyU5LrZH2h/tw1UAvrBFf4KEKit1kO7H0/img.png?width=436&amp;amp;height=228&amp;amp;face=0_0_436_228,https://scrap.kakaocdn.net/dn/bsJoRT/hyU5Sq7pkg/xGQBFyCgMLTIIhVn8XDoZk/img.png?width=300&amp;amp;height=300&amp;amp;face=0_0_300_300');&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;JavaScript Scope&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.w3schools.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style8&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;let&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;const&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&lt;b&gt;var&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;유효범위&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Block Scope&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Block Scope&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;Function Scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;값 재정의&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;재선언&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;출처: &lt;a href=&quot;https://joooing.tistory.com/entry/Scope&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://joooing.tistory.com/entry/Scope&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;function func() {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var a = 1;
}

console.log(a);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;예로 들면 var a는 func의 함수 스코프에서 유효하므로 func 함수 밖에서 a 변수에 접근할 수 없다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Function 생성자나 eval 함수를 통해 생성된 함수에도 이런 스코프가 존재한다.&lt;br /&gt;Function 생성자는 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function#constructor&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;&lt;span&gt;전역 스코프&lt;/span&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;774&quot; data-origin-height=&quot;234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d03VPq/btsDnC2fsNT/K8SfDvP2wDDPdsLcdny1Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d03VPq/btsDnC2fsNT/K8SfDvP2wDDPdsLcdny1Z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d03VPq/btsDnC2fsNT/K8SfDvP2wDDPdsLcdny1Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd03VPq%2FbtsDnC2fsNT%2FK8SfDvP2wDDPdsLcdny1Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;234&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;반면 eval()는 caller 권한 즉, &lt;b&gt;함수 자신을 호출한 함수&lt;/b&gt;에 따라 전역 함수가 될 지 내부 함수가 될지 달라진다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;예시로 사용자의 입력 값이 func()이라는 함수 내 반영되고 eval 또는 Function 생성자를 통해 스크립트를 실행한다면 이런 차이가 발생하게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s1SfG/btsDonX125S/wUZKpVRTUGE2S1kR8NzfMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s1SfG/btsDonX125S/wUZKpVRTUGE2S1kR8NzfMk/img.png&quot; data-alt=&quot;eval은 func의 a변수에 접근할 수 있지만 Function은 a변수에 접근할 수 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s1SfG/btsDonX125S/wUZKpVRTUGE2S1kR8NzfMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs1SfG%2FbtsDonX125S%2FwUZKpVRTUGE2S1kR8NzfMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;871&quot; height=&quot;237&quot; data-origin-width=&quot;871&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eval은 func의 a변수에 접근할 수 있지만 Function은 a변수에 접근할 수 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;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;701&quot; data-origin-height=&quot;290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kNs7M/btsDrFpn8zc/IWImCfIDkwv866KW6ibKlk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kNs7M/btsDrFpn8zc/IWImCfIDkwv866KW6ibKlk/img.png&quot; data-alt=&quot;eval(&amp;quot;console.log(a)&amp;quot;)의 Scope&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kNs7M/btsDrFpn8zc/IWImCfIDkwv866KW6ibKlk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkNs7M%2FbtsDrFpn8zc%2FIWImCfIDkwv866KW6ibKlk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;290&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;290&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;eval(&quot;console.log(a)&quot;)의 Scope&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;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;701&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q9ivM/btsDpyrwoOL/3M2ODLoM9wfT5RS6q4R5ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q9ivM/btsDpyrwoOL/3M2ODLoM9wfT5RS6q4R5ZK/img.png&quot; data-alt=&quot;Function(&amp;quot;console.log(a)&amp;quot;)()의 Scope&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q9ivM/btsDpyrwoOL/3M2ODLoM9wfT5RS6q4R5ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq9ivM%2FbtsDpyrwoOL%2F3M2ODLoM9wfT5RS6q4R5ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;701&quot; height=&quot;297&quot; data-origin-width=&quot;701&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Function(&quot;console.log(a)&quot;)()의 Scope&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Function 생성자로 실현할 수 없는 특수한 상황이 뭔지는 알겠는데&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;사용자의 입력 값이&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;함수 내에 반영되고&lt;/li&gt;
&lt;li&gt;스크립트를 임의 실행이 가능하고&lt;/li&gt;
&lt;li&gt;함수 내 공격자 관점에서 유의미하게 활용할 수 있는 데이터가 존재하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;같은 제한적인 상황이라서 Function 생성자에 비해 엄청나게 위험한 것 처럼 작성된 이유도 모르겠고 (eval을 절대 사용하지 않아야한다기보다 사용자 입력 값이 스크립트로 해석되지 않는 게 중요한게 아닌지) 자주 써먹을 수 있을지도 잘 모르겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;++&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dreamhack.io/wargame/challenges/1578&quot;&gt;https://dreamhack.io/wargame/challenges/1578&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731511654875&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;JS is the best&quot; data-og-description=&quot;JavaScript is the best programming language :)&quot; data-og-host=&quot;dreamhack.io&quot; data-og-source-url=&quot;https://dreamhack.io/wargame/challenges/1578&quot; data-og-url=&quot;https://dreamhack.io/wargame/challenges/1578&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b7fUmC/hyXzPk2K0U/s4Gk1YSPRtPdnPx4P6ohM0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/uC9C7/hyXwpBzR8p/UjisADfkvZ32bKaUFegzbK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bFjsOv/hyXzOfmB1n/ag5W2y4CwqFixcuUEPv8R1/img.jpg?width=909&amp;amp;height=822&amp;amp;face=0_0_909_822&quot;&gt;&lt;a href=&quot;https://dreamhack.io/wargame/challenges/1578&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dreamhack.io/wargame/challenges/1578&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b7fUmC/hyXzPk2K0U/s4Gk1YSPRtPdnPx4P6ohM0/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/uC9C7/hyXwpBzR8p/UjisADfkvZ32bKaUFegzbK/img.png?width=512&amp;amp;height=512&amp;amp;face=0_0_512_512,https://scrap.kakaocdn.net/dn/bFjsOv/hyXzOfmB1n/ag5W2y4CwqFixcuUEPv8R1/img.jpg?width=909&amp;amp;height=822&amp;amp;face=0_0_909_822');&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;JS is the best&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript is the best programming language :)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dreamhack.io&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Funtion 생성자로는 실현할 수 없고 유의미하게 활용될 수 있는 데이터를 조작 가능한 상황과 관련된 wargame&lt;br /&gt;정확히 말하면 출제자의 인텐대로라면 Function 생성자로도 가능하지만 언인텐은 Function 생성자로는 불가능하다. &lt;br /&gt;&lt;br /&gt;해당 문제를 풀면서 추가로 알게된 지식은 &lt;br /&gt;&lt;br /&gt;1.&amp;nbsp;node.js&amp;nbsp;은&amp;nbsp;파일마다&amp;nbsp;&lt;b&gt;모듈&amp;nbsp;스코프&lt;/b&gt;를&amp;nbsp;가지고&amp;nbsp;있음 &lt;br /&gt;node&amp;nbsp;server.js&amp;nbsp;로&amp;nbsp;실행했더라도&amp;nbsp;server.js&amp;nbsp;안에서&amp;nbsp;정의된&amp;nbsp;변수들은&amp;nbsp;&lt;b&gt;전역&amp;nbsp;스코프&lt;/b&gt;에&amp;nbsp;해당하지&amp;nbsp;않는다. &lt;br /&gt;html에서&amp;nbsp;&amp;lt;script&amp;gt;&amp;nbsp;태그의&amp;nbsp;최상위에&amp;nbsp;정의하면&amp;nbsp;전역&amp;nbsp;스코프에&amp;nbsp;속했지만&amp;nbsp;node.js&amp;nbsp;는&amp;nbsp;그게&amp;nbsp;아닌가봄 &lt;br /&gt;&lt;br /&gt;2. eval을 &lt;b&gt;간접&amp;nbsp;호출&lt;/b&gt;&amp;nbsp;시&amp;nbsp;전역&amp;nbsp;스코프에서&amp;nbsp;실행됨 &lt;br /&gt;eval을 직접 호출하면 자신을 호출한 함수의 스코프에서 실행되지만 z=eval; z(...) 와 같이 간접 호출로 할 시 전역 스코프에서 실행된다.&lt;/p&gt;
&lt;pre id=&quot;code_1731511527829&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;script&amp;gt;
function y(s) {

  const c = 3;
  function x() {
     eval('console.log(`직접 호출 : ${c}`)');
     eval('z=eval;e=&quot;console.log(`간접 호출 : ${c}`)&quot;;z(e);');
  };

  x();
}
&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1731511542391&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// eval('console.log(`직접 호출 : ${c}`)');
직접 호출 : 3
// eval('z=eval;e=&quot;console.log(`간접 호출 : ${c}`)&quot;;z(e);');
VM985:1 Uncaught ReferenceError: c is not defined
    at eval (eval at &amp;lt;anonymous&amp;gt; (eval at x (file:///***/test.html:7:4)), &amp;lt;anonymous&amp;gt;:1:24)
    at eval (&amp;lt;anonymous&amp;gt;)
    at eval (eval at x (file:///***/test.html:7:4), &amp;lt;anonymous&amp;gt;:1:40)
    at x (file:///***/test.html:8:4)
    at y (file:///***/test.html:11:3)
    at &amp;lt;anonymous&amp;gt;:1:1&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;그래서 wargame 문제의 소스코드를 직관적으로 봤을 때 조작하고 싶게끔 생긴 변수는 실제 조작이 어려울 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;언인텐으로 풀고 나선 다른 변수를 조작할 수 있었으니 같은 Scope에 있는 그 변수 역시 조작이 가능한게 아닌가 쉽게 생각했지만 위의 2가지 지식을 알고 나서 왜 안되었는지 이해했음.&lt;/p&gt;</description>
      <category>Web,Mobile/Tech</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/128</guid>
      <comments>https://limelee85.tistory.com/entry/eval%EA%B3%BC-Function-%EC%83%9D%EC%84%B1%EC%9E%90%EC%9D%98-Scope#entry128comment</comments>
      <pubDate>Fri, 12 Jan 2024 19:26:55 +0900</pubDate>
    </item>
    <item>
      <title>Github Actions로 push 이벤트 발생 시 내 서버로 배포 자동화하기</title>
      <link>https://limelee85.tistory.com/entry/Github-Actions%EB%A1%9C-push-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%9C%EC%83%9D-%EC%8B%9C-%EB%82%B4-%EC%84%9C%EB%B2%84%EB%A1%9C-%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub 리포지토리의 &lt;b&gt;Actions&lt;/b&gt; 탭에서 CI/CD 플랫폼을 이용해 빌드, 테스트, 배포 등을 자동화할 수 있다. &lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions#understanding-the-workflow-file&quot;&gt;공식 문서&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 GitHub Actions를 이용해 특정 브랜치에 &lt;b&gt;push&lt;/b&gt; 이벤트가 발생할 때 설정된 서버로 자동 배포를 구현해보기로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt; 1. GitHub Actions 설정 &lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리포지토리의 &lt;b&gt;Actions&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-filename=&quot;11002.png&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zsnYD/btsDqR4MmWN/s7viUDmhy1TwKnsKXDQa5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zsnYD/btsDqR4MmWN/s7viUDmhy1TwKnsKXDQa5k/img.png&quot; data-alt=&quot;리포지토리마다 Actions 탭이 존재함&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zsnYD/btsDqR4MmWN/s7viUDmhy1TwKnsKXDQa5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzsnYD%2FbtsDqR4MmWN%2Fs7viUDmhy1TwKnsKXDQa5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;602&quot; data-filename=&quot;11002.png&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;리포지토리마다 Actions 탭이 존재함&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &quot;Set up a workflow yourself&quot;&lt;/b&gt; 옵션을 선택하여 직접 작성할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11003.png&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lGxlQ/btsDnB9ZIwu/vWJc3KQBs21xRByrSHDsgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lGxlQ/btsDnB9ZIwu/vWJc3KQBs21xRByrSHDsgK/img.png&quot; data-alt=&quot;직접 작성할 거기 때문에 &amp;quot;set up a workflow yourself&amp;quot; 선택&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lGxlQ/btsDnB9ZIwu/vWJc3KQBs21xRByrSHDsgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlGxlQ%2FbtsDnB9ZIwu%2FvWJc3KQBs21xRByrSHDsgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;711&quot; data-filename=&quot;11003.png&quot; data-origin-width=&quot;973&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;직접 작성할 거기 때문에 &quot;set up a workflow yourself&quot; 선택&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;GitHub Actions의 워크플로우는 YAML 파일로 작성되며, &lt;a href=&quot;https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions&quot;&gt;공식 문서&lt;/a&gt;를 참고하여 문법을 확인할 수 있다.&lt;/p&gt;
&lt;figure id=&quot;og_1705050830122&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Workflow syntax for GitHub Actions - GitHub Docs&quot; data-og-description=&quot;A workflow is a configurable automated process made up of one or more jobs. You must create a YAML file to define your workflow configuration.&quot; data-og-host=&quot;docs.github.com&quot; data-og-source-url=&quot;https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions&quot; data-og-url=&quot;https://ghdocs-prod.azurewebsites.net/en/actions/using-workflows/workflow-syntax-for-github-actions&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/eApDTk/hyU2okUGRC/CkUMbXhfO6GwcTkfbmZveK/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200&quot;&gt;&lt;a href=&quot;https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/eApDTk/hyU2okUGRC/CkUMbXhfO6GwcTkfbmZveK/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200');&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;Workflow syntax for GitHub Actions - GitHub Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A workflow is a configurable automated process made up of one or more jobs. You must create a YAML file to define your workflow configuration.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.github.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;b&gt;예시 워크플로우 설정&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 main 브랜치에 &lt;b&gt;push&lt;/b&gt; 이벤트가 발생할 때 서버에 자동으로 배포하는 간단한 예시이다.&lt;/p&gt;
&lt;pre id=&quot;code_1705050867979&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;name: GitHub Actions - Test

on: 
  push:
    branches:
      - main
    
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Executing remote SSH commands using password
      uses: appleboy/ssh-action@v1.0.0
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}
        port: ${{ secrets.PORT }}
        script: |
          cd ${{ secrets.PATH }}
          git pull origin main&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-filename=&quot;11005.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;826&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSwaKX/btsDnuDmEwZ/AqpcHxh6NKyCABScIsZZD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSwaKX/btsDnuDmEwZ/AqpcHxh6NKyCABScIsZZD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSwaKX/btsDnuDmEwZ/AqpcHxh6NKyCABScIsZZD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSwaKX%2FbtsDnuDmEwZ%2FAqpcHxh6NKyCABScIsZZD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;826&quot; data-filename=&quot;11005.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;826&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;on: 워크플로를 트리거하기 위한 이벤트를 정의 &lt;/b&gt;&lt;br /&gt;main 브랜치에 &lt;b&gt;push&lt;/b&gt; 이벤트가 발생할 때 워크플로우가 실행된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;jobs: 이벤트가 발생했을 경우 수행할 작업을 정의&lt;/b&gt;&lt;br /&gt;build라는 이름의 작업이 정의했고, GitHub가 호스팅하는 최신 Ubuntu 머신에서 실행된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;steps: 실행할 명령, 설정 작업&lt;/b&gt;&lt;br /&gt;서버에 자동 배포하는 명령을 수행한다. SSH 접근 후 git pull 명령어를 실행하는 식으로 구현했고 SSH 접근은&amp;nbsp; &lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: start;&quot; href=&quot;https://github.com/appleboy/ssh-action&quot;&gt;appleboy/ssh-action&lt;/a&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;해당 yml 파일을 레포에 추가한 후 이벤트가 발생하면 자동 배포가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. Actions Secrets 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;위 YAML 파일에서 ${{ secret.~~~ }} 으로 되어있는 부분은 원래라면 내 서버와 게정 정보들이 들어갈텐데 그렇게 되면 내 서버의 계정 정보가 노출되는 문제가 발생한다. 이를 방지하기 위해 Actions Secrets이라는 기능을 이용한다.&lt;/p&gt;
&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;Actions Secrets 설정 방법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 리포지토리의 &lt;b&gt;Settings&lt;/b&gt;로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;Security&lt;/b&gt; 섹션에서 &lt;b&gt;Secrets and variables&lt;/b&gt; &amp;gt; &lt;b&gt;Actions&lt;/b&gt;로 이동한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;New repository secret&lt;/b&gt;을 클릭한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11006.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQZI38/btsDohXMjtC/lIqc3Z7F8oL0iMBtKPfqtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQZI38/btsDohXMjtC/lIqc3Z7F8oL0iMBtKPfqtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQZI38/btsDohXMjtC/lIqc3Z7F8oL0iMBtKPfqtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQZI38%2FbtsDohXMjtC%2FlIqc3Z7F8oL0iMBtKPfqtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;912&quot; data-filename=&quot;11006.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HOST: 서버의 IP 주소&lt;/li&gt;
&lt;li&gt;USERNAME: SSH 사용자명&lt;/li&gt;
&lt;li&gt;PASSWORD: SSH 비밀번호&lt;/li&gt;
&lt;li&gt;PORT: SSH 포트 번호&lt;/li&gt;
&lt;li&gt;PATH: 배포할 서버 경로&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 설정하면, YAML 파일 내에서 ${{ secrets.HOST }} 같은 형태로 해당 정보를 안전하게 호출할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11007.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G6JOQ/btsDqQ50qK2/BEjgPJPk3CqkWDq5Ym8XrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G6JOQ/btsDqQ50qK2/BEjgPJPk3CqkWDq5Ym8XrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G6JOQ/btsDqQ50qK2/BEjgPJPk3CqkWDq5Ym8XrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG6JOQ%2FbtsDqQ50qK2%2FBEjgPJPk3CqkWDq5Ym8XrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;541&quot; data-filename=&quot;11007.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/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-filename=&quot;11008.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8uLnf/btsDnt5wVzj/axSnkPm8OcHoSglOGO9n50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8uLnf/btsDnt5wVzj/axSnkPm8OcHoSglOGO9n50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8uLnf/btsDnt5wVzj/axSnkPm8OcHoSglOGO9n50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8uLnf%2FbtsDnt5wVzj%2FaxSnkPm8OcHoSglOGO9n50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;593&quot; data-filename=&quot;11008.png&quot; data-origin-width=&quot;1160&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 자동 배포 테스트&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정이 완료되면, main 브랜치에 임의의 &lt;b&gt;push&lt;/b&gt;를 발생시켜 자동 배포가 정상적으로 작동하는지 테스트한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11009.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;335&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AhBNT/btsDo8TRglT/9MsX1unXucHRDra7bdS7s0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AhBNT/btsDo8TRglT/9MsX1unXucHRDra7bdS7s0/img.png&quot; data-alt=&quot;&amp;quot;자동 배포 테스트&amp;quot;라는 문구 추가 후 커밋&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AhBNT/btsDo8TRglT/9MsX1unXucHRDra7bdS7s0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAhBNT%2FbtsDo8TRglT%2F9MsX1unXucHRDra7bdS7s0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;335&quot; data-filename=&quot;11009.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;335&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;&quot;자동 배포 테스트&quot;라는 문구 추가 후 커밋&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-filename=&quot;11010.png&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;174&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqAwjg/btsDnxs21Wu/8fkLXWSfuLDmUDNBRFPhs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqAwjg/btsDnxs21Wu/8fkLXWSfuLDmUDNBRFPhs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqAwjg/btsDnxs21Wu/8fkLXWSfuLDmUDNBRFPhs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqAwjg%2FbtsDnxs21Wu%2F8fkLXWSfuLDmUDNBRFPhs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;174&quot; data-filename=&quot;11010.png&quot; data-origin-width=&quot;792&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;&lt;br /&gt;서버에 있던 README.md 파일도 수정된 것을 확인할 수 있다.&lt;/p&gt;</description>
      <category>Server</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/126</guid>
      <comments>https://limelee85.tistory.com/entry/Github-Actions%EB%A1%9C-push-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%EB%B0%9C%EC%83%9D-%EC%8B%9C-%EB%82%B4-%EC%84%9C%EB%B2%84%EB%A1%9C-%EB%B0%B0%ED%8F%AC-%EC%9E%90%EB%8F%99%ED%99%94%ED%95%98%EA%B8%B0#entry126comment</comments>
      <pubDate>Tue, 5 Sep 2023 19:58:29 +0900</pubDate>
    </item>
    <item>
      <title>String, Number형 변수를 이용한 XSS Bypass</title>
      <link>https://limelee85.tistory.com/entry/String-Number%ED%98%95-%EB%B3%80%EC%88%98%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 문제&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 입력 값을 script 태그 안의 변수에 선언하는 경우가 있다.&lt;/p&gt;
&lt;pre class=&quot;xquery&quot;&gt;&lt;code&gt;// Request https://test_page.xyz/test?code=CODE&amp;amp;mode=ACD&amp;amp;value=test&amp;amp;count=1&amp;amp;dept=0&amp;amp;name=%ED%85%8C%EC%8A%A4%ED%8A%B8

// Response
&amp;lt;html&amp;gt;
    &amp;lt;body&amp;gt;
&amp;lt;script&amp;gt;
var code = &quot;CODE&quot;;
var mode = &quot;ACD&quot;;
var value = &quot;test&quot;;
var count = 1;
var dept = 0;
var name = &quot;테스트&quot;;
&amp;lt;/script&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&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;0016.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oiMoz/btsqtWERLdx/T7kFj1F0FJojng0M5T8u11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oiMoz/btsqtWERLdx/T7kFj1F0FJojng0M5T8u11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oiMoz/btsqtWERLdx/T7kFj1F0FJojng0M5T8u11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoiMoz%2FbtsqtWERLdx%2FT7kFj1F0FJojng0M5T8u11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;264&quot; data-filename=&quot;0016.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0017.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SevEo/btsqrNonAjq/n8uqLAeEmZDrquSCEkHPTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SevEo/btsqrNonAjq/n8uqLAeEmZDrquSCEkHPTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SevEo/btsqrNonAjq/n8uqLAeEmZDrquSCEkHPTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSevEo%2FbtsqrNonAjq%2Fn8uqLAeEmZDrquSCEkHPTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;262&quot; data-filename=&quot;0017.png&quot; data-origin-width=&quot;1011&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 필터링을 적용해보았다. 탐지하는 문자는 다음과 같고 탐지하는 문자를 사용 시 페이지 자체가 차단되도록 했다.&lt;/p&gt;
&lt;pre class=&quot;mojolicious&quot;&gt;&lt;code&gt;' &quot; `
%0d %0a ; %20
() [] {} . &amp;lt; &amp;gt;
+ - 
string href concat document script
alert confirm prompt console.log 
eval

URL Encoding 우회 불가 
ex) ev%61l ev%2561l 등등&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분자가 필터링되어 있으므로 &lt;code&gt;code&lt;/code&gt;, &lt;code&gt;mode&lt;/code&gt;, &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;는 더블 쿼터를 나갈 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;code&gt;count&lt;/code&gt;, &lt;code&gt;dept&lt;/code&gt;는 &lt;code&gt;Number&lt;/code&gt;형으로 변수를 받고 있어 구분자를 사용할 필요가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;count&lt;/code&gt;, &lt;code&gt;dept&lt;/code&gt; 파라미터에 스크립트를 삽입하면 가능성이 있어보이지만 여러 함수들이 막혀있다. &lt;code&gt;alert&lt;/code&gt; 및 alert를 대체할 수 있는 함수 모두 사용할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 스크립트로 실행할 수 있다면 &lt;code&gt;alert&lt;/code&gt; 함수에 대한 필터링을 우회할 수 있다. Unicode escape sequence나 문자열 합치기 등이 있다. &lt;code&gt;+&lt;/code&gt;나 &lt;code&gt;concat&lt;/code&gt;이 필터링되어있어 문자열 합치기는 힘들 수 있지만 \xZZ 인코딩 형태를 사용함으로써 우회가 가능해보인다. 다만 어느 형태의 변수이건 구분자는 차단되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;=&amp;gt; 문자열 합치기
var a=&quot;al&quot;;var b=&quot;ert(1)&quot;;
&quot;a&quot;.concat(&quot;lert(1)&quot;);
&quot;al&quot;+&quot;ert(1)&quot;;

=&amp;gt; Unicode escape sequence
&quot;ale\x72t(1)&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;또한 문자열로 스크립트를 만들었다해도 문자열을 스크립트로 실행해야 하는 문제가 남아있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;eval&lt;/code&gt; 함수는 차단되어 있고 이전 게시물에서 썼던 페이로드도 사용할 수 없다. 점 표기법, 대괄호 표기법으로 constructor에 접근하지 못하고, 소괄호가 막혀있어 생성자의 다른 문법 Function() 등을 사용할 수 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1693899702511&quot; style=&quot;color: #333333; text-align: start;&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;JSFuck과 Function 객체 생성자를 이용한 XSS Bypass&quot; data-og-description=&quot;0. 서론 스크립트 태그 영역 안에서 별도의 태그나 이벤트 핸들러를 사용하지 않고 XSS 취약점을 터트리는 경우 서버에서 XSS 스크립트 실행에 사용해야 할 함수(여기서는 'alert' 를 예시로 든다.) &quot; data-og-host=&quot;blog.limelee.xyz&quot; data-og-source-url=&quot;https://blog.limelee.xyz/entry/JSFuck%EA%B3%BC-Function-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass&quot; data-og-url=&quot;https://blog.limelee.xyz/entry/JSFuck%EA%B3%BC-Function-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/uSxYW/hyTPyWiFvN/c1kcxRD4zTH7UHpExEU4A1/img.png?width=402&amp;amp;height=180&amp;amp;face=0_0_402_180,https://scrap.kakaocdn.net/dn/dcBHBk/hyTPByIaD0/k9H8LPeSVx1oAOuyYSYJlK/img.png?width=402&amp;amp;height=180&amp;amp;face=0_0_402_180,https://scrap.kakaocdn.net/dn/cXOpUt/hyTPA7EkLj/VTSzVySQYHcGMmv4IQK2V1/img.png?width=952&amp;amp;height=691&amp;amp;face=0_0_952_691&quot;&gt;&lt;a style=&quot;color: #000000;&quot; href=&quot;https://blog.limelee.xyz/entry/JSFuck%EA%B3%BC-Function-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass&quot; data-source-url=&quot;https://blog.limelee.xyz/entry/JSFuck%EA%B3%BC-Function-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/uSxYW/hyTPyWiFvN/c1kcxRD4zTH7UHpExEU4A1/img.png?width=402&amp;amp;height=180&amp;amp;face=0_0_402_180,https://scrap.kakaocdn.net/dn/dcBHBk/hyTPByIaD0/k9H8LPeSVx1oAOuyYSYJlK/img.png?width=402&amp;amp;height=180&amp;amp;face=0_0_402_180,https://scrap.kakaocdn.net/dn/cXOpUt/hyTPA7EkLj/VTSzVySQYHcGMmv4IQK2V1/img.png?width=952&amp;amp;height=691&amp;amp;face=0_0_952_691');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; style=&quot;color: #000000;&quot; data-ke-size=&quot;size16&quot;&gt;JSFuck과 Function 객체 생성자를 이용한 XSS Bypass&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;0. 서론 스크립트 태그 영역 안에서 별도의 태그나 이벤트 핸들러를 사용하지 않고 XSS 취약점을 터트리는 경우 서버에서 XSS 스크립트 실행에 사용해야 할 함수(여기서는 'alert' 를 예시로 든다.)&lt;/p&gt;
&lt;p class=&quot;og-host&quot; style=&quot;color: #909090;&quot; data-ke-size=&quot;size16&quot;&gt;blog.limelee.xyz&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;code&gt;eval&lt;/code&gt; 함수는 우회할 수는 있지만 조건이 있다. 예로 들어 서버에서 사용자 입력 값에 document라는 문자열이 들어올 경우 공백으로 치환하는 필터링이 적용되어 있다면 &lt;code&gt;evdcoumental&lt;/code&gt; 를 입력할 시 서버에서 공백처리하고 최종적으로 응답 값으로 넘어올 때는 &lt;code&gt;eval&lt;/code&gt;이므로 함수를 사용할 수 있다. 하지만 공백 치환 필터링은 구현해두지 않았다.&lt;/p&gt;
&lt;p data-ke-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;0014.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qmwNy/btsqm78dZku/kITGYhy5GvcJ2N2KJKwgZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qmwNy/btsqm78dZku/kITGYhy5GvcJ2N2KJKwgZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qmwNy/btsqm78dZku/kITGYhy5GvcJ2N2KJKwgZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqmwNy%2Fbtsqm78dZku%2FkITGYhy5GvcJ2N2KJKwgZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;818&quot; height=&quot;150&quot; data-filename=&quot;0014.png&quot; data-origin-width=&quot;818&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 우회 방법을 적어두었지만 보기 전에 한번 스스로 고민해봐도 좋을 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 우회&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;size16&quot;&gt;1. 사용자 입력 값이 반영되는 &lt;code&gt;Number&lt;/code&gt; 형 변수와 &lt;code&gt;String&lt;/code&gt;형 변수가 존재할 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;code&gt;String&lt;/code&gt;형 변수는 &lt;b&gt;반드시&lt;/b&gt; &lt;code&gt;Number&lt;/code&gt; 형 변수보다 위에 선언될 것.&lt;/p&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;code&gt;value&lt;/code&gt; 파라미터와 &lt;code&gt;count&lt;/code&gt; 파라미터를 이용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;value&lt;/code&gt; 파라미터는 더블쿼터 밖으로 나가 원하는 스크립트를 실행할 수 없다. 스크립트를 실행하는 구문은 &lt;code&gt;count&lt;/code&gt; 파라미터에 입력해야한다.&amp;nbsp;&lt;code&gt;;&lt;/code&gt; 를 사용할 수 없으므로 &lt;code&gt;count&lt;/code&gt; 변수 선언 시 스크립트가 실행될 수 있어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 &lt;code&gt;location&lt;/code&gt;을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;href&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;, &lt;code&gt;[&lt;/code&gt;, &lt;code&gt;]&lt;/code&gt; 가 필터링되어 있지만 &lt;code&gt;location.href='a'&lt;/code&gt; 와 &lt;code&gt;location='a'&lt;/code&gt; 는 동일한 동작을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1693899761831&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;XSS Bypass in window.location&quot; data-og-description=&quot;사용자의 입력 값이 window.location의 속성이나 메소드에 반영되는 서비스들이 종종 있다. 보통 XSS가 발생하는 공격 벡터인데 XSS 방지를 위해 싱글쿼터 또는 더블쿼터를 escape 처리를 해두기도 한다&quot; data-og-host=&quot;blog.limelee.xyz&quot; data-og-source-url=&quot;https://blog.limelee.xyz/entry/XSS-Bypass-in-windowlocation&quot; data-og-url=&quot;https://blog.limelee.xyz/entry/XSS-Bypass-in-windowlocation&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bIiSZl/hyTPA0Sjth/4AvagiyVpkM8tsTednOZ21/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/czrUzt/hyTPDQPgXc/KPJPV8W6sBBKcIlU7ZTvH0/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/eD3Kf/hyTPvrLAMo/skIE9zlGwkIn4gBFFlhSD0/img.png?width=982&amp;amp;height=433&amp;amp;face=0_0_982_433&quot;&gt;&lt;a href=&quot;https://blog.limelee.xyz/entry/XSS-Bypass-in-windowlocation&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.limelee.xyz/entry/XSS-Bypass-in-windowlocation&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bIiSZl/hyTPA0Sjth/4AvagiyVpkM8tsTednOZ21/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/czrUzt/hyTPDQPgXc/KPJPV8W6sBBKcIlU7ZTvH0/img.png?width=800&amp;amp;height=352&amp;amp;face=0_0_800_352,https://scrap.kakaocdn.net/dn/eD3Kf/hyTPvrLAMo/skIE9zlGwkIn4gBFFlhSD0/img.png?width=982&amp;amp;height=433&amp;amp;face=0_0_982_433');&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;XSS Bypass in window.location&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;사용자의 입력 값이 window.location의 속성이나 메소드에 반영되는 서비스들이 종종 있다. 보통 XSS가 발생하는 공격 벡터인데 XSS 방지를 위해 싱글쿼터 또는 더블쿼터를 escape 처리를 해두기도 한다&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.limelee.xyz&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;code&gt;count&lt;/code&gt; 파라미터에 &lt;code&gt;location='javascript:alert(1)'&lt;/code&gt; 을 삽입하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 값에는 &lt;code&gt;var count = location='javascript:alert(1)'&lt;/code&gt; 이런 식으로 반영이 될 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 되면 &lt;code&gt;count&lt;/code&gt; 변수에 &lt;code&gt;location='javascript:alert(1)'&lt;/code&gt;의 결과 값인 &lt;code&gt;'javascript:alert(1)'&lt;/code&gt;를 저장하기 위해 &lt;code&gt;location='javascript:alert(1)'&lt;/code&gt;를 실행할 수 있게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 구분자를 사용할 수 없다. 이 점을 &lt;code&gt;String&lt;/code&gt; 형 변수 &lt;code&gt;value&lt;/code&gt;를 이용해 우회한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;code&gt;value&lt;/code&gt; 파라미터에 &lt;code&gt;javascript:alert(1)&lt;/code&gt;을 입력한다. &lt;code&gt;script&lt;/code&gt;와 &lt;code&gt;alert&lt;/code&gt;, &lt;code&gt;(&lt;/code&gt;, &lt;code&gt;)&lt;/code&gt; 의 경우 필터링 되어 있으므로 Unicode escape sequence를 이용하여 우회한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;응답 값에는 &lt;code&gt;var value = &quot;javasc\x72ipt:ale\x72t\x281\x29&quot;&lt;/code&gt; 가 되어 &lt;code&gt;value&lt;/code&gt; 변수에는 실행하고픈 스크립트가 선언된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 &lt;code&gt;count&lt;/code&gt; 파라미터에서 &lt;code&gt;value&lt;/code&gt; 변수를 호출함으로 구분자를 사용하지 않고 스크립트를 사용할 수 있게된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 종합하여 다음과 같은 페이로드를 만든다.&lt;/p&gt;
&lt;pre class=&quot;excel&quot;&gt;&lt;code&gt;value=javasc\x72ipt:ale\x72t\x281\x29&amp;amp;count=location=value&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;0015.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J4pG8/btsqwW46qDH/JitVRNH5NSKIZ2mVgWuegK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J4pG8/btsqwW46qDH/JitVRNH5NSKIZ2mVgWuegK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J4pG8/btsqwW46qDH/JitVRNH5NSKIZ2mVgWuegK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ4pG8%2FbtsqwW46qDH%2FJitVRNH5NSKIZ2mVgWuegK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;481&quot; data-filename=&quot;0015.png&quot; data-origin-width=&quot;1064&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;사용자 입력 값이 반영되는 Number 형 변수가 드물긴 하지만 사용할 시에는 유효성 검증(count 파라미터에 숫자만 받는다던지)은 반드시 필요하겠다.&lt;/p&gt;</description>
      <category>Web,Mobile/Tech</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/125</guid>
      <comments>https://limelee85.tistory.com/entry/String-Number%ED%98%95-%EB%B3%80%EC%88%98%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass#entry125comment</comments>
      <pubDate>Tue, 8 Aug 2023 11:05:04 +0900</pubDate>
    </item>
    <item>
      <title>JSFuck과 Function 객체 생성자를 이용한 XSS Bypass</title>
      <link>https://limelee85.tistory.com/entry/JSFuck%EA%B3%BC-Function-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass</link>
      <description>&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;0. 서론&amp;nbsp;&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;스크립트 태그 영역 안에서 별도의 태그나 이벤트 핸들러를 사용하지 않고 XSS 취약점을 터트리는 경우 서버에서 XSS 스크립트 실행에 사용해야 할 함수(여기서는 'alert' 를 예시로 든다.) 값 자체를 필터링하고 있다면 이를 우회하기가 쉽지가 않다. 필터링되어 있지 않은 비슷한 함수 confirm, prompt 등으로 대체하거나 서비스 자체의 필터링을 이용한 방법&lt;b&gt;*&lt;/b&gt;을 이용하는게 아니라면 alert 자체를 우회하긴 어렵다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;*&lt;/b&gt; 페이지를 불러오기 전 백엔드에서 &quot;abc&quot;를 공백으로 치환하는 서비스 자체의 시큐어코딩이 되어있을 경우 &quot;alabcert&quot;를 입력하여 우회 등등&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;402&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xLQKb/btsplNC5TMj/puPkiyTa9GFbQUwp47hoI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xLQKb/btsplNC5TMj/puPkiyTa9GFbQUwp47hoI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xLQKb/btsplNC5TMj/puPkiyTa9GFbQUwp47hoI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxLQKb%2FbtsplNC5TMj%2FpuPkiyTa9GFbQUwp47hoI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;180&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;그러나&amp;nbsp;해당&amp;nbsp;스크립트를&amp;nbsp;문자열을&amp;nbsp;실행할&amp;nbsp;수&amp;nbsp;있다면&amp;nbsp;이런&amp;nbsp;제한에서&amp;nbsp;비교적&amp;nbsp;자유로워&amp;nbsp;질&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;pre id=&quot;code_1690784155402&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;우회 예시
=&amp;gt; 문자열 합치기
var a=&quot;al&quot;;var b=&quot;ert(1)&quot;;
&quot;a&quot;.concat(&quot;lert(1)&quot;);
&quot;al&quot;+&quot;ert(1)&quot;;

=&amp;gt; Unicode escape sequence
&quot;ale\x72t(1)&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HxIAl/btspFi8ZGLX/EFU4Jka9imUnsbiP9f0NaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HxIAl/btspFi8ZGLX/EFU4Jka9imUnsbiP9f0NaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HxIAl/btspFi8ZGLX/EFU4Jka9imUnsbiP9f0NaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHxIAl%2FbtspFi8ZGLX%2FEFU4Jka9imUnsbiP9f0NaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;691&quot; height=&quot;294&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;691&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;문자열을 스크립트로 실행하는데 eval이라는 함수를 자주 사용한다.&lt;br /&gt;그러나 eval 함수도 필터링 되어 있는 경우엔 어떻게 우회할 수 있을까.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690784729298&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 a = &quot;사용자의 입력 값&quot;;
&amp;lt;/script&amp;gt;

필터링되는 문자열
String, fromCharcode, console.log, eval, alert,', prompt, confirm, location, document&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://jsfuck.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JSFuck&lt;/a&gt; 이라는&amp;nbsp;프로그래밍&amp;nbsp;스타일을&amp;nbsp;통해&amp;nbsp;우회가&amp;nbsp;가능하다.&lt;br /&gt;대략적인&amp;nbsp;원리는&amp;nbsp;[,&amp;nbsp;],&amp;nbsp;(,&amp;nbsp;),&amp;nbsp;+,&amp;nbsp;!&amp;nbsp;6개의&amp;nbsp;문자로&amp;nbsp;문자열로&amp;nbsp;갖가지&amp;nbsp;트릭을&amp;nbsp;이용해&amp;nbsp;모든&amp;nbsp;문자을&amp;nbsp;만들어내는&amp;nbsp;일종의&amp;nbsp;식을&amp;nbsp;짠다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690784221827&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(![]+[[]])[+!+[]] = &quot;a&quot;

&quot;a&quot;+&quot;l&quot; = &quot;al&quot; = (![]+[[]])[+!+[]]+(![]+[[]])[!+[]+!+[]]
(![]+[[]])[+!+[]]+(![]+[[]])[!+[]+!+[]]+(!![]+[[]])[!+[]+!+[]+!+[]]+(!![]+[[]])[+!+[]]+(!![]+[[]])[+[]] = &quot;alert&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이런식으로&amp;nbsp;문자열&amp;nbsp;&quot;alert(1)&quot;&amp;nbsp;을&amp;nbsp;실행하는&amp;nbsp;함수를&amp;nbsp;생성한&amp;nbsp;것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a style=&quot;background-color: #e6f5ff; color: #0070d1; text-align: left;&quot; href=&quot;https://jsfuck.com/&quot;&gt;JSFuck&lt;/a&gt; 사이트에서 원하는 문자열을 스크립트로 실행하는 페이로드를 자동으로 생성해주며 해당 페이로드를 삽입할 수 있다면 실행이 가능하다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;간단한 &quot;alert(1)&quot;을 실행시키는 페이로드를 생성하여 콘솔에 입력해보니 스크립트가 실행된다.&lt;/p&gt;
&lt;p style=&quot;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-filename=&quot;3.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;515&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UYihi/btspsVGXpWC/DsKKkGHoy6N9KqV6bOKCqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UYihi/btspsVGXpWC/DsKKkGHoy6N9KqV6bOKCqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UYihi/btspsVGXpWC/DsKKkGHoy6N9KqV6bOKCqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUYihi%2FbtspsVGXpWC%2FDsKKkGHoy6N9KqV6bOKCqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;515&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1122&quot; data-origin-height=&quot;515&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;하지만 한계점이라면 있다. 간단한 &quot;alert(1)&quot;을 실행시키는 페이로드조차 이정도의 길이를 가진다. &quot;alert(&quot;xss&quot;)&quot;정도만 되어도 엄청난 길이의 페이로드를 자랑하며, 이정도의 길이의 get 파라미터를 수용할 수 없는 서비스에서는 이런 공격이 성공하지 않을 것이다.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;페이로드를 보면 eval을 사용하지 않고 문자열을 스크립트로 실행하였다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;JSFuck 이 동작하는 원리를 이해한다면 JSFuck의 실제로 사용하기 힘든 페이로드 길이를 해결하면서 eval이 필터링 되어있는 환경에서 페이로드를 짜는데 도움이 될 것이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/aemkei/jsfuck&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;JSFuck&amp;nbsp;github&lt;/a&gt; 페이지에 가면 이렇게 되어있다 &lt;b&gt;Run =&amp;gt; [][&quot;filter&quot;][&quot;constructor&quot;]( CODE )()&lt;/b&gt;&lt;br /&gt;&quot;alert(1)&quot;을 실행하는 페이로드를 보기 편하게 치환하면 &lt;b&gt;[][&quot;flat&quot;][&quot;constructor&quot;](&quot;return eval&quot;)()(&quot;alert(1)&quot;)&lt;/b&gt; 이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;두 코드를 분석하여 어떻게 문자열을 실행시킬 수 있었는지 확인해보도록 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;1. 프로토타입&lt;/h2&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Javascript는 객체지향 프로토타입 기반 언어이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;객체지향 언어의 특징 중 하나로는 '상속'이 있다. 기존 클래스의 프로퍼티, 메소드를 사용할 수 있는 것을 의미하는데 Javascript 같은 프로토타입 기반 언어는 이 상속의 개념을 원형 객체로 부터 복제하여 새로운 객체를 만들어내는 것으로 구현했다. 이 원형 객체를 &lt;b&gt;&quot;프로토타입&quot;&lt;/b&gt; 이라고 한다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;JSFuck 페이지에서 만든 페이로드 &quot;[][&quot;flat&quot;][&quot;constructor&quot;](&quot;return eval&quot;)()(&quot;alert(1)&quot;)&quot;의 가장 앞부분 &quot;[]&quot; 는 빈 배열이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Javascript에서 별도의 정의 없이 배열을 생성할 수 있는 건 Javascript 에 내장되어 있는 Built in Object인 Array 객체를 프로토타입 삼아 새로운 배열 객체를 생성했기 때문이다.&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;Built in Object는 ECMAScript 명세에 정의된 객체를 말하며, Linux 환경의 서버에서는 당연하게 'cd' 명령어를 사용하듯 &lt;b&gt;Javascript를 사용하는 환경에서는 언제나 사용할 수 있는 것이 특징&lt;/b&gt;이다.&lt;/p&gt;
&lt;p style=&quot;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;Array라고 하는 전역 객체를 기반으로 만들어진 빈 배열 &quot;[]&quot; 프로토타입 기반 언어의 특징에 따라 원형 객체 Array의 프로퍼티나 메소드에 접근할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈 배열 뒤에 나오는 [&quot;flat&quot;]이나 [&quot;filter&quot;]나 전부 Array 전역 객체 안에 있는 메소드에 접근한 것이다.&lt;/p&gt;
&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://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Array&lt;/a&gt;&amp;nbsp;객체의 문서에서 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 생성자&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[][&quot;flat&quot;] 까지 Array 객체의 flat 메소드에 접근한 것까지 이해를 했다면 그 뒤의 [&quot;constructor&quot;] 부분도 확인을 해보자. 위의 문서를 확인해보면 메소드 외 Constructor 항목이 존재하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Constructor는 생성자로 새로운 객체를 생성하는 함수로 빈 배열의 경우에도 Array 객체 안에 있는 constructor 생성자를 통해 만들어진 것이다.&lt;/p&gt;
&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;[][&quot;flat&quot;]&lt;span&gt;[&quot;constructor&quot;] 는 어느 객체의 생성자에 접근한 것일까?&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;모든 Javascript 의 함수는 Function 객체&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;a style=&quot;color: #0070d1; text-align: start;&quot; href=&quot;https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Function&quot;&gt;Function&lt;/a&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체의 문서에서 확인 가능하다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, Array 안에 있는 flat(), filter() 메소드 또한 Function 객체를 원형으로 하여 만들어진 객체라는 것을 알 수 있다.&lt;/p&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;flat&quot;]을 통해 flat 메소드의 원형이 되는 Function 객체에 접근할 수 있고 그 객체 안에 있는 constructor 생성자에 접근하여 새로운 Function 객체를 생성할 수 있다.&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-filename=&quot;4.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crD44Q/btspmhjHoos/vWK7Rb8bIIdCYw9tVWUUCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crD44Q/btspmhjHoos/vWK7Rb8bIIdCYw9tVWUUCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crD44Q/btspmhjHoos/vWK7Rb8bIIdCYw9tVWUUCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrD44Q%2FbtspmhjHoos%2FvWK7Rb8bIIdCYw9tVWUUCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;691&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;423&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cakwNX/btspxpOte0Z/OKGcBkHx2OSo6bKbFhXC20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cakwNX/btspxpOte0Z/OKGcBkHx2OSo6bKbFhXC20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cakwNX/btspxpOte0Z/OKGcBkHx2OSo6bKbFhXC20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcakwNX%2FbtspxpOte0Z%2FOKGcBkHx2OSo6bKbFhXC20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;423&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;423&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[][&quot;flat&quot;][&quot;constructor&quot;](&quot;alert(1)&quot;)() alert(1)이라는 함수를 생성하여 실행한 것이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[][&quot;flat&quot;][&quot;constructor&quot;](&quot;return eval&quot;)()(&quot;alert(1)&quot;) eval을 반환하는 함수를 생성하여 실행한 후 eval(&quot;alert(1)&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;Built in Object의 생성자와 Javascript 언어의 특징인 프로토타입을 활용한 방법이므로 Javascript를 지원하는 환경이면 사용가능한 우회 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 활용&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토타입과 constructor 개념을 알았다면 여러가지로 활용 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 표기법을 이용한 우회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript에서 &lt;a href=&quot;http://https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Operators/Property_accessors&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;객체 내 데이터에 접근하는 방법&lt;/a&gt;으로 점 표기법(Dot notation) 또는 대괄호 표기법(Bracket notation)을 사용하여 호출할 수 있다.&lt;/p&gt;
&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;[][&quot;flat&quot;][&quot;constructor&quot;](&quot;alert(1)&quot;)()&lt;/span&gt;&amp;nbsp;같은 경우는 대괄호 표기법을 이용했다고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약에 [, ] 대괄호를 필터링하는 서비스가 있다면 점 표기법을 이용하여 &quot;a&quot;.concat 등으로 우회할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 정의되어진 객체에 접근해도 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690789171946&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;a&quot;.concat.constructor(...)()
Array.fill.constructor(...)()
Function.constructor(...)()&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 생성자의 문법을 이용한 우회&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대괄호와 점(.) 모두 제한당했다면 생성자의 다른 문법을 사용해도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/Function&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;생성자&lt;/a&gt; 문서를 Syntax 부분을 확인하면&lt;/p&gt;
&lt;pre id=&quot;code_1690789540369&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Function(functionBody)
new Function(arg0, functionBody)
new Function(arg0, arg1, functionBody)
new Function(arg0, arg1, /* &amp;hellip; ,*/ argN, functionBody)

Function(functionBody)
Function(arg0, functionBody)
Function(arg0, arg1, functionBody)
Function(arg0, arg1, /* &amp;hellip; ,*/ argN, functionBody)&lt;/code&gt;&lt;/pre&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;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt;그리고 &lt;b&gt;&quot;&lt;/b&gt;Function()&lt;span style=&quot;color: #4e4e4e; text-align: start;&quot;&gt;&amp;nbsp;&lt;b&gt;can be called with o&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #4e4e4e; text-align: start;&quot;&gt;r&lt;/span&gt;&lt;span style=&quot;color: #4e4e4e; text-align: start;&quot;&gt;without&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;a style=&quot;color: #ee2323; text-align: start;&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new&quot;&gt;new&lt;/a&gt;&lt;/span&gt;&lt;span style=&quot;color: #4e4e4e; text-align: start;&quot;&gt;. &lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #4e4e4e; text-align: start;&quot;&gt;Both create a new&amp;nbsp;&lt;/span&gt;Function&lt;span style=&quot;color: #4e4e4e; text-align: start;&quot;&gt;&amp;nbsp;instance.&lt;b&gt;&quot;&lt;/b&gt; 라는 문구를 찾을 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1690788870003&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var test = new Function(1);
var test = Function(1);&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;뭔 말이냐 하면, 위의 두 코드는 동일한 동작을 한다. new를 생략해서 쓸 수 있다.&lt;/p&gt;
&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;span style=&quot;color: #333333; text-align: start;&quot;&gt;굳이 빈 배열을 생성하고 객체 프로토타입의 메소드에 접근해서 생성자에 접근할 필요없이&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Function 객체의 생성자를 호출하여 함수를 실행할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1690788995986&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;new Function(&quot;alert(1)&quot;)()
Function(&quot;alert(1)&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;</description>
      <category>Web,Mobile/Tech</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/124</guid>
      <comments>https://limelee85.tistory.com/entry/JSFuck%EA%B3%BC-Function-%EA%B0%9D%EC%B2%B4-%EC%83%9D%EC%84%B1%EC%9E%90%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-XSS-Bypass#entry124comment</comments>
      <pubDate>Wed, 19 Jul 2023 18:16:43 +0900</pubDate>
    </item>
    <item>
      <title>Raspberry Pi 3 안전하게 종료하기</title>
      <link>https://limelee85.tistory.com/entry/Raspberry-Pi-3-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B8%B0</link>
      <description>&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;안전하게 종료하려면&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;nbsp;아래 명령어를 사용해야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724309144981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo poweroff&lt;/code&gt;&lt;/pre&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;플러그 뽑았다가 주말 내내 작업하던 데이터를 모두 날려버렸다.&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;</description>
      <category>Raspberry Pi</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/123</guid>
      <comments>https://limelee85.tistory.com/entry/Raspberry-Pi-3-%EC%95%88%EC%A0%84%ED%95%98%EA%B2%8C-%EC%A2%85%EB%A3%8C%ED%95%98%EA%B8%B0#entry123comment</comments>
      <pubDate>Mon, 17 Apr 2023 22:54:41 +0900</pubDate>
    </item>
    <item>
      <title>Raspberry Pi 3 메일서버(sendmail) 구축</title>
      <link>https://limelee85.tistory.com/entry/Raspberry-Pi-3-%EB%A9%94%EC%9D%BC%EC%84%9C%EB%B2%84sendmail-%EA%B5%AC%EC%B6%95</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Sendmail 설치&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저, 아래 명령어를 통해 sendmail과 관련 패키지를 설치한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309592193&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;apt-get install sendmail sendmail-cf&lt;/code&gt;&lt;/pre&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;설치 도중 &lt;b&gt;&quot;Creating SSL certificates for sendmail.&quot;&lt;/b&gt; 단계에서 설치가 멈춘다면, Ctrl+C로 설치를 중단한 뒤 아래 명령어를 실행한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;cd /etc/mail/tls
sudo openssl dsaparam -out sendmail-common.prm 2048
sudo chown root:smmsp sendmail-common.prm
sudo chmod 0640 sendmail-common.prm
sudo dpkg --configure -a&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://askubuntu.com/questions/937666/ubuntu-16-04-command-line-sendmail-installation-hanged&quot;&gt;https://askubuntu.com/questions/937666/ubuntu-16-04-command-line-sendmail-installation-hanged&lt;/a&gt; &lt;/p&gt;
&lt;figure id=&quot;og_1724309648989&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;Ubuntu 16.04 command line sendmail installation hanged&quot; data-og-description=&quot;I was trying to install sendmail but it is hanging while trying to generate ssl certificates. I have canceled the installation process and later killed processes that was locking any new packages f...&quot; data-og-host=&quot;askubuntu.com&quot; data-og-source-url=&quot;https://askubuntu.com/questions/937666/ubuntu-16-04-command-line-sendmail-installation-hanged&quot; data-og-url=&quot;https://askubuntu.com/questions/937666/ubuntu-16-04-command-line-sendmail-installation-hanged&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bTBFDp/hyWSjVM8OU/UUkEIzBkMKps3Q3YZ7Tfxk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316&quot;&gt;&lt;a href=&quot;https://askubuntu.com/questions/937666/ubuntu-16-04-command-line-sendmail-installation-hanged&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://askubuntu.com/questions/937666/ubuntu-16-04-command-line-sendmail-installation-hanged&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bTBFDp/hyWSjVM8OU/UUkEIzBkMKps3Q3YZ7Tfxk/img.png?width=316&amp;amp;height=316&amp;amp;face=0_0_316_316');&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;Ubuntu 16.04 command line sendmail installation hanged&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;I was trying to install sendmail but it is hanging while trying to generate ssl certificates. I have canceled the installation process and later killed processes that was locking any new packages f...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;askubuntu.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;b&gt;&quot;Updating /etc/mail/aliases...&quot;&lt;/b&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;2. Sendmail 설정 파일 수정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치가 완료되었으면, 외부에서 sendmail을 이용해 메일을 발신하려면 설정 파일을 수정해야 한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309671617&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;vi /etc/mail/sendmail.mc&lt;/code&gt;&lt;/pre&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;다음과 같이 기존 설정을 변경한다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309756177&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DAEMON_OPTIONS(`Family=inet, &amp;nbsp;Name=MTA-v4, Port=smtp, Addr=127.0.0.1')dnl
DAEMON_OPTIONS(`Family=inet, &amp;nbsp;Name=MSP-v4, Port=submission, M=Ea, Addr=127.0.0.1')dnl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&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;이 부분을 아래와 같이 수정한다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309698315&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;DAEMON_OPTIONS(`Family=inet, &amp;nbsp;Name=MTA-v4, Port=smtp, Addr=0.0.0.0')dnl
DAEMON_OPTIONS(`Family=inet, &amp;nbsp;Name=MSP-v4, Port=submission, M=Ea, Addr=0.0.0.0')dnl&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_002.png&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AP3hD/btrIddJp3xN/GJqZkE6IXt623D0ycXSsw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AP3hD/btrIddJp3xN/GJqZkE6IXt623D0ycXSsw1/img.png&quot; data-alt=&quot;sendmail.mc 설정파일 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AP3hD/btrIddJp3xN/GJqZkE6IXt623D0ycXSsw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAP3hD%2FbtrIddJp3xN%2FGJqZkE6IXt623D0ycXSsw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;287&quot; data-filename=&quot;edited_002.png&quot; data-origin-width=&quot;895&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;sendmail.mc 설정파일 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정 후에는 m4 명령어를 사용해 sendmail.cf 파일을 생성한다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309787225&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;m4 /etc/mail/sendmail.mc &amp;gt; /etc/mail/sendmail.cf&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;3. hosts 파일 수정&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;hosts 파일에서 도메인을 추가한다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309855392&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;vi /etc/hosts&lt;/code&gt;&lt;/pre&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;필요한 도메인 정보를 추가해준다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_004.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CHZno/btrH2oFMM6z/YW4vRtdscM1C3glzKqd8Z1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CHZno/btrH2oFMM6z/YW4vRtdscM1C3glzKqd8Z1/img.png&quot; data-alt=&quot;hosts 파일 수정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CHZno/btrH2oFMM6z/YW4vRtdscM1C3glzKqd8Z1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCHZno%2FbtrH2oFMM6z%2FYW4vRtdscM1C3glzKqd8Z1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;583&quot; height=&quot;179&quot; data-filename=&quot;edited_004.png&quot; data-origin-width=&quot;583&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;hosts 파일 수정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;4. Sendmail 재시작&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정이 완료되었으면 sendmail을 재시작한다. 동작 상태와 에러 메시지를 확인하려면 status 명령어를 사용한다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309895355&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;service sendmail restart
service sendmail status&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;5. 메일 발송 테스트&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sendmail이 정상적으로 실행되었다면, telnet을 통해 테스트 메일을 발송할 수 있다:&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1724309909303&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;telnet 127.0.0.1 25

helo localhost
mail from: test@localhostdomain
rcpt to: test@gmail.com
data
subject: Test Mail Send
hello, world!
sendmail
.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;005.png&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bT3EAu/btrH2nUniVo/AelBi5P6QYCLiJCwhdFsjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bT3EAu/btrH2nUniVo/AelBi5P6QYCLiJCwhdFsjk/img.png&quot; data-alt=&quot;메일 발송&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bT3EAu/btrH2nUniVo/AelBi5P6QYCLiJCwhdFsjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbT3EAu%2FbtrH2nUniVo%2FAelBi5P6QYCLiJCwhdFsjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;440&quot; data-filename=&quot;005.png&quot; data-origin-width=&quot;1225&quot; data-origin-height=&quot;440&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메일 발송&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;6. 메일 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메일 수신자의 메일함을 확인하면, 정상적으로 메일이 발송된 것을 확인할 수 있다. 단, 스팸메일 처리 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;SPF, DMARC, DKIM&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-filename=&quot;006.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bafCkX/btrH3QovHuw/Vl2BR9xkGOe3V0Dhs2aS8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bafCkX/btrH3QovHuw/Vl2BR9xkGOe3V0Dhs2aS8k/img.png&quot; data-alt=&quot;메일확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bafCkX/btrH3QovHuw/Vl2BR9xkGOe3V0Dhs2aS8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbafCkX%2FbtrH3QovHuw%2FVl2BR9xkGOe3V0Dhs2aS8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;554&quot; data-filename=&quot;006.png&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;554&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;</description>
      <category>Raspberry Pi</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/122</guid>
      <comments>https://limelee85.tistory.com/entry/Raspberry-Pi-3-%EB%A9%94%EC%9D%BC%EC%84%9C%EB%B2%84sendmail-%EA%B5%AC%EC%B6%95#entry122comment</comments>
      <pubDate>Mon, 25 Jul 2022 19:37:57 +0900</pubDate>
    </item>
    <item>
      <title>Raspberry Pi 3 하드디스크 마운트 및 파일 서버 구축</title>
      <link>https://limelee85.tistory.com/entry/Raspberry-Pi-3-%ED%95%98%EB%93%9C%EB%94%94%EC%8A%A4%ED%81%AC-%EB%A7%88%EC%9A%B4%ED%8A%B8-%EB%B0%8F-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;로컬이나 용량이 작은 여러 usb에 분산해서 저장해놓으니까 막상 원하는 파일이 어디에 있는지 몰라서 이 usb, 저 usb 뒤적거리다 결국은 못찾는 경우가 여럿있었다. &lt;br /&gt;그래서&amp;nbsp;어차피&amp;nbsp;라즈베리파이는&amp;nbsp;웹&amp;nbsp;서버&amp;nbsp;때문에&amp;nbsp;24시간&amp;nbsp;구동도&amp;nbsp;하겠다.&amp;nbsp;파일서버&amp;nbsp;하나&amp;nbsp;구축하면&amp;nbsp;접근성도&amp;nbsp;쉽고&amp;nbsp;어떤&amp;nbsp;파일을&amp;nbsp;찾고&amp;nbsp;있는지도&amp;nbsp;용이할&amp;nbsp;것&amp;nbsp;같다. &lt;br /&gt;&lt;br /&gt;라즈베리파이&amp;nbsp;3&amp;nbsp;에서&amp;nbsp;부팅을&amp;nbsp;위한&amp;nbsp;sd&amp;nbsp;card는&amp;nbsp;아무래도&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;라즈베리파이 3는 이동을 자주하는게 아니므로 외장용 하드디스크 말고 그냥 일반 하드디스크를 구매했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;용량은 4TB.&lt;br /&gt;&lt;b&gt;SATA-USB&amp;nbsp;변환&amp;nbsp;케이블&lt;/b&gt;로&amp;nbsp;하드디스크에&amp;nbsp;전력&amp;nbsp;공급&amp;nbsp;및&amp;nbsp;라즈베리&amp;nbsp;파이에&amp;nbsp;연결&amp;nbsp;시켜줬다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;2679&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4XX8z/btrDiDGryIn/vHbtS6tTzKf4glkVNmkArK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4XX8z/btrDiDGryIn/vHbtS6tTzKf4glkVNmkArK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4XX8z/btrDiDGryIn/vHbtS6tTzKf4glkVNmkArK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4XX8z%2FbtrDiDGryIn%2FvHbtS6tTzKf4glkVNmkArK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2268&quot; height=&quot;2679&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;2268&quot; data-origin-height=&quot;2679&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&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_1653634952556&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo lsblk&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_001.png&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8j5IU/btrDhe8vQ3a/uRn5LyjXavvnYOfL9KNyX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8j5IU/btrDhe8vQ3a/uRn5LyjXavvnYOfL9KNyX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8j5IU/btrDhe8vQ3a/uRn5LyjXavvnYOfL9KNyX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8j5IU%2FbtrDhe8vQ3a%2FuRn5LyjXavvnYOfL9KNyX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;138&quot; data-filename=&quot;edit_001.png&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;lsblk를&amp;nbsp;이용하여&amp;nbsp;sda라는&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;pre id=&quot;code_1653635444061&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo mkfs.ext4 /dev/sda&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_002.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;250&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z0nQc/btrDiHIJllC/ZlKykBa1BtJxiE12XyKn50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z0nQc/btrDiHIJllC/ZlKykBa1BtJxiE12XyKn50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z0nQc/btrDiHIJllC/ZlKykBa1BtJxiE12XyKn50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz0nQc%2FbtrDiHIJllC%2FZlKykBa1BtJxiE12XyKn50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;250&quot; data-filename=&quot;edit_002.png&quot; data-origin-width=&quot;724&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;ext4로&amp;nbsp;포맷시켜준다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이&amp;nbsp;때&amp;nbsp;UUID도&amp;nbsp;같이&amp;nbsp;출력된다.&amp;nbsp;자동마운트를&amp;nbsp;설정해줄거라면&amp;nbsp;기억해두자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_003.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;176&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QSRxK/btrDi4Q3IYY/xO2UpmcUqGCk2MgEAwWJzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QSRxK/btrDi4Q3IYY/xO2UpmcUqGCk2MgEAwWJzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QSRxK/btrDi4Q3IYY/xO2UpmcUqGCk2MgEAwWJzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQSRxK%2FbtrDi4Q3IYY%2FxO2UpmcUqGCk2MgEAwWJzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;176&quot; data-filename=&quot;edit_003.png&quot; data-origin-width=&quot;607&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;마운트를 할 디렉터리를 생성해준다. /home/storage라는 디렉터리를 생성해주었다.&lt;/p&gt;
&lt;p data-ke-size=&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_1653635526053&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ mount /dev/sda /home/storage/&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_004.png&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;137&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/58JDC/btrDivuZ6CM/8DQ8epHkD6YBPkwthdbws1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/58JDC/btrDivuZ6CM/8DQ8epHkD6YBPkwthdbws1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/58JDC/btrDivuZ6CM/8DQ8epHkD6YBPkwthdbws1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F58JDC%2FbtrDivuZ6CM%2F8DQ8epHkD6YBPkwthdbws1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;603&quot; height=&quot;137&quot; data-filename=&quot;edit_004.png&quot; data-origin-width=&quot;603&quot; data-origin-height=&quot;137&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mount 명령어를 통해 /home/storage에 하드디스크가 정상적으로 마운트 된 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1653635624116&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ln -s [마운트 된 디렉터리 경로] private&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_005.png&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvxtY3/btrDjfdRjJX/4nqCIBpkLyomQdN8bmkLsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvxtY3/btrDjfdRjJX/4nqCIBpkLyomQdN8bmkLsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvxtY3/btrDjfdRjJX/4nqCIBpkLyomQdN8bmkLsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvxtY3%2FbtrDjfdRjJX%2F4nqCIBpkLyomQdN8bmkLsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;869&quot; height=&quot;156&quot; data-filename=&quot;edit_005.png&quot; data-origin-width=&quot;869&quot; data-origin-height=&quot;156&quot;/&gt;&lt;/span&gt;&lt;/figure&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;생성해준다.&lt;br /&gt;이전에&amp;nbsp;생성해둔&amp;nbsp;심볼릭링크에&amp;nbsp;경로를&amp;nbsp;덮어씌워서&amp;nbsp;-Tf&amp;nbsp;옵션을&amp;nbsp;사용했고&amp;nbsp;새로&amp;nbsp;만드는거라면&amp;nbsp;-s&amp;nbsp;옵션만&amp;nbsp;사용하면&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_006.png&quot; data-origin-width=&quot;863&quot; data-origin-height=&quot;284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkxlmG/btrDiqN8Ggh/SI1g9ojQlgwCvgFjACzCTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkxlmG/btrDiqN8Ggh/SI1g9ojQlgwCvgFjACzCTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkxlmG/btrDiqN8Ggh/SI1g9ojQlgwCvgFjACzCTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkxlmG%2FbtrDiqN8Ggh%2FSI1g9ojQlgwCvgFjACzCTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;863&quot; height=&quot;284&quot; data-filename=&quot;edit_006.png&quot; data-origin-width=&quot;863&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;&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_009.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;120&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBmWIl/btrDihYHxf1/fqpEErGcxnrKw7zrvjrFt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBmWIl/btrDihYHxf1/fqpEErGcxnrKw7zrvjrFt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBmWIl/btrDihYHxf1/fqpEErGcxnrKw7zrvjrFt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBmWIl%2FbtrDihYHxf1%2FfqpEErGcxnrKw7zrvjrFt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;120&quot; data-filename=&quot;edit_009.png&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;120&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/files/ 와 하위디렉터리 내부에 존재하는 파일이 보이는 이유는 Options +Indexes +FollowSymLinks 옵션을 설정해두었기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AllowOverride all은 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;리부트되면&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;UUID는 하드디스크 포맷 때 확인한 UUID를 입력해주면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1653635688455&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo vi /etc/fstab

UUID='[하드디스크의 UUID]' /home/storage ext4 defaults,noatime 0 0&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_008.png&quot; data-origin-width=&quot;919&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l5TZc/btrDgOCc9MK/uvVkoHAkVXSKrL6iLn9eBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l5TZc/btrDgOCc9MK/uvVkoHAkVXSKrL6iLn9eBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l5TZc/btrDgOCc9MK/uvVkoHAkVXSKrL6iLn9eBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl5TZc%2FbtrDgOCc9MK%2FuvVkoHAkVXSKrL6iLn9eBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;132&quot; data-filename=&quot;edit_008.png&quot; data-origin-width=&quot;919&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;&lt;br /&gt;이제 리부트되도 하드디스크가 연결되어있다면 자동으로 연결된다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1653635752406&quot; class=&quot;shell&quot; data-ke-language=&quot;shell&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$ sudo blkid&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edit_007.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OYMAT/btrDirGeFQw/NJw2wakKRQWAP6ZLOsl3sK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OYMAT/btrDirGeFQw/NJw2wakKRQWAP6ZLOsl3sK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OYMAT/btrDirGeFQw/NJw2wakKRQWAP6ZLOsl3sK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOYMAT%2FbtrDirGeFQw%2FNJw2wakKRQWAP6ZLOsl3sK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;903&quot; height=&quot;114&quot; data-filename=&quot;edit_007.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;하드디스크 포맷할 때 UUID 확인을 못했다면 blkid&amp;nbsp;를&amp;nbsp;통해&amp;nbsp;확인&amp;nbsp;가능하다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Raspberry Pi</category>
      <author>LimeLee</author>
      <guid isPermaLink="true">https://limelee85.tistory.com/121</guid>
      <comments>https://limelee85.tistory.com/entry/Raspberry-Pi-3-%ED%95%98%EB%93%9C%EB%94%94%EC%8A%A4%ED%81%AC-%EB%A7%88%EC%9A%B4%ED%8A%B8-%EB%B0%8F-%ED%8C%8C%EC%9D%BC-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95#entry121comment</comments>
      <pubDate>Fri, 27 May 2022 19:16:18 +0900</pubDate>
    </item>
  </channel>
</rss>