今天完成了一道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. ubutu强制结束进程 kill -9 ProcessID

    强制终止进程 kill -9 2128 表示强制结束进程号 2128 对应的进程.

  2. centos下的hadoop集群实现ssh的无密码登陆

    CentOS 下SSH无密码登录的配置 最近学习Hadoop.它要求各节点之间通过SSH无密码登录,配置SSH的时候费了一番功夫,记录下来,以备忘. 配置SSH无密码登录需要3步: 1.生成公钥和私钥 ...

  3. 网络请求--Retrofit2用法

    欢迎Follow我的GitHub, 关注我的CSDN. Retrofit是Square开发的网络请求库, 简化了网络请求的使用, 这个库太知名了, 优点我就不多说了. 让我们看看怎样使用吧? 注意: ...

  4. appium 控件定位

    转自:http://www.2cto.com/kf/201410/340345.html AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用 ...

  5. Linux 常用命令 (备忘)

    查看linux版本信息 uname -r cat /proc/version

  6. Mongoose Embedded Web Server Library

    https://github.com/cesanta/mongoose http://ltp.ai/docs/ltpserver.html LTP Server在轻量级服务器程序mongoose基础上 ...

  7. 如何解决Windows的端口占用问题?

    已知某应用在启动时会创建服务套接字,并将其绑定至端口8888,然而端口8888已被占用,如何解除占用? 以下为解决方案: 在cmd中运行netstat -ano|findstr 8888,其中的参数8 ...

  8. POJ2942 Knights of the Round Table 点双连通分量 二分图判定

    题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...

  9. ie下文件上传无权访问的问题

    最近项目遇到个问题,ie下文件上传无权访问,在网上找了很久才找到答案,原来是因为ie下不能用js触发input=file的点击事件,必须手动点击才可以.

  10. 更改scroll样式

    /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 2px; height: 80%; background: #fff; } /*定 ...