美文网首页
变量覆盖

变量覆盖

作者: seeiy | 来源:发表于2019-01-25 14:28 被阅读8次

    进入靶场环境以后,注意到下方有一个“source at /source.php”,点进去以后发现是个源码页

    完整的源码如下:

    <?php
    include("secret.php");
    ?>
    <html>
        <head>
            <title>The Ducks</title>
            <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">
            <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>
        </head>
        <body>
            <div class="container">
                <div class="jumbotron">
                    <center>
                        <h1>The Ducks</h1>
                        <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
                            <?php
                            extract($_POST);
                            if ($pass == $thepassword_123) { ?>
                                <div class="alert alert-success">
                                    <code><?php echo $theflag; ?></code>
                                </div>
                            <?php } ?>
                        <?php } ?>
                        <form action="." method="POST">
                            <div class="row">
                                <div class="col-md-6 col-md-offset-3">
                                    <div class="row">
                                        <div class="col-md-9">
                                            <input type="password" class="form-control" name="pass" placeholder="Password" />
                                        </div>
                                        <div class="col-md-3">
                                            <input type="submit" class="btn btn-primary" value="Submit" />
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </form>
                    </center>
                </div>
                <p>
                    <center>
                        source at <a href="source.php" target="_blank">/source.php</a>
                    </center>
                </p>
            </div>
        </body>
    </html>
    

    进行筛选,选出需要关注的代码如下:

                        <?php if ($_SERVER["REQUEST_METHOD"] == "POST") { ?>
                            <?php
                            extract($_POST);
                            if ($pass == $thepassword_123) { ?>
                                <div class="alert alert-success">
                                    <code><?php echo $theflag; ?></code>
                                </div>
                            <?php } ?>
                        <?php } ?>
    

    之前我只知道PHP的变量覆盖的$$符号这种方式,查了下还有一些函数,如下:

    extract()
    parse_str()
    import_request_variables()
    $$
    

    这里存在变量覆盖的原因就在于的extract()函数。

    关于PHP变量覆盖的详细说明的可以参考这里

    extract() 函数从数组中将变量导入到当前的符号表。
    该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

    这里刚开始没弄清楚到底是覆盖什么哪个变量,刚开始以为是将pass覆盖成password_123,事实证明我看错了,也想错了。

    这里真正重写的地方是$_POST
    $_POST在PHP中是指定接受参数的方式
    

    将POST方法传过来的变量进行重写。

    图片.png

    弹flag的条件就是pass和thepassword_123相等,那就知道该怎么传了。

    image.png

    随便构造一个值,使pass和thepassword_123相等即可。

    图片.png

    相关文章

      网友评论

          本文标题:变量覆盖

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