PHP弱型別引發的漏洞例項

westwolf發表於2021-09-09

【非原創】
我們知道PHP 是一門弱型別語言,不必向 PHP 宣告該變數的資料型別,PHP 會根據變數的值,自動把變數的值轉換為正確的資料型別,但在這個轉換過程中就有可能引發一些安全問題。

型別轉換

  1. 會先進行型別轉換,再進行對比
  2. 會先比較型別,如果型別不同直接返回false,參考如下

圖片描述

注意:

  1. 當一個字串被當作一個數值來取值,其結果和型別如下:如果該字串沒有包含’.',’e',’E'並且其數值值在整形的範圍之內,該字串被當作int來取值。其他所有情況下都被作為float來取值,該字串的 開始部分 決定了它的值,如果該字串以合法的數值開始,則使用該數值, 否則其值為0 。
    圖片描述

  2. 在進行比較運算時,如果遇到了 0e 這類字串,PHP會將它解析為 科學計數法
    圖片描述

  3. 在進行比較運算時,如果遇到了 0x 這類字串,PHP會將它解析為 十六進位制 。
    圖片描述

例項: DedeCMS(20180109)任意使用者密碼重置
部落格: http://blog.nsfocus.net/dedecms-20180109/

函式鬆散性
switch()
如果switch是數字型別的case的判斷時,switch會將其中的引數轉換為int型別。
圖片描述

例項:HDwikiSQL隱碼攻擊
圖片描述

實際執行的語句:
$type = 'hot';

in_array()
in_array(search,array,type): 如果給定的值 search 存在於陣列 array 中則返回 true( 類似於==)。如果第三個引數設定為 true,函式只有在元素存在於陣列中且資料型別與給定值相同時才返回 true( 類似於=== )。如果沒有在陣列中找到引數,函式返回 false。
圖片描述

例項:免費開源相簿Piwigo SQL隱碼攻擊

is_number()
is_numeric在做判斷時候,如果攻擊者把payload改成十六進位制0x…,is_numeric會先對十六進位制做型別判斷,十六進位制被判斷為數字型為真,就進入了條件語句,如果再把這個代入進入sql語句進入mysql資料庫,mysql資料庫會對hex進行解析成字串存入到資料庫中,如果這個欄位再被取出來二次利用,就可能造成二次注入漏洞。
圖片描述

strcmp()
strcmp(string1,string2):比較括號內的兩個字串string1和string2,當他們兩個相等時,返回0;string1的大於string2時,返回>0;小於時返回圖片描述

md5()
string md5 ( string $str [, bool $raw_output = false ] )

md5()需要是一個string型別的引數。但是當你傳遞一個array時,md5()不會報錯,只是會無法正確地求出array的md5值,返回null,這樣就會導致任意2個array的md5值都會相等。
圖片描述

以上就是常見的利用PHP弱型別產生的一些安全問題,在CTF、PHP程式碼審計中也會遇到這種利用弱型別來繞過邏輯判斷,進而引發更大問題的漏洞。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4662/viewspace-2814224/,如需轉載,請註明出處,否則將追究法律責任。

相關文章