white
打开靶机,发现可以执行命令,但是进行了严格的过滤
可以执行的命令是一个白名单- ls
- pwd
- whoami
- date
- echo
- base64
- sh
复制代码 白名单命令下方告知了过滤规则,比如禁止危险函数和过滤特殊字符等。有意思的是,这里虽然说过滤特殊字符(如;、&、|、@、!)等,但是我们随便输入一个被过滤的字符,会回显一个过滤字符的正则表达式- /[;&`$\'"<>?*[\]{}()#@!%]/
复制代码 而这个正则表达式过滤掉的字符有- / [ ; & \ $ ' " < > ? * [ ] { } ( ) # @ ! %`
复制代码 可以发现,并没有管道符 | 。所以管道符拼接就是本题的利用点。
回到白名单,可以发现有echo base64 sh等可以利用,这样解法就很清楚了。
首先给ls命令base64编码为bHM=,然后执行发现可以正常回显,证明这种方法可行
tac /flag编码dGFjIC9mbGFn,执行- echo dGFjIC9mbGFn|base64 -d|sh
复制代码 拿到flag
俄罗斯方块
是一个小游戏
游戏开始页面提示够10分给奖励,我们控制台修改score=10,然后消除一行,看到弹窗提示
好吧是个假的奖励。
我们去翻js源码
在下面可以看到一个路由地址,访问拿到flag
- flag{Polar_gift_of_Squirtle}
复制代码 狗黑子的舔狗日记
进去之后是一个类似微信的页面,我们到处点一点,发现只有消息、朋友圈、我和退出登录这几个页面可以有效访问
dirsearch扫一下,发现flag.php和源码泄露
flag.php是一个类似表白女神的页面,没什么有用信息
www.zip解压出来是一串弱密码,留着备用
然后我们观察切换页面时url的变化,是通过?page参数来改变访问的页面
考虑文件读取漏洞,尝试目录穿越,但是严格过滤了特殊字符,所以目录穿越不可行
然后考虑php伪协议读index.php源码,尝试发现可行,并且在源码中找到了一个base64加密的flag字符串
解base64发现关键信息
注意output编码改为utf-8,否则汉字输出时会乱码
知道了女神的微信号,猜测刚才的弱密码其中有女神微信密码,爆破
拿到密码直接登录,发现可以进到女神和狗黑子的聊天记录
随便发送一条消息即可得到女神名字
md5加密名字即可得到flag
- flag{aa1e3ea993e122de5de6e387db6c8609}
复制代码 VIP
vip内容需要VIP才能查看,我们抓包查看,发现有一个post参数给他改成yes拿到flag
polar快递
下载备忘录
在里面找到默认普通账号和默认密码,此时登录发现当前是普通用户权限,无法查看flag
登录时抓包,我们看到一个post参数id=user,给他改成root,登录拿到flag
狗黑子的登录
dirsearch扫一下发现git泄露,githack拿到源码
index.php- <?php
- session_start();
- if (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) {
- header('Location: admin.php');
- exit;
- }
- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['seclients_can_register'])) {
- $registerValue = $_POST['seclients_can_register'];
- // 明确处理0和1两种情况
- if ($registerValue == 1) {
- $_SESSION['show_register'] = true;
- } elseif ($registerValue == 0) {
- $_SESSION['show_register'] = false;
- }
- }
- // 处理登录
- $error = '';
- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['login'])) {
- $username = $_POST['username'] ?? '';
- $password = $_POST['password'] ?? '';
-
- require 'config.php';
-
- if (isset($users[$username]) && $users[$username] === $password) {
- $_SESSION['logged_in'] = true;
- $_SESSION['username'] = $username;
- header('Location: admin.php');
- exit;
- } else {
- $error = '用户名或密码不正确';
- }
- }
- ?>
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title>狗黑子的小破站</title>
-
- </head>
- <body>
-
- <h2>用户登录</h2>
- <?php if ($error): ?>
- <?php echo $error; ?>
- <?php endif; ?>
-
- <form method="post">
-
- <label for="username">用户名</label>
- <input type="text" id="username" name="username" required>
-
-
- <label for="password">密码</label>
- <input type="password" id="password" name="password" required>
-
- <button type="submit" name="login">登录</button>
-
- <?php if (isset($_SESSION['show_register']) && $_SESSION['show_register'] === true): ?>
- <button type="button" onclick="window.location.href='register.php'">注册</button>
- <?php endif; ?>
- </form>
-
- </body>
- </html>
复制代码 admin.php- <?php
- session_start();
- if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {
- header('Location: index.php');
- exit;
- }
- if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['seclients_can_upload']) && $_POST['seclients_can_upload'] == 1) {
- $_SESSION['show_upload'] = true;
- }
- $upload_message = '';
- if (isset($_SESSION['show_upload']) && $_SESSION['show_upload'] === true && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
- $target_dir = "uploads/";
- if (!file_exists($target_dir)) {
- mkdir($target_dir, 0777, true);
- }
-
- $target_file = $target_dir . basename($_FILES["file"]["name"]);
- $uploadOk = true;
-
- if ($_FILES["file"]["size"] < 200 * 1024) {
- $upload_message = "文件太小了。";
- $uploadOk = false;
- }
-
- $image_types = array('image/jpeg', 'image/png', 'image/gif', 'image/webp');
- $file_type = $_FILES["file"]["type"];
-
- if (!in_array($file_type, $image_types)) {
- $upload_message = "只允许上传图片文件 (JPG, PNG, GIF, WEBP)。";
- $uploadOk = false;
- }
-
- if ($uploadOk && move_uploaded_file($_FILES["file"]["tmp_name"], $target_file)) {
- $upload_message = "文件 " . htmlspecialchars(basename($_FILES["file"]["name"])) . " 上传成功。";
- } elseif ($uploadOk) {
- $upload_message = "文件上传失败。";
- }
- }
- ?>
- <!DOCTYPE html>
- <html lang="zh-CN">
- <head>
- <meta charset="UTF-8">
- <title>狗黑子的小破站</title>
-
- </head>
- <body>
- <h1>恭喜进来<?php echo htmlspecialchars($_SESSION['username']); ?>!</h1>
- <p><button>退出登录</button></p>
-
- <?php if ($upload_message): ?>
-
- <?php echo $upload_message; ?>
-
- <?php endif; ?>
-
- <?php if (isset($_SESSION['show_upload']) && $_SESSION['show_upload'] === true): ?>
-
- <h2>文件上传</h2>
- <form method="post" enctype="multipart/form-data">
- <input type="file" name="file" id="file">
-
- <input type="submit" value="上传文件" name="upload">
- </form>
-
- <?php endif; ?>
- </body>
- </html>
复制代码 思路很简单,首先注册,登录,然后传马拿flag
首先post传参seclient_can_register=1拿到注册按钮,注册账号
这里注意账号密码需要保持统一
注册后登录
在admin.php页面post传seclient_can_upload=1拿到文件上传按钮,这里只检测MIME类型和文件大小,我们在shell.php中写入一句话木马,后面跟上200k的数据即可
[code] |