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

来源:互联网 发布:什么是面向接口编程 编辑:程序博客网 时间:2024/05/18 02:46
原题如下,提示是 程序员的坏习惯

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