Moctf死亡退出Write up

在这里插入图片描述
一开始就看到了源码,萌新表示大致看得懂什么意思,大致分析下:
第四行@$ c.=$ _POST[‘c’]; //@为屏蔽错误不显示在浏览器界面,$ _POST[‘c’]是以post的方式获取字符串类型的变量c,".="表示变量c会与之前变量中的<?php exit;?>进行字符串连接。很显然题目需要我们以post的方式提交变量c使<?php exit;?>失效。
@$filename = $_POST[‘file’];同理我们以post方式提交一个字符串的变量file,赋值给filename。
后面if判断,如果我们没有以post提交filename,就会运行空的tmp.php,否则就会把c的内容写入filename文件中并运行。
后来百度了一下,好像涉及php的filter协议,看了一下大佬的博客(https://www.leavesongs.com/PENETRATION/php-filter-magic.html),似懂非懂,
在这里插入图片描述

原理:
通过上传字符串变量c,通过<?php exit;?>与变量c连接破坏掉语句结构;同时变量c也需要写入到变量filename这个文件中通过执行获得flag。
在包含HTML、PHP语言的的网页中,通常会在进行解析XML将PHP的<??>语法当作为XML,而导致解析错误。为了防止这样的错误产生,php引入了php://filter协议流,通过该协议流可以将php的代码经过base64再编码一遍来避免此类冲突的产生。
可以巧妙运用base64解码的过程,将需要执行的php代码使用base64上传,再利用php:filter协议流进行base64解码执行。
base64解码过程会将<、?、;、空格、>等7个不合法字符忽略。从而导致<?php exit?>经过base64解码后变为phpexit。
base64算法解码是4个byte为一组,"phpexit"只有7个字符,这样会导致我们base64加密过后的密码,第一个字符被当作无效字符,从而破坏掉代码结构。

实现:
1.编写我们希望在文件中执行的php代码,猜测flag放在flag.php文件中,构建代码让系统执行获取flag文件命令

<?php system('cat flag.php');?>

2.最后的文件需要通过base64解密执行,所以需要对代码进行base64加密。

<?php system('cat flag.php');?>加密后代码为:PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKSA7Pz4=

3.写入的字符串是与<?php exit;?>连接后写入的,但是经过base64解密后phpexit只有7个字符我们需要随便加一个字符补充完整性(这里我选择的字符是a),防止在解密时候破坏我们加密的webshell。故变量c为aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKSA7Pz4=
4.f9打开hackbar,以post方式提交c=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKSA7Pz4=&file=php://filter/write=convert.base64-decode/resource=tmp.php
f12查看即可得flag
在这里插入图片描述
emmm,萌新第一次写wp,借鉴了很多别人的,若有大佬看到错误,望指正~~~继续学习,加油!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值