Path Traversal : self-test [1]

DATE : 2023/10/25

Path Traversal [1]์—์„œ ์‚ดํŽด๋ณธ Lab๊ณผ ์œ ์‚ฌํ•œ ํ™˜๊ฒฝ์„ ์ง์ ‘ ๋งŒ๋“ค์–ด๋ณด๊ณ 

path traversal sequence๊ฐ€ ๊ณผ์—ฐ ์œ ํšจํ•  ๊ฒƒ์ธ์ง€..! ์ง์ ‘ ํ™•์ธํ•ด๋ณด์ž.

Lab๊ณผ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณผ ํ™˜๊ฒฝ์€ image choice form์ด๋‹ค.

images directory์— ์ด 4๊ฐœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ƒํƒœ์—์„œ

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๊ฐ„๋‹จํ•œ form์„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ ํ•œ๋‹ค.

( ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฏธ์ง€๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์€ ์ƒํƒœ์ผ ๋•Œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ 1.jpg๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค. )

[ images.php ]

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Image</title>
</head>
<body>
    <h2>Enter filename to check a image</h2>
    <form action="" method="GET">
        <input type="text" name="filename" placeholder="ex) 1.jpg" >
        <input type="submit" value="CHOICE" name="submit">
    </form>
</body>
</html>

<?php
if(array_key_exists('submit', $_GET)) {
    $filename = $_GET['filename'];
    echo "<br><img src='./images/$filename' alt='$filename' width='600' height='400'>";


} else {
    echo "<br><img src='./images/1.jpg' alt='1.jpg' width='600' height='400'>";
}
?>

image choice form์„ ์ œ๊ณตํ•  ์ฝ”๋“œ๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

html์—์„œ๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ์ด๋ฏธ์ง€ ์ด๋ฆ„์„ ๋ฐ›์„ <input> & ์ œ์ถœ ๋ฒ„ํŠผ ์—ญํ• ์˜ <input> tag๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋‹ค.

PHP์—์„œ๋Š” KEY 'submit'์ด ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜ GET์— ์กด์žฌํ•˜๋Š” ์ง€ ํ™•์ธํ•œ๋‹ค.

(<form> tag์—์„œ method ์†์„ฑ์„ get์„ ์ง€์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—)

์ด๋•Œ KEY 'submit'์ด ์กด์žฌํ•œ๋‹ค๋Š” ๊ฑด, ์‚ฌ์šฉ์ž๊ฐ€ CHOICE ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๋ฒ„ํŠผ์ด ๋ˆŒ๋ ธ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ด๋ฆ„์„ $filename์— ํ• ๋‹นํ•˜๊ณ 

๋ฒ„ํŠผ์ด ๋ˆŒ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ images directory์— ๋“ค์–ด์žˆ๋Š” 1.jpg๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.


(+) <img> tag๋Š” html์—์„œ image๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์šฉ๋„์˜ ํƒœ๊ทธ๋กœ

src ์†์„ฑ์€ ์ถœ๋ ฅํ•  ์ด๋ฏธ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ,

alt ์†์„ฑ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด ์ด๋ฏธ์ง€๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ ๋Œ€์ฒดํ•  ๋ฌธ๊ตฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.


๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ CHOICE ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €๊ณ  ์ž…๋ ฅํ•œ ํŒŒ์ผ ์ด๋ฆ„์ด "2.jpg"๋ผ๋ฉด

USER's INPUT = 2.jpg          ->          $filename = '2.jpg'

<img src='./images/$filename'>        ->        <img src='./images/2.jpg'>

์œ„์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ <img> tag์— 2.jpg๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ ํ™•์ธํ•ด๋ณด์ž!!

[ image choice form result ]

images.php์˜ ํ™”๋ฉด์€ ์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” 1.jpg ์‚ฌ์ง„๋„ ์ž˜ ๋‚˜์˜ค๊ณ  ์žˆ๊ณ ,

filename์„ ์ž…๋ ฅํ•˜๋ผ๋Š” ๋ฌธ๊ตฌ์™€ ํ•จ๊ป˜ <input> tag๊ฐ€ ์ œ๊ณต๋˜๊ณ  ์žˆ๋‹ค.

