9์ 2์ฃผ์ฐจ ํดํน ์๋ ค์ค๊ฒ : Path Traversal ํดํน ์๋ ค์ค๊ฒ 6ํ: Path Traversal ๋๊ตฐ๊ฐ๊ฐ ์ฐ๋ฆฌ ์ง์ ๋ง์๋๋ก ๋์๋ค๋ ์ ์๋ค๋ฉด ์ด๋จ๊น์? ๋ง๊ตฌ ํค์ง์ด๋์ ์๋ง์ด ๋ ์๋ ์๊ณ , ๊ท์คํ์ด ์์ด์ง ์๋ ์๊ณ ์ ๋ง ์ด์ด ๋์๋ฉด ํญํ์ ๋๊ณ ๊ฐ์ง๋ ๋ชจ๋ฅด๋ ์ผ์ด์ฃ ๐ข
์ด๋ฒ ์ฃผ์ ์์๋ณผ ์ทจ์ฝ์ ์ ๋ฐ๋ก Logical Bug์ธ Path Traversal๋ก, Directory Traversal์ด๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์น ์ทจ์ฝ์ ์ด์์! ์ฐ๋ฆฌ ์น ์ทจ์ฝ์ ์ ์ฒ์์ด๋ค์ ๐ Path Traversal ์ด์ ์.. Logical Bug๋ ๋ญ๋ฐ์? ๐ Stack Buffer Overflow๋ฅผ ๊ณต๋ถํ ๋ ํ ๋น๋ ํฌ๊ธฐ์ ๋ฒํผ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์
๋ ฅํด ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ์์ญ์ ์นจ๋ฒํด ์ค์ผ์ํฌ ์ ์๋ ๊ฒ์ ๊ธฐ์ตํ์๋์? ๐ฅบ
์ด์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค์ผ์ํค๋ ์ทจ์ฝ์ ์ข
๋ฅ๋ฅผ Memory Corruption ์ทจ์ฝ์ ์ด๋ผ๊ณ ํด์.
๋ฐ๋ฉด์ Logical Bug๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ์ ์์ด ํ๋ก๊ทธ๋จ์ ๋
ผ๋ฆฌ์ ์ธ ํ๋ฆ์ ๋ํ ์ค๋ฅ๋ฅผ ์ด์ฉํฉ๋๋ค. ๊ฐ๋จํ ์์๋ก ์ดํด๋ณผ๊ฒ์. Logical_bug .c ์ฝ๋๋ ์ฌ์ฉํ ์ฟ ํฐ์ ๊ฐ์๋ฅผ ์
๋ ฅํด ๊ฒฐ์ ๊ธ์ก์ discount() ํจ์๋ฅผ ํตํด ์
๋ ฅํ ์ฟ ํฐ ์๋งํผ 10,000์์ฉ ํ ์ธํ ๊ธ์ก์ ์ถ๋ ฅํ๊ณ ์๋ค์. ๊ฒฐ์ ๊ธ์ก์ 50,000์์ด๊ณ , ์ฟ ํฐ์ 3์ฅ์ ๊ฐ์ง๊ณ ์์ด์.์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์๊น์? ๐ค
๊ฐ์ฅ ํฐ ๋ฌธ์ ์ ์ ํ์ฌ 3์ฅ์ ์ฟ ํฐ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ '๋ ์ฟ ํฐ 10์ฅ ์ธ๋!!' ๋ผ๊ณ ํ๋ฉด ๋ง์ ์๊ฐ ์๋ ๊ฑฐ์์.๐ฑ
coupon_to_use ์ 10์ ์
๋ ฅํ๋ฉด ๊ฒฐ๊ณผ์ ์ผ๋ก ์ต์ข
๊ฒฐ์ ๊ธ์ก์ด ์คํ๋ ค -50000๊ฐ ๋๋ค์.Logical Bug๊ฐ ๋ญ์ง ๊ฐ์ ์ก์ผ์
จ๋์? ๐ ํ์ผ์ ๊ฒฝ๋ก๋ ์ด๋ป๊ฒ ๋ํ๋ผ ์ ์๋์?
Path Traversal์ ๋ํด ์์ธํ ์ค๋ช
ํ๊ธฐ ์ ์ ์ฌ๊ธฐ์ ๋งํ๋ Path์ธ ๊ฒฝ๋ก์ ๋ํด์ ์ ๊น ์๊ธฐํด์! ํ์ผ์ ๊ฒฝ๋ก๋ ์ ๋๊ฒฝ๋ก์ ์๋๊ฒฝ๋ก๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
์ ๋๊ฒฝ๋ก๋ ๋ง ๊ทธ๋๋ก ์ ๋์ ์ธ ์์น!! ํ์ผ์ ๊ณ ์ ํ ๊ฒฝ๋ก์ด๋ฉฐ, ์ต์์ ๋๋ ํ ๋ฆฌ์์๋ถํฐ ํด๋น ํ์ผ๊น์ง ๊ฑฐ์น ๊ฒฝ๋ก๋ฅผ ๋ชจ๋ ํ๊ธฐํ๋ ๋ฐฉ์์ด์์.
C:\\Program Files (x86)\\Kakao\\KakaoTalk ์ฒ๋ผ ์ ๋๊ฒฝ๋ก๋ฅผ ๋ํ๋ผ ์ ์๋ต๋๋ค.์๋๊ฒฝ๋ก๋ ํ์ฌ ์์นํ ๊ณณ์ ๊ธฐ์ค์ผ๋ก ์ํ๋ ํ์ผ์ ์์น๋ฅผ ๋ํ๋ธ ๊ฑฐ์์. ํ์ฌ
C:\\Program Files (x86)\\Microsoft\\Edge ์ ์๋ค๋ฉด KakaoTalk ํ์ผ๊น์ง์ ๊ฒฝ๋ก๋ ํ์ฌ ์์น์ ์๋จ ํด๋๋ฅผ ์๋ฏธํ๋ ../ ๋ฅผ ์ฌ์ฉํด์ ../../Kakao/kakaoTalk ์ผ๋ก ๋ํ๋ผ ์ ์๊ฒ ๋ค์! ์ฐธ๊ณ ๋ก ์ต์์ ๋๋ ํ ๋ฆฌ๋ / , ํ์ฌ ๋๋ ํ ๋ฆฌ๋ ./ ๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.์ค์ํ์์ ์์๋ฅผ ๋ค์ด๋ณผ๊ฒ์. ๐ ์ฐ๋ฆฌ๊ฐ ๋กฏ๋ฐ์๋์ ์์น๋ฅผ ๋งํ ๋ "๋กฏ๋ฐ์๋๋ ๋ํ๋ฏผ๊ตญ ์์ธ์ ์กํ๊ตฌ ์ ์ค๋ ์ฌ๋ฆผํฝ๋ก 240์ ์์ด!"๋ผ๊ณ ๋งํ ๊ฒ์ด ์ ๋๊ฒฝ๋ก, "๋กฏ๋ฐ์๋๋ ์ฌ๊ธฐ์ 2ํธ์ ํ๊ณ ์ ์ค์ญ์ ๋ด๋ ค์ 4๋ฒ ์ถ๊ตฌ๋ก ๋๊ฐ๋ฉด ์์ด"๋ผ๊ณ ๋งํ ๊ฒ์ด ์๋๊ฒฝ๋ก์
๋๋ค.
์ด์ Path๊ฐ ๋ฌด์์ธ์ง ์์์ผ๋ ๋ณธ๊ฒฉ์ ์ผ๋ก Path Traversal์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค! ๊ทธ๋ผ ์ด์ Path Traversal ์ค๋ช
ํด์ฃผ์ธ์!
๋๋์ด ์ทจ์ฝ์ ์ ์ค๋ช
ํ ์ฐจ๋ก๋ค์!
Path Traversal ์ทจ์ฝ์ ์ ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์กฐ์ํ์ฌ, ์์ฉ ํ๋ก๊ทธ๋จ์ ์๋ฒ ๋ด์ ์์์ ํ์ผ์ ์ฝ๊ณ , ์ธ ์ ์๋ arbitary file read, arbitary file write๊ฐ ๋ฐ์ํ ์ ์์ด์. ์ฌ์ง์ด๋ ๋ฐ์ดํฐ ๋๋ ๋์์ ์์ ํ๊ณ ์๋ฒ๋ฅผ ์์ ํ ์ ์ด ํ ์ ์๋ต๋๋ค. ๐ฑ ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์น ์ฌ์ดํธ๋ฅผ ์๊ฐํด๋ณผ๊น์?
์ด๋ฏธ์ง๋
<img src = "/loadImage?filename=hackyboiz.png"> ๊ฐ์ html ์ฝ๋๋ก ์ฌ๋ผ๊ฐ ๊ฑฐ์์. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง ์์ฒด๋ /var/www/images ์ ์ ์ฅ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์์ฒญ๋ ํ์ผ ์ด๋ฆ์ ๋ค์ ์ถ๊ฐํ /var/www/images/hackyboiz.png ์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ ๋ณผ ์ ์์ด์.๋ง์ฝ https://pathtraversal.com/loadImage?filename=../../../etc/passwd ๋ผ๊ณ ์์ฒญ์ ํ๋ฉด /var/www/images/../../../etc/passwd ์ ์ฝ์๊ฑฐ์์. ์ฌ๊ธฐ์ ../ ๋ ํ์ฌ ์์น์ ์๋จ ํด๋๋ฅผ ์๋ฏธํ๋ฏ๋ก ๊ฒฐ๊ตญ /var/www/images/../../../ ๋ก ๋ฃจํธ ๋๋ ํ ๋ฆฌ๊น์ง ์ฌ๋ผ๊ฐ๊ณ /etc/passwd ๋ฅผ ์ฝ์ด๋ฒ๋ฆฌ๋ ๊ฑฐ์ฃ . ๐ฑ์ ๋ง๋ก passwdํ์ผ๊น์ง ์ฝ์ ์ ์์๊น์?? ์ง์ง๋ก?
๋ฏฟ๊ธฐ ํ๋ค๊น ๋ด ์๋
์ ์ ๋ณด๋ GitLab Path Traversal ์ทจ์ฝ์ (CVE-2020-10977)์ ๊ฐ๋จํ ์๊ฐํด์ค๊ฒ์. ๐
GitLab์์ ์ด์๋ฅผ ์์ฑํ ๋๋ ๋งํฌ๋ค์ด์ ์ด์ฉํด์  ํ์์ผ๋ก ํ์ผ์ ๋ํ ๋งํฌ๋ฅผ ์ฝ์
ํ ์ ์์ด์. ํ์ง๋ง ํ์ผ ์ด๋ฆ์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ง ์์ ์ด์๋ฅผ ์ ํ๋ก์ ํธ๋ก ์ด๋ํ ๋ ๋๋ ํ ๋ฆฌ ํ์์ ํตํด ์์์ ํ์ผ์ ๋ณต์ฌ ํ ์ ์๋ ์ทจ์ฝ์ ์ด ๋ฐ๊ฒฌ๋์๋ต๋๋ค.์ด๊ฒ ๋ฌธ์ ์ ์ฝ๋์๋๋ฐ์, ๋ค ์ดํด ๋ชป ํด๋ ๊ด์ฐฎ์์!๐๐ป
find_file() ํจ์์์ ๋ฌด์จ ํ์ผ์ ์ฐพ๋์ง์ ๋ํ ์ ํ๊ณผ ํํฐ๋ง์ด ์์ผ๋ฏ๋ก Path Traversal์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ํ์ผ์ ๋ณต์ฌ ํ ์ ์์๋ค๋ ๊ฒ๋ง ์ดํดํ๋ฉด ๋ฉ๋๋ค.ํด๋น ์ทจ์ฝ์ ์ ์ ๋ณด์๋
 ๋ก ์ด์๋ฅผ ๋ง๋ค์ด passwd ํ์ผ์ ๋ค์ด๋ก๋ํ๋๋ฐ ์ฑ๊ณตํ๋ต๋๋ค.๊ฐ๋จํด ๋ณด์ด๋์? ๐คจ ํ์ง๋ง ์ด ์ ๋ณด๋ $20,000์ด๋ ๋ฐ์๋ต๋๋ค. ๐ธ ๐ธ ๊ณต๊ฒฉ์ ๋์์์ผ๋ก ์ง์ ๋ณด๊ณ ์ถ์ผ๋ฉด ์์์ ์ฐธ๊ณ ํด์ฃผ์ธ์! ์ด ์ทจ์ฝ์ ์ผ๋ก GitLab์ ๋ค์๊ณผ ๊ฐ์ด GitLab::Utils.check_path_traversal ์ผ๋ก ๊ฒ์ฌํ๋ ๊ณผ์ ์ ์ถ๊ฐํจ์ผ๋ก์จ ํจ์นํ์ต๋๋ค. ์ด๋ป๊ฒ Path Traversal์ ๊ฒ์ฌํด์ผ ํ ๊น์?
