ctfshow(94,95)--PHP特性--strpos函数

发布于:2024-11-03 ⋅ 阅读:(135) ⋅ 点赞:(0)

建议先学习intval函数相关内容

Web94

源代码:

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==="4476"){
        die("no no no!");
    }
    if(preg_match("/[a-z]/i", $num)){
        die("no no no!");
    }
    if(!strpos($num, "0")){
        die("no no no!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

审计

共四处条件判断:
第一处,严格比较$num==="4476",返回值为false则进入下一处。
第二处,preg_match("/[a-z]/i", $num),返回值为0则进入下一处。
第三处,!strpos($num, "0"),strpos函数返回值不为false则进入下一处.

int|false strpos(str $str , str $find)

strpos函数,第一个参数为字符串,第二个参数为要从字符串中寻找的字符
当没有匹配到目标字符时,返回值为bool型的false
当匹配到目标字符时,返回值目标字符第一次出现的索引位置,int类型

第四处,intval($num,0)===4476,返回值为true则获得flag。

思路

第一处,可以使用八进制、十六进制、科学计数法绕过

?num=4476e1
?num=010574
?num=0x117c

第二处,过滤了字母,因此十六进制、科学计数法绕过被过滤。
第三次,strpos($num, "0")在num中搜索0,搜索到则返回索引位置。

?num=010574

'0'在num中第一次出现的索引位置为0,因此strpos函数的返回值为0
由于函数前有!,所以条件判断最后的返回值为true,绕过失败

以上三种方法全部绕过失败。

这里学习新的绕过方法。

?num=+010574 正数符号绕过
?num=4476.0 小数绕过

正数符号绕过
在数字前面加+号,不影响数字的值。
?num=+010574显然绕过了第一处和第二处条件判断。
而到第三处判断,由于第一个0的索引位置变成了1,索引strpos($num, "0")的值变成了1,那么!strpos($num, "0")的值就变成了false,成功绕过。
第四处返回值显然为true,得到flag。

小数绕过
?num=4476.0显然绕过了第一处和第二处条件判断。
而到第三处判断,由于第一个0的索引位置变成了5,索引strpos($num, "0")的值变成了5,那么!strpos($num, "0")的值就变成了false,成功绕过。
第四处返回值显然为true,得到flag。

这里补充一个知识点,intval函数将小数转换为整数时,只保留整数部分,小数点及其之后的数字是直接被去掉的。

Web95

源代码:

include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
    $num = $_GET['num'];
    if($num==4476){
        die("no no no!");
    }
    if(preg_match("/[a-z]|\./i", $num)){
        die("no no no!!");
    }
    if(!strpos($num, "0")){
        die("no no no!!!");
    }
    if(intval($num,0)===4476){
        echo $flag;
    }
}

审计

第一处条件判断换成了弱类型比较。
第二次多过滤了点.
其他两处与94题相同。

思路

科学计数法、小数绕过不能绕过弱类型比较。
使用八进制和十六进制绕过第一处弱类型比较。

?num=010574
?num=0x117c

第二处过滤了字母,不能使用十六进制绕过。
第三处!strpos($num, "0"),正常使用八进制绕过返回值为true,绕过失败。在八进制前加正数符号+,成功绕过。

?num=+010574

第四处返回值显然为true,得到flag.


网站公告

今日签到

点亮在社区的每一天
去签到