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相等對於上述第二個問題我查了php手冊:2 「1admin」=1 比較的時候會將1admin轉化成數值,結果為1,而admin1=1 卻等於錯誤,也就是"admin1"被轉化成了0,為什麼呢??
3 「0e123456」=="0e456789"相互比較的時候,會將0e這類字串識別為科學技術法的數字,0的無論多少次方都是零,所以相等。
以上=代表雙等於。
當乙個字串被當作乙個數值來取值,其結果和型別如下:
如果該字串沒有包含』.』,『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和任意字串都弱相等。當比較的一方是字串時,會先把其轉換為數字,不能...