CTF——Web——php 弱类型总结
php 弱類型總結
?
特別注意: md5(),? ? json_encode(),? ?array_search(),? strcmp(),? switch()? ,in_array()??這幾個容易涉及到php弱類型的函數
描述:php中有兩種比較的符號 == 與 ===
? ? ? ? ? === 在進行比較的時候,會先判斷兩種字符串的類型是否相等,再比較值是否相等
? ? ? ? ? == 在進行比較的時候,會先將字符串類型轉化成相同,再比較值
? ? ? ? ? 如果比較一個數字和字符串或者比較涉及到數字內容的字符串,則字符串會被轉換成數值并且比較按照數值來進行
漏洞關鍵:
當一個字符串欸當作一個數值來取值,其結果和類型如下:如果該字符串沒有包含'.','e','E'并且其數值值在整形的范圍之內
該字符串被當作int來取值,其他所有情況下都被作為float來取值,該字符串的開始部分決定了它的值,如果該字符串以合法的數值開始,則使用該數值,否則其值為0。
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 中的類型是否相同。如下:
實戰7: 成也布爾,敗也布爾;
成也布爾,敗也布爾‘,布爾類型的true跟任意字符串在‘==’下成立
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的CTF——Web——php 弱类型总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CTF——Web——MD5漏洞
- 下一篇: 动态规划算法php,php算法学习之动态