到底传入什么呢?

代码:

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

首先是ereg函数:
语法

 int ereg(string pattern, string originalstring, [array regs]);

定义和用途

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。
可选的输入参数规则包含一个数组的所有匹配表达式,他们被正则表达式的括号分组。

继续分析:

^[a-zA-Z0-9]+$

表示以大写字母开头,只接收大小写字母和数字的字符串所以往下走必须得输入数字
strlen($_GET['password']) < 8 && $_GET['password'] > 9999999 提交的password长度要小于8并且大小要大于99999999
strpos ($_GET['password'], '-') !== FALSE
password里必须要有’-’

所以构造payload:

password=1e8%00*-*

补充说明:
因为ereg()函数存在NULL截断漏洞,导致正则过滤被绕过,所以可以用%00来截断正则匹配 第二个条件长度小于8大小大于99999999可以用科学计数法来绕过

猜你喜欢

转载自blog.csdn.net/qq_29647709/article/details/81624480