<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Naam's Hacking Log</title>
    <link>https://cloudnaaam.tistory.com/</link>
    <description>해킹 공부방입니다.</description>
    <language>ko</language>
    <pubDate>Tue, 16 Jun 2026 22:29:10 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>cloudnaaam</managingEditor>
    <item>
      <title>2025년 회고록</title>
      <link>https://cloudnaaam.tistory.com/182</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블로그를 공부용으로만 쓰기엔 왠지 모를 아까움이 들었다. 그래서 뭘 할까 고민하다가.. 한 해를 갈무리 할 겸 회고록을 써보기로 했다. 아 물론 2026년의 첫 해가 뜬 지 9일이나 지났지만 말이다. 그래도 더 늦기 전에 2025년을 회고해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년은 토끼띠에게 들삼재였다는데, 그랬던 것 같기도 하고.. 아니었던 것 같기도 하다. 뭐 아무렴 어떠랴. 근성으로 이겨내면 그만이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1월&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bJTIS4/dJMcaaqsAAu/CkQIeu6xZ5XpPDekk18bM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bJTIS4/dJMcaaqsAAu/CkQIeu6xZ5XpPDekk18bM0/img.png&quot; data-alt=&quot;플랜카드 없었으면 훨씬 예뻤을텐데&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bJTIS4/dJMcaaqsAAu/CkQIeu6xZ5XpPDekk18bM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbJTIS4%2FdJMcaaqsAAu%2FCkQIeu6xZ5XpPDekk18bM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;294&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;플랜카드 없었으면 훨씬 예뻤을텐데&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나의 2025년 첫 1초는 DDP역 앞 세븐일레븐이었다. 알바와 함께하는 새해는 처음이라 감회가 새롭더라. 주 손님층이었던 외국인들이 종각으로 몰렸는지 그날따라 사람이 적었었다. 덕분에 알바의 마지막 날을 마무리했었지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 그리고 학점을 다 들어서 수료 상태가 되었다. 이에 따라 자취방도 빼고 본가로 돌아왔다. 참 즐거우면서도 탈도 많았던 자취 생활이었다. 한 가지 확실하게 말할 수 있는 건, 자취했던 동안은 내 대학 생활 중 가장 열심히 살았던 시기였다. KISIA 교육 프로젝트, 화이트햇 스쿨, 졸업 플젝, 그리고 알바까지. 대학 생활 중 가장 큰 발자국을 여기서 찍을 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OPNCu/dJMcadHrZ90/z8HadSrZUNhyYfDw6MBka0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OPNCu/dJMcadHrZ90/z8HadSrZUNhyYfDw6MBka0/img.png&quot; data-alt=&quot;1월의 서우봉&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OPNCu/dJMcadHrZ90/z8HadSrZUNhyYfDw6MBka0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOPNCu%2FdJMcadHrZ90%2Fz8HadSrZUNhyYfDw6MBka0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;285&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;1월의 서우봉&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1월 중순에는 제주도 여행을 갔다왔다. 한 때 내 집과도 같았던 제주의 청취는 여전했다. 은은하고, 여유로웠다. 하늘은 쾌청하고, 1월치고는 춥지 않은 날씨와 적당히 부는 바람. 무엇 하나 부족하지 않았던 여행이었다. 또 가고 싶다 제주도..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2월 ~ 8월&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본격적인 상반기 취준 시기.. SQLD, CPPG, 정처기, Opic 총 4개의 자격증에 호기롭게 도전. 결과적으로 성공한 건 정처기 필기 하나뿐..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상반기에는 나름 서류 열심히 넣었다. 잡코리아에서 이력서도 만들어보고, 자소서도 계속 써보고.. 결과적으로 CJ올리브네트웍스, 신한DS 이 두 개가 서류 통과했다. 아 물론 둘 다 떨어졌다. 각각 코테, 면접에서 말이다. 특히 면접은 힘겹더라.. 프리스타일로 말하려다가 된통 쓴 맛을 봐버렸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아 BOB도 지원..하려고 했으나, 취업에 대한 압박감 때문에 넣지 않았다. 물론 넣었어도 붙었을지는 모르겠지만.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eg9hGO/dJMcadHr0NI/9x2Sjp0nNd2af0kV2TDlM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eg9hGO/dJMcadHr0NI/9x2Sjp0nNd2af0kV2TDlM0/img.png&quot; data-alt=&quot;니시하마 해수욕장, 에노시마&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eg9hGO/dJMcadHr0NI/9x2Sjp0nNd2af0kV2TDlM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feg9hGO%2FdJMcadHr0NI%2F9x2Sjp0nNd2af0kV2TDlM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;303&quot; height=&quot;404&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;니시하마 해수욕장, 에노시마&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8월에는 도쿄로 여행을 갔다왔다. 8월의 일본은 정말.. 여름이었다. 최고 기온 34도, 체감 기온 38도를 곁들인.. 아 물론 찜통 더위에도 불구하고 재밌게 놀고 왔다. 신주쿠, 시부야, 아키하바라, 아사쿠사, 우에노, 가마쿠라, 에노시마.. 3박 4일동안 진짜 많이 다녔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 여름에 일본을 간다면 니시하마 해수욕장은 강력 추천한다. 모래가 곱고 물도 많이 안차서 물놀이 하기 딱이더라. 우리는 옷을 안가져가서 못했지만..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 야끼니꾸 짱 맛있더라. 거짓말 안보태고 셋이서 우설만 10번은 넘게 시켜먹은 것 같다. (무한 리필집임). 갈비는 8번 정도. 생맥주도 같이 먹을까 했었는데, 우리의 주된 목적은 고기였기에. 맥주 먹을 배에 고기를 미친듯이 투입시켰다. 헌데, 사장님이 우리의 폭주를 막고자 하셨음일까? 마지막에 시켰던 돈설은 유난히 양이 많았다. 우리는 인생 첫 돈설을 도전하였고, 얼마 안가 돼지 잡내에 굴복하고 식당을 나섰다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 2월 ~ 8월은 심적으로 부담되던 시기였다. 취준도 처음이고, 동시에 '내가 취업을 할 수 있을까'라는 생각도 들었고 말이다. 아니, 더 정확히 말하자면 '내가 사장이라면 과연 나를 뽑을까?'라는 생각이였을까. 동시에 보안 공부를 일찍 시작했더라면.. 이라는 무용한 생각도 계속 들었지.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9월&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9월에는 SK 쉴더스 루키즈 교육에 합격했다. 그래서 24일부터 교육 시작했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qjDTu/dJMcagYuX2g/olaIuUkAOFCRDZ8tkf8y4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qjDTu/dJMcagYuX2g/olaIuUkAOFCRDZ8tkf8y4k/img.png&quot; data-alt=&quot;만리포 해수욕장, 태안&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qjDTu/dJMcagYuX2g/olaIuUkAOFCRDZ8tkf8y4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqjDTu%2FdJMcagYuX2g%2FolaIuUkAOFCRDZ8tkf8y4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;386&quot; height=&quot;4032&quot; data-origin-width=&quot;3024&quot; data-origin-height=&quot;4032&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;만리포 해수욕장, 태안&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리하여 교육 전 마지막 여행으로 태안에 갔다. 이게 취준생의 묘미지. 1박 2일로 첫 날은 천리포 해수욕장 쪽에서 놀고, 이튿 날은 만리포 해수욕장에서 놀았다. 특히 이튿 날은 다행히 날씨가 개서 물놀이를 즐겼다. 서해 바다는 수위가 낮아서 편하게 놀기 좋더라. 푸지게 놀고 올라가는데, 도저히 집 갈 여력이 없어 운전해준 친구 집에서 다같이 잤다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10월 ~ 12월&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때는 한창 교육 들었다. 관제, 컨설팅, 취약점 진단 등등.. 다 들어봤는데 역시 모의해킹이 제일 재밌더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nhiD3/dJMcahb2WbE/kKdbINXznEjtjrGkjglIP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nhiD3/dJMcahb2WbE/kKdbINXznEjtjrGkjglIP0/img.png&quot; data-alt=&quot;12월 어느 날. 첫눈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nhiD3/dJMcahb2WbE/kKdbINXznEjtjrGkjglIP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnhiD3%2FdJMcahb2WbE%2FkKdbINXznEjtjrGkjglIP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;306&quot; height=&quot;543&quot; data-origin-width=&quot;507&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;12월 어느 날. 첫눈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;12월에는 첫눈이 왔다. 근데 올해는 낭만이 아니라 재해더라. 갑자기 눈이 오는 터라 도로도, 차들도, 사람들도 모두 대비가 안되었었다. 날도 추워서 떨어진 눈이 얼어버렸는데, 사람도 차도 다 미끄러지더라. 오죽하면 마을 버스가 안굴러가서 사람들이랑 뒤에서 밀어줬었다. 이 와중에 건이는 산책 나가서 낭만을 즐기더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;900&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj2p0G/dJMcahXrJJi/4eg63KcVdkX7FgNleXgkY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj2p0G/dJMcahXrJJi/4eg63KcVdkX7FgNleXgkY1/img.png&quot; data-alt=&quot;2025년의 마지막 날. 교육장 창문&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj2p0G/dJMcahXrJJi/4eg63KcVdkX7FgNleXgkY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj2p0G%2FdJMcahXrJJi%2F4eg63KcVdkX7FgNleXgkY1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;339&quot; height=&quot;452&quot; data-origin-width=&quot;675&quot; data-origin-height=&quot;900&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;2025년의 마지막 날. 교육장 창문&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;2025년의 마지막 날도 역시 교육을 들었다. 노트북에 집중하다가 피로하면 창 밖을 보곤 한다. 그럴 때마다 보이는 학교 앞 술집 거리와 남산. 생각 없이 보다 보면, 대학 생활이 스쳐 지나가곤 한다. 그렇게 마주한 찰나의 추억이 다시 힘을 주더라. 졸업식 날에는 또 어떤 느낌이 들 지 문득 궁금하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마치며&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2025년은.. 진짜 어른으로서의 첫 방황이 아니었을까 싶다. 수료와 동시에 취준, 그리고 연속되는 탈락.. 왜 취준이 다들 어렵다는 지 알 것 같던 시기였다. 이걸 1년 이상 한다고..?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 시기를 버틸 수 있었던 건, 어려움 속에서도 방법을 찾는 내 성격 덕분이었다. 새로운 시작을 했고, 아직 현재 진행형이다. 마지막에는 어떻게 될 지 알 수 없지만, 잘 될꺼다. 변명도, 핑계도 불필요하다. 나를 믿는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2026년은 뭔가 목표가 있다면, 우선은 원하는 곳에 취업하는 것. 이건 무조건..! 그리고 해킹 실력좀 많이 늘었으면 좋겠다. 요즘 감이 아주 떡락해서 쉬운 것들도 자꾸 빙빙 돌아가는 느낌이다.&lt;/p&gt;
