原題如下,提示是 程式員的壞習慣
根據提示,在當前URL後加.bak,獲得源碼
<?phperror_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]的原值