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就可以了。