最近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的多少次方還是0。md5('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和任意字串都弱相等。當比較的一方是字串時,會先把其轉換為數字,不能...