Path Traversal : self-test [2]

DATE : 2023/11/5

์ด๋ฒˆ POST์—์„œ๋Š” Path Traversal [2]์—์„œ ๋ดค๋˜ ์‚ฌ๋ก€ ์ค‘

path traversal sequence๋ฅผ strip! ํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ์žฌํ˜„ํ•ด๋ณผ๊นŒ ํ•œ๋‹ค.

์ „์ฒด์ ์ธ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ์€ Path Traversal self test๊ณผ ๋™์ผํ•˜๋‹ค.

images.php๋กœ ์ ‘์†ํ•ด ์ด๋ฒˆ์—๋Š” 4.jpg ์ด๋ฏธ์ง€๋ฅผ ์š”์ฒญํ•ด๋ดค๋‹ค.

๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๊ฐ™์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฏธ์ง€๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ด๋•Œ์˜ packet์„ ๋ณด๋ฉด

<img> tag์˜ ๊ฐ’์ด ./images/4.jpg์ธ ๊ฑธ ๋ณด์•„ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ์ด๋ฏธ์ง€๋Š”

ํŽ˜์ด์ง€์™€ ๋™์ผํ•œ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ /images directory์—์„œ ๊บผ๋‚ด์˜จ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ์˜ ๋ชฉํ‘œ์ธ hanhxx directory - secret.txt๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด์„œ๋Š”

๊ธฐ๋ณธ์ ์œผ๋กœ ์„ค์ •๋œ /images directory ๊ฒฝ๋กœ์—์„œ ํ•œ ๋ฒˆ ๋น ์ ธ๋‚˜์˜ค๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

directory๋ฅผ ๋น ์ ธ๋‚˜์˜ค๊ธฐ ์œ„ํ•ด path traversal sequence๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด..!

ํŽ˜์ด์ง€ ์ƒ์—๋Š” alt ๊ฐ’์ด ์ถœ๋ ฅ ๋˜๊ณ 

(์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜๋Š” ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—)

packet์—์„œ๋„ 404 Not Found ๋ผ๊ณ  ํ•œ๋‹ค. ํ  ๐Ÿง

Path Traversal self test์—์„œ๋Š” ์ด๋ ‡๊ฒŒ ํ•ด์„œ ๋ถ„๋ช… directory ์ด๋™์— ์„ฑ๊ณตํ–ˆ๋Š”๋ฐ..

๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๋“ฏํ•˜๋‹ค!!

[ 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'];
    $filename = str_replace('../','',$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'>";
}
?>

self-test [1]๊ณผ ๋น„๊ตํ•ด๋ดค์„ ๋•Œ, PHP code๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

์ด๋ฒˆ์— ๊ตฌํ˜„ํ•œ ํ™˜๊ฒฝ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ sequence ../ ๋ฅผ ์ฐจ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ

$filename = $_GET['filename'];
$filename = str_replace('../','',$filename);

"../"๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ณต๋ฐฑ์œผ๋กœ ๊ต์ฒดํ•ด๋ฒ„๋ฆฌ๋Š” ๋‚ด์šฉ์„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค ๋ณด๋‹ˆ ์œ„์—์„œ ์ž…๋ ฅํ•œ ๊ฐ’์ด $filename์œผ๋กœ ์ „๋‹ฌ๋˜๋ฉด

$filename = "../hanhxx/secret.txt"

str_replace('../','',$filename) => str_replace('../','',"../hanhxx/secret.txt")

../hanhxx/secret.txt => hanhxx/secret.txt

์ด์™€ ๊ฐ™์€ ๊ณผ์ •์œผ๋กœ sequence๊ฐ€ ์ œ๊ฑฐ ๋˜๋Š” ๊ฒƒ์ด๋‹ค..!

ํ•˜.์ง€.๋งŒ sequence๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ๋งŒ๋“ค์–ด์ง€๋Š” sequence๋Š” ์–ด๋–ป๊ฒŒ ๋ง‰์ง€ ๋ชปํ•œ๋‹ค!!

....//hanhxx/secret.txt

์™€ ๊ฐ™์ด ๊ฐ’์„ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด

str_replace('/','',....//hanhxx/secret.txt);

....//hanhxx/secret.txt => ../hanhxx/secret.txt

ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์นœ ๊ฒฐ๊ด๊ฐ’์— sequence๊ฐ€ ํฌํ•จ ๋˜๋ฏ€๋กœ

str_replace ๊ณผ์ •์„ ๊ฑฐ์นœ ๊ฐ’์ด filename์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด

<img> ๊ฒฝ๋กœ ๊ฐ’์— ์œ„์™€ ๊ฐ™์ด "../"์ด ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•ด๋‹น ๊ฒฝ๋กœ์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด /images/../hanhxx/secret.txt ๊ฒฝ๋กœ์˜ ํŒŒ์ผ์„ ์š”์ฒญํ•˜๊ฒŒ ๋˜๋ฉด

response์—์„œ secret.txt ํŒŒ์ผ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค!!

์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐํšŒ ์„ฑ๊ณต! ๐Ÿ˜„


์ง์ ‘ ๊ตฌํ˜„ํ•œ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด์„œ

์ผ์ฐจ์ ์œผ๋กœ sequence๋งŒ ์ œ๊ฑฐํ•˜๋ ค๊ณ  ํ•˜๋‹ค ๋ณด๋ฉด ์ƒ๊ฐ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์šฐํšŒ๋  ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

sequence๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ณผ์ • ํ›„์—๋„ nested sequence์™€ ๊ฐ™์ด

path traversal sequence๊ฐ€ ์กด์žฌํ•˜๋Š” ์ง€ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์• ์ดˆ์— sequence๊ฐ€ ๊ฐ์ง€๋˜๋ฉด

๊ทธ ์ดํ›„์˜ ์–ด๋– ํ•œ script๋„ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ค‘๋‹จํ•ด๋ฒ„๋ฆฌ๋Š” ๋“ฑ ์ถ”๊ฐ€์ ์ธ ๋ณด์™„์ด ํ•„์š”ํ•  ๋“ฏํ•˜๋‹ค. ๐Ÿ˜ซ๐Ÿ˜ซ

Last updated