一道CTF题目对PHP特性的思考

代码如下:

<?php
$a = $_GET[‘a’];
$b = $_GET[‘b’];
if(!isset($a) || !isset($b)){
    highlight_file(__FILE__);
    echo (’00’);
}

if(strpos($a,’e’) === false && strpos($b,’e’) === false && strlen($a) === strlen($b) && $a !== $b && $a[0] !=’0′ && $a==$b){
    echo (‘good’);}
?>

分析代码:

  • 第一个if 必须要传入值,否则一直输出 00,
  • 第二个if 第一层
    • $a与$b中不能包含字符串e(tips:防止科学计数法绕过 $a=1e2,$b=100)
    • 第二层 strlen()暂时不用管
    • 第三层 $a !== $b && $a == $b
      1. 前者比较值与类型 不全等
      2. 后者只比较值 相等
  • 在来了解一下PHP的运算符

根据上面的分析构造payload $a=1.0 $b=001 验证如下:

构造payload

?a=1.0&b=001

总结

刚拿到这题,思考了很久,最后经过群友的点缀才完成了解题。之前有做过类似的题目,开始思考自己对PHP语言的理解是不是真的基础扎实?人不能一直朝前走,总要回头看看过去。

留下评论