์ญ์ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฌ์ฉ์์ ์
๋ ฅ์ด ํ์ผ ์์คํ
API๋ก ์ ์ก๋์ง ์๊ฒ ํ๋ ๊ฑฐ์ฃ . ํ์ง๋ง ๊ผญ ์ ์ก๋์ผ ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
๊ฐ๋จํ
../ ๋ฅผ ํํฐ๋งํ๊ฑฐ๋ .png , .txt ๋ฑ ํ์ฅ์๊ฐ ๊ผญ ๋ถ์ด์ผ ๋๋ค๋ ์กฐ๊ฑด์ผ๋ก Path Traversal์ ํผํ ์ ์์๊น์?์์ฝ๊ฒ๋
../ ๋ ์ฌ๋ฌ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํด ํํฐ๋ง์ ์ฐํํ ์ ์์ต๋๋ค. ..%252f , ..%c0%af ์์ผ๋ก์.
๊ทธ๋ฆฌ๊ณ .png๊ฐ ๊ผญ ๋ถ์ด์ผ ํ๋ค๋ฉด filename=../../../etc/passwd%00.png ์ฒ๋ผ Null byte์ธ %00 ์ ํฌํจํ ์ ์๊ฒ ๋ค์.๊ทธ๋ผ ์ด๋ ๊ฒ Path Traversal์ ๋ง์๋ด์!
์ฒซ ๋ฒ์งธ๋ก ์ฌ์ฉ์์ ์
๋ ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๊ผญ ๊ฒ์ฆ์ ํด์ผ ํฉ๋๋ค. ํ์ฉ๋ ๊ฐ๋ง ๋ฐ๋ ํ์ดํธ๋ฆฌ์คํธ์ ๋น๊ตํ๋ฉด ์ข๊ณ , ์๋๋ผ๋ฉด ์๋ฌธ์์ ์ซ์๋ง ํ์ฉํด์.
๋ ๋ฒ์งธ๋ ์ ๊ณต๋ ์
๋ ฅ์ ๊ฒ์ฆํ ๋ค, ์
๋ ฅ์ ๊ธฐ๋ณธ ๋๋ ํ ๋ฆฌ์ ์ถ๊ฐํ๊ณ ํ์ผ ์์คํ
์ API๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก๋ฅผ ์ ๊ทํํด์ผ ํฉ๋๋ค. ์ด๋ฒ ์ฃผ์ ํดํน ๊ฐ๋ฅด์ณ์ค๊ฒ๋ ์ฌ๊ธฐ๊น์ง! ๐ ์ค๋ ์ ํด๋๋ฆฐ ๋ด์ฉ์ด ๋ง์์ ๋์
จ๋์? ์ฃผ์ ์น๊ตฌ๋ค์๊ฒ ๋ด์ค๋ ํฐ๋ฅผ ์ถ์ฒํด์ฃผ์ธ์! ๋ค์์ฃผ์๋ ์์ฐฌ ๋ด์ฉ์ผ๋ก ๋์์ค๊ฒ ์ต๋๋ค. ๐ ํน์ ๋ง์์ ์๋๋ ๋ถ๋ถ์ด ์์๋์? ์ฌ๊ธฐ์์ ํผ๋๋ฐฑ์ ์ ๋ฌํด์ฃผ์ธ์! ์ฌ๋ฌ๋ถ์ ์๊ฒฌ๋ค์ ์ ๊ทน ๋ฐ์ํด์ ๋์ฑ ์ ์ตํ ๋ด์ค๋ ํฐ๋ฅผ ๋ง๋ค์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค. ๐ Hackyboiz |