最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

PHP弱類型

2023-03-14 15:13 作者:青陽小棧  | 我要投稿


> ## Excerpt

> 知識介紹:php中有兩種比較的符號`==`與`===`**<?php$a == $b;$a === $b;?>===在進行比較的時候,會先判斷兩種字符傳類型是否相等,再比較1、==和=====為弱相等,也就是說12=="12" --> true,而且12=="12cdf" --> true,只取字符串中開頭的整數(shù)部分,但是1e3dgf這樣的字符串在比較時,取的是符合科學(xué)計數(shù)法的部分:1e3,也就是1000.而且bool類型的true


---

## 知識介紹:


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


> <?php

>?

> $a == $b;

>?

> $a === $b;

>?

> ?>


\===在進行比較的時候,會先判斷兩種字符傳類型是否相等,再比較


## **1、==和===**


\==為弱相等,也就是說12=="12" --> true,而且12=="12cdf" --> true,只取[字符串](https://so.csdn.net/so/search?q=%E5%AD%97%E7%AC%A6%E4%B8%B2&spm=1001.2101.3001.7020)中開頭的整數(shù)部分,但是1e3dgf這樣的字符串在比較時,取的是符合科學(xué)計數(shù)法的部分:1e3,也就是1000.


**而且bool類型的true和任意字符串的弱類型相等**


\===為完全相等,數(shù)據(jù)類型和值都相等時返回true。


\==在進行比較的時候,會先將字符串類型轉(zhuǎn)化成相同,再比較(如何比較一個數(shù)字和字符串或者比較涉及到數(shù)字內(nèi)容的字符串,則字符串會被轉(zhuǎn)換成數(shù)值,并且按照數(shù)值來進行)


這里明確說明一個數(shù)值和字符串進行比較的時候,會將字符串轉(zhuǎn)換成數(shù)值


> <?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轉(zhuǎn)化成數(shù)值,強制轉(zhuǎn)化,由于admin是字符串,轉(zhuǎn)化的結(jié)果是0自然和0相等


2."1admin"\`==\`1 比較的時候會將1admin轉(zhuǎn)化成數(shù)值,結(jié)果為1,而"admin1"\`==\`1 卻等于錯誤,也就是"admin1"被轉(zhuǎn)化成了0,為什么呢??


3."0e123456"\`==\`"0e456789"相互比較的時候,會將0e這類字符串識別為科學(xué)計數(shù)法的數(shù)字,0的無論多少次方都是0,所以相等


**對于上述問題我查了PHP手冊**


當(dāng)一個字符串當(dāng)作一個數(shù)值來取直,其結(jié)果和類型如下:如果該字符串沒有包含'.','e','E'并且其數(shù)值再整形的范圍之內(nèi)該字符串被當(dāng)作int來取值,其他所有情況下都被作為float來取值,該字符串的開始部分決定了他的值,如果該字符串以合法的數(shù)值開始,則使用該數(shù)值,否則其值為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'\])) {

>?

> $logined = true;

>?

> $Username = $\_GET\['Username'\];

>?

> $password = $\_GET\['password'\];

>?

> if (!ctype\_alpha($Username)) {$logined = false;}

>?

> if (!is\_numeric($password) ) {$logined = false;}

>?

> if (md5($Username) != md5($password)) {$logined = false;}

>?

> if ($logined){

>?

> echo "successful";

>?

> }else{

>?

> echo "login failed!";

>?

> }

>?

> }

>?

> ?>


題目大意是要輸入一個字符串和數(shù)字類型,并且他們的md5值相等,就可以成功執(zhí)行下一步語句


介紹一批md5開頭是0e的字符串 上文提到過,0e在比較的時候會將其視作為科學(xué)計數(shù)法,所以無論0e后面是什么,0的多少次方還是0。md5('240610708') == md5('QNKCDZO')成功繞過!


> QNKCDZO

>?

> 0e830400451993494058024219903391

>?

> s878926199a

>?

> 0e545993274517709034328855841020

>?

> s155964671a

>?

> 0e342768416822451524974117254469

>?

> s214587387a

>?

> 0e848240448830537924465865611904

>?

> s214587387a

>?

> 0e848240448830537924465865611904

>?

> s878926199a

>?

> 0e545993274517709034328855841020

>?

> s1091221200a

>?

> 0e940624217856561557816327384675

>?

> s1885207154a

>?

> 0e509367213418206700842008763514


## **json繞過**


> <?php

>?

> if (isset($\_POST\['message'\])) {

>?

> $message = json\_decode($\_POST\['message'\]);

>?

> $key ="\*\*\*\*\*\*\*\*\*";

>?

> if ($message->key == $key) {

>?

> echo "flag";

>?

> }

>?

> else {

>?

> echo "fail";

>?

> }

>?

> }

>?

> else{

>?

> echo "~~~~";

>?

> }

>?

> ?>


輸入一個json類型的字符串,json\_decode函數(shù)解密成一個數(shù)組,判斷數(shù)組中key的值是否等于 \`$key\`的值,但是\`$key\`的值我們不知道,但是可以利用0\`==\`"admin"這種形式繞過


最終\`payload message={"key":0}\`


**array\_search is\_array繞過**


> <?php

>?

> if(!is\_array($\_GET\['test'\])){exit();}

>?

> $test=$\_GET\['test'\];

>?

> for($i=0;$i<count($test);$i++){

>?

> if($test\[$i\]==="admin"){

>?

> echo "error";

>?

> exit();

>?

> }

>?

> $test\[$i\]=intval($test\[$i\]);

>?

> }

>?

> if(array\_search("admin",$test)===0){

>?

> echo "flag";

>?

> }

>?

> else{

>?

> echo "false";

>?

> }

>?

> ?>


上面是自己寫的一個,先判斷傳入的是不是數(shù)組,然后循環(huán)遍歷數(shù)組中的每個值,并且數(shù)組中的每個值不能和admin相等,并且將每個值轉(zhuǎn)化為int類型,再判斷傳入的數(shù)組是否有admin,有則返回flag


payload test\[\]=0可以繞過


mixed array\_search ( mixed $needle , array $haystack \[, bool $strict = false \] )


$needle,$haystack必需,$strict可選 函數(shù)判斷$haystack中的值是存在$needle,存在則返回該值的鍵值 第三個參數(shù)默認(rèn)為false,如果設(shè)置為true則會進行嚴(yán)格過濾


> <?php

>?

> $a=array(0,1);

>?

> var\_dump(array\_search("admin",$a)); // int(0) => 返回鍵值0

>?

> var\_dump(array\_seach("1admin",$a)); // int(1) ==>返回鍵值1

>?

> ?>


array\_search函數(shù) 類似于\`==\`也就是\`$a=="admin"\`當(dāng)然是$a=0 當(dāng)然如果第三個參數(shù)為true則就不能繞過


strcmp漏洞繞過 \`php -v <5.3\`


> <?php

>?

> $password="\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*"

>?

> if(isset($\_POST\['password'\])){

>?

> if (strcmp($\_POST\['password'\], $password) == 0) {

>?

> echo "Right!!!login success";n

>?

> exit();

>?

> } else {

>?

> echo "Wrong password..";

>?

> }

>?

> ?>


strcmp是比較兩個字符串,如果\`str1<str2\`則返回\`<0 \`如果, \`str1>str2\`返回\`>0 \`如果兩者相等 返回0


我們是不知道\`$password\`的值的,題目要求strcmp判斷的接受的值和\`$password\`必需相等,strcmp傳入的期望類型是字符串類型,如果傳入的是個數(shù)組會怎么樣呢


我們傳入 password\[\]=xxx 可以繞過 是因為函數(shù)接受到了不符合的類型,將發(fā)生錯誤,但是還是判斷其相等


payload: password\[\]=xxx


## **switch繞過**


> <?php

>?

> $a="4admin";

>?

> switch ($a) {

>?

> case 1:

>?

> echo "fail1";

>?

> break;

>?

> case 2:

>?

> echo "fail2";

>?

> break;

>?

> case 3:

>?

> echo "fail3";

>?

> break;

>?

> case 4:

>?

> echo "sucess"; //結(jié)果輸出success;

>?

> break;

>?

> default:

>?

> echo "failall";

>?

> break;

>?

> }

>?

> ?>


這種原理和前面的類似,


PHP弱類型的評論 (共 條)

分享到微博請遵守國家法律
长泰县| 香港| 循化| 岗巴县| 卫辉市| 疏勒县| 赤城县| 阿拉善右旗| 栾川县| 富源县| 二连浩特市| 广水市| 当雄县| 黔西| 阿城市| 涿鹿县| 湖南省| 武功县| 白城市| 监利县| 区。| 库车县| 寻乌县| 临漳县| 乌拉特前旗| 无为县| 军事| 阿克苏市| 通道| 四平市| 临汾市| 库伦旗| 临漳县| 桦甸市| 肃北| 洛隆县| 昆明市| 邵东县| 青冈县| 万宁市| 永州市|