萌新赛的web题

    1. <?php
    2. $six_number = $_POST['webp'];
    3. $a = $_POST['a'];
    4. $b = $_POST['b'];
    5. $c = $_POST['c'];
    6. if (md5($six_number) == 'e10adc3949ba59abbe56e057f20f883e' && md5($a) === md5($b) && $a !== $b) {
    7. if($array[++$c]=1){
    8. if($array[]=1){
    9. echo "nonono";
    10. }
    11. else{
    12. require_once 'flag.php';
    13. echo $flag;
    14. }
    15. }
    16. }
    17. ?>

    MD5(123456)=e10adc3949ba59abbe56e057f20f883e ==>webp=123456
    md5无法处理数组a[]=1&b[]=2
    分析c

    if($array[++$c]=1){
                        if($array[]=1){
                            echo "nonono";
                        }
                        else{
                            require_once 'flag.php';
                            echo $flag;
                        }}
    

    关键是;$array[]=1
    此语句正常赋值时,返回结果一定是为 1 的,要想跳出这个判断语句,必须让它赋值出问题。
    查阅资料后发现:

    作为PHP最重要的数据类型HashTable其key值是有一定的范围的,如果设置的key值过大就会出现溢出的问题,临界点是9223372036854775807这个数字。
    c=9223372036854775807

    payload

    webp=123456&a[]=1&b[]=2&c=9223372036854775806
    

    即可得到密码