1. 程式人生 > 其它 >bugku 前女友WP (md5繞過 strcmp繞過)

bugku 前女友WP (md5繞過 strcmp繞過)

bugku 前女友WP (md5繞過 strcmp繞過)

php程式碼如下

<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
    $v1 = $_GET['v1'];
    $v2 = $_GET['v2'];
    $v3 = $_GET['v3'];
    if($v1 != $v2 && md5($v1) == md5($v2)){
        if(!strcmp($v3, $flag)){
            echo $flag;
        }
    }
}
?>

關鍵兩點

  1. v1 != v2 && md5(v1) == md5(v2)
  2. strcmp(v3, flag)==0

1.md5繞過

法1:md5碰撞

使用fastcoll等工具進行md5碰撞,得到兩個本身不同但md5碼完全相同的字串

法2:科學計數法繞過弱型別比較

使用兩個不同的字串,但md5碼都以0e開頭,即值為0,判斷為相等

如:

QNKCDZO

0e830400451993494058024219903391

240610708

0e462097431906509019562988736854

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

法3:陣列繞過md5函式,返回null

php中md5()之類的雜湊函式計算的是一個字串的雜湊值,對於陣列則返回false

所以傳入兩個不同的陣列即可繞過

2.strcmp繞過

strcmp函式原型

strcmp

Binary safe string comparison

<?php
function strcmp(string $string1, string $string2): int { }
@param string $string1 — The first string.

@param string $string2 — The second string.

@return int

比較的是string字串型別大小,如果傳入陣列則直接返回0,傳入陣列即可成功