360杯信息安全技术大赛Web第一题分析

原题如下,提示是 程序员的坏习惯

根据提示,在当前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]的原值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值