免责声明:本公众号 太乙Sec实验室 所提供的实验环境均是本地搭建,仅限于网络安全研究与学习。旨在为安全爱好者提供技术交流。任何个人或组织因传播、利用本公众号所提供的信息而进行的操作,所导致的直接或间接后果及损失,均由使用者本人负责。太乙Sec实验室及作者对此不承担任何责任
实验背景:
本文旨在从取证的角度出发,对获取 PHP 网站后台地址的方法以及多种绕过后台密码的方式进行详细阐述。
需要着重强调的是,本文所涉及的相关技术与方法仅供合法的安全研究、网络取证以及在遵循法律法规且获得合法授权的情况下使用。任何未经授权擅自利用这些技术对他人网站进行非法访问、破坏等行为均属于违法犯罪活动,使用者需自行承担相应的法律责任。
网站后台加盐原理
以下是使用 PHP 语言实现网站后台加盐加密及验证密码的示例代码,展示了加盐机制的基本原理及操作过程:
<?php
// 生成盐值的函数
function generateSalt($length = 16) {
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$salt = '';
for ($i = 0; $i < $length; $i++) {
$salt.= $characters[rand(0, strlen($characters) - 1)];
}
return$salt;
}
// 加盐加密密码的函数
function hashPasswordWithSalt($password, $salt) {
returnhash('sha256', $salt. $password);
}
// 模拟用户注册,假设这里有用户输入的密码,实际中从表单获取
$userPassword = "123456";
// 生成盐值
$salt = generateSalt();
// 加盐加密密码
$hashedPassword = hashPasswordWithSalt($userPassword, $salt);
// 这里只是简单打印输出,实际中会将盐值和加密后的密码存储到数据库相应字段
echo"生成的盐值: ". $salt. "<br>";
echo"加盐加密后的密码: ". $hashedPassword. "<br>";
?>
<?php
// 验证密码的函数,接收用户输入的密码、存储的盐值和存储的加密密码
function verifyPassword($inputPassword, $storedSalt, $storedHash) {
$inputHashed = hash('sha256', $storedSalt. $inputPassword);
return$inputHashed === $storedHash;
}
// 模拟用户登录,假设这里获取用户输入的密码,实际从表单获取
$inputPassword = "123456";
// 假设从数据库读取到的盐值(这里用之前生成的示例盐值,实际从数据库对应字段获取)
$storedSalt = "示例盐值";
// 假设从数据库读取到的加密后的密码(这里用之前生成的示例加密密码,实际从数据库对应字段获取)
$storedHash = "示例加密密码";
if (verifyPassword($inputPassword, $storedSalt, $storedHash)) {
echo"密码验证成功,登录成功!";
} else {
echo"密码验证失败,登录失败!";
}
?>
bypass加盐后台
从安全研究和了解防范角度,如果网站存在诸如 SQL 注入漏洞、代码执行漏洞等,攻击者可能会通过构造恶意的 SQL 语句或代码执行语句来尝试绕过正常的加盐验证逻辑。
例如,存在 SQL 注入漏洞时,攻击者可能构造类似下面这样的语句(以下是示意,实际情况会更复杂,且不同数据库语法有差异):
-- 假设登录验证的 SQL 语句类似这样(原本正常是根据用户名和加盐验证密码来查询验证)
SELECT * FROM users WHERE username = '$input_username' AND password = '$input_password_hashed'
-- 攻击者构造的注入语句,试图让验证恒成立
SELECT * FROM users WHERE username = '$input_username' OR '1'='1'
-- 这样就可能绕过密码验证环节,直接获取到用户记录,仿佛验证通过了一样
利用 SQL 函数来篡改验证逻辑
'; UPDATE users SET password = '$known_hashed_value' WHERE username = 'target_user'; --
//这条语句先通过
'; 闭合前面的语句,然后执行
UPDATE 操作,将目标用户(
target_user)的密码哈希值(加盐后的)修改为攻击者已知的一个值(
$known_hashed_value),后面的
-- 用于注释掉后面原本可能有的其他语句,防止语法错误。之后攻击者再使用对应这个已知哈希值的密码去登录,就可以绕过正常的加盐验证了。
创世神大法
针对网站源码特征进行修改认证逻辑。
虽然盐值随机,但是我们可以通过修改代码逻辑进入其它用户,将选中的==(==)改为!=(不等于),就可以用随便非正确的密码登录任意用户账号!!!
首先需要对目标网站的源码进行分析,确定其认证逻辑所在的代码位置和具体实现方式。通常涉及到用户登录验证的 PHP 文件(比如在 PHP 网站中,像 login.php
或者相关的包含验证函数的文件
<?php
function verifyUser($username, $password) {
// 从数据库获取用户记录,假设使用了某个数据库操作类
$user = UserModel::getUserByUsername($username);
if ($user) {
$storedSalt = $user['salt'];
$storedHash = $user['password_hash'];
$hashedInputPassword = hashPasswordWithSalt($password, $storedSalt);
if ($hashedInputPassword === $storedHash) {
returntrue;
}
}
returnfalse;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];
if (verifyUser($username, $password)) {
// 登录成功后的操作,比如设置会话等
session_start();
$_SESSION['user_id'] = $user['id'];
header('Location: dashboard.php');
} else {
// 登录失败提示
echo"登录失败,请检查用户名和密码";
}
}
?>
篡改验证条件
一旦找到了验证逻辑代码,可能尝试修改验证条件来绕过正常的认证流程。将 ==(等于)改为!=(不等于)
< ?php
// 同样假设连接数据库的代码(此处省略具体配置及错误处理等细节)
$conn = mysqli_connect("localhost", "username", "password", "database_name");
// 获取用户输入的用户名和密码
$input_username = $_POST['username'];
$input_password = $_POST['password'];
// 从数据库中查询该用户名对应的记录,获取密码密文和盐值
$query = "SELECT password_hash, salt FROM users WHERE username = '$input_username'";
$result = mysqli_query($conn, $query);
$row = mysqli_fetch_assoc($result);
if ($row) {
$stored_password_hash = $row['password_hash'];
$salt = $row['password'];
// 使用密码加密函数(这里假设是自定义函数 hashPassword,实际中可以是更复杂的加密算法)将用户输入密码结合盐值进行加密
$input_password_hash = hashPassword($input_password, $salt);
// 恶意修改后的验证逻辑,将 ==(等于)改为!=(不等于)
if ($input_password_hash!= $stored_password_hash) {
echo"登录成功";
} else {
echo"登录失败,密码错误";
}
} else {
echo"用户名不存在";
}
// 关闭数据库连接(省略错误处理等)
mysqli_close($conn);
?>
本地实验
实验要求
理解代码中的登录逻辑,进而对其进行修改。
定位前台和后台
查看 SQL 相关语句,以寻找与源码相关的语句内容。
查看加盐方式
修改源码登录逻辑
通过php修改登录逻辑,前台、后台任意用户可以登录
case'login':
// 直接设置登录成功,不进行账号密码验证
$result['status'] = 1;
$result['msg'] = '登录成功';
$result['url'] = url('index/index');
break;
}
经过长时间的查找,最终找到了管理员登录页面。主要依靠使用 IDA 编辑器对整个源码内容进行关键词 “salt” 的搜索。
public function login($username, $password, $keeptime = 0)
{
// 直接设置登录成功状态,跳过原有验证
$admin = new Admin();
$admin->id = 1; // 假设一个默认的管理员 ID
$admin->username = 'anyuser';
$admin->token = Random::uuid();
Session::set("admin", $admin->toArray());
$this->keeplogin($keeptime);
returntrue;
}
修改后台逻辑,随便用户名、密码输入即可登录。
查看用户名与源码一致
最后,由于机器人账户出现了意外状况,导致无法正常使用,所以目前相关消息的回复只能通过公众号。
往期精彩回顾
关注我,了解更多知识,别忘了点赞+在看哦!
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...