关于 "的绕过问题

在Moctf中看到一道题目:php

<?php show_source(__FILE__); $c="<?php exit;?>"; @$c.=$_POST['c']; @$filename=$_POST['file']; if(!isset($filename)) { file_put_contents('tmp.php', ''); } @file_put_contents($filename, $c); include('tmp.php'); ?>

这里简单分析下题目,并记录下解题过程。html

咱们来看第二行的<?php exit;?>,这句话在开头增长了exit过程,致使即便咱们成功写入一句话,也执行不了(这个过程在实战中十分常见,一般出如今缓存、配置文件等等地方,不容许用户直接访问的文件,都会被加上if(!defined(xxx))exit;之类的限制)。在往下看,咱们要post一个c与file两个变量,而c不用说就是用来绕过exit并执行命令的。而下面的file_put_contents函数的含义为能够将一个字符串写入文件。因此咱们简单分析获得,咱们应该输入一个c用来绕过exit,并让c中的内容写入filename所表明的变量内容里。缓存

又由于这里文件包含了tmp.php,因此咱们很容易想到filename应该与tmp.php相关。函数

也就是说,这道题目的关键点在于咱们如何绕过这句话。post

 

这里引入一篇blog编码

https://www.leavesongs.com/PENETRATION/php-filter-magic.htmlspa

这里讲述了能够利用php伪协议进行绕过,简单来讲,咱们若是使用  file=php://filter/write=convert.base64-decode  来进行对file变量的处理,既以base64的编码来读。而咱们为何要使用base64呢?由于<?php exit;?>中"<、?、;、>"等符号解码时都会被忽略,因此命令就变成了-->    “phpexit”。也就达到了咱们绕过了这个函数。以后咱们要想执行咱们所想的代码,能够在phpexit这七个字符后任意加一个字母(由于base64是4个字符一组进行解码的),因此咱们能够写成code

file=php://filter/write=convert.base64-decode/resource=tmp.php

也就是说以base64为编码对tmp.php读取。而写入tmp.php的内容是什么呢?htm

这里咱们能够嵌入php命令来写入tmp.php中blog

将命令用base64编码,获得PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==,而后在原有的(phpexit)基础上添加上述base64代码,(****这里咱们为了让其成为八位,因此任意在后面加一个a)获得

phpexitaPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

 

而传过去的值为t=aPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

 

也就获得flag了,,233333

相关文章
相关标签/搜索