今天完成了一道Moctf的代码审计题目。这道题目也花了我一定时间去搞清楚他的逻辑,所以把所学所想记录在此,并分享给需要的朋友。

打开题目后直接放出源码--->

之后就是疯狂百度这些函数的意思并努力搞懂的过程了。

我们简单分析一段程序。

开始的时候给了一个waf函数,意思是传入的键名中不能含有flag的字符。

之后是一个复杂的循环逻辑简单介绍下:

将post、get、cookie这三个变量(在网页中对应你用get、post传入的值)依次赋值给$__R,若$$__R中存在数据(就是说你post或者get过来数据了)则进行下一步。

这里我们就那post这一个举例子。

进入下一个语句后,我们发现这里使用了$$__R,这意味着什么?

原本我这里$__R为$__POST,这时就变成了$$__POST,意味着我们要取出“$POST所对应的值--的值(注意:是值的值)”我们可以举个例子来分析。假设我这里有a=>b;    b=>c;那么我 $$a 就是是取出a的值的值,也就是说取出c。

之后我们进入下一个foreach,去$__K为键名,$__V为值。如果键名作为变量所对应的值与$$__R的值相等,则unset掉$$__K。这里unset经过我查资料理解为就是把这个值在程序中所对应的内存清除掉。简单来说就是销毁了他,他就不存在了。。

接着向下看。

这个意思是如果对应的值存在,那么满足if进入waf函数。

这一段的重点应该是在extract函数,这个函数的详细意思大家可以去百度下。我这里简单的说明。

这里假设我写extract($a,EXTR_SKIP),并且$a = array("flag"=>"hhh");

此时我如果执行了extract函数,那么我如果echo $flag就会得到hhh。理解我的意思?就是说我会把extract的对象内的键名变成一个变量,而这个变量对应的值就是这个键名的值。而EXTR_SKIP意思是如果前面存在了此键名,那么我不会覆盖掉前面的。

之后就是重点,这里我把漏洞的原出处放上来。http://www.secevery.com:4321/bugs/wooyun-2014-063895

这道题我们的目的是要读取flag.php这个页面的内容,而如果我们不绕过waf,那么我们是不能读取的。

所以我们要通过POST一个特殊的内容来达到绕过的目的。根据代码的逻辑,我们发现如果我们提前把_GET的内容给unset掉,之后顺便的通过waf,然后再通过extract函数给还原回来是不是就达到我们的目的了??

这里我们要这样传

即POST传过去的内容为_GET,这样我们就可以达到if(isset($$__k) && $$__k == $__v) unset($$__k); 这里$$__K就是get参数的值,而$__V是POST传入数组里的键值的值。举例说这里都可以是QNKCDZO。之后我们就把_GET里的数组给unset掉了。

之后if($_GET) { waf($_GET); }就不进入了。

在之后通过if($_POST) extract($_POST, EXTR_SKIP);    if($_GET) extract($_GET, EXTR_SKIP);将_GET给还原回来。达到绕过waf并读取flag.php的作用。

而在最后我发现为什么if($_POST) { waf($_POST);}没有给我ban了呢?我本地测试发现在waf函数里,$__k确实会有flag字符呀?后来经过真实的POST模拟,我才发现真正在网页中post过去的数组(例如你post一个_GET[flag]="hhh",这里传到后面所对应的$__K就只有_GET了。。网页自己把其解析成立一个数组,然后就取数组的名字作为键的名字)。

至此我们就把flag读出来了。

