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