&lt;p data-ke-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;어.. 마지막 멘트는.. 로또 1등 당첨되면 좋겠다.&lt;/p&gt;</description>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/182</guid>
      <comments>https://cloudnaaam.tistory.com/182#entry182comment</comments>
      <pubDate>Sat, 10 Jan 2026 13:24:10 +0900</pubDate>
    </item>
    <item>
      <title>XS_leak</title>
      <link>https://cloudnaaam.tistory.com/181</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;Background&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XS leak에 대해 이해하려면 먼저 CORS와 SOP에 대해 알아야 한다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;동일 출처 정책 (Same Origin Policy)&lt;/b&gt;&lt;/h4&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SOP는 동일한 출처에서만 리소스를 공유하도록 유도한다. 동일한 출처란 &quot;프로토콜|호스트|포트&quot;가 모두 같은 곳을 말한다. 즉,&lt;/p&gt;
&lt;pre id=&quot;code_1764638509724&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;http://123.123.123.12:8000 = http://123.123.123.12:8000 
https://1.1.1.1:8000 != http://1.1.1.1:8000
http://search.naver.com != http://mail.naver.com&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 하나만 달라도 다른 출처로 간주하는 것. 참고로 TLD나 subdomain이 달라도 다른 출처로 간주된다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SOP는&amp;nbsp;다른 서버, API로 요청을 보내고 응답 받을 수는 있지만, 요청을 받는 것을 막는다. 이게 꽤나 중요한 게, SOP가 없다면 아마 side channel을 이용한 해커들의 공격이 마구잡이로 일어날꺼다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;근데 이렇게만 보면 개발자들에게 있어서 리소스가 너무나도 한정적이다. 특히 외부 API를 못가져오는 건 재앙이나 마찬가지일꺼다. 때문에 이를 완화시키기 위해 CORS라는 게 존재한다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;교차 출처 리소스 공유 (Cross Origin Resource Sharing)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CORS는 교차 출처 리소스 공유에 대한 정책이다. SOP에서 교차 출처를 모두 막지만, CORS를 통해 이를 완화하여 특정 출처의 리소스를 공유할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;i&gt;CORS 기본 동작&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 브라우저가 헤더의 Origin 필드에 출처를 담아 보냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 서버가 Access-Control-Allow-Origin: 출처 를 담아 클라이언트에게 전달&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 클라이언트에서 Origin과 Access-Control-Allow-Origin을 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 유효하지 않으면 차단&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 CORS의 동작을 보면 알 수 있듯, 서버와 브라우저가 상호작용을 통해 리소스를 허용한다. 따라서 결론적으로 CORS를 통해 출처를 허용하려면, 서버가 Access-Control-Allow-Origin 헤더에 허용할 출처를 포함해서 응답하면 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 외에도 CORS의 동작 방식이 더 있는데, 본 글은 xs leak 설명이 중심이기에 배경 지식 설명은 이 정도면 충분할 것 같다. (Reference를 참조하시길..)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;XS leak이란?&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;직역하면 교차 사이트 유출이다. 쉽게 말하면 타겟 사이트의 동작에 기반하여 사이드 채널을 통해 정보를 얻는 것인데, 대략 구조를 그려보자면&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7bMU7/dJMcagjFRM5/v9NKJagKFUC8UhQc9haCf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7bMU7/dJMcagjFRM5/v9NKJagKFUC8UhQc9haCf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7bMU7/dJMcagjFRM5/v9NKJagKFUC8UhQc9haCf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7bMU7%2FdJMcagjFRM5%2Fv9NKJagKFUC8UhQc9haCf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;522&quot; height=&quot;243&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 느낌이지 싶다. 여기서 알아야 할 부분이, 앞서 말한 SOP/CORS 모두 브라우저 단에서 이뤄지는 정책들이기 때문에, 우리가 지금 보고 있는 XS leak은 브라우저 단에서 일어나는 취약점이라는 것이다. 이를 먼저 알면 이해하기 편하다. (브라우저 단 취약점이다? ==&amp;gt; JS/HTML을 반드시 공부해라!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 상호 작용할 수 있도록 설계되어 있다. 비단 사용자 뿐만 아니라 다른 사이트 또한 마찬가지이다. iframe, a href, img 등등.. 그리고 이를 안전하게 하도록 브라우저는 SOP를 사용한다. 하지만 SOP로도 해커들을 완벽하게 막을 수는 없었다. 사실 정확히 말하면 개발자들의 웹 설계 방식도 한 몫 하지만..&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;Scenario&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XS leak을 유발하는 시나리오는 다양하다. 패턴이 꽤 많아서 XS leak wiki를 참고하는 것을 추천한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://xsleaks.dev/&quot;&gt;https://xsleaks.dev/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1764642164754&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;Introduction&quot; data-og-description=&quot;XS-Leaks Wiki # Overview # Cross-site leaks (aka XS-Leaks, XSLeaks) are a class of vulnerabilities derived from side-channels 1 built into the web platform. They take advantage of the web&amp;rsquo;s core principle of composability, which allows websites to intera&quot; data-og-host=&quot;xsleaks.dev&quot; data-og-source-url=&quot;https://xsleaks.dev/&quot; data-og-url=&quot;https://xsleaks.dev/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://xsleaks.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://xsleaks.dev/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Introduction&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;XS-Leaks Wiki # Overview # Cross-site leaks (aka XS-Leaks, XSLeaks) are a class of vulnerabilities derived from side-channels 1 built into the web platform. They take advantage of the web&amp;rsquo;s core principle of composability, which allows websites to intera&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;xsleaks.dev&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 몇 개만 살펴보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;i&gt;&lt;b&gt;1. Frame Counting&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;브라우저에서는 window.open() 이나 &amp;lt;iframe&amp;gt;을 사용할 경우 다른 출처의 페이지여도 다음과 같은 속성은 접근이 가능하다.&lt;/p&gt;
&lt;pre id=&quot;code_1764642461825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;iframe.contentWindow.length
iframe.contentWindow.frames.length&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 속성들은 자식 프레임의 개수 (정상 응답만) 를 반환한다. 만약 타겟 페이지에서 &amp;lt;iframe&amp;gt;을 이용해서 입력 결과를 반환한다면 해당 속성들을 이용해서 결과를 유추할 수 있지 않을까? 예를 들어&lt;/p&gt;
&lt;pre id=&quot;code_1764643507607&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;iframe.src = `타겟 서버/search?query=CLOUD`;

