php比较绕过(强比较“===”/弱比较“==“)

比较绕过(强比较/弱比较)

PHP弱类型比较及绕过

PHP的字符串和数字比较时,会将字符串先转化成数字类型在进行比较。

  1. 字符串和数字

字符串以数字开头时,以开头数字(到字母出现截止)作为转换结果;开头不是数字的字符串或空(null),则转换为0。

'12'==12    //true
'12abc'==12 //true
'adm2n'==0  //true
  1. 布尔值与任意值比较

布尔值true和任意字符串都相等,除了0。

'way'==true    //true
'flase'==true  //true
234==true      //true
0==flase       //true
  1. hash值和字符串“0”比较

因为当hash开头为0e后全为数字的话,进行比较时就会将其当做科学计数法来计算,用计算出的结果来进行比较。

md5($str1)=0e420233178946742799316739797882
md5($str2) == '0'	//true

当字符串被当作一个数值来处理时,如果该字符串没有包含’.’,‘e’,'E’并且其数值在整形的范围之内,该字符串作为int来取值,其他所有情况下都被作为float来取值,并且字符串开始部分决定它的取值,开始部分为数字,则其值就是开始的数字,否则,其值为0。

  1. strcmp(str1,str2)函数

此函数用来比较字符串。返回值:0-两字符串相等;<0- str1<str2;>0-str1>str2

(如果两个字符串不同等,但是字符串长度相同,就比较从哪一位开始不同的,然后比较那一位的大小。 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。)

但当参数为数字或数组时,返回值则会为null。

绕过

  1. ==绕过

两个等号是弱类型比较,他会将两边自动转换为同一种类型后再进行比较。所以他比较的就只是值 ,不比较类型。

12.0==12  true
'12'==12  true
  1. switch绕过

switch()函数的参数和弱比较类似,会将参数进行转换,转换成int型值。

<?php
  $a='2abc';
switch($a){
  case 1:
		echo 111;
  case 2:
  	echo 222;
  case 3:
  	echo 333;
}
?>

>>222
  1. intval()函数

intval()函数是获取变量的整数值,但是intval()函数有个漏洞就是他也会自动获取数字,从数字开头到出现字母后停止。有是也会利用这个来进行绕过;另外intval() 不能用于 object,否则会产生 E_NOTICE 错误并返回 1。

$num=2e4
intval($num)<2020 && intval($num+1)>2021

第一个判断取到的值为2,第二个判断会先计算加法,为20001,即可成功绕过。

  1. ===强比较绕过

一般强比较绕过都是利用相同的MD5强碰撞进行绕过。我把网上找的一些都写在这了:

a=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%00%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%55%5d%83%60%fb%5f%07%fe%a2
b=%4d%c9%68%ff%0e%e3%5c%20%95%72%d4%77%7b%72%15%87%d3%6f%a7%b2%1b%dc%56%b7%4a%3d%c0%78%3e%7b%95%18%af%bf%a2%02%a8%28%4b%f3%6e%8e%4b%55%b3%5f%42%75%93%d8%49%67%6d%a0%d1%d5%5d%83%60%fb%5f%07%fe%a2
a=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1U%5D%83%60%FB_%07%FE%A2
b=M%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DCV%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%02%A8%28K%F3n%8EKU%B3_Bu%93%D8Igm%A0%D1%D5%5D%83%60%FB_%07%FE%A2
a=0e306561559aa787d00bc6f70bbdfe3404cf03659e704f8534c00ffb659c4c8740cc942feb2da115a3f4155cbb8607497386656d7d1f34a42059d78f5a8dd1ef
b=0e306561559aa787d00bc6f70bbdfe3404cf03659e744f8534c00ffb659c4c8740cc942feb2da115a3f415dcbb8607497386656d7d1f34a42059d78f5a8dd1ef

例题:BUUCTF在线评测

请求图片参数改为index.php,获得源码,绕过命令过滤,MD5强类型比较

  1. is_numeric(mix $var)函数绕过

他是判断变量是否是数字说数字字符串的函数,只有全部为数字时才能为真,但是其漏洞是:当将变量用16进制表达时,结果都为真。

is_numeric(123)  //true
is_numeric('123') //true
is_numeric('123.0) //true
is_numeric(0x776179)  //'way'->true
is_numeric('0x776179') //flase
is_numeric('123a')//flase
is_numerric('123 ')//flase

例题:BUUCTF-Ez bypass

其中gg和id传参为上面强碰撞的第一对值,然后passwd=1234567 (注意7后面有个空格,或者写成1234567%20),以post方式请求,即可得到flag。

### 关于PHP相等绕过的方法 在PHP中,“==”操作符会尝试将不同类型的变量转换为相同的类型后再进行比较,这种行为可能导致安全漏洞。以下是几种常见的PHP相等绕过方法及其原理: #### 类型转换特性 当使用“==”时,PHP会对不同类型的数据执行隐式的类型转换[^1]。例如,在字符串与整数比较的情况下,字符串会被解析成数值部分并丢弃其余字符。 ```php var_dump("1abc" == 1); // 输出 true ``` 上述例子展示了如何通过字符串前缀匹配来实现绕过[^3]。 #### 布尔值处理 布尔值与其他数据类型的比较也会引发意外的结果。任何非零的数字都会被视作`true`,而空字符串、数字0或null则被认为是`false`。 ```php var_dump(0 == false); // true var_dump("" == false); // true var_dump(null == false); // true ``` 这些情况可以用来设计特定条件下的输入验证规避策略[^2]。 #### 浮点精度误差 浮点运算可能引入微小错误,这使得某些看似不等于实际却判定为相等的情况发生。 ```php $a = 1.2e+8; $b = (string)$a; var_dump($b == $a); // 可能返回 true 或 false取决于环境设置 ``` 这里需要注意的是科学计数法表示的大数转字符串再回溯到原始形式可能会丢失精确度从而造成误判[^4]。 #### 特殊字符的影响 对于含有特殊控制字符或者不可见ASCII码序列的字符串参与对比时也可能存在异常表现,比如`\x00`(NULL字节),它经常用于文件路径拼接攻击场景下终止后续读取内容达到目的[^5]。 ```php // 利用 NULL 字节截断效应 $pattern = '^[A-Za-z]*$'; $input_with_null_byte = "test\x00bad"; if (!preg_match("/$pattern/", $input_with_null_byte)) { echo "Match failed due to null byte."; } ``` 以上代码片段说明了正则表达式模式匹配失败的原因是因为遇到了嵌入式NUL字符。 #### 结合哈希函数的行为特征 有时题目给出类似下面这样的逻辑结构: ```php if ($_GET['param1'] != $_GET['param2'] && hash('sha256',$_GET['param1']) === hash('sha256',$_GET['param2'])) { ... } ``` 此时可以通过寻找一对不同的参数但其经过指定散列算法后的摘要完全一致的现象即碰撞实例完成挑战目标。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值