<?php
$flag = "flag";
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) //strpos — 查找字符串首次出现的位置
{
die('Flag: ' . $flag);
}
else
{
echo('<p>*-* have not been found</p>');
}
}
else
{
echo '<p>Invalid password</p>';
}
}
?>
审计上面代码可以发现
要想的到flag必须满足一下3个条件
1、必须是数字、字母组成的密码
2、密码的长度小于8,却必须要大于9999999
3、密码必须包含—
对于第二个条件,使用科学计数法绕过
对于第三个条件,由于ereg()函数存在NULL截断漏洞,所以可以用%00(空字符)来截断正则匹配。那么我们就可以绕过第3个条件了
那么我们就可以构造出payload为1e8%00*—*