php 弱型別總結

2021-09-22 22:50:07 字數 1668 閱讀 4245

0x01 前言

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

0x02 知識介紹

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

1 <?php

2 $a = $b ;

3 a ==

=a===

a===

b ;4 ?>

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

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

如果比較乙個數字和字串或者比較涉及到數字內容的字串,則字串會被轉換成數值並且比較按照數值來進行

這裡明確了說如果乙個數值和字串進行比較的時候,會將字串轉換成數值

<?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

?>

//上述**可自行測試

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

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

3 「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 的原因

php 弱型別總結

最近ctf比賽,不止一次的出了php弱型別的題目,藉此想總結一下關於php弱型別以及繞過方式 php中有兩種比較的符號 與 a b a b 在進行比較的時候,會先判斷兩種字串的型別是否相等,再比較 在進行比較的時候,會先將字串型別轉化成相同,再比較 如果比較乙個數字和字串或者比較涉及到數字內容的字串...

PHP弱型別安全問題總結

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

php 弱型別比較

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