zoukankan      html  css  js  c++  java
  • 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读出来了。

  • 相关阅读:
    Python学习第151天(Django之多对多)
    Python学习第150天(目前正在做的内容介绍)
    挑战日语学习100天:Day11
    挑战日语学习100天:Day10
    hdu3853 LOOPS 期望dp
    最长公共子串
    基于后缀数组的字符串匹配
    高度数组模板
    Jenkins持续集成自动化测试
    自动化上传文件
  • 原文地址:https://www.cnblogs.com/Pinging/p/8628445.html
Copyright © 2011-2022 走看看