[極客大挑戰 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了!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/288984.html
標籤:其他
