前言
php的很多特性再带来编程方面的同时也会带来很多安全隐患,其中一些漏洞在CTF中经常出现,本文大部分示例也是取自CTF题目。这里首先说一下和=区别。是比较运算,它不会去检查条件式的表达式的类型,=是恒等,它会检查查表达式的值与类型是否相等,NULL,0,”0″,array()使用和false比较时,都是会返回true的,而使用=却不会。
注:本文部分内容及代码并非原创,而是从网上搜集而得。
一、数组
数组的hash计算
很多时候,PHP数组都发挥了至关重要的作用,比如下面代码
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
if ($_GET['username'] == $_GET['password'])
print 'Your password can not be your username.';
else if (md5($_GET['username']) === md5($_GET['password']))
die('Flag: '.$flag);
else
print 'Invalid password';
}
?>
首先判断name和password是否一致,一致的话提示’Your password can not be your name.’,不一致的话无法通过第二个if判断,但是php对数组进行hash计算都会得出null的空值。比如下面代码,当我们直接进行数组的MD5运算时会提示警告
<?php
#error_reporting(0);
echo md5($_GET['username']);
?>
警告信息说MD5()函数需要一个string类型的参数
我们加几条调试信息,并将error_reporting(0)取消注释
<?php
error_reporting(0);
$flag = 'flag{test}';
if (isset($_GET['username']) and isset($_GET['password'])) {
echo 'null md5 is ';echo md5(null);
echo '<br>';
echo 'null length is '; echo strlen((md5($_GET['username'])));
echo '<br>';
echo 'md5(md5($_GET["username"])) md5 is ';
echo md5(md5($_GET["username"]));
echo '<br>';
echo 'md5(md5($_GET["password"])) m