[極客大挑戰 2019]BuyFlag


0x00 知識點

php中的strcmp漏洞
說明:

int strcmp ( string $str1 , string $str2 )

參數 str1第一個字符串。str2第二個字符串。如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等,返回 0。

可知,傳入的期望類型是字符串類型的數據,但是如果我們傳入非字符串類型的數據的時候,這個函數將會有怎么樣的行為呢?實際上,當這個函數接受到了不符合的類型,這個函數將發生錯誤,但是在5.3之前的php中,顯示了報錯的警告信息后,將return 0 ,
也就是雖然報了錯,但卻判定其相等

php中的is_numeric()漏洞

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

0x01 解題

查看源代碼發現:

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

bp抓包:
將user=1,且password=404%20

提示我們與money=10000

意到這題Cookie沒有用上PHPSESSID,那么這題猜一下邏輯就是直接將我們提交的money與要求的1000000比較,不存在記錄的過程.

同時注意到,此題用到的是PHP 5.3.5,老版本PHP了。要求我們不能輸入8位字符,而輸入其他任何字符都會返回you have not enough money,loser~,合理猜測一下用的是strcmp,那么直接money[]=1就可以了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM