解题关键知识点:
ereg函数有两个漏洞
1、00截断
2、当ntf为数组时它的返回值不是FALSE
1、利用第一个漏洞
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
函数原型:int ereg(string pattern, string originalstring, [array regs]);
ereg()限制password的格式,只能是数字或者字母。但ereg()函数存在NULL截断漏洞,可以使用%00绕过验证。
例如,once more一题中要求password必须是字母和数字组成,长度小于8,值大于9999999,首先想到科学计数法,使password='1e9',还需要满足另一个条件含有字符串‘*-*’,这显然是矛盾的,想到ereg的截断漏洞便迎刃而解,使password='1e9%00*-*'。
<?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>';
}
}
?>
2、利用第二个漏洞
url中参数password为数组,password[]=1