初探審計—md5類

0000 md5()和intval()

這是如下幾種繞過技術的依據git

01 「==」比較中的轉化問題

php的「==」是值比較,不會比較類型。那麼不一樣類型的比較會直接輸出false嗎?答案是否認的,好比string型==int型解釋器會將string轉化爲int再比較。而string轉化int,等價於使用intval(string)獲得的返回值。github

看看官網對intval()的一些解釋:數組

若是字符串包括了 "0x" (或 "0X") 的前綴,使用 16 進制 (hex);不然,
若是字符串以 "0" 開始,使用 8 進制(octal);不然,
將使用 10 進制 (decimal)。函數

成功時返回 var 的 integer 值,失敗時返回 0。
空的 array 返回 0,非空的 array 返回 1。網站

還有一條note:加密

Not mentioned elsewhere: intval(NULL) also returns 0.url

02 md5

還有md5()函數的一些特色:spa

md5(array())爲null.net

md5()爲null

1111 md5比較繞過

Ox1 源碼

<?php

$md51 = md5('QNKCDZO');
$a = @$_GET['a'];
$md52 = @md5($a);
if(isset($a)){
if ($a != 'QNKCDZO' && $md51 == $md52) {
    echo "nctf{*****************}";
} else {
    echo "false!!!";
}}
else{echo "please input a";}

?>

Ox2 函數註解

01 \(a = @\)_GET['a']

$a=GET["a"]; 其中的 @ 是爲了防止沒有 $_GET['a']出現錯誤提示.

可是 @ 的代價太高, 通常都用 isset() 來判斷一下.

比較通俗的寫法是:

if (isset($_GET['a'] ))
{
    $a = $_GET['a'] ;
}else
{
    $a = null;
}

Ox3 payload

http://127.0.0.1/Php_Bug/13.php?a=240610708

不討論具體的環境的話,代碼的邏輯是想找到一個和 'QNKCDZO' 有同一hash值的字符串(hash碰撞)。但在實踐的環境下由於「==」弱類型比較和 'QNKCDZO' md5以'0e'開頭,能夠構造md5值爲0eXXXXXXXXXX 的字符串,利用弱類型的轉換,將0eXXXXXXXXXX 轉成0。

md5('240610708'); // 0e462097431906509019562988736854 
md5('QNKCDZO'); // 0e830400451993494058024219903391

Ox4 總結

01 md5加密相等繞過

利用條件:使用爲加鹽的hash,使用弱等於做爲hash校驗的方式

構造:hash爲0eXXXXXXXXXX的字符串

var_dump(md5('240610708') == md5('QNKCDZO'));       //true
var_dump(md5('aabg7XSs') == md5('aabC9RqS'));         //true
var_dump(sha1('aaroZmOk') == sha1('aaK1STfY'));        //true
var_dump(sha1('aaO8zKZF') == sha1('aa3OFF9m'));      //true
var_dump('0010e2' == '1e3');                                                     //true
var_dump('0x1234Ab' == '1193131');                                      //true
var_dump('0xABCdef' == ' 0xABCdef');                                  //true

md5('240610708'); // 0e462097431906509019562988736854 
md5('QNKCDZO'); // 0e830400451993494058024219903391

2222 md5($temp)==0

01 hash爲0eXXXXXXXXXX的字符串

md5('240610708'); // 0e462097431906509019562988736854 
md5('QNKCDZO'); // 0e830400451993494058024219903391

url:

http://127.0.0.1/bugs/23.php?password=QNKCDZO

02 $temp=array()

url:

http://127.0.0.1/bugs/23.php?password[]=1

03 $temp=null

url:

http://127.0.0.1/bugs/23.php?password=

333 md5()函數===使用數組繞過

===是比較類型和值,這時候構造「hash爲0eXXXXXXXXXX的字符串」的字符不行了。

就利用數組,PHP對數組進行hash計算都會得出null的空值。

url:

http://127.0.0.1/bugs/18.php?username[]=1&password[]=2

總結

到這裏其實沒什麼好總結的,記住0000的md5特性和intval的特性,就會對其繞過有了基本的認識了。

記住這個,省得關鍵時候找不到:

md5('240610708'); // 0e462097431906509019562988736854 
md5('QNKCDZO'); // 0e830400451993494058024219903391

Ref

感謝"git主"(滑稽)地整理:github地址

感謝官網助攻:官網手冊

php md5()

php password_hash()

PHP 探測任意網站密碼明文/加密手段辦法

相關文章
相關標籤/搜索