PHP弱类型绕过

PHP弱类型绕过

strcmp() 是 PHP 中用于比较两个字符串的函数。它将返回一个整数值,该值表示两个字符串的比较结果

  • 如果两个字符串相等,则返回 0
  • 如果第一个字符串按字典顺序小于第二个字符串,则返回一个负数
  • 如果第一个字符串按字典顺序大于第二个字符串,则返回一个正数

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
// 定义两个字符串
$string1 = "apple";
$string2 = "banana";

// 使用 strcmp() 函数比较字符串
$result1 = strcmp($string1, $string1);
$result2 = strcmp($string1, $string2);
$result3 = strcmp($string2, $string1);

// 根据比较结果输出不同的消息
if ($result1 == 0) {
    echo "两个字符串相等";
} 
if ($result2 < 0) {
    echo "第一个字符串在字典顺序上小于第二个字符串";
} 
if ($result3 > 0) {
    echo "第一个字符串在字典顺序上大于第二个字符串";
}

/*
运行将输出:
两个字符串相等
第一个字符串在字典顺序上小于第二个字符串
第一个字符串在字典顺序上大于第二个字符串
*/
?>

绕过场景:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
include("secret.php");
if(isset($_POST['php_engineer'])){
    if(!strcmp($elephant, $_POST['php_engineer'])){
        die("FLAG: flag{xxxxxx}");
    }else{
        die("You aren't a php engineer.");
    }
}
?>

上述场景的意思是 php_engineer 传进来的字符串要和 elephant 字符串相等,但是 elephant 字符串是在 secret.php 中,不可见

绕过方式:令 php_engineer[]=xxx

strcmp() 比较的是字符串类型,如果强行传入其他类型参数会出错,出错后返回值为0,正是利用这点进行绕过