攻防世界新手题单

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
2
3
4
5
6
7
8
9
$c=(array)json_decode(@$_GET['c']);
if(is_array($c) && !is_numeric(@$c["m"]) && $c["m"] > 2022){
if(is_array(@$c["n"]) && count($c["n"]) == 2 && is_array($c["n"][0])){
$d = array_search("DGGJ", $c["n"]);
$d === false?die("no..."):NULL; foreach($c["n"] as $key=>$val){
$val==="DGGJ"?die("no......"):NULL; } $key2 = 1; }
else{ die("no hack"); }
}
else{ die("no");}

检查 $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 中用于创建关联数组的运算符,表示键值对的分隔符。它将数组的键与对应的值连接起来,形成一个关联数组。