强比较: === 比较值也比较类型
弱比较: == 只比较值
a===b 如果a和b的类型不同就会输出flase;a==b会把a和b的值转为一样的数据类型在进行比较;
如何进行绕过
弱比较绕过:
弱比较有一下两种绕过方式
1.0e进行绕过一下几种为md5编码是0e开头
QNKCDZO
240610708
s878926199a
s155964671a
s21587387a
这对于不是md5的数字还需要调整如ctfshow中web入门web92
<?php
/*
# -*- coding: utf-8 -*-
# @Author: Firebasky
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:29:30
# @link: https://ctfer.com
*/
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==4476){
die("no no no!");
}
if(intval($num,0)==4476){
echo $flag;
}else{
echo intval($num,0);
}
}
这里有两个等号==所以为弱比较,但是这里没有md5进行转义所以不需要在转为md5所以直接构造
?num=4476e2 |
这里为啥第二个怎么不绕过因为intval函数只会返回整数值所以e后面直接忽略所以可以得到flag
对于md5还有一种绕过方式就是利用数组,因为
md5()函数计算的是一个字符串的哈希值,对于数组则返回false
MD5强比较绕过
直接在后面加一些字母绕过:
如ctfshow web入门90
<?php
/*
# -*- coding: utf-8 -*-
# @Author: h1xa
# @Date: 2020-09-16 11:25:09
# @Last Modified by: h1xa
# @Last Modified time: 2020-09-18 16:06:11
# @email: h1xa@ctfer.com
# @link: https://ctfer.com
*/
include("flag.php");
highlight_file(__FILE__);
if(isset($_GET['num'])){
$num = $_GET['num'];
if($num==="4476"){
die("no no no!");
}
if(intval($num,0)===4476){
echo $flag;
}else{
echo intval($num,0);
}
}
这里利用inval函数和强比较的性质构造:
?num=4476a |
对于md5还有数组绕过和上面的绕过方式一样
补充
nssctf
[BJDCTF 2020]easy_md5
根据以上知识进行解题
打开网页可以看到以上内容,标准的不知道干什么先输入一个东西看看有什么反应,发现并没有太大反应那就抓一下包
在网页中随便输入一些东西,抓一下包重发一下得到以上效果
在hint后发现一个sql注入语句
这时候输入
ffifdyop
原理:ffifdyop加密之后为276f722736c95d99e921722cf9ed621c
再转换为字符串:'or’6<乱码> 即 'or’66�]��!r,��b
输入之后就可以得到以下页面
我们查看源码可以看到如下代码
利用上面知识md5弱比较
node4.anna.nssctf.cn:28702/levels91.php?a=QNKCDZO&b=240610708
输入以上内容
则可以看到以下网页
分析代码发现他需要param1强等于param2
利用md5强比较
利用数组绕过
此题就解出来了
补充一些0e开头的md5
md5弱比较
0e215962017
0e1284838308
0e1137126905
0e807097110
0e730083352