欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 社会 > ctfshow(94,95)--PHP特性--strpos函数

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

2024/11/14 15:06:44 来源:https://blog.csdn.net/m0_56019217/article/details/143456712  浏览:    关键词:ctfshow(94,95)--PHP特性--strpos函数

建议先学习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.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com