PHP是弱类型还是强类型,php弱类型比较(松散比较) | CN-SEC 中文网
總結一下關于php(拍h片)弱類型相關知識的梳理。
前言
php有八種類型
標量類型:整數型integer,浮點型float,字符串類型string,布爾類型boolen
復合類型:對象 object,數組array
特殊類型:空null,資源resource
我們要知道php是一種弱類型的語言,它不同于C/Go/java等。
那么首先,說一下php中兩個比較符號。
在這里要說明一下,==在這里是判斷兩邊的值是否相等,等號兩邊為相同的值的時候,直接判斷值是否相等,如果類型不一樣,則先轉換為相同的類型,再判斷轉換后的值是否相等。
(若是等號兩邊是數值和字符串比較,則字符串會轉換為數值,字符串轉為數值這里很有意思了,大家可以用var_dump去嘗試一下不同的類型轉換)
(比如像這樣多嘗試嘗試)
其中為什么第11行為true呢,這里是php中的hash缺陷,如果hash值是以0e開頭的,進行比較時候會變成0乘以10的多少次方,結果還是為0
(ps:如果MD5運算后為0e開頭的字符串,是不是可以繞過強制(string)轉換后的MD5比較呢)
提醒:0,"0",null,false,array()都是為空。
===,則是判斷的是否全等,不僅要值相等,而且類型也要一致。
而在有些語言中(比如Go),要比較的兩個變量類型須相等并且Go沒有隱式類型轉換,要比較的兩個變量必須類型完全一樣,類型別名都也不行。
這里便可以先從一個簡單的題目入手(題目來自攻防世界)。
is_numeric() 函數
用于檢測變量是否為數字或數字字符串(感覺說明這個函數,大家就沒有生詞了)。
然后就是一個很簡單的弱類型比較了,大家隨便輸一下符合兩個邏輯的就行了。
有了這些準備以后,我們可以進階的再看一個題目(題目來自于BUUCTF)。
我們邁過第一關以后會看到這個頁面,F12得到了提示。
$a = $GET['a'];$b = $_GET['b'];if($a != $b && md5($a) == md5($b)){// wow, glzjin wants a girl friend.
知識補充
md5( string $str [, bool $raw_output = false ] ) : string
計算字符串的 MD5 散列值,md5函數告訴我們我們傳入的參數應該是string類型的,但如果我們傳入一個數組,它不會報錯,也不會解析其值,導致兩個數組的中無論什么值MD5都相同(出同樣的錯誤是不是也是一樣的呢)。
然后我們便可以傳入兩個數組來進行繞過了。
到了第三關,便和第二關大同小異了。
如果我們遇到強制類型轉換比如再傳參的參數前面有一個(string)類型轉換,那怎么辦,那邊要用的MD5強碰撞了(記得以前看過一個cissp的題目講的也是碰撞出MD5,也解釋MD5的不安全性)。
這里我們大多可能要用一下工具(fastcoll)
講完了MD5我們再將另一個,sha(題目來自于bugku,web29各種繞過)。
知識補充
sha1( string $str [, bool $raw_output = false ] ) : string
——計算字符串的 sha1 散列值,測試sha1()函數和md5()函數"殊途同歸"。
這里還有很多可以利用的函數,比如 json_decode() {傳入json形式的數據,類Python中的字典},不可否認的是任何函數的繞過都需要相關的邏輯判斷。
{json_decode()把接送格式的字符串解碼成了數組,而通過相應的邏輯判斷我們便可的繞過}
下面我們會介紹與弱類型相呼應的php函數。
unserialize函數問題
知識補充
對單一的已序列化的變量進行操作,將其轉換回 PHP 的值。
key和value是我們可以通過POST數據傳入的值,我們把它傳入bool值,unserialize函數解析為了數組,下面又因為使用的是 ==,根據php弱類型,bool值跟任何字符串都相等。
故判斷成立輸出了OK。
strpos函數問題
知識補充
strpos ( string $haystack , mixed $needle [, int $offset = 0 ] ) : int
返回 needle 在 haystack 中首次出現的數字位置。
問題的出現依然是出現了0=="admin"的弱類型比較的問題。
php中的哲學問題
(代碼中還有哲學問題?)
因為以前老師問過我們這個問題,為什么呢,用一句模糊的話來說"無限接近就是相等"。
in_array()函數問題
知識補充
in_array( mixed $needle , array $haystack [, bool $strict = false ] ) : bool
— 檢查數組中是否存在某個值,若第三個參數strict為默認的false,則使用松散比較。
這是便我們嘗試對比的結果了。
相關題目(php審計題目):
首先我們發現in_array()并沒有使用第三個參數,所以為默認值,可以進行松散比較。我們只要再*.php前面加上一個在range(1,24),比如23a.php。
array_search()問題
array_search ( mixed $needle , array $haystack [, bool $strict = false ] ) : mixed
— 在數組中搜索給定的值,如果成功則返回首個相應的鍵名,與in_array()函數類似。
strcmp()函數問題
知識補充
比較兩個字符串(區分大小寫)
strcmp(string1,string2)
返回值:
? 0 - 如果兩個字符串相等
? <0 - 如果 string1 小于 string2
? >0 - 如果 string1 大于 string2
測試缺陷的方法和MD5函數類似,我們不給予這個函數string類型,而是給它array類型的值。
發現它依然是給出警告,但依然判斷為ture,打印出了ok。(題目來自南京郵電大學網絡攻防訓練平臺-pass check)
<?php $pass1=***********;//被隱藏起來的密碼if(isset($pass)){if(@!strcmp($pass,$pass1)){echo "flag:nctf{*}";}else{echo "the pass is wrong!";}}else{echo "please input pass!";}?>/*wp:<?php $k[]=1;var_dump(!strcmp($k, "flag"));printf("n");?>*/
switch相關的問題
如果switch的case是數字類型的判斷的時候。switch會將參數轉換為int類型。
不要慌張,繼續加油哈。
end
本文始發于微信公眾號(雷石安全實驗室):php弱類型比較(松散比較)
總結
以上是生活随笔為你收集整理的PHP是弱类型还是强类型,php弱类型比较(松散比较) | CN-SEC 中文网的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么unity 安装完模块还是找不到s
- 下一篇: 程序员的数学_数学公式太晦涩,不如用代码