php8.0前后版本关于弱比较的更新

AffettoIris 2025-4-30 106 4/30

 

Php8.0前后版本关于弱比较的更新

今天在做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之前和之后的两种版本,弱比较的结果是不一样的:

php8.0前后版本关于弱比较的更新

php8.0前后版本关于弱比较的更新

在旧版本,>和< 和== 是弱比较,比较'99a' > 1314时,会自动转换类型,99a转化为99,即比较99 > 1314。

在新版本,字符串 "99a" 在比较时未被正确转换为数字,导致意外行为,PHP 会把字符串当作比任何数字都大(即 string > number 恒成立)。

对开发者的影响:

  1. 更新php版本以防御攻击

  2. 使用强制类型转换var_dump((int)'99a' > 1314);和严格比较(===)

对渗透攻城师的影响:

本题所教方法适用于渗透php8.0版本之前的网站,而不能渗透新php版本网站。

本体题解

进入目标网站看到题目:

php8.0前后版本关于弱比较的更新

is_numeric( ) 是 PHP 中的一个函数,用于判断给定的变量是否为数字或数字字符串

当参数不是数字时,且当参数等于1才给答案,这确实矛盾。

我的第一反应是php is_numeric函数绕过漏洞

php8.0前后版本关于弱比较的更新

解出来了。

但是这个靶场是php旧版本的,所以存在弱比较的绕过方式,所以get请求让num=1xxxx,1开头就行,后面接非数字的格式,即可利用弱比较绕过。

php8.0前后版本关于弱比较的更新

如果靶场的php版本升级到8.0,则上述方法都不能绕过,就拿不到flag。

- THE END -

AffettoIris

4月30日03:59

最后修改:2025年4月30日
1

共有 0 条评论