ereg正则%00截断
<?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
';
}
}
?>
解题
1.if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
表示必须有a-zA-Z0-9
2.if (strpos ($_GET['password'], '-') !== FALSE)
password中必须有‘-’
3.else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999)
长度<8且大小>9999999
4.解题方法
(1):利用数组绕过这两个函数
-
ereg() 只能处理字符串,而password是数组,所以返回的是null,三个等号的时候不会进行类型转换。所以null!==false。
即if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE)
-
strpos() 的参数同样不能够是数组,所以返回的依旧是null,null!=false也正确。
即if (strpos ($_GET[‘password’], ‘-’) !== FALSE)`
Payload:?password[]=1
(2):%00截断绕过正则匹配
(ereg函数存在NULL截断漏洞,导致了正则过滤被绕过,所以可以使用%00截断正则匹配)
-
判断是不是长度<8且大小>9999999
-
判断是不是有“-”
payload:?password=1e9%00*-*