iframe.onload = () =&amp;gt; {
  const frameCount = iframe.contentWindow.length;
  if(frameCount &amp;gt;= 1){
      console.log(&quot;HIT!!&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;size18&quot;&gt;&lt;i&gt;&lt;b&gt;2. Timing&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Timing 기법의 경우 네트워크 환경에 따라 측정이 불안정 할 수 있다. 따라서 여러 번 측정하면서 패턴을 파악하고 측정 결과 간&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비교해야 한다. 예를 들어 DB에서 결과를 가져오는 시간에 따른 패턴이라던가, 결과에 따른 브라우저 렌더링 및 동작 시간을 파악한다던가..&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;i&gt;&lt;b&gt;3. Etc.&lt;/b&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단순하게 서버의 응답 코드만으로도 정보가 유출될 수 있다. 예를 들어 idx를 조회하는 페이지가 있다면&lt;/p&gt;
&lt;pre id=&quot;code_1764641889683&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/my-idx?user=Cloud&amp;amp;idx=101 ==&amp;gt; 404
/my-idx?user=Cloud&amp;amp;idx=102 ==&amp;gt; 200
/my-idx?user=Cloud&amp;amp;idx=103 ==&amp;gt; 404
/my-idx?user=Cloud&amp;amp;idx=104 ==&amp;gt; 404&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 user의 idx를 응답 코드를 통해 유추할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 이용해서 CTFd 라는 플랫폼에서 1-day 취약점이 발생했었는데, 자세한 부분은 해당 링크를 참고하는 게 좋겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.hspace.io/posts/XS-Leak101-2/&quot;&gt;https://blog.hspace.io/posts/XS-Leak101-2/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1764642161328&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;XS-Leak101#2&quot; data-og-description=&quot;Visited link XS-Leak라는 기법을 알아봅니다.&quot; data-og-host=&quot;blog.hspace.io&quot; data-og-source-url=&quot;https://blog.hspace.io/posts/XS-Leak101-2/&quot; data-og-url=&quot;https://blog.hspace.io/posts/XS-Leak101-2/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bQe8oK/hyZOuHRFL7/3UwFuHnS96bva9q4LzlvK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mQRyv/hyZOoAQLx8/O9kxHPh2kBOhn7ZITRVvt1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://blog.hspace.io/posts/XS-Leak101-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.hspace.io/posts/XS-Leak101-2/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bQe8oK/hyZOuHRFL7/3UwFuHnS96bva9q4LzlvK1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/mQRyv/hyZOoAQLx8/O9kxHPh2kBOhn7ZITRVvt1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&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;XS-Leak101#2&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Visited link XS-Leak라는 기법을 알아봅니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.hspace.io&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Mitigation&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SameSite Cookie, COOP(Cross-Origin-Opener-Policy), COEP(Cross-Origin-Embedded-Policy), CSP(Content-Security-Policy), X-Frame-Options, Origin-Agent-Cluster, CORP(Cross-Origin-Resource-Policy) 등 브라우저 단에서 막을 수 있는 여러 방법들이 있다. 물론 서버 측의 설계를 바꿀 수도 있겠지만, 웬만하면 개발자들의 인권을 존중하자..!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Practice&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/CloudNaaam/xs_leak&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/CloudNaaam/xs_leak&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1764644617104&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 - CloudNaaam/xs_leak: for study&quot; data-og-description=&quot;for study. Contribute to CloudNaaam/xs_leak development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/CloudNaaam/xs_leak&quot; data-og-url=&quot;https://github.com/CloudNaaam/xs_leak&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://github.com/CloudNaaam/xs_leak&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://github.com/CloudNaaam/xs_leak&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub - CloudNaaam/xs_leak: for study&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;for study. Contribute to CloudNaaam/xs_leak 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;사실 이게 이 글을 쓴 진짜 이유다. 사이드 프로젝트로 xs leak을 간단하게 구현해봤다.&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;Reference&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-CORS-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%F0%9F%91%8F&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://inpa.tistory.com/entry/WEB-%F0%9F%93%9A-CORS-%F0%9F%92%AF-%EC%A0%95%EB%A6%AC-%ED%95%B4%EA%B2%B0-%EB%B0%A9%EB%B2%95-%F0%9F%91%8F&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@jesop/SOP%EC%99%80-CORS&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@jesop/SOP%EC%99%80-CORS&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://xsleaks.dev/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://xsleaks.dev/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.hahwul.com/cullinan/attack/xs-leaks&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.hahwul.com/cullinan/attack/xs-leaks&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.hspace.io/posts/XS-Leak101-2/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://blog.hspace.io/posts/XS-Leak101-2/&lt;/a&gt;&lt;/p&gt;</description>
      <category>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/181</guid>
      <comments>https://cloudnaaam.tistory.com/181#entry181comment</comments>
      <pubDate>Tue, 2 Dec 2025 12:05:08 +0900</pubDate>
    </item>
    <item>
      <title>JWT (Json web token)</title>
      <link>https://cloudnaaam.tistory.com/167</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;JWT란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;json 형식으로 이루어진 웹 토큰이라고 쉽게 생각하면 된다. jwt는 &lt;b&gt;header, payload, signature&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;보통 signature 부분은 해당 jwt 알고리즘에 따른 key를 이용해 생성되기 때문에 변조 불가능하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header, payload 부분을 변조한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vi6Pd/btsPXJnF6A1/KvVPGqz6VsUPzPiJv8rI6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vi6Pd/btsPXJnF6A1/KvVPGqz6VsUPzPiJv8rI6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vi6Pd/btsPXJnF6A1/KvVPGqz6VsUPzPiJv8rI6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fvi6Pd%2FbtsPXJnF6A1%2FKvVPGqz6VsUPzPiJv8rI6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;428&quot; height=&quot;428&quot; data-origin-width=&quot;428&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 header 부분에는&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;alg : 해당 jwt 생성 시 사용한 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;typ : 토큰 타입, 보통 JWT 로 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;cty : 페이로드의 타입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;kid : 키의 id&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jwk : 서명에 사용된 공개키를 직접 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;jku : 공개키가 위치한 url&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;x5u, x5c : 공개키 인증서 위치한 url, 혹은 직접 포함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;header 부분을 조작해서 인증 우회를 하는건, 서버의 코드 설계 자체에서 오는 결함이 대부분일듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내가 아는 한도는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. key 검증에서 문제가 발생해 임의로 만든 jwt 토큰으로 검증 우회 (alg 이 none으로 설정되어 있는 경우가 대표적)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. kid 를 이용한 directory traversal (리눅스에서 /dev/null 경로를 많이 사용한다고 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. algorithm confusion. 보통 서버는 비대칭을 원하는데, 공격자가 대칭키로 조작했을 때 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://portswigger.net/web-security/jwt/algorithm-confusion&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://portswigger.net/web-security/jwt/algorithm-confusion&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1755659681282&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;Web Application Security, Testing, &amp;amp; Scanning - PortSwigger&quot; data-og-description=&quot;PortSwigger offers tools for web application security, testing, &amp;amp; scanning. Choose from a range of security tools, &amp;amp; identify the very latest vulnerabilities.&quot; data-og-host=&quot;portswigger.net&quot; data-og-source-url=&quot;https://portswigger.net/web-security/jwt/algorithm-confusion&quot; data-og-url=&quot;https://portswigger.net&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://portswigger.net/web-security/jwt/algorithm-confusion&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://portswigger.net/web-security/jwt/algorithm-confusion&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Web Application Security, Testing, &amp;amp; Scanning - PortSwigger&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;PortSwigger offers tools for web application security, testing, &amp;amp; scanning. Choose from a range of security tools, &amp;amp; identify the very latest vulnerabilities.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;portswigger.net&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;4. jwk 와 jku를 서버가 사용할 경우, 이들을 임의로 인젝션해서 서버가 jwt를 신뢰하도록&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등이 있는데, 그 밖에도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. cty 를 이용해 Content-type을 바꿔 XXE나 역직렬화 공격&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. x5c를 통해 인증서 주입 및 우회 (CVE-2017-2800, CVE-2018-2633)&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;payload는 서버에서 지정한 양식대로 가는데, 만약 header 조작으로 우회를 성공했다면?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;admin&quot;:true 이런 식으로 센스껏 조작해서 시도해보면 되겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 인증 우회가 그렇듯, JWT를 이용한 인증도 우회가 되는 이유는 설계 상의 문제인 듯 하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서명 검증을 빡세게 하거나, jku 를 화이트리스트로 필터링하고, kid 파라미터를 필터링한다던가 여러 방법으로 완화할 수 있겠다.&lt;/p&gt;
&lt;p data-ke-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>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/167</guid>
      <comments>https://cloudnaaam.tistory.com/167#entry167comment</comments>
      <pubDate>Wed, 20 Aug 2025 12:17:23 +0900</pubDate>
    </item>
    <item>
      <title>Web cache deception</title>
      <link>https://cloudnaaam.tistory.com/164</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Web cache deception이란&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹은 정적 콘텐츠, 동적 콘텐츠로 구성된다. 정적 콘텐츠(Static Contents)의 경우 PNG, JPG 등 정보가 고정된 콘텐츠를 의미한다. 트래픽이 많아질 경우에 서버의 부담을 덜어주기 위해 Caching을 이용하기도 하는데, 이 때 발생할 수 있는 취약점이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;213&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wT2b1/btsPqUh1inT/rA8k8x1K7RxMnlASCUCLN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wT2b1/btsPqUh1inT/rA8k8x1K7RxMnlASCUCLN1/img.png&quot; data-alt=&quot;출처: 챗지피티&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wT2b1/btsPqUh1inT/rA8k8x1K7RxMnlASCUCLN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwT2b1%2FbtsPqUh1inT%2FrA8k8x1K7RxMnlASCUCLN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;504&quot; height=&quot;213&quot; data-origin-width=&quot;504&quot; data-origin-height=&quot;213&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;출처: 챗지피티&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 있다고 생각하면 되는데, 캐시 서버에서 Caching을 하면 유저의 로컬 브라우저에 저장되게 된다. 즉, 백엔드 서버까지 굳이 가서 다시 콘텐츠를 불러올 필요가 없어진다는 것이고, 그러면 서버의 부담이 줄게 되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 만약 캐시 서버와 백엔드 서버의 URL 정규화 규칙이 다르다면? Web cache deception 취약점이 발생하게 되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 /my-account 로 접근하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;136&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2bzSi/btsPpQnf2wJ/5fi888IkX6cfBOekRrkzSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2bzSi/btsPpQnf2wJ/5fi888IkX6cfBOekRrkzSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2bzSi/btsPpQnf2wJ/5fi888IkX6cfBOekRrkzSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2bzSi%2FbtsPpQnf2wJ%2F5fi888IkX6cfBOekRrkzSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;540&quot; height=&quot;136&quot; data-origin-width=&quot;540&quot; data-origin-height=&quot;136&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 내 정보가 뜬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 캐시 서버는 경로를 그대로 해석하고, 백엔드 서버는 /my-account/* 는 모두 동일하게 처리할 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/my-account/asd.js로 접근하면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csiEnM/btsPqz6hjfa/jwTllglYEDn7DKucubTVs0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csiEnM/btsPqz6hjfa/jwTllglYEDn7DKucubTVs0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csiEnM/btsPqz6hjfa/jwTllglYEDn7DKucubTVs0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsiEnM%2FbtsPqz6hjfa%2FjwTllglYEDn7DKucubTVs0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;227&quot; data-origin-width=&quot;528&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 caching 하는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M5TuV/btsPptlzwoZ/c4VCVxFm6UvbMiB7iUqmS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M5TuV/btsPptlzwoZ/c4VCVxFm6UvbMiB7iUqmS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M5TuV/btsPptlzwoZ/c4VCVxFm6UvbMiB7iUqmS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM5TuV%2FbtsPptlzwoZ%2Fc4VCVxFm6UvbMiB7iUqmS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;590&quot; height=&quot;194&quot; data-origin-width=&quot;636&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째 접근에서는 cache가 hit 되었고, 30초 동안은 /my-account/asd.js에 접근하면 내 정보가 그대로 보이게 되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 만일 이걸 다른 사람이 접근하게 된다면? 누군가에게 리다이렉션을 강제로 시켜서 접근시켜버린다면?&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;600&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bs9tgU/btsPqLyGDD8/3MU0zaCN9d306OYKGEYw01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bs9tgU/btsPqLyGDD8/3MU0zaCN9d306OYKGEYw01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bs9tgU/btsPqLyGDD8/3MU0zaCN9d306OYKGEYw01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbs9tgU%2FbtsPqLyGDD8%2F3MU0zaCN9d306OYKGEYw01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;150&quot; data-origin-width=&quot;600&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;그 사람의 정보가 다시 caching 되어 캐시 서버에 저장되고, 이를 내가 빠르게 접근하면 정보 탈취가 가능한 것.&lt;/p&gt;
&lt;p data-ke-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;주로 robot.txt favicon.ico index.html 등 수정이 거의 없는 파일에서 캐싱 규칙을 찾아낼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CDN 기능이나, Cache-Control 헤더, 그리고 서버들 간의 정규화 통일을 통해 취약점을 방어할 수 있겠다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-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>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/164</guid>
      <comments>https://cloudnaaam.tistory.com/164#entry164comment</comments>
      <pubDate>Sat, 19 Jul 2025 15:56:08 +0900</pubDate>
    </item>
    <item>
      <title>pugjs  취약점</title>
      <link>https://cloudnaaam.tistory.com/161</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;워게임 풀다가 관련 개념이 나와서 간단히 &lt;span style=&quot;color: #444447; background-color: #ffffff; letter-spacing: 0px;&quot;&gt;정리해 보려 한다&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; letter-spacing: 0px;&quot;&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pug는 html을 더 효과적으로 보여주는 렌더링 엔진이다. pretty option을 통해 입력 값을 들여쓰기 해서 보여줄 수 있는데, 여기서 RCE가 발생할 수 있다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750916570981&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; visitMixin: function(mixin) { 
   var name = 'pug_mixins['; 
   var args = mixin.args || ''; 
   var block = mixin.block; 
   var attrs = mixin.attrs; 
   var attrsBlocks = this.attributeBlocks(mixin.attributeBlocks); 
   var pp = this.pp; 
   var dynamic = mixin.name[0] === '#'; 
   var key = mixin.name; 
   if (dynamic) this.dynamicMixins = true; 
   name += 
     (dynamic 
       ? mixin.name.substr(2, mixin.name.length - 3) 
       : '&quot;' + mixin.name + '&quot;') + ']'; 
  
   this.mixins[key] = this.mixins[key] || {used: false, instances: []}; 
   if (mixin.call) { 
     this.mixins[key].used = true; 
     if (pp) 
       this.buf.push( 
         &quot;pug_indent.push('&quot; + Array(this.indents + 1).join(pp) + &quot;');&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;내부 코드를 보면 pp에 pretty의 입력값을 넣게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마지막 부분을 보면 버퍼에 push 하는 부분이 있는데, 문법에 맞춰서&lt;/p&gt;
&lt;pre id=&quot;code_1750917271166&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;')console.log('hello');// 를 넣으면

 if (pp) 
   this.buf.push( 
     &quot;pug_indent.push('')console.log('hello');//');&quot; 
   );&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3.0.0 이후 버전부터는 조치되었다고 하니, 알아만 놓자.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/pugjs/pug/issues/3312&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/pugjs/pug/issues/3312&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.piolink.com/kr/service/Security-Analysis.php?bbsCode=security&amp;amp;vType=view&amp;amp;idx=67&amp;amp;page=4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.piolink.com/kr/service/Security-Analysis.php?bbsCode=security&amp;amp;vType=view&amp;amp;idx=67&amp;amp;page=4&lt;/a&gt;&lt;/p&gt;</description>
      <category>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/161</guid>
      <comments>https://cloudnaaam.tistory.com/161#entry161comment</comments>
      <pubDate>Thu, 26 Jun 2025 14:59:01 +0900</pubDate>
    </item>
    <item>
      <title>Unicode case mapping collision</title>
      <link>https://cloudnaaam.tistory.com/159</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;h3 data-ke-size=&quot;size23&quot;&gt;Unicode case mapping collision이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니코드가 lowercasing, uppercasing 할 때 서로 충돌하여 동일하게 처리되는 현상..이라고 하는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 이해하기 위해 예시를 들어보면&lt;/p&gt;
&lt;pre id=&quot;code_1750903636574&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;print('&amp;szlig;'.lower() == 'SS') // False
print('&amp;szlig;'.upper() == 'SS') // True
print(ord('S')) // 83&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;python으로 독일어 '&amp;szlig;' 를 대문자화하면 'SS' 와 같다고 인식하는 것을 볼 수 있다. 그리고 저기 있는 'S'는 10진수로 83, 즉 영문자 'S'이다.&lt;/p&gt;
&lt;pre id=&quot;code_1750904264114&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log('&amp;szlig;'.toLowerCase() == 'SS'); // false
console.log('&amp;szlig;'.toUpperCase() == 'SS'); // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript 또한 마찬가지이다. 듣기로는 다른 언어들도 매핑 충돌이 일어난다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750904368879&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;admin_id = 'admin' 
my_permission = False

if not my_permission and user_input == 'admin':
	print('no permission')

if user_input.upper() == 'ADMIN':
	print('login')&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;user_input 에 'ADMıN' 을 넣는다면 login이 출력되는 것을 확인 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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://dev.to/jagracey/hacking-github-s-auth-with-unicode-s-turkish-dotless-i-460n&quot;&gt;https://dev.to/jagracey/hacking-github-s-auth-with-unicode-s-turkish-dotless-i-460n&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750907180422&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;Hacking GitHub's Auth with Unicode's Turkish Dotless 'I'&quot; data-og-description=&quot;From combining emoji marks and astral planes, Unicode is under appreciated and poorly understood. The...&quot; data-og-host=&quot;dev.to&quot; data-og-source-url=&quot;https://dev.to/jagracey/hacking-github-s-auth-with-unicode-s-turkish-dotless-i-460n&quot; data-og-url=&quot;https://dev.to/jagracey/hacking-github-s-auth-with-unicode-s-turkish-dotless-i-460n&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bDrluw/hyZbt3dDlg/hBYomu7kg8v4xI7UizxMSK/img.jpg?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_500&quot;&gt;&lt;a href=&quot;https://dev.to/jagracey/hacking-github-s-auth-with-unicode-s-turkish-dotless-i-460n&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dev.to/jagracey/hacking-github-s-auth-with-unicode-s-turkish-dotless-i-460n&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bDrluw/hyZbt3dDlg/hBYomu7kg8v4xI7UizxMSK/img.jpg?width=1000&amp;amp;height=500&amp;amp;face=0_0_1000_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;Hacking GitHub's Auth with Unicode's Turkish Dotless 'I'&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;From combining emoji marks and astral planes, Unicode is under appreciated and poorly understood. The...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dev.to&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;cheatsheet 도 있으니 참고하면 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://gosecure.github.io/unicode-pentester-cheatsheet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://gosecure.github.io/unicode-pentester-cheatsheet/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750906192270&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;Characters that byͥte&quot; data-og-description=&quot;&quot; data-og-host=&quot;gosecure.github.io&quot; data-og-source-url=&quot;https://gosecure.github.io/unicode-pentester-cheatsheet/&quot; data-og-url=&quot;https://gosecure.github.io/unicode-pentester-cheatsheet/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://gosecure.github.io/unicode-pentester-cheatsheet/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://gosecure.github.io/unicode-pentester-cheatsheet/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Characters that byͥte&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;gosecure.github.io&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;</description>
      <category>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/159</guid>
      <comments>https://cloudnaaam.tistory.com/159#entry159comment</comments>
      <pubDate>Thu, 26 Jun 2025 12:07:08 +0900</pubDate>
    </item>
    <item>
      <title>Prototype Pollution</title>
      <link>https://cloudnaaam.tistory.com/158</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Prototype Pollution이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Javascript는 객체 지향 언어이다. python, java는 class 라는 개념으로 상속을 구현하지만, javascript는 prototype을 이용하여 상속을 구현한다. (물론 class도 사용하지만, 본질은 prototype이긴 함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 객체는 최상위 객체를 원형(prototype)으로 삼고 이를 참조하는 방식으로 상속과 비슷하게 구현되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쉽게 말해 어떤 객체의 프로퍼티를 찾을 때, 자바스크립트는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 해당 객체 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. __proto__로 연결된 부모 객체 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 계속 거슬러 올라가다가 마지막에 전역 객체인 Object.prototype까지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 없으면 undefined&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 계속 부모 객체로 거슬러 올라가면서 프로퍼티를 찾는다. 이 과정을 prototype chain이라고 부르고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prototype Pollution은 이러한 prototype을 공격자가 임의로 수정하여 원하는 동작을 유발시키는 공격 방식이다. XSS에서 심하면 RCE까지도 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750758461030&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;let a = {};

a['__proto__']['hello'] = 'bello';
console.log(a.hello); // 'bello'

let b = {};

console.log(b.hello); // 'bello'
console.log(b['__proto__']); // [Object: null prototype] { hello: 'bello' }
console.log(Object.prototype['hello']); // bello
console.log(Object.constructor.prototype['hello']); // bello
console.log(Object.__proto__['hello']); // bello&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 하나의 객체의 prototype을 수정하면 전역 객체인 Object까지 영향을 미치는 것을 확인할 수 있다.&lt;/p&gt;
&lt;p data-ke-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;portswigger에 예시 문제를 하나 뜯어보며 알아보자.&lt;/p&gt;
&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://portswigger.net/web-security/prototype-pollution/client-side/lab-prototype-pollution-dom-xss-via-client-side-prototype-pollution&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://portswigger.net/web-security/prototype-pollution/client-side/lab-prototype-pollution-dom-xss-via-client-side-prototype-pollution&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750819751460&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;Lab: DOM XSS via client-side prototype pollution | Web Security Academy&quot; data-og-description=&quot;This lab is vulnerable to DOM XSS via client-side prototype pollution. To solve the lab: Find a source that you can use to add arbitrary properties to the ...&quot; data-og-host=&quot;portswigger.net&quot; data-og-source-url=&quot;https://portswigger.net/web-security/prototype-pollution/client-side/lab-prototype-pollution-dom-xss-via-client-side-prototype-pollution&quot; data-og-url=&quot;https://portswigger.net/web-security/prototype-pollution/client-side/lab-prototype-pollution-dom-xss-via-client-side-prototype-pollution&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/byaPUU/hyZcb8QTIk/DCLoWRS9q6jOn1RN6VI6e1/img.png?width=1201&amp;amp;height=603&amp;amp;face=0_0_1201_603,https://scrap.kakaocdn.net/dn/c97re6/hyZclwSfr2/NDRIvqNUaIlupgunJbhLLK/img.png?width=1201&amp;amp;height=603&amp;amp;face=0_0_1201_603&quot;&gt;&lt;a href=&quot;https://portswigger.net/web-security/prototype-pollution/client-side/lab-prototype-pollution-dom-xss-via-client-side-prototype-pollution&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://portswigger.net/web-security/prototype-pollution/client-side/lab-prototype-pollution-dom-xss-via-client-side-prototype-pollution&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/byaPUU/hyZcb8QTIk/DCLoWRS9q6jOn1RN6VI6e1/img.png?width=1201&amp;amp;height=603&amp;amp;face=0_0_1201_603,https://scrap.kakaocdn.net/dn/c97re6/hyZclwSfr2/NDRIvqNUaIlupgunJbhLLK/img.png?width=1201&amp;amp;height=603&amp;amp;face=0_0_1201_603');&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;Lab: DOM XSS via client-side prototype pollution | Web Security Academy&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;This lab is vulnerable to DOM XSS via client-side prototype pollution. To solve the lab: Find a source that you can use to add arbitrary properties to the ...&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;portswigger.net&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;해당 문제는 prototype pollution을 연계하여 XSS 공격을 유발하게 되어 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;/resources/js/deparam.js&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;/resources/js/searchLogger.js&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;프론트엔드 코드를 뜯어보면 이 두 라이브러리를 가져와서 사용하는 것을 볼 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;deparam의 경우 파라미터의 병합을, &lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #1f1f1f; text-align: left;&quot;&gt;searchLogger에서는 스크립트의 동적 삽입을 담당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;특히 transport_url 라는 속성을 가져와 script.src에 넣어 동적 삽입하기 때문에 해당 속성을 오염 타겟으로 삼아&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1750819580733&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/?__proto__[transport_url]=data:,alert(1); 
// {__proto__ : &quot;data:,alert(1);&quot;} //&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #1f1f1f;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;이렇게 data: scheme을 사용하여 XSS를 유도할 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버 측의 경우..는 클라이언트 측보다 발생하기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애초에 블랙박스 방식으로는 거의 못찾을 것 같고, 찾는다고 해도 결국 시스템의 환경변수나 전역 객체를 건드려야 하기 때문에&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 자체가 다운될 수도 있으니까.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관련해서 자세한 글이 있으니 읽어보면 크게 도움될 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://portswigger.net/research/server-side-prototype-pollution&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://portswigger.net/research/server-side-prototype-pollution&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1750843914880&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;Server-side prototype pollution: Black-box detection without the DoS&quot; data-og-description=&quot;Server-side prototype pollution is hard to detect black-box without causing a DoS. In this post, we introduce a range of safe detection techniques, which we've also implemented in an open source Burp&quot; data-og-host=&quot;portswigger.net&quot; data-og-source-url=&quot;https://portswigger.net/research/server-side-prototype-pollution&quot; data-og-url=&quot;https://portswigger.net/research/server-side-prototype-pollution&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cjXlwc/hyZbt9NWYm/GCvkqM5ioISlMjcGsP1iVK/img.png?width=506&amp;amp;height=254&amp;amp;face=0_0_506_254,https://scrap.kakaocdn.net/dn/cM5qOh/hyZcjTr8El/jsIeBKA6vonKKwLC1oGhFk/img.png?width=506&amp;amp;height=254&amp;amp;face=0_0_506_254,https://scrap.kakaocdn.net/dn/bSBT6X/hyZck5UJtn/yEKI7tJQFmQVsi42Vuz33k/img.png?width=1200&amp;amp;height=584&amp;amp;face=0_0_1200_584&quot;&gt;&lt;a href=&quot;https://portswigger.net/research/server-side-prototype-pollution&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://portswigger.net/research/server-side-prototype-pollution&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cjXlwc/hyZbt9NWYm/GCvkqM5ioISlMjcGsP1iVK/img.png?width=506&amp;amp;height=254&amp;amp;face=0_0_506_254,https://scrap.kakaocdn.net/dn/cM5qOh/hyZcjTr8El/jsIeBKA6vonKKwLC1oGhFk/img.png?width=506&amp;amp;height=254&amp;amp;face=0_0_506_254,https://scrap.kakaocdn.net/dn/bSBT6X/hyZck5UJtn/yEKI7tJQFmQVsi42Vuz33k/img.png?width=1200&amp;amp;height=584&amp;amp;face=0_0_1200_584');&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;Server-side prototype pollution: Black-box detection without the DoS&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Server-side prototype pollution is hard to detect black-box without causing a DoS. In this post, we introduce a range of safe detection techniques, which we've also implemented in an open source Burp&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;portswigger.net&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;&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;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.hahwul.com/cullinan/attack/prototype-pollution/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.hahwul.com/cullinan/attack/prototype-pollution/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.igloo.co.kr/security-information/prototype-pollution-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B3%B5%EA%B2%A9%EC%82%AC%EB%A1%80-%EB%B6%84%EC%84%9D-%EB%B0%8F-%EB%8C%80%EC%9D%91%EB%B0%A9%EC%95%88/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.igloo.co.kr/security-information/prototype-pollution-&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.igloo.co.kr/security-information/prototype-pollution-%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B3%B5%EA%B2%A9%EC%82%AC%EB%A1%80-%EB%B6%84%EC%84%9D-%EB%B0%8F-%EB%8C%80%EC%9D%91%EB%B0%A9%EC%95%88/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;%EC%B7%A8%EC%95%BD%EC%A0%90%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EA%B3%B5%EA%B2%A9%EC%82%AC%EB%A1%80-%EB%B6%84%EC%84%9D-%EB%B0%8F-%EB%8C%80%EC%9D%91%EB%B0%A9%EC%95%88/&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://portswigger.net/web-security/prototype-pollution&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://portswigger.net/web-security/prototype-pollution&lt;/a&gt;&lt;/p&gt;</description>
      <category>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/158</guid>
      <comments>https://cloudnaaam.tistory.com/158#entry158comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:38:46 +0900</pubDate>
    </item>
    <item>
      <title>CSP</title>
      <link>https://cloudnaaam.tistory.com/157</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;- 이 글은 아직 현업을 경험하지 못한 보안 공부생의 정리 글이니, 정확하지 않을 수도 있습니다.-&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CTF 풀 때 CSP를 포함한 문제가 나왔었다.&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;h4 data-ke-size=&quot;size20&quot;&gt;CSP란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Contents Security Policy. 콘텐츠 보안 정책이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주요 목표는 XSS 공격을 완화하고 보고하는 것이다. 브라우저는 콘텐츠의 출처를 신뢰하기 때문에 공격자가 주입한 악성 스크립트를 실행한다. 때문에 XSS 공격이 발생하는 것이고.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 CSP를 통해서 신뢰할 수 있는 출처나 소스를 지정하면 XSS 공격을 완화할 수 있게 되는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 방법은 두 가지가 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP 헤더&lt;/p&gt;
&lt;pre id=&quot;code_1750668226543&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Content-Security-Policy: default-src 'self'; script-src 'self' https://apis.google.com; style-src 'self' https://fonts.googleapis.com; img-src 'self' data: https://*.example.com;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTML Meta 태그&lt;/p&gt;
&lt;pre id=&quot;code_1750668383502&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;Content-Security-Policy&quot; content=&quot;default-src 'self' 'unsafe-eval' 'unsafe-inline' https:; img-src 'self' data: blob: https:; font-src 'self' data: https:;&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 HTTP 헤더에 넣거나 Meta 태그에 포함시켜서 CSP를 적용시킬 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 다양한 지시어가 존재하는데,&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 90.6961%; height: 204px; background-color: #e0e0e0;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;default-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;기본적으로 허용되는 리소스 출처를 지정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;script-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;&lt;span&gt;스크립트의 출처를 지정한다.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;style-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;스타일 시트의 출처를 지정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;img-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;이미지의 출처를 지정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;media-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;&lt;span&gt;오디오, 비디오와 같은 미디어 파일의 출처를 지정한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;connect-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;fetch, XMLHttpRequest, Navigator.sendBeacon, WebSocket 등의 HTTP 연결 요청의 출처를 제한한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;frame-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;&lt;span&gt;iframe의 출처를 지정한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;object-src&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;object의 출처를 지정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;report-uri&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;C&lt;span&gt;SP 위반이 발생했을 경우 보고할 URL를 지정한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;plugin-types&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;허용할 플러그인의 MIME 타입을 지정한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.3953%; height: 17px;&quot;&gt;reflected-xss&lt;/td&gt;
&lt;td style=&quot;width: 71.302%; height: 17px;&quot;&gt;&lt;span&gt;Reflected XSS 공격을 방지하기 위한 정책 지정.&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 매치되는 값들은&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 91.1618%; height: 119px; background-color: #e0e0e0;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;self&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;&lt;span&gt;현재 페이지의 도메인만 허용한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;none&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;&lt;span&gt;모든 리소스나 스타일을 차단한다.&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;unsafe-inline&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;인라인 스타일이나 스크립트를 허용한다. -- 취약할 수 있음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;unsafe-eval&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;&lt;span&gt;eval() 함수를 사용하여 실행되는 스크립트를 허용한다. -- 취약함&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;nonce-&amp;lt;value&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;nonce 값을 사용하는 스크립트 허용.&amp;nbsp; 보통 nonce값은 예측 불가능하고 계속 바뀌게 설계한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;hash-&amp;lt;value&amp;gt;&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;hash 값을 사용하는 스크립트 허용. 보통 sha-256 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 20%; height: 17px;&quot;&gt;strict-dynamic&lt;/td&gt;
&lt;td style=&quot;width: 71.1628%; height: 17px;&quot;&gt;신뢰된 스크립트가 로드하는 스크립트도 허용. 단, nonce나 hash를 사용할 때만 사용 가능.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용 예시를 들어보면&lt;/p&gt;
&lt;pre id=&quot;code_1750671223977&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Content-Security-Policy: script-src 'nonce-랜덤값' 'strict-dynamic'; object-src 'none'; base-uri 'none';&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;gt; &amp;lt;script nonce='nonce 값'&amp;gt; 이런 식으로 설정된 스크립트와 이 놈이 불러오는 스크립트만 허용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 작동하는 것.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Bypass 하는 방법은 여러 가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;와일드 카드를 잘못 썼을 경우, 그러니까&lt;/p&gt;
&lt;pre id=&quot;code_1750671385989&quot; class=&quot;bash&quot; style=&quot;background-color: #ffffff; color: #353638; text-align: left;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;Content-Security-Policy: script-src 'self' http://safesite data: http://*&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;&amp;lt;script src=&quot;data:text/javascript;base64,...&quot;&amp;gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 페이로드 짜면 바로 실행된다. 신뢰 리소스가 http:// 포함한 모든 도메인으로 설정되어 있기 때문에..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;혹은 nonce값을 충분히 랜덤한 값으로 설정하지 않는 경우 등이 있는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 MaltaCTF 롸업 보니까 특이한 케이스도 있더라.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1750728816887&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'Content-Security-Policy', &quot;script-src 'sha256-1ltlTOtatSNq5nY+DSYtbldahmQSfsXkeBYmBH5i9dQ=' 'strict-dynamic'; object-src 'none'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CSP는 이렇게 되어 있어서, 초기 신뢰 스크립트 중 스크립트 내용을 해시화한 값이 명시한 값과 같은 스크립트 및 해당 스크립트가 로드한 스크립트 까지만 실행이 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 초기 신뢰 스크립트 중 pace.js를 가져오는 스크립트가 존재했는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pace.js는 웹 페이지의 로딩 상황을 렌더링해주는 라이브러리인데, 내부에 객체 병합 코드가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;defaultOptions&amp;nbsp;&lt;/span&gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;window.paceOptions&lt;/span&gt; &lt;span style=&quot;background-color: #dddddd;&quot;&gt;data-pace-options&lt;/span&gt; 이 DOM 내부 요소를 병합하는 과정에서 prototype pollution을 통해 취약점이 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 초기에 로드하는 라이브러리 내부의 취약점을 통해서도 CSP를 bypass 할 수도 있다는 것도 알아두면 좋을 것 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reference&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://velog.io/@gth1123/meta%ED%83%9C%EA%B7%B8-Content-Security-Policy&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://velog.io/@gth1123/meta%ED%83%9C%EA%B7%B8-Content-Security-Policy&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://hg2lee.tistory.com/entry/Content-Security-PolicyCSP-Bypass#JSONP%20Callback-1-12&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://hg2lee.tistory.com/entry/Content-Security-PolicyCSP-Bypass#JSONP%20Callback-1-12&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/CSP&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP/Guides/CSP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://github.com/CodeByZach/pace/issues/546&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/CodeByZach/pace/issues/546&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Study</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/157</guid>
      <comments>https://cloudnaaam.tistory.com/157#entry157comment</comments>
      <pubDate>Tue, 24 Jun 2025 11:18:25 +0900</pubDate>
    </item>
    <item>
      <title>Webhacking.kr old-42</title>
      <link>https://cloudnaaam.tistory.com/150</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;415&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eamRIJ/btsOgNSkVFd/SrsvZQUYSuQYZa7wR9Jys0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eamRIJ/btsOgNSkVFd/SrsvZQUYSuQYZa7wR9Jys0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eamRIJ/btsOgNSkVFd/SrsvZQUYSuQYZa7wR9Jys0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeamRIJ%2FbtsOgNSkVFd%2FSrsvZQUYSuQYZa7wR9Jys0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;415&quot; height=&quot;114&quot; data-origin-width=&quot;415&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;&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba7acm/btsOhhk46Lx/YYTgyqGw4X6hOrbyZQCkBk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba7acm/btsOhhk46Lx/YYTgyqGw4X6hOrbyZQCkBk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba7acm/btsOhhk46Lx/YYTgyqGw4X6hOrbyZQCkBk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba7acm%2FbtsOhhk46Lx%2FYYTgyqGw4X6hOrbyZQCkBk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;86&quot; data-origin-width=&quot;393&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;text.txt 다운로드 링크가 있는데, 저 파라미터를 base64 디코딩하면 text.txt가 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 flag.docx를 base64인코딩 한 후 ?down= 를 통해 들어가주자.&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;blob&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;72&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qbKgG/btsOhUpsICM/KktIQSwHG81e84fWTDYtrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qbKgG/btsOhUpsICM/KktIQSwHG81e84fWTDYtrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qbKgG/btsOhUpsICM/KktIQSwHG81e84fWTDYtrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqbKgG%2FbtsOhUpsICM%2FKktIQSwHG81e84fWTDYtrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;341&quot; height=&quot;72&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;341&quot; data-origin-height=&quot;72&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀었다!&lt;/p&gt;</description>
      <category>Web/webhacking.kr</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/150</guid>
      <comments>https://cloudnaaam.tistory.com/150#entry150comment</comments>
      <pubDate>Wed, 28 May 2025 17:58:51 +0900</pubDate>
    </item>
    <item>
      <title>Webhacking.kr g00gle1</title>
      <link>https://cloudnaaam.tistory.com/149</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO9j6w/btsOdieTMn2/C3kgLGbosAWP8t3Wj2dlS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO9j6w/btsOdieTMn2/C3kgLGbosAWP8t3Wj2dlS1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO9j6w/btsOdieTMn2/C3kgLGbosAWP8t3Wj2dlS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO9j6w%2FbtsOdieTMn2%2FC3kgLGbosAWP8t3Wj2dlS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;764&quot; height=&quot;309&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구글 폼이 나온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 둘 중 하나를 누르고 제출하면 0개만 선택하라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 처음에는 개발자도구에서 js부분 건드려서 바꾸는 줄 알았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 개발자도구 뜯어보다가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;121&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkuvjs/btsOfzFUzqQ/UsWRfqIGCoZEMHNtSee0S1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkuvjs/btsOfzFUzqQ/UsWRfqIGCoZEMHNtSee0S1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkuvjs/btsOfzFUzqQ/UsWRfqIGCoZEMHNtSee0S1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkuvjs%2FbtsOfzFUzqQ%2FUsWRfqIGCoZEMHNtSee0S1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;121&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;121&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설마 했는데 이왜진?&lt;/p&gt;</description>
      <category>Web/webhacking.kr</category>
      <author>cloudnaaam</author>
      <guid isPermaLink="true">https://cloudnaaam.tistory.com/149</guid>
      <comments>https://cloudnaaam.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 27 May 2025 16:53:18 +0900</pubDate>
    </item>
  </channel>
</rss>