Moctf--unset的更多相关文章

  1. PHP unset()函数销毁变量 但没有实现释放内存

    <?PHP $a = "hello";$b = &$a;unset( $b );echo $a; // 输出 helloecho $b; // 报错$b = &quo ...

  2. is_null, empty, isset, unset对比

    is_null, empty, isset, unset 我们先来看看这4个函数的描述 isset 判断变量是否已存在(配置)unset 把变量删除(释放)掉empty 判断变量是否为空is_null ...

  3. PHP unset销毁变量并释放内存

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s=st ...

  4. 11月1日上午PHP------empty、 is_null、isset、unset的区别

    1.empty 判断一个变量是否为"空".null.false.00.0.'0′.』.为以上值的变量在检测時都将返回true. 2.isset 判断一个变量是否已经设置.0.00. ...

  5. 如何删除PHP数组中的元素,并且索引重排(unset,array_splice)?

    如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排: <?php $arr = array('a','b','c','d'); unset($arr[1]); pri ...

  6. initial、inherit、unset、revert和all

    前面的话 在CSS中,有4个关键字理论上可以应用于任何的CSS属性,它们是initial(初始).inherit(继承).unset(未设置).revert(还原).而all的取值只能是以上这4个关键 ...

  7. git push.default is unset

    warning: push.default is unset; its implicit value is changing inGit 2.0 from 'matching' to 'simple' ...

  8. mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)

    主从复制:http://blog.csdn.net/drifterj/article/details/7833883 对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能 ...

  9. PHP如何释放内存之unset销毁变量并释放内存详解

    PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = ...

  10. php foreach循环中unset后续的键值问题

    实例: $arr=array('a','b','c','d','e','f'); foreach($arr as $index=>$tmp){ echo $index.'=>'.$tmp. ...

随机推荐

  1. 递归获取JSON内容的key-value值

    方法主体: 使用时,请在类中先声明一个Map,參数形式例如以下: JSONObject jobj = new JSONObject(JSONContent); 首次请传递jobj.

  2. ZOJ ACM 1314(JAVA)

    昨天做了几个题目.过于简单,就不在博客里面写了. 1314这道题也比較简单,写出来是由于我认为在这里有一个小技巧,对于时间复杂度和空间复杂度都比較节省. 这个题目类似哈希表的求解.可是更简单.刚拿到题 ...

  3. 安卓2.3 js解析问题 split()

    安卓2.3版本号解析错误,split和parseInt都会把09和08都解析成0,07下面解析没有问题.解决的方法是直接取个位数. function getYMD(yMd){ var dArray=n ...

  4. swift,demo,ios8

    swift交流群:342581988,欢迎增加. 刚刚写的小 demo.搞得还是不是太好.请大家拍砖! 能够直接复制执行 import UIKit class ViewController: UIVi ...

  5. Java中常见的注解

    Java中常见的注解 1.JDK自带的注解@Override  @Deprecated  @Suppvisewarnings 常见第三方注解 Spring:@Autowired  @Service  ...

  6. Jquery-easyui的默认图标的使用,以及如何添加自己想要的图标

    easyui的默认图标有以下这些: .icon-blank{ background:url('icons/blank.gif') no-repeat; } .icon-add{ background: ...

  7. 最长公共上升子序列 (poj 2127) (Greatest Common Increasing Subsequence)

    \(Greatest Common Increasing Subsequence\) 大致题意:给出两个长度不一定相等的数列,求其中最长的公共的且单调递增的子序列(需要具体方案) \(solution ...

  8. JUNO eclipse Version: 4.2.0 添加svn插件

    1.下载最新的这个版本的SVN http://www.eclipse.org/subversive/latest-releases.php 实际的下载地址 http://www.eclipse.org ...

  9. 开源企业IM免费企业即时通讯ENTBOOST V2014.177版本号正式公布

    版权声明:本文为博主原创文章,欢迎转载,转载请尽量保持原文章完整,谢谢! https://blog.csdn.net/yanghz/article/details/30529469 ENTBOOST, ...

  10. C语言中的声明与定义的差别

    1.对于以下的声明语句 int a;        假设其位置出如今全部的函数体之外,那么它就被称为外部对象a的定义.这个语句说明了a是一个外部整型变量,同一时候为a分配了存储空间.由于外部对象a并没 ...