当前位置:   article > 正文

PHP黑魔法之既是0又是1/switch/$a==0可用.绕过(非数字都可绕过)/PHP://伪协议绕过

PHP黑魔法之既是0又是1/switch/$a==0可用.绕过(非数字都可绕过)/PHP://伪协议绕过

1、既是0又是1的情况

$a==1 & $test[$a]=t 时

知识点1)php在处理数字时,如果数字的位数超过 16 位是可以弱等于1的,也就是

var_dump( 9999999999999999999 == 1 );//true

因为当数字位数超过 16 位时,是将该数字转换成了数值为 1 的字符串进行处理

知识点2)在科学计数法中也有种特殊情况,0.1e1 是代表 0.1*10,而 .1e1 代表的也是 0.1*10 ,但在数组中时,由于 . 代表的是字符串,所以会于数组中变成 0 ,于 is_numeric 中有点则正常输出为数字

  1. // 打印数组b下标为0的数据
  2. echo $b['.1e1'] //输出t

2、switch代码漏洞

当使用 switch 并且没有使用 break 来跳出循环时,代码是会继续往下执行。这属于程序员在编写程序出现的人为漏洞,并不是语言本身的问题。

3、$a==0可用.绕过(非数字都可绕过)

如何使 $a==0 的同时 $a 又为真?

  1. <?php
  2. $a=$_GET['a'],
  3. if ($a==0){
  4. echo "1";
  5. }
  6. if ($a) {
  7. echo "must";
  8. }
  9. ?>

答:接收参数$a得存在,并且$a==0可用 . 绕过(非数字都可绕过) ,例如输入 .1e1

4、php://伪协议绕过

接收参数中不能出现某一字符,但下面又必须使用时,就可以php://伪协议绕过

  1. $s=file_get_contents(php://input);
  2. <?php
  3. $res=file_get_contents('php://input');
  4. var_dump('file_get_contents 数据是:'.$res);
  5. echo '<br>post 数据是:';
  6. var_dump($_POST);

运行后我们会发现:file_get_contents('php://input')不能接收curlpost过来的数组
解释:如果POST的原始数据是一维数组或&拼接的标准格式的键值对字符串,那么可以用$-POST来获取。
如果要通过file_get_contents获取,这种情况下可以发送json字符串,用ison_encode转一下或者使用http_build_query:比如上面修改如下:curl_setopt($ch, CURLOPT_POSTFIELDS, http _build_query($data));//POST数据结果:
string(97)"file_get_contents 数据是:username=%E5%91%A8%E4%BC%AF%E9%80%9A&password=123456&sign=asdfg123456"
post 数据是:array(3){["username"]=> string(9)"周伯通"["password"]=> string(6)"123456"["sign"]=>string(11)"asdfg123456"}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/616477
推荐阅读
  

闽ICP备14008679号