PHP代码审计(ereg截断漏洞)

<?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须要三个条件
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里必需要有’-php

由于ereg()函数存在NULL截断漏洞,致使正则过滤被绕过,因此能够用%00来截断正则匹配
第二个条件长度小于8大小大于99999999能够用科学计数法来绕过web

则最后构造password=1e8%00*-*便可获得flagsvg