一、引用的理解:
引用就是给予一个变量一个恒定的别名。
int a = 10;
int b = &a;
a = 20;
cout<<a<<b<<endl;
输出结果 : a=20、b=20
二、靶场复现:
<?php highlight_file(__FILE__); error_reporting(0); include("flag.php"); class just4fun { var $enter; var $secret; } if (isset($_GET['pass'])) { $pass = $_GET['pass']; $pass=str_replace('*','\*',$pass); } $o = unserialize($pass); if ($o) { $o->secret = "*"; if ($o->secret === $o->enter) echo "Congratulation! Here is my secret: ".$flag; else echo "Oh no... You can't fool me"; } else echo "are you trolling?"; ?>
分析靶场源代码:
后台会将我们输入的字符串中的 * 转义成 \*,并且转义之后会将 $serect 赋值为 *。并且最终以 $o->serect 和 $o->enter 是否相等作为最终条件,我们可以使用引用将 serect 和 enter 捆绑在一起,使他们一直相等即可。
构造 payload:
将序列化字符串赋值给 ['pass'] 后提交: