PHP弱類型比較與md5繞過

2021-12-25 寰宇衛士

md5碰撞只是一種掌握php弱類型的方式,弱類型的內容有很多,數組、字符串比較等等,但不論以哪種方式考,涉及的知識點都是相通的,寰宇衛士希望通過對基礎知識的分享與大家一同學習進步。

php是一門弱類型的語言,它不會嚴格檢驗變量類型,變量可以不顯示地聲明其類型,而是在運行期間直接賦值。

在php中比較是否相等有兩種符號:==和===。

其中==在比較時會將不同類型的變量或值轉換為相同類型再進行比較。

而===則直接比較類型是否相同,如果同類型,再比較值。

那麼php弱類型這裡的「弱」,指的不是某個類型有什麼問題,而是整個php語言中某些函數在處理賦值、字符串比較、變量比較的過程中對類型似乎並不關心,弱化了類型帶來的影響,在使用某個變量時不需要我們定義變量的類型,而是根據內容判斷這是什麼類型,從而導致了各種漏洞的發生。例如:

<?phpvar_dump("a"==0);  //truevar_dump("1a"==1); //truevar_dump("a1"==1); //falsevar_dump("a1"==0); //truevar_dump("0e123456"=="0e234567"); //truevar_dump(0=="1a"); //false?>

輸出結果是:

bool(true)bool(true)bool(false)bool(true)bool(true)bool(false)

出現上述判斷輸出的原因是,在php中當一個字符串被當作一個數值來取值時,如果該字符串沒有包含'.','e','E',並且其數值值在整形的範圍之內時,該字符串被當作int來取值,其他所有情況下都被作為float來取值,而該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0。

所以在上面的情況中,1a轉換為1,a1轉換為0,而"0e123456"=="0e234567"相互比較的時候,會將0e這類字符串識別為科學計數法的數字,0的無論多少次方都是零,所以相等。這就是常說的0e繞過的原理。

「MD5,即消息摘要算法(英語:MD5 Message-Digest Algorithm)。是一種被廣泛使用的密碼散列函數,將數據(如一段文字)運算變為另一固定長度值,是散列算法的基礎原理,可以產生出一個128位(16位元組)的散列值(hash value),用於確保信息傳輸完整一致。

顯然128位不足以把世界上所有消息的摘要毫不重複的計算出來,當然現在16位元組(128位)、32位元組(256位)的md5也都有,選擇位數多的方式可以在一定程度上減少硬碰撞(collision)的可能性。

<?php$flag = 'ook!';$a = $_GET['a'];if ($a != 'QNKCDZO' && md5($a) == md5('QNKCDZO')) {    echo $flag;}else{echo('你的答案不對0.0');}

上面這段代碼中就是上述0e開頭的所有字串都被認為是0,所以我們先看看md5('QNKCDZO')的結果是0e830400451993494058024219903391,那麼所有0e開頭的md5串都可以滿足上面的條件。

常用的0e開頭md5值的字符串有:

 

QNKCDZO

0e830400451993494058024219903391

240610708

0e462097431906509019562988736854

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

s214587387a

0e848240448830537924465865611904

在php中的hash函數md5、sha1等處理中若傳入一個數組的值,則會報錯返回NULL,而返回的值在類型和內容上都是相同的,所以可以用來繞過某些兩邊參數可控的場景,上面只能控制一邊的值傳入,所以數組類型不適用。

<?php$flag = "ook!";$a = $_GET['a'];$b = $_GET['b'];if ($a != $b && md5($a) === md5($b)) //這裡==也可以使用數組繞過。  echo $flag;?>

上述的例子中傳入?a[]=a&b[]=b即可滿足既不相等,md5後又相等的條件,雖然報錯,但仍然輸出了正確的值。具體輸出為:

Warning: md5() expects parameter 1 to be string, array given in 1.php on line 5Warning: md5() expects parameter 1 to be string, array given in 1.php on line 5ook!

php在處理傳入的json串時使用json_decode將其解碼,再進行比較時,我們不需要知道比較字串的內容,也可以利用字符串與0比較為真的特點繞過。

