没有人质疑php的简单强大,它提供了很多特性供开发者使用,其中一个就是弱类型机制。
弱类型的语言对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。
PHP弱类型
PHP弱类型简介
在PHP中,可以进行一下的操作。
$param = 1;
$param = array();
$param = "stringg";
比如 在$a == $b的比较中
实例一
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出卖的那一个。