php黑魔法

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

在这里插入图片描述

前言

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值