1. 程式人生 > 實用技巧 >[極客大挑戰 2019]BuyFlag

[極客大挑戰 2019]BuyFlag

0x01

進入頁面如下

結合題目buyflag的提示,我們點選payflag看看

檢視一下原始碼

發現端倪

0x02

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>";
	}
}

這裡跟以前做過的一個“矛盾”的ctf題目很相似,首先它判斷你是不是數字,如果是,就錯誤,如果不是數字再判斷你是不是等於404,如果等於404,則密碼正確。很顯然,這裡的考點就是is_numeric這個函式,那麼我們來看看這個函式有什麼特別

PHP is_numeric() 函式

is_numeric() 函式用於檢測變數是否為數字或數字字串。

語法:

bool is_numeric ( mixed $var )

$var:要檢測的變數。

返回值:

  如果指定的變數是數字和數字字串則返回 TRUE,否則返回 FALSE。

is_numeric函式對於空字元%00,無論是%00放在前後都可以判斷為非數值,而%20空格字元只能放在數值後。所以,檢視函式發現該函式對對於第一個空格字元會跳過空格字元判斷,接著後面的判斷!

那知道這個就好說了,我們直接404%20,就可以同時過第一個判斷和第二個判斷,下面嘗試

0x03

但我們把密碼改了之後,發現提示我們數字長度太大,但是要讓我們買flag還必須有這麼多的錢,那我們就需要對money這個引數動點腦筋了,有什麼辦法讓它不需要輸入那麼多數字,還能滿足它對money的判斷

PHP strcmp() 函式

要求的是傳入兩個字串,那如果我們傳入一個非字串會出現什麼結果呢?當我們傳入一個非字串的時候,函式會報錯,但同時會返回結果0,也就是說雖然報錯,但返回的結果0意味著相等,那麼如何可以傳入一個非字串呢?用陣列。

所以這裡我們將money這個變數改成數字形式

再這裡同樣還有一個點需要注意,平時的時候我們的cookie一般是PHPSESSID,但是這裡卻不是,這裡的user,本來這裡的值是user=0,那麼我們將其改為1,其可能是判斷使用者的一個方式

下面是返回結果

拿到flag

總結

主要是考察php中某些函式的用法和漏洞利用