bugku ereg正则%00截断

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*-*

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值