Web-intval()函数漏洞绕过

什么是intval()?

intval() 函数是 PHP 中的一个内置函数,用于获取变量的整数值。常用于强制类型转换。

基础语法

intval(mixed $value, int $base = 10): int

参数:

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

注意:

如果 base 是 0,通过检测 value 的格式来决定使用的进制:

  • 如果字符串包括了 “0x” (或 “0X”) 的前缀,使用 16 进制 (hex);否则,
  • 如果字符串以 “0b” (或 “0B”) 开头,使用 2 进制 (binary);否则,
  • 如果字符串以 “0” 开始,使用 8 进制(octal);否则,
  • 将使用 10 进制 (decimal)。

返回值

成功时返回 value 的 integer 值,失败时返回 0。 空的 array 返回 0,非空的 array 返回 1。

举个例子

<?php
echo intval(42);          //42
echo "\n";
echo intval(42.2);        //42
echo "\n";
echo intval(042);         //34
echo "\n";
echo intval(0x42);        //66
echo "\n";
echo intval(array('name'));     //1
echo "\n";
echo intval(array());           //0
echo "\n";

绕过思路

  • 当某个数字被过滤时,可以使用它的 8进制/16进制来绕过;比如过滤10,就用012(八进制)或0xA(十六进制)。
  • 对于弱比较(a==b),可以给a、b两个参数传入空数组,使弱比较为true。
  • 当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。
  • 当某个数字被过滤时,可以给它拼接字符串来绕过;比如过滤3,就用3ab。
  • 当某个数字被过滤时,可以两次取反来绕过;比如过滤10,就用~~10。
  • 当某个数字被过滤时,可以使用算数运算符绕过;比如过滤10,就用 5+5 或 2*5。

例题解析

商丘师范学院第四届网络安全及信息对抗大赛(校外赛)

<?php

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['sqctf'])){
    $num = $_GET['sqctf'];
    if($num==114514){
        die("逸一时, 误一世!");
    }
    if(intval($num,0)==114514){
        echo $flag;
    }else{
        echo "看看你输入的数字: ".intval($num,0);
    }
}

?>

发现 intval($num,0)==114514 想起当某个数字被过滤时,可以给它增加小数位来绕过;比如过滤3,就用3.1。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容