解題關鍵知識點:php
ereg函數有兩個漏洞數組
一、00截斷函數
二、當ntf爲數組時它的返回值不是FALSEurl
一、利用第一個漏洞code
ereg()函數用指定的模式搜索一個字符串中指定的字符串,若是匹配成功返回true,不然,則返回false。搜索字母的字符是大小寫敏感的。字符串
函數原型:int ereg(string pattern, string originalstring, [array regs]);原型
ereg()限制password的格式,只能是數字或者字母。但ereg()函數存在NULL截斷漏洞,能夠使用%00繞過驗證。string
例如,once more一題中要求password必須是字母和數字組成,長度小於8,值大於9999999,首先想到科學計數法,使password='1e9',還須要知足另外一個條件含有字符串‘*-*’,這顯然是矛盾的,想到ereg的截斷漏洞便迎刃而解,使password='1e9%00*-*'。class
<?php if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) { echo '<p>You password must be alphanumeric</p>'; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) { if (strpos ($_GET['password'], '*-*') !== FALSE) { die('Flag: ' . $flag); } else { echo('<p>*-* have not been found</p>'); } } else { echo '<p>Invalid password</p>'; } } ?>
二、利用第二個漏洞搜索
url中參數password爲數組,password[]=1