$flag = "flag";
if (isset ($_GET['password']))
{
if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
{
echo 'You password must be alphanumeric
';
}
else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
{
if (strpos ($_GET['password'], '*-*') !== FALSE) //strpos — 查找字符串首次出现的位置
{
die('Flag: ' . $flag);
}
else
{
echo('*-* have not been found
');
}
}
else
{
echo 'Invalid password
';
}
}
?>
审计得到想要得到flag需要三个条件
1.ereg ("^[a-zA-Z0-9]+$", $_GET['password']) !=== FALSE
即提交的password必须是只能是一个或者多个数字、大小写字母。
2.strlen($_GET['password']) < 8 && $_GET['password'] > 9999999
提交的password长度要小于8并且大小要大于99999999
3. strpos ($_GET['password'], '*-*') !== FALSE
password里必须要有’-’
因为ereg()函数存在NULL截断漏洞,导致正则过滤被绕过,所以可以用%00来截断正则匹配
第二个条件长度小于8大小大于99999999可以用科学计数法来绕过
则最后构造password=1e8%00*-*即可得到flag