变量覆盖

2019-01-25  本文已影响8人  seeiy

进入靶场环境以后,注意到下方有一个“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
上一篇下一篇

猜你喜欢

热点阅读