php 弱型別總結

2021-08-25 02:28:58 字數 2540 閱讀 9738

最近ctf比賽,不止一次的出了php弱型別的題目,藉此想總結一下關於php弱型別以及繞過方式

php中有兩種比較的符號 == 與 ===

<?php

$a = $b ;

$a===$b ;

?>

=== 在進行比較的時候,會先判斷兩種字串的型別是否相等,再比較

== 在進行比較的時候,會先將字串型別轉化成相同,再比較

如果比較乙個數字和字串或者比較涉及到數字內容的字串,則字串會被轉換成數值並且比較按照數值來進行
這裡明確了說如果乙個數值和字串進行比較的時候,會將字串轉換成數值

<?php

var_dump("admin"==0); //true

var_dump("1admin"==1); //true

var_dump("admin1"==1); //false

var_dump("admin1"==0); //true

var_dump("0e123456"=="0e4456789"); //true

?> //上述**可自行測試

觀察上述**,"admin"==0 比較的時候,會將admin轉化成數值,強制轉化,由於admin是字串,轉化的結果是0自然和0相等

"1admin"==1 比較的時候會將1admin轉化成數值,結果為1,而「admin1「==1 卻等於錯誤,也就是"admin1"被轉化成了0,為什麼呢??

"0e123456"=="0e456789"相互比較的時候,會將0e這類字串識別為科學技術法的數字,0的無論多少次方都是零,所以相等

對於上述的問題我查了php手冊

當乙個字串當作乙個數值來取值,其結果和型別如下:如果該字串沒有包含'.','e','e'並且其數值值在整形的範圍之內

該字串被當作int來取值,其他所有情況下都被作為float來取值,該字串的開始部分決定了它的值,如果該字串以合法的數值開始,則使用該數值,否則其值為0。

<?php

$test=1 + "10.5"; // $test=11.5(float)

$test=1+"-1.3e3"; //$test=-1299(float)

$test=1+"bob-1.3e3";//$test=1(int)

$test=1+"2admin";//$test=3(int)

$test=1+"admin2";//$test=1(int)

?>

所以就解釋了"admin1"==1 =>false 的原因

md5繞過(hash比較缺陷)

<?php

if (isset($_get['username']) && isset($_get['password']))

if (!is_numeric($password) )

if (md5($username) != md5($password))

if ($logined)else

}?>

題目大意是要輸入乙個字串和數字型別,並且他們的md5值相等,就可以成功執行下一步語句 

介紹一批md5開頭是0e的字串 上文提到過,0e在比較的時候會將其視作為科學計數法,所以無論0e後面是什麼,0的多少次方還是0md5('240610708')[0e462097431906509019562988736854] == md5('qnkcdzo')

[0e830400451993494058024219903391]        兩者都為0成功繞過!

qnkcdzo

0e830400451993494058024219903391

s878926199a

0e545993274517709034328855841020

s155964671a

0e342768416822451524974117254469

s214587387a

0e848240448830537924465865611904

s214587387a

0e848240448830537924465865611904

s878926199a

0e545993274517709034328855841020

s1091221200a

0e940624217856561557816327384675

s1885207154a

0e509367213418206700842008763514

json繞過

<?php

if (isset($_post['message']))

else

} else

?>

php 弱型別總結

0x01 前言 最近ctf比賽,不止一次的出了php弱型別的題目,藉此想總結一下關於php弱型別以及繞過方式 0x02 知識介紹 php中有兩種比較的符號 與 1 2 a b 3 a a a b 4 在進行比較的時候,會先判斷兩種字串的型別是否相等,再比較 在進行比較的時候,會先將字串型別轉化成相同...

PHP弱型別安全問題總結

前段時間做了南京郵電大學網路攻防平台上面的題目,寫了乙個writeup之後,還有必要總結一下。由於做的題目都是web型別的,所有的題目都是使用php來寫的,所以很多題目並沒有考察到傳統的如sql注入,xss的型別的漏洞,很多都是php本身語法的問題。鑑於目前php是世界上最好的語言,php本身的問題...

php 弱型別比較

php中 是弱等於,不會比較變數型別 是強等於,會先比較變數型別。0e 開頭跟數字的字串 例如 0e123 會當作科學計數法去比較,所以和0相等 0x 開頭跟數字的字串 例如 0x1e240 會被當作16進製制數去比較 布林值true和任意字串都弱相等。當比較的一方是字串時,會先把其轉換為數字,不能...