
前言
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

本文探讨了PHP编程中的一些安全隐患,包括数组操作、数字比较以及控制语句的陷阱。通过CTF题目的示例,展示了如何利用这些特性进行安全漏洞利用,如数组的MD5计算、strcmp函数误用、数字比较中的十六进制转换以及switch语句的未break问题。这些例子揭示了PHP在安全性上的潜在问题,提醒开发者注意代码审查和安全实践。
最低0.47元/天 解锁文章
546

被折叠的 条评论
为什么被折叠?



