web-Welcome

image-20250111103144660

打开是405错误,抓包后看到是Method Not Allowed

image-20250111103817580

搜索后发现是请求方式错误,换成POST传参就可以拿到源码了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
error_reporting(0);
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header("HTTP/1.1 405 Method Not Allowed");
exit();
} else {

if (!isset($_POST['roam1']) || !isset($_POST['roam2'])){
show_source(__FILE__);
}
else if ($_POST['roam1'] !== $_POST['roam2'] && sha1($_POST['roam1']) === sha1($_POST['roam2'])){
phpinfo(); // collect information from phpinfo!
}
}

前面都是刚刚遇到的,我们只需要关注最后一个else if语句就可以了

一个简单的sha1哈希绕过,传数组就可以了

image-20250111105042421

然后在里面查找flag就可以了

web-Myblog

image-20250111131938206

可以看到有登录入口,测试一下

image-20250111132028751

输入1和1后页面显示

image-20250111132049726

可以看到url中有admin和user,应该是需要管理员登陆,我们先fuzz一下sql注入什么的,但是发现打不进去,后来发现在url中有?page=login参数,猜测可能是任意文件读取漏洞,试一下

1
/?page=php://filter/read=convert.base64-encode/resource=login.php

什么也没得,看了wp后才知道这里的话源码中是闭合了php后缀的,那我们再试一下,然后就读出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//login.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Login</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="robots" content="all,follow">
<link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/4.2.1/css/bootstrap.min.css">
<link rel="stylesheet" href="css/style.default.css" id="theme-stylesheet">
</head>
<body>
<div class="page login-page">
<div class="container d-flex align-items-center">
<div class="form-holder has-shadow">
<div class="row">
<!-- Logo & Information Panel-->
<div class="col-lg-6">
<div class="info d-flex align-items-center">
<div class="content">
<div class="logo">
<h1>欢迎登录</h1>
</div>
<p>—— 博客后台 ——</p>
</div>
</div>
</div>
<!-- Form Panel -->
<div class="col-lg-6 bg-white">
<div class="form d-flex align-items-center">
<div class="content">
<form method="post" action="/?page=admin/user" class="form-validate" id="loginFrom">
<div class="form-group">
<input id="login-username" type="text" name="username" required data-msg="请输入用户名" placeholder="用户名" class="input-material">
</div>
<div class="form-group">
<input id="login-password" type="password" name="password" required data-msg="请输入密码" placeholder="密码" class="input-material">
</div>
<button id="login" type="submit" class="btn btn-primary">登录</button>
<div style="margin-top: -40px;">
<!-- <input type="checkbox" id="check1"/>&nbsp;<span>记住密码</span>
<input type="checkbox" id="check2"/>&nbsp;<span>自动登录</span> -->
<div class="custom-control custom-checkbox " style="float: right;">
<input type="checkbox" class="custom-control-input" id="check2" >
<label class="custom-control-label" for="check2">自动登录</label>
</div>
<div class="custom-control custom-checkbox " style="float: right;">
<input type="checkbox" class="custom-control-input" id="check1" >
<label class="custom-control-label" for="check1">记住密码&nbsp;&nbsp;</label>
</div>
</div>
</form>
<br />
<small>没有账号?</small><a href="#" class="signup">&nbsp;不给注册</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- JavaScript files-->
<script src="https://libs.baidu.com/jquery/1.10.2/jquery.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/bootstrap/4.2.1/bootstrap.min.js"></script>
<script src="vendor/jquery-validation/jquery.validate.min.js"></script><!--表单验证-->
<!-- Main File-->
<script src="js/front.js"></script>
</body>
</html>

<?php
require_once("secret.php");
mt_srand($secret_seed);
$_SESSION['password'] = mt_rand();
?>

1
2
3
4
5
//secret.php
<?php
$secret_seed = mt_rand();
?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//admin/user
<?php
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){
if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){ // No one knows my password, including myself
$logined = true;
$_SESSION['status'] = $logined;
}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){
echo "<script>alert('username or password not correct!');window.location.href='index.php?page=login';</script>";
die();
}
?>

最后一个是我没想到的,尽管看着不像文件,但是还是读取出来了emm

这里我们分析一下代码,需要让username=Longlone,然后密码的话是session中password的值,也就是经过随机后的值,那我们怎么去拿到password的值呢?

我们把cookie中的值删除,令password为空,那我们的username对应的password为空的话就可以绕过验证了,但是好像必须输入密码,那我们把密码对应的HTML中 required 属性规定必需在提交之前填写输入字段。直接找到它把它删了,然后就成功登录了

image-20250111135849147

image-20250111135917811

发现一个上传头像的地方,看看是不是文件上传漏洞

发现可以上传,那我们这里可以将php文件打包成zip,改后缀名为jpg,再利用zip伪协议进行读取。zip协议是可以解压缩jpg后缀的压缩包的。

先写一个木马文件,然后用zip压缩转成jpg文件后缀进行上传,上传成功后进行访问发现并不能看到图片(是因为我们这个文件是个压缩包,不是个正常的图片)

image-20250111141307731

利用zip伪协议读取一下

zip:// + zip路径 + %23 + php文件名

这里用%23去把源码中自动接上的php后缀去掉,然后传入参数执行命令就可以了

image-20250111142218492

web-Rceme

image-20250111204504679

打开是一个命令执行界面

image-20250111204539582

可以看到