isset数组绕过


1.数组返回NULL绕过

<?php 

$flag = "flag";
if (isset ($_GET['password'])) {
    if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) 
        echo 'You password must be alphanumeric'; 
    else if (strpos ($_GET['password'], '--') !== FALSE) 
        die('Flag: ' . $flag); 
    else 
        echo 'Invalid password';
}

?>

php不能处理数组

根据 if (strpos ($_GET['password'], '--') !== FALSE)

知道password一定有'--'。开始构造%2d但是过不了,根据题目暗示和php特性可以传一个数组绕过判断

http://123.206.87.240:9009/19.php?password[]=sad%2d%2d

strpos() 函数查找字符串在另一字符串中第一次出现的位置。

注释:strpos() 函数对大小写敏感。

ereg()函数用指定的模式搜索一个字符串中指定的字符串,如果匹配成功返回true,否则,则返回false。搜索字母的字符是大小写敏感的。

2.

<?php
$flag = "flag";
if (isset ($_GET['ctf'])) {
if (@ereg ("^[1-9]+$", $_GET['ctf']) === FALSE) //①
echo '必须输入数字才行';
else if (strpos ($_GET['ctf'], '#biubiubiu') !== FALSE) //②
die('Flag: '.$flag);
else
echo '骚年,继续努力吧啊~';
}
?>

思路:

ereg()只能处理字符串的,遇到数组做参数返回NULL,判断用的是 === ,其要求值与类型都要相同,而NULL跟FALSE类型是不同的,所以①判断if不成立,继续执行②,这时strpos函数遇到数组,也返回NULL,与FALSE类型不同,if条件成立,输出flag。
所以payload应该是?ctf[]=任意字符,甚至就是?ctf[]=


文章作者: 剑胆琴心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 剑胆琴心 !
评论
 上一篇
php变量覆盖 php变量覆盖
可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞 场景 $$使用不当 extract()函数使用不当 parse_str()函数使用不当 import_request_variables()使用不当 开启了全局变量注册 … …
2020-08-18
下一篇 
深X服 EDR终端检测系统RCE漏洞复现 深X服 EDR终端检测系统RCE漏洞复现
简介深信服终端检测响应平台EDR,围绕终端资产安全生命周期,通过预防、防御、检测、响应赋予终端更为细致的隔离策略、更为精准的查杀能力、更为持续的检测能力、更为快速的处置能力。在应对高级威胁的同时,通过云网端联动协同、威胁情报共享、多层级响应
2020-08-17
  目录