打开就是登录界面,直接'123456',出现弹窗,还以为是js验证(想多了),CTRL+u打开源码

$(function(){
    var $login = $("#login");
    $login.on(
        "click",function(){
            try{
                $.ajax({
                    url: '/admin/checklogin.php',
                    type: 'POST',
                    dataType:'json',
                    cache: false,
                    data: new FormData($('#form-login')[0]),
                    processData: false,
                    contentType: false
                    }).done(function(res){
                        if(data.result=='true'){
                            alert('登陆成功');
                        }else{
                            alert('登陆失败');
                        }
                    }).fail(function(res){
                        alert('登陆失败');
                    });
            }catch(e){
                alert(e);
            }
        }
    );
});

打开checklogin.php,出现一个链接,点进去,源码里有checklogin.txt,又是代码审计(应该是checklogin.php的源码),内容如下:

session_start();
$_SESSION['pwd']=time();
foreach(array_keys($_REQUEST) as $v){
        $key = $v;
        $$key = $_REQUEST[$v]; # 重点在这,可变变量
    }
if (isset ($_POST['password'])) {
    if ($_SESSION['pwd'] == $pwd)
        die('Flag:'.$flag);
    else{
        print '<p>猜测错误.</p>';
        $_SESSION['pwd']=time().time();
    }
}

array_keys函数的作用的读取给定数组的键,比如POST发送"password=123456",在后端就是$_REQUEST['password']='123456',那么$_key的值就是'password',"$$key=$_REQUEST[$v]"就是"$password=$REQUEST['password']

同理,POST发送"_SESSION[pwd]=123456",$_key的值就是"_SESSION[pwd]",得到$_SESSION[pwd]='123456'

所以最终payload是"_SESSION[pwd]=1&pwd=1&password="