1. 程式人生 > >md5()弱型別和sha1()函式(繞過姿勢)

md5()弱型別和sha1()函式(繞過姿勢)

md5()加密與sha1()函式

1.md5概念

MD5是message-digest algorithm>
5(資訊-摘要演算法)的縮寫,被廣泛用於加密和解密技術上,它可以說是檔案的“數字指紋”。任何一個檔案,無論是可執行程式、影象檔案、臨時檔案或者其他任何型別的檔案,也不管它體積多大,都有且只有一個獨一無二的MD5資訊值,並且如果這個檔案被修改過,它的MD5值也將隨之改變。因此,我們可以通過對比同一檔案的MD5值,來校驗這個檔案是否被“篡改”過。

有關md5加密的題目連結MD5

我們來看一下原始碼

if (isset($_GET['a']) and isset($_GET['b'])) {
if ($_GET['a'] != $_GET['b'])
if (md5($_GET['a']) == md5($_GET['b']))
die('Flag: '.$flag);
else
print 'Wrong.';
}

解法一

b必須存在且值不等,但是經過md5加密之後相等,首先我們能想到的是md5的一個缺陷,也就是說經過md5加密之後以0e開頭的,值都為0,那是因為0e在比較的時候會將其視作為科學計數法,所以無論0e後面是什麼,0的多少次方還是0。於是上網查了一下以0e開頭的md5值

這裡是連結構造如下語句:

http://chinalover.sinaapp.com/web17/index.php?a=s878926199a&b=s155964671a

我們來看一下頁面的反應
這裡寫圖片描述
得到flag:nctf{php_is_so_cool}

解法二

另外我們知道,md5是獲取不到陣列的值的,會預設陣列為0,那麼如果輸入兩個陣列並賦予不同的值,不妨試一下

http://chinalover.sinaapp.com/web17/index.php?a[]=0&b[]=1

結果得到的和上面的方法一樣。

2.sha1()函式

(1)sha1()函式功能這裡是連結
我們來做個題目,看原始碼:

<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
    if ($_GET['uname'] == $_POST['passwd'])

        print 'passwd can not be uname.';

    else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))

        die('Flag: '.$flag);

    else

        print 'sorry!';

}

分析一下程式碼,發現GET了兩個欄位name和password,獲得flag要求是:uname和passwd是相通的,雖然看起來這是不可能的,其實可以利用sha1()函式的漏洞來繞過,如果把這兩個欄位構造為陣列:

http://120.24.86.145:8002/web7/?id=margin&uname[]=1

這裡寫圖片描述

這樣在第一處判斷時兩陣列確實是不同的,但在第二處判斷時由於sha1()函式無法處理陣列型別,將報錯並返回false,if 條件成立,獲得flag。