<?php$flag = 'ook!';$a = $_GET['a'];$b = json_decode($a);echo $b->abc;var_dump($b->abc == $flag);if ($b->abc == $flag)    echo $flag;else  echo "error!!";?>

當傳入?a={"abc":0}時,分別輸出:0、bool(true)和00k。注意這裡的{"abc":0},0是數字,而加雙引號{"abc":"0"}之後兩邊都是字符,就不相等了。

原理都是類型轉換的問題,函數的原型為: mixed array_search ( mixed $needle , array $haystack [, bool $strict = false ] )。

其中$needle,$haystack必需,$strict可選 函數判斷$haystack中的值是存在$needle,存在則返回該值的鍵值(數組的下標,例如該值在第一位返回0,第二位返回1),第三個參數默認為false,如果設置為true則會進行嚴格過濾(帶類型的比較)。

<?php$a = array(0,1,2,3);var_dump(array_search("a",$a));var_dump(array_search("1a",$a));var_dump(array_search("2a",$a));var_dump(array_search("1a",$a,true));?>

結果為:

int(0) int(1)int(2)bool(false)

 

總結

從上面我們可以看出,所有繞過的形式都是基於弱類型的比較,或值對於不合規參數類型的錯誤處理,數組與字符串、字符串與整數等等情形,我們不能保證每個用戶都乖乖輸入我們想要的值,因此在php中限定用戶輸入的類型和值就顯得尤為重要。

 

原文來源:CSDN  AFCC_|侵刪

中電運行是專業專注培養能源企業IT工匠和提供IT整體解決方案的服務商,也是能源網際網路安全專家。

為方便大家溝通,中電運行開通「中電運行交流群」,誠摯歡迎能源企業和相關人士,以及對網絡安全感興趣的群體加入本群,真誠交流,互相學習。想加入我們就給我們留言吧。

 

