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. ...
随机推荐
- ubutu强制结束进程 kill -9 ProcessID
强制终止进程 kill -9 2128 表示强制结束进程号 2128 对应的进程.
- centos下的hadoop集群实现ssh的无密码登陆
CentOS 下SSH无密码登录的配置 最近学习Hadoop.它要求各节点之间通过SSH无密码登录,配置SSH的时候费了一番功夫,记录下来,以备忘. 配置SSH无密码登录需要3步: 1.生成公钥和私钥 ...
- 网络请求--Retrofit2用法
欢迎Follow我的GitHub, 关注我的CSDN. Retrofit是Square开发的网络请求库, 简化了网络请求的使用, 这个库太知名了, 优点我就不多说了. 让我们看看怎样使用吧? 注意: ...
- appium 控件定位
转自:http://www.2cto.com/kf/201410/340345.html AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用 ...
- Linux 常用命令 (备忘)
查看linux版本信息 uname -r cat /proc/version
- Mongoose Embedded Web Server Library
https://github.com/cesanta/mongoose http://ltp.ai/docs/ltpserver.html LTP Server在轻量级服务器程序mongoose基础上 ...
- 如何解决Windows的端口占用问题?
已知某应用在启动时会创建服务套接字,并将其绑定至端口8888,然而端口8888已被占用,如何解除占用? 以下为解决方案: 在cmd中运行netstat -ano|findstr 8888,其中的参数8 ...
- POJ2942 Knights of the Round Table 点双连通分量 二分图判定
题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...
- ie下文件上传无权访问的问题
最近项目遇到个问题,ie下文件上传无权访问,在网上找了很久才找到答案,原来是因为ie下不能用js触发input=file的点击事件,必须手动点击才可以.
- 更改scroll样式
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ ::-webkit-scrollbar { width: 2px; height: 80%; background: #fff; } /*定 ...