攻防新手wp
攻防世界新手题单
php序列反序列
class xctf{
public $flag = ‘111’;
public function __wakeup(){
exit(‘bad requests’);
}
?code=
WP:
代码涵盖定义了xctf类、成员flag、魔术方法wakeup、以及末尾code待传参,wakeup在序列化时会优先于其他函数被调用,所以我们传参时要利用漏洞绕开,即使序列化字符串中表示对象属性的个数大于真实属性个数(3),可写为O:4:”xctf”:2:{S:4:”flag”;S:3:”111”;},以GET方式传参,url直接拼接
easyphp
1 | if(isset($a) && intval($a) > 6000000 && strlen($a) <= 3){ if(isset($b) && '8b184b' === substr(md5($b),-6,6)){ $key1 = 1; }else{ die("Emmm...再想想"); } }else{ die("Emmm...");} |
首先三个函数:
isset($a):检查$a是否被定义且不为null intval($a):将$a转换为整数并检查是否是有效数字 strlen($a)<=3:检查$a字符串长度不超过3
采用科学计数法绕过长度限制,使用a=1e9
当$a满足条件,计算$b的MD5哈希值,并提取最后6个字符并检查这6个字符是否等于’8b184b’,使用PHP脚本进行暴力爆破得b=53724
```
若上述条件都成立代码执行$key1=1,表示条件检查通过
1 | $c=(array)json_decode(@$_GET['c']); |
检查 $c
是否是一个有效数组
1 | if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){ |
$c需为数组,且存在m不为数字,但需大于2022,直接赋值m=2023a(php的弱类型)。当前$c=array(“m”=>’2023a’)
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
存在n为数组,n的值数量为2,n的第一个值为数组。得到$c=array(“m”=>’2023a’,”n”=>array(array(),0))
注:=>
是 PHP 中用于创建关联数组的运算符,表示键值对的分隔符。它将数组的键与对应的值连接起来,形成一个关联数组。