Moctf--unset
今天完成了一道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的更多相关文章
- PHP unset()函数销毁变量 但没有实现释放内存
<?PHP $a = "hello";$b = &$a;unset( $b );echo $a; // 输出 helloecho $b; // 报错$b = &quo ...
- is_null, empty, isset, unset对比
is_null, empty, isset, unset 我们先来看看这4个函数的描述 isset 判断变量是否已存在(配置)unset 把变量删除(释放)掉empty 判断变量是否为空is_null ...
- PHP unset销毁变量并释放内存
PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s=st ...
- 11月1日上午PHP------empty、 is_null、isset、unset的区别
1.empty 判断一个变量是否为"空".null.false.00.0.'0′.』.为以上值的变量在检测時都将返回true. 2.isset 判断一个变量是否已经设置.0.00. ...
- 如何删除PHP数组中的元素,并且索引重排(unset,array_splice)?
如果要在某个数组中删除一个元素,可以直接用的unset,但是数组的索引不会重排: <?php $arr = array('a','b','c','d'); unset($arr[1]); pri ...
- initial、inherit、unset、revert和all
前面的话 在CSS中,有4个关键字理论上可以应用于任何的CSS属性,它们是initial(初始).inherit(继承).unset(未设置).revert(还原).而all的取值只能是以上这4个关键 ...
- git push.default is unset
warning: push.default is unset; its implicit value is changing inGit 2.0 from 'matching' to 'simple' ...
- mongodb_修改器($inc/$set/$unset/$push/$pop/upsert......)
主从复制:http://blog.csdn.net/drifterj/article/details/7833883 对于文档的更新除替换外,针对某个或多个文档只需要部分更新可使用原子的更新修改器,能 ...
- PHP如何释放内存之unset销毁变量并释放内存详解
PHP的unset()函数用来清除.销毁变量,不用的变量,我们可以用unset()将它销毁.但是某些时候,用unset()却无法达到销毁变量占用的内存!我们先看一个例子: <?php $s = ...
- php foreach循环中unset后续的键值问题
实例: $arr=array('a','b','c','d','e','f'); foreach($arr as $index=>$tmp){ echo $index.'=>'.$tmp. ...
随机推荐
- atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型执行期获得Dialect
atitit. hb 原生sql跨数据库解决原理 获得hb 数据库类型执行期获得Dialect #-----原理 Hibernate 执行期获得Dialect 2010-07-28 12:59 ...
- java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX
1)DOM(JAXP Crimson解析器)DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找 特定信息. ...
- CPU组成
感冒了近一周,这两天最终又能正常活动了,,立即開始增产博客啦~ 近期一直都在做软考题.刚開始还是感觉挺无聊的,坐不住,还是一点一点的写个总结吧.今天先来看下比較重要的CPU内部组成. 图画的比較花.事 ...
- CPU Stepping
http://baike.baidu.com/view/16839.htm?fr=ala0_1_1 步进 编辑 步进(Stepping)是CPU的一个重要参数,也叫分级鉴别产品数据转换规范,“步进 ...
- gcc在出现错误的时候停止编译 -Wfatal-errors
有时候我们编译一个大的项目的时候.会出现非常多错误使得屏幕堆满了非常多没用的信息.普通情况下我们须要找到首次出现错误的地方,在gcc中加入编译选项能够使编译停止在第一次出现错误的地方: $ gcc - ...
- WTF
WTF ,luna黑色主题比较sublime 还是差点!
- 【健康生活】Google、百度之间的选择
没有什么技术性的分析,仅仅是个人吐槽而已. 一般人遇到问题就会说一句"百度一下",说实话,百度在中国推广的真的非常不错,可谓是家喻户晓,搜索个八卦新闻,小文章,小电影什么的的确非常 ...
- BingMap地图怎样显示中文
这是bingMap的js引用 <script type="text/javascript" src="v=7.0&mkt=zh-cn'></sc ...
- 设计模式学习笔记——Template Method模板方法模式
可能是最简单的设计模式. 而且你我都用过而不自知. 因为,模板方法模式也者,就是面向对象中的继承.公用部分放在父类,子类继承父类,然后扩展.呵呵.
- ECMAScript学习笔记
1. ECMAScript不存在块级作用域,因此在循环内部定义的变量,在循环外也是可以访问的 eg: var count =10; fpr(var i=0; i<count; i++){ ale ...