变量覆盖
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