【PHP安全】PHP弱类型

没有人质疑php的简单强大,它提供了很多特性供开发者使用,其中一个就是弱类型机制。
弱类型的语言对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。

PHP弱类型


PHP弱类型简介

在PHP中,可以进行一下的操作。

$param = 1;

$param = array();

$param = "stringg";

比如 在$a == $b的比较中

  • $a = null; $b = false; //为真
  • $a = ‘’; $b = 0; //同样为真

    实例解释


实例一

2016年风云杯的题

题目就是一个登陆框,需要输入账号密码。

post:username[]=1&password[]=2

原因是:用户在输入账号密码之后php会进行解析,首先会把username和password当成数组,username和password再MD5加密之后就变得和数据库中相同,这样就成功登陆。

实例二

也是2016年风云杯的题

  • 首先一个备份文件,拿到源码

代码如下:
<?php
$_GET[‘myid’] = urldecode($_GET[‘myid’]);
$flag = ‘xxxxxxxxxxxxxxxxx’;
if (isset($_GET[‘name’]) and isset($_POST[‘password’])) {

        if ($_GET['name'] == $_POST['password'])

            print 'Your password can not be your name.';

        else if (sha1($_GET['name']) === sha1($_POST['password'])&($_GET['myid']=='anyun'))

            die('Flag: '.$flag);

    else

    print 'sorry!';

    }
?>
  • 首先对myid进行一个urldecode
  • 然后判断是否设置name和password
  • 再然后判断sha1(name)和sha1(password)是否相等,并且myid=anyun
  • 最后输出flag
    根据对源码分析,构造如下payload:

    http://139.129.166.67/5677ui8ifgs/index.php?myid=anyun&name[]=1

    post:password[]=2
    这样就绕过了,具体的原因就不一一解释了。

总结

作为一个程序员,弱类型确实给程序员书写代码带来了很大的便利,但是也让程序员忘记了
$array =array();的习惯。
都说一切输入都是有害的

那么其实可以说一切输入的类型也是可疑的,永远不要相信弱类型的php下任何比较函数,任何数学运算。否则,你绝对是被php出卖的那一个。

大爷,赏个铜板呗!