题目
当点进去不知道干啥的时候:1.看源代码 2.抓包 3.看网络请求 F12
用bp抓包,在response消息头中有hint提示:
select * from 'admin' where password=md5($pass,true)
如果md5($pass,true)后是' ' or 1 那么整句话就是password=' ' or 1,此时必定会返回1(也就是true)
为假的情况:1.空字符串 比如说 " " 或者 ' '
2.0,0.0(会转换成0进而进行比较)
3.空数组 [] 或者array()
4.特殊类型值: null 和 undefined
5.未初始化的变量:在一些情况下,未初始化的变量如果在条件判断中使用,会发出警告并且被视为 false 。
其他情况一般都被判定为 true
ffifdyop的来源:
PHP 中的 md5()
函数在第二个参数为 true
时会将 MD5 哈希结果以二进制数据
的形式进行返回,因 MD5 函数的返回值类型为 字符串
,故在返回结果前,二进制数据将使用 ASCII 进行 解码(二进制数据到文本字符的转化)
。
出现由四边形包裹的问号:
一个字节能够表示的十进制数的范围为 0~255
,而 ASCII 中的字符的编号范围为 0~127
,两者的范围不对等。因此,当一个字节所表示的十进制数在 128~255
时,该字节将使用 四边形包裹的问号(不同的环境可能有不同的表现方式)
表示。
在提交ffifdyop后,出现界面
查看源代码:
<!--
$a = $GET['a'];
$b = $_GET['b'];if($a != $b && md5($a) == md5($b)){// wow, glzjin wants a girl friend.
-->
这里 != 用来比较值,而 !== 不光比较值,还会比较类型
对于这种数值不相等但是md5值相等的,此时有两种方法:
1.使用数组绕过:数组经过md5加密以后结果为null,比较则相等
a[] = 1
的意思是把值 1
追加到数组 a
的末尾。
注意这里传参的时候不能写/?,只能单写一个?
也不知道为啥,感觉明明一样啊
2.使用特殊字符串绕过
md5编码后开头为0e的数:
a=s1885207154a
b=s1836677006a
<?php
error_reporting(0);
include "flag.php";highlight_file(__FILE__);if($_POST['param1']!==$_POST['param2']&&md5($_POST['param1'])===md5($_POST['param2'])){echo $flag;
}
利用数组绕过:
错误提交方式:
话说正确的提交方法不是这样吗?这样也不对,不知道为啥
参考:web buuctf [BJDCTF2020]Easy MD51_[bjdctf2020]easy md5 1-CSDN博客
万能密码ffifdyop原理 - redfish999 - 博客园
MD5 绕过第三式:ffifdyop-CSDN博客
PHP特性之CTF中常见的PHP绕过_数组绕过-CSDN博客