PHP intval()函数详解,intval()函数漏洞原理及绕过思路
作者:mmseoamin日期:2023-12-13

「作者主页」:士别三日wyx

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者

「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》

intval

  • 一、进制自动转换
  • 二、转换数组
  • 三、转换小数
  • 四、转换字符串
  • 五、取反~
  • 六、算数运算符
  • 七、浮点数精度缺失问题
  • 三、intval()绕过思路

    intval() 函数可以获取变量的「整数值」。常用于强制类型转换。

    语法

    int intval( $var, $base )
    

    参数

    • $var:需要转换成 integer 「变量」
    • $base:转换所使用的「进制」

      返回值

      返回值为 integer 类型,可能是 0 或 1 或 其他integer 值。

      • 0:失败 或 空array 返回 0
      • 1:非空array 返回 1
      • 其他integer值:成功时 返回 $var 的 integer 值。

        返回值的「最大值」取决于系统

        • 32 位系统(-2147483648 到 2147483647)
        • 64 位系统(-9223372036854775808到9223372036854775807)

          一、进制自动转换

          第二个参数 $base 允许为空。

          当 base 为空时,默认值是 0,会根据 $var 的格式来调整转换的进制。

          • 如果 $var 以 0 开头,就使用 8进制
          • 如果 $var 以0x开头,就使用 16进制
          • 否则,就使用 10进制

            实例:

            # 10的 8进制是12
            var_dump(intval(012));
            # 10的 16进制是A
            var_dump(intval(0xA));
            # 10的 10进制是10
            var_dump(intval(10));
            

            输出:

            int(10)
            int(10)
            int(10)
            

            绕过思路:当某个数字被过滤时,可以使用它的 8进制/16进制来绕过。

            二、转换数组

            intval() 转换数组类型时,不关心数组中的内容,只判断数组中有没有元素。

            • 「空数组」返回 0
            • 「非空数组」返回 1

              实例:

              var_dump(intval(array()));
              var_dump(intval(array(3,2)));
              

              输出:

              int(0)
              int(1)
              

              如果传入的 $var是数组中的某个值时,则当做变量来转换,而不是当做数组类型。

              实例:

              $arr1 = array(8,6);
              var_dump(intval($arr1[0]));
              

              输出:

              int(8)
              

              绕过思路:对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。

              三、转换小数

              intval() 转换小数类型时,只返回个位数,不遵循四舍五入的原则。

              实例:

              var_dump(intval(12));
              var_dump(intval(1.2));
              var_dump(intval(1.9));
              

              输出:

              int(12)
              int(1)
              int(1)
              

              绕过思路:当某个数字被过滤时,可以给它增加小数位来绕过。

              四、转换字符串

              intval() 转换字符串类型时,会判断字符串是否以数字开头

              • 如果以数字开头,就返回1个或多个连续的数字
              • 如果以字母开头,就返回0

                单双引号对转换结果没有影响,并且 0 或 0x 开头也只会当做普通字符串处理。

                实例:

                var_dump(intval('12abc'));
                var_dump(intval("12abc"));
                var_dump(intval('abc123'));
                var_dump(intval('1a2b3c'));
                var_dump(intval('0101'));
                var_dump(intval("0x2b"));
                

                输出:

                int(12)
                int(12)
                int(0)
                int(1)
                int(101)
                int(0)
                

                五、取反~

                intval() 函数支持一些特殊符号的,比如~取反。

                实例:

                var_dump(intval(~10));
                var_dump(intval(~~10));
                

                输出:

                int(-11)
                int(10)
                

                绕过思路:当某个数字被过滤时,可以两次取反来绕过。

                六、算数运算符

                intval() 函数支持算数运算符,如果传入的 $var参数包含算数运算符,会先运算,再对运算结果进行转换。

                实例:

                var_dump(intval(5*5));
                var_dump(intval(5+5));
                var_dump(intval(05+5));
                

                输出:

                int(25)
                int(10)
                int(10)
                

                绕过思路:当某个数字被过滤时,可以使用算数运算符绕过。


                七、浮点数精度缺失问题

                由于PHP中的浮点数是「弱类型」,存在「精度丢失」的问题,在转换时可能会出现意料之外的情况。

                比如下面这个案例,第一个输出34正常,第二个以为会输出58,结果输出了57。

                实例:

                var_dump(intval(0.34*100.0));
                var_dump(intval(0.58*100.0));
                

                输出:

                int(34)
                int(57)
                

                三、intval()绕过思路

                最后汇总一下intval()函数漏洞的绕过思路:

                1)当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。

                2)对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。

                3)当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。

                4)当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。(GET请求的参数会自动拼接单引号)

                5)当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。

                6)当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。

                粉丝福利

                评论区留言即可参与抽奖,送《ChatGPT一本通》。

                PHP intval()函数详解,intval()函数漏洞原理及绕过思路,在这里插入图片描述,第1张

                本书从ChatGPT等自然语言大模型基础知识讲起,重点介绍了ChatGPT等语言大模型在生活中的实际应用,让每一个人都能了解未来的生活和工作。

                本书分为16章,涵盖的主要内容有人工智能、OpenAI、ChatGPT的介绍、ChatGPT的使用技巧,向大家展现ChatGPT在学术教育、商业管理、新媒体、办公、求职、法律、电商等不同领域的应用,以及ChatGPT当下的问题、大模型的未来。

                本书通俗易懂,用最简单的语言解释人工智能的入门知识,案例丰富,实用性强,适合每一个想要了ChatGPT等自然语言处理大模型的读者和进阶爱好者阅读,也适合想要通过API打造新时代语言模型应用的开发者。

                实用性强:本书通过实际案例和操作技巧,使读者能够快速上手并灵活运用ChatGPT技术,提升职场竞争力。

                深入浅出:本书以通俗易懂的语言解释ChatGPT的原理和应用,即使是职场新手也能轻松掌握。

                高效学习:本书结构紧凑,内容精炼,便于读者快速吸收和理解,无需花费大量时间。

                融合行业经验:本书结合了作者多年的经验,为读者提供了独到的见解和实用建议。