1. 程式人生 > 其它 >[極客大挑戰 2019]BuyFlag 1

[極客大挑戰 2019]BuyFlag 1

本篇文章通過CTF試題-主要內容就是php-strcmp函式繞過,php弱型別比較

[極客大挑戰 2019]BuyFlag 1

這裡我講解以下php的兩個函式吧:

  • is_numberic():就是判斷括號裡面的變數是不是數值
    漏洞繞過:is_numeric函式對於空字元%00,無論是%00放在前後都可以判斷為非數值,而%20空格字元只能放在數值後。
    
  • int strcmp ( string $str1 , string $str2 )
    
    引數 str1第一個字串。str2第二個字串。如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。
    
    可知,傳入的期望型別是字串型別的資料,但是如果我們傳入非字串型別的資料的時候,這個函式將會有怎麼樣的行為呢?實際上,當這個函式接受到了不符合的型別,這個函式將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告資訊後,將return 0 ,
    也就是雖然報了錯,但卻判定其相等
    
    
    strcmp函式漏洞:strcmp比較的是字串型別,如果強行傳入其他型別引數,會出錯,出錯後返回值0,正是利用這點進行繞過。
    比如:
    如下這段程式碼
    define('FLAG','pwnhub{this_is_flag}');
    if(strcmp($_GET['flag'],FLAG) == 0){
         echo "success,flag:".FLAG;
    }
    
    指令碼意思是get到的flag和FLAG的值相等,就可以得到FLAG,但我們都不知道flag值是什麼,利用strcmp函式特點嘗試使用陣列繞過。令flag[]=xxx
    
    flag[]=xxx 》》 strcmp比較出錯 》》返回null 》》null==0 》》條件成立得到flag
    

    下面來個例題吧:

    實驗環境:http://3fda030e-b2a0-497e-bb1c-a95653a083f7.node4.buuoj.cn/pay.php

    我們開啟這個頁面會發現一段原始碼

<!--
	~~~post money and password~~~
if (isset($_POST['password'])) {
	$password = $_POST['password'];
	if (is_numeric($password)) {
		echo "password can't be number</br>";
	}elseif ($password == 404) {
		echo "Password Right!</br>";
	}
}
-->

大概意思就是:將得到的password資料賦值給$password變數,然後判斷$password不是純數字,並且得$password==404

但是在php中“==”是弱型別比較
具體可以參考這個:https://www.cnblogs.com/mrsm1th/p/6745532.html
大致舉個例子吧 404xxx == 404 就是隻要前面是相等的後面接什麼都一樣,他會自動轉成相同型別

然後就是我們在burpsuite裡面抓包,將user=0改為user=1,這個應該是判別你是不是CUIT使用者吧,一個身份辨別。然後下面傳入post引數:password=404abc&money[]=1

然後就得到我們的flag了!!


有什麼錯誤或者改進意見歡迎評論或發給我噢!大家一起共同學習!求大佬帶帶我!!!