相關焦點

  • PHP弱類型總結
    弱類型語言是一種弱類型定義的語言,某一個變量被定義類型,該變量可以根據環境變化自動進行轉換,不需要經過現行強制轉換。代表有VB,PHP,JavaScript等語言。php2    $a==$b;3    $a===$b;4    ?>在進行===符號比較時,會先判斷兩種字符串類型是否相同,再比較值是否相同。
  • 【網安帶專測評】md5bypass靶場八關
    分析:$_GET["pass"] != hash("md4", $_GET["pass"]!結果:代碼做了數據類型判斷,我們可以採用科學計數法繞過,一個需全部為數字,另一個需要全部為字母。
  • php 弱類型問題
    ,在弱類型機制下,你能夠給一個變量賦任意類型的值。但由於 php 在定義變量時並不需要像 C++ 語言那樣去定義其變量類型,因此在一些 CTF web 題目中,經常會碰到一些源碼是 php 的題目,我們可以通過分析代碼,結合 php 弱類型問題去嘗試繞過。
  • 【代碼審計】PHP代碼審計之CTF系列(3)
    >過程分析伺服器會包含一個flag.php文件,為了最終die($flag)的順利執行,需要繞過上面的各種驗證,而邏輯本身有兩處矛盾:$_GET數組本身提取自QUERY_STRING,$_GET['^_^']中key包含_符號,而QUERY_STRING卻不允許。
  • CTF中常見的PHP漏洞小結
    md5()漏洞  PHP在處理哈希字符串時,會利用」!=」或」==」來對哈希值進行比較,它把每一個以」0E」開頭的哈希值都解釋為0,所以如果兩個不同的密碼經過哈希以後,其哈希值都是以」0E」開頭的,那麼PHP將會認為他們相同,都是0。
  • 文庫|PHP弱類型
    php$pass=@$_GET['pass'];$pass2=@$_GET['pass2'];@$pass1='asdasdasd';if(strcmp($pass,$pass2)==0&& $pass !
  • 淺談md5弱類型比較和強碰撞
    的題目太常見了,雖然有很多這方面的文章,但相對來說比較零散,這裡主要將自己學習和比賽時遇到的md5弱類型和強碰撞的題目從淺到深地梳理一下。基本知識php中有兩種比較的符號==與=====在進行比較的時候,如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換為數值並且比較按照數值來進行。===在進行比較的時候,會先判斷兩種字符串的類型是否相等,再比較。
  • php弱類型初級入門介紹
    藉此,總結一下php弱類型。0x01 知識介紹php中有兩種比較的符號 == 與 ===<?php$a == $b ;$a === $b ;?>所以就解釋了"admin1"==1 =>False 的原因0x02 CTF/實戰md5繞過(Hash比較缺陷)<?
  • php代碼審計總結
    偽協議進行一個繞過。比較相等繞過MD5md5('240610708')==md5('QNKCDZO')md5('aabg7XSs')==md5('aabC9RqS')SHA1sha1('aaroZmOk
  • CTF中關於md5的一些總結
    當然也可以用INF繞過,原理類似,這裡不過多贅述案例2——強網杯2020——Funhash<?phpinclude 'conn.php';highlight_file("index.php");//level 1if ($_GET["hash1"] !
  • PHP代碼審計要點
    >這裡引用小密圈中P牛的解讀查看php源碼,其實我們能發現,php讀取、寫入文件,都會調用php_stream_open_wrapper_ex來打開流,而判斷文件存在、重命名、刪除文件等操作則無需打開文件流。
  • php代碼審計學習之函數缺陷
    弱類型比較時,6php會轉換為6,6在1-24中間,所以可以進行上傳piwigo2.7.1實例分析漏洞分析case 'rate' : { include_once(PHPWG_ROOT_PATH.'
  • 你所不知道的php編程中那些坑~
    php$a = '123';?>//file2.php<?a = 21474836470,看上去是整數,實際上是浮點數,a = floatval(21474836470 ) 確保是一個數字8.md5和sha1的0e...的問題$md5_1 = md5('240610708');$md5_2 = md5('QNKCDZO');
  • CTF中的PHP安全特性總結
    B、結合上述特性,可以使用其他進位進行繞過intval限制進而輸出flag。2.4 PayLoad選擇使用十六進位進行繞過:1. intval('0x117c')===4476   3.1 代碼示例3.
  • MD5足夠嗎----談PHP中信息加密技術
    當時我愣了一下,因為我把非對稱加密與單項散列加密的概念弄混淆了,所以更不用說什麼非對稱加密算法中有什麼經典算法,結果當然也讓面試官愣了一下,所以今天就花點時間說說PHP中的信息加密技術信息加密技術的分類單項散列加密技術(不可逆的加密)屬於摘要算法,不是一種加密算法,作用是把任意長的輸入字符串變化成固定長的輸出串的一種函數MD5string md5 ( string $
  • php mysql SQL注入語句構造
    聲明:文章所有提到的「漏洞」,都沒有經過測試,可能根本不存在,其實有沒有漏洞並不重要,重要的是分析思路和語句構造。   二.「漏洞」分析:   1.admin/login.php注射導致繞過身份驗證漏洞:   代碼:   $conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);   $password = md5($password);   $q = "select id,group_id from
  • 淺談WAF繞過技巧
    常見的函數:extractvalue(1, concat(0x5c,md5(3)));updatexml(1, concat(0x5d,md5(3)),1);GeometryCollection((select*from(select*from(select@@version)f)x))polygon((select*from(select name_const
  • PHP 那些「坑」
    本文持續更新,歡迎關注字符串 == 比較類型強轉隱患http://php.net/manual/zh/language.operators.comparison.php
  • php異或計算繞過preg_match()
    進行連接,便可以繞過preg_match匹配。詳情了解php不同於其他語言部分但是很多的preg_match會過濾掉".",所以需要使用異或運算進行繞過,很多的免殺馬都是這樣製作的。php對字符進行異或運算是先將字符轉換成ASCII碼然後進行異或運算,並且php能直接對一串字符串進行異或運算,例如"123"^"abc"是"1"與"a"進行異或然後"2"與"b"進行異或,以此類推,在異或結束後就獲得了想要的字符串。
  • 【實戰講究】PHP靶場實戰分析——DVWA
    >取圖片頭部驗證是否為圖片1getimagesize( $uploaded_tmp )cmd合成圖片馬即可1copy 1.jpg/b+1.php/a hack.jpg採用%00截斷的方法可以輕鬆繞過文件名的檢查,採用剛才的圖片一句話進行上傳。