今天在做bugku的这一关时,发现php8.0的一个更新后的特性。先直接说结论,方便理解后面的题目。
<?php
var_dump('99a' > 1314); # 旧版本结果是false,8.0版本之后为true
var_dump('99a' == 99); # 旧版本结果是true,8.0版本之后为false
var_dump('99a' === 99); #新旧版本都是false
echo phpversion();
?>
上述同一串代码,用php8.0之前和之后的两种版本,弱比较的结果是不一样的:
在旧版本,>和< 和== 是弱比较,比较'99a' > 1314时,会自动转换类型,99a转化为99,即比较99 > 1314。
在新版本,字符串
"99a"
在比较时未被正确转换为数字,导致意外行为,PHP 会把字符串当作比任何数字都大(即string > number
恒成立)。
对开发者的影响:
更新php版本以防御攻击
使用强制类型转换
var_dump((int)'99a' > 1314);
和严格比较(===)
对渗透攻城师的影响:
本题所教方法适用于渗透php8.0版本之前的网站,而不能渗透新php版本网站。
本体题解
进入目标网站看到题目:
is_numeric( ) 是 PHP 中的一个函数,用于判断给定的变量是否为数字或数字字符串
当参数不是数字时,且当参数等于1才给答案,这确实矛盾。
我的第一反应是php is_numeric函数绕过漏洞:
解出来了。
但是这个靶场是php旧版本的,所以存在弱比较的绕过方式,所以get请求让num=1xxxx,1开头就行,后面接非数字的格式,即可利用弱比较绕过。
- THE END -
最后修改:2025年4月30日
共有 0 条评论