[極客大挑戰 2019]BuyFlag 1
阿新 • • 發佈:2021-07-07
本篇文章通過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了!!
有什麼錯誤或者改進意見歡迎評論或發給我噢!大家一起共同學習!求大佬帶帶我!!!