์ด๋ฒˆ์—” ์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ๋ณ€๊ฒฝ๋˜๋Š” ์ง€ ํ™•์ธํ•ด๋ณด์ž.

<input>์— 2.jpg๋ฅผ ์ž…๋ ฅํ•˜๊ณ  choice ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด

์„ฑ๊ณต์ ์œผ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ”๋€ ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค!!

images directory๋กœ ๊ฐ€์„œ ํ™•์ธํ•ด๋ณด๋ฉด ์ด ์ด๋ฏธ์ง€๊ฐ€

์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ 2.jpg์™€ ๋™์ผํ•œ ์‚ฌ์ง„์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ๋Š” ์ด๋ฒˆ POST์˜ ๋ชฉ์ ๋Œ€๋กœ path traversal sequence๋ฅผ ์‚ฌ์šฉํ•ด secret.txt ๋‚ด์šฉ์„ ์ฝ์–ด๋ณผ ๊ฒƒ์ด๋‹ค.

๊ทธ ์ „์— ๋ฏธ๋ฆฌ hanhxx directory์— secret.txt๋ฅผ ๋งŒ๋“ค์–ด๋‘์ž.

secret.txt ๋‚ด์šฉ์€ ์œ„์™€ ๊ฐ™๋‹ค.

๋‹ค์‹œ form์œผ๋กœ ๋Œ์•„์™€์„œ! secret.txt ๋‚ด์šฉ์„ ์ฝ๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด

์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ๋กœ๋Š” code์—์„œ ๋ณธ ๋ฐ”์™€ ๊ฐ™์ด images directory์ด๋‹ค.

secret.txt๊ฐ€ ๋“ค์–ด์žˆ๋Š” hanhxx directory๋กœ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„  images directory์—์„œ ํ•œ ๋ฒˆ

์ƒ์œ„ ๊ณ„์ธต directory๋กœ ๋น ์ ธ๋‚˜์™€์•ผ ํ•œ๋‹ค.

USER's INPUT = ../hanhxx/secret.txt

ํ˜„์žฌ directory์—์„œ ํ•œ ๋ฒˆ ๋น ์ ธ๋‚˜์˜จ ๋’ค, hanhxx directory๋กœ ๋“ค์–ด๊ฐ€ secret.txt๋ฅผ ์ฝ๋„๋ก ๊ฐ’์„ ๋„ฃ์œผ๋ฉด

ํ™”๋ฉด์—๋Š” ์ž…๋ ฅํ•œ ๊ฒฝ๋กœ์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฏธ์ง€๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— alt ๊ฐ’์ด ์ถœ๋ ฅ ๋˜์ง€๋งŒ

response ๋‚ด์šฉ์„ ํ™•์ธํ•ด๋ณด๋ฉด

์„ฑ๊ณต์ ์œผ๋กœ secret.txt ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ path traversal sequence๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ๋ชปํ•˜๋ฉด

๊ณต๊ฒฉ์ž๊ฐ€ ์›ํ•˜๋Š” ๋Œ€๋กœ directory๋ฅผ ์˜ฎ๊ฒจ ๋‹ค๋‹ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๊ณ  ์ด๋Š” ๊ฒฐ๊ตญ

์ค‘์š”ํ•œ ์ •๋ณด๊ฐ€ ์œ ์ถœ ๋‹นํ•˜๋Š” ์‚ฌํƒœ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค!!


[ summary ]

์ด๋ฒˆ POST์—์„œ๋Š” ์ง์ ‘ ๊ฐ„๋‹จํ•œ form์„ ๊ตฌ์„ฑํ•˜๊ณ  path traversal sequence๋กœ ์•…์šฉ๋  ์ˆ˜ ์žˆ๋Š”

์‚ฌ๋ก€์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜๋‹ค.

php code์— sequence๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ทธ ์–ด๋–ค ๋‚ด์šฉ์ด ์ž‘์„ฑ๋˜์–ด์žˆ์ง€ ์•Š์„ ๋ฟ๋”๋Ÿฌ

์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ img tag์— ๋ฐ˜์˜ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ฃผ ์›์ธ์œผ๋กœ ๋ณด์ธ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด path traversal sequence๋ฅผ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์„ ์ง€ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž!

Last updated