文章目錄

如果switch没有break(php,javascript)

社区一个讨论帖中提到如下一段代码的LFI利用问题:

<?php
if (isset($_GET['a']))
{
        $a= $_GET['a'];
        switch ($a)
        {
        case 0:
        case 1:
        case 2:
                require_once $a.'.php';
                break;
        default:
                echo 'error';
                break;
        }
}
?>

一开始看觉得 ?a=2/../yu.jpg%00 这样利用弱类型和截断。但是有小伙伴说直接./1.jpg%00就可以。让我百思不得其解。

测试了一下才发现,原来如果没有写break的情况跟自己预期的不一样。一开始猜测,case 0 比较成功,执行case 0的代码,没有break的话,会继续比较case 1。事实证明完全不是这个样子。

测试代码:

<?php


$a = 'abcd';
if ($a){
        #$a= $_GET['a'];
        switch ($a)
        {
        case 0:
                print '000';
        case 1:
                print '1111';
        case 2:
                #require_once $a.'.php';
                print '22222';
                #break;
        default:
                echo 'error';
                break;
        }
}
?>

img
当匹配0成功,如果没有break,会依次执行后面的语句。不会再进行比较。这么看来如果switch没有写break,在某些场景也是可能引起漏洞的。

测试了一下javascript,也是一样。测试代码。

var day=new Date().getDay();
switch (day)
{
case 0:
  x="Today it's Sunday";
case 1:
  x="Today it's Monday";
  break;
case 2:
  x="Today it's Tuesday";
  break;
case 3:
  x="Today it's Wednesday";
case 4:
  x+="Today it's Thursday";
  break;
case 5:
  x="Today it's Friday";
  break;
case 6:
  x="Today it's Saturday";
  break;
}

img
经过搜索发现,这个特性公认是从C语言那来的。包括java也是这样。但是C#中已经修正了(没有测试)。

个人微信公众